From 742c262e879ff6e6bc316f3f5d5e5f3366c7cb8a Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Wed, 12 Feb 2025 10:40:10 +0530 Subject: [PATCH 01/26] feat: update submodules --- .gitmodules | 7 +- avs/contracts/lib/eigenlayer-middleware | 2 +- avs/contracts/lib/forge-std | 2 +- avs/contracts/lib/openzeppelin-contracts | 1 - avs/contracts/script/AddNewStrategy.s.sol | 102 ---------------------- 5 files changed, 3 insertions(+), 111 deletions(-) delete mode 160000 avs/contracts/lib/openzeppelin-contracts delete mode 100644 avs/contracts/script/AddNewStrategy.s.sol diff --git a/.gitmodules b/.gitmodules index c8ec71e1..181c1b95 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,12 +1,7 @@ [submodule "avs/contracts/lib/forge-std"] path = avs/contracts/lib/forge-std url = https://github.com/foundry-rs/forge-std - branch = v1.8.2 -[submodule "avs/contracts/lib/openzeppelin-contracts"] - path = avs/contracts/lib/openzeppelin-contracts - url = https://github.com/OpenZeppelin/openzeppelin-contracts - branch = v4.7.3 [submodule "avs/contracts/lib/eigenlayer-middleware"] path = avs/contracts/lib/eigenlayer-middleware url = https://github.com/layr-Labs/eigenlayer-middleware - branch = v0.2.0-rc1-holesky-preprod-payments \ No newline at end of file + branch = mainnet \ No newline at end of file diff --git a/avs/contracts/lib/eigenlayer-middleware b/avs/contracts/lib/eigenlayer-middleware index c5b419a8..fe583437 160000 --- a/avs/contracts/lib/eigenlayer-middleware +++ b/avs/contracts/lib/eigenlayer-middleware @@ -1 +1 @@ -Subproject commit c5b419a82fcca1b64aacd32026ce8d4459b80e35 +Subproject commit fe5834371caed60c1d26ab62b5519b0cbdcb42fa diff --git a/avs/contracts/lib/forge-std b/avs/contracts/lib/forge-std index 978ac6fa..bf909b22 160000 --- a/avs/contracts/lib/forge-std +++ b/avs/contracts/lib/forge-std @@ -1 +1 @@ -Subproject commit 978ac6fadb62f5f0b723c996f64be52eddba6801 +Subproject commit bf909b22fa55e244796dfa920c9639fdffa1c545 diff --git a/avs/contracts/lib/openzeppelin-contracts b/avs/contracts/lib/openzeppelin-contracts deleted file mode 160000 index ecd2ca2c..00000000 --- a/avs/contracts/lib/openzeppelin-contracts +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ecd2ca2cd7cac116f7a37d0e474bbb3d7d5e1c4d diff --git a/avs/contracts/script/AddNewStrategy.s.sol b/avs/contracts/script/AddNewStrategy.s.sol deleted file mode 100644 index 4c930932..00000000 --- a/avs/contracts/script/AddNewStrategy.s.sol +++ /dev/null @@ -1,102 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.21; - -import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; -import "@eigenlayer/contracts/permissions/PauserRegistry.sol"; -import {IDelegationManager} from "@eigenlayer/contracts/interfaces/IDelegationManager.sol"; -import {IAVSDirectory} from "@eigenlayer/contracts/interfaces/IAVSDirectory.sol"; -import {IStrategyManager, IStrategy} from "@eigenlayer/contracts/interfaces/IStrategyManager.sol"; -import {ISlasher} from "@eigenlayer/contracts/interfaces/ISlasher.sol"; -import {StrategyBaseTVLLimits} from "@eigenlayer/contracts/strategies/StrategyBaseTVLLimits.sol"; -import "@eigenlayer/test/mocks/EmptyContract.sol"; -import {ECDSAStakeRegistry} from "@eigenlayer-middleware/src/unaudited/ECDSAStakeRegistry.sol"; -import {Quorum, StrategyParams} from "@eigenlayer-middleware/src/interfaces/IECDSAStakeRegistryEventsAndErrors.sol"; -import "@eigenlayer-middleware/src/OperatorStateRetriever.sol"; -import {ReclaimServiceManager, IServiceManager} from "../src/ReclaimServiceManager.sol"; -import "../src/ERC20Mock.sol"; -import {Utils} from "./utils/Utils.sol"; -import "forge-std/Script.sol"; -import "forge-std/StdJson.sol"; -import "forge-std/Test.sol"; -import "forge-std/console.sol"; - -contract AddStrategyScript is Script, Utils { - // Replace the placeholders with actual addresses or add them as inputs to the script - address eigenLayerProxyAdminAddr; - address eigenLayerPauserRegAddr; - address baseStrategyImplementationAddr; - address strategyManagerAddr; - address delegationManagerAddr; - address avsDirectoryAddr; - address helloWorldServiceManagerProxyAddr; - address stakeRegistryProxyAddr; - - function run() external { - ERC20Mock erc20Mock = new ERC20Mock(); - StrategyBaseTVLLimits erc20MockStrategy = _deployStrategy(erc20Mock); - _whitelistStrategy(erc20MockStrategy); - _updateHelloWorldAVS(erc20MockStrategy); - } - - function _deployStrategy(ERC20Mock erc20Mock) internal returns (StrategyBaseTVLLimits) { - ProxyAdmin eigenLayerProxyAdmin = ProxyAdmin(eigenLayerProxyAdminAddr); - PauserRegistry eigenLayerPauserReg = PauserRegistry(eigenLayerPauserRegAddr); - StrategyBaseTVLLimits baseStrategyImplementation = StrategyBaseTVLLimits(baseStrategyImplementationAddr); - - return StrategyBaseTVLLimits( - address( - new TransparentUpgradeableProxy( - address(baseStrategyImplementation), - address(eigenLayerProxyAdmin), - abi.encodeWithSelector( - StrategyBaseTVLLimits.initialize.selector, - 1 ether, // maxPerDeposit - 100 ether, // maxDeposits - IERC20(erc20Mock), - eigenLayerPauserReg - ) - ) - ) - ); - } - - function _whitelistStrategy(StrategyBaseTVLLimits erc20MockStrategy) internal { - IStrategyManager strategyManager = IStrategyManager(strategyManagerAddr); - - IStrategy[] memory strats = new IStrategy[](1); - strats[0] = erc20MockStrategy; - bool[] memory thirdPartyTransfersForbiddenValues = new bool[](1); - thirdPartyTransfersForbiddenValues[0] = false; - strategyManager.addStrategiesToDepositWhitelist( - strats, - thirdPartyTransfersForbiddenValues - ); - } - - function _updateHelloWorldAVS(StrategyBaseTVLLimits erc20MockStrategy) internal { - IDelegationManager delegationManager = IDelegationManager(delegationManagerAddr); - IAVSDirectory avsDirectory = IAVSDirectory(avsDirectoryAddr); - ReclaimServiceManager helloWorldServiceManagerProxy = ReclaimServiceManager(helloWorldServiceManagerProxyAddr); - ECDSAStakeRegistry stakeRegistryProxy = ECDSAStakeRegistry(stakeRegistryProxyAddr); - - StrategyParams memory strategyParams = StrategyParams({ - strategy: erc20MockStrategy, - multiplier: 10_000 - }); - - StrategyParams[] memory strategies = new StrategyParams[](1); - strategies[0] = strategyParams; - - Quorum memory quorum = Quorum({ - strategies: strategies - }); - - stakeRegistryProxy.initialize( - address(helloWorldServiceManagerProxy), - 1, - quorum - ); - } -} From 8f421371d60f552da3d163fa35632fb1cd55d593 Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Wed, 12 Feb 2025 11:20:01 +0530 Subject: [PATCH 02/26] feat: deploy eigen-core working --- avs/contracts/config/core/31337.json | 28 ++ avs/contracts/deployments/core/31337.json | 1 + .../script/DeployEigenLayerCore.s.sol | 38 ++ .../script/utils/CoreDeploymentLib.sol | 461 ++++++++++++++++++ .../script/utils/UpgradeableProxyLib.sol | 52 ++ package.json | 1 + 6 files changed, 581 insertions(+) create mode 100644 avs/contracts/config/core/31337.json create mode 100644 avs/contracts/deployments/core/31337.json create mode 100644 avs/contracts/script/DeployEigenLayerCore.s.sol create mode 100644 avs/contracts/script/utils/CoreDeploymentLib.sol create mode 100644 avs/contracts/script/utils/UpgradeableProxyLib.sol diff --git a/avs/contracts/config/core/31337.json b/avs/contracts/config/core/31337.json new file mode 100644 index 00000000..53d25eff --- /dev/null +++ b/avs/contracts/config/core/31337.json @@ -0,0 +1,28 @@ +{ + "strategyManager": { + "init_paused_status": 0, + "init_withdrawal_delay_blocks": 50400 + }, + "delegation": { + "init_paused_status": 0, + "init_withdrawal_delay_blocks": 50400 + }, + "slasher": { + "init_paused_status": 0 + }, + "eigenPodManager": { + "init_paused_status": 0 + }, + "rewardsCoordinator": { + "init_paused_status": 0, + "MAX_REWARDS_DURATION": 864000, + "MAX_RETROACTIVE_LENGTH": 86400, + "MAX_FUTURE_LENGTH": 86400, + "GENESIS_REWARDS_TIMESTAMP": 1672531200, + "rewards_updater_address": "0x14dC79964da2C08b23698B3D3cc7Ca32193d9955", + "rewards_updater_key": "0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356", + "activation_delay": 0, + "calculation_interval_seconds": 86400, + "global_operator_commission_bips": 1000 + } +} \ No newline at end of file diff --git a/avs/contracts/deployments/core/31337.json b/avs/contracts/deployments/core/31337.json new file mode 100644 index 00000000..d9535338 --- /dev/null +++ b/avs/contracts/deployments/core/31337.json @@ -0,0 +1 @@ +{"lastUpdate":{"timestamp":"1739337820","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","avsDirectory":"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9","avsDirectoryImpl":"0x68b1d87f95878fe05b998f19b66f4baba5de1aed","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","eigenPodManagerImpl":"0x59b670e9fa9d0a427751af201d676719a970857b","strategyFactory":"0x959922be3caee4b8cd9a407cc3ac1c251c2007b1","strategyFactoryImpl":"0xc6e7df5e7b4f2a278906862b61205850344d4e7d","strategyBeacon":"0x09635f643e140090a9a8dcd712ed6285858cebef","rewardsCoordinator":"0x610178da211fef7d417bc0e6fed39f05609ad788"}} \ No newline at end of file diff --git a/avs/contracts/script/DeployEigenLayerCore.s.sol b/avs/contracts/script/DeployEigenLayerCore.s.sol new file mode 100644 index 00000000..e18b092d --- /dev/null +++ b/avs/contracts/script/DeployEigenLayerCore.s.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.12; + +import {Script} from "forge-std/Script.sol"; + +import {CoreDeploymentLib} from "./utils/CoreDeploymentLib.sol"; +import {UpgradeableProxyLib} from "./utils/UpgradeableProxyLib.sol"; + +import {IRewardsCoordinator} from "@eigenlayer/contracts/interfaces/IRewardsCoordinator.sol"; + +import "forge-std/Test.sol"; + +contract DeployEigenlayerCore is Script, Test { + using CoreDeploymentLib for *; + using UpgradeableProxyLib for address; + + address internal deployer; + address internal proxyAdmin; + CoreDeploymentLib.DeploymentData internal deploymentData; + CoreDeploymentLib.DeploymentConfigData internal configData; + + function setUp() public virtual { + deployer = vm.rememberKey(vm.envUint("PRIVATE_KEY")); + vm.label(deployer, "Deployer"); + } + + function run() external { + vm.startBroadcast(deployer); + //set the rewards updater to the deployer address for payment flow + configData = CoreDeploymentLib.readDeploymentConfigValues("config/core/", block.chainid); + configData.rewardsCoordinator.updater = deployer; + proxyAdmin = UpgradeableProxyLib.deployProxyAdmin(); + deploymentData = CoreDeploymentLib.deployContracts(proxyAdmin, configData); + vm.stopBroadcast(); + string memory deploymentPath = "deployments/core/"; + CoreDeploymentLib.writeDeploymentJson(deploymentPath, block.chainid, deploymentData); + } +} \ No newline at end of file diff --git a/avs/contracts/script/utils/CoreDeploymentLib.sol b/avs/contracts/script/utils/CoreDeploymentLib.sol new file mode 100644 index 00000000..1a415e6d --- /dev/null +++ b/avs/contracts/script/utils/CoreDeploymentLib.sol @@ -0,0 +1,461 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import {TransparentUpgradeableProxy} from + "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import {UpgradeableBeacon} from "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; +import {console2} from "forge-std/Test.sol"; +import {Vm} from "forge-std/Vm.sol"; +import {stdJson} from "forge-std/StdJson.sol"; +import {DelegationManager} from "@eigenlayer/contracts/core/DelegationManager.sol"; +import {StrategyManager} from "@eigenlayer/contracts/core/StrategyManager.sol"; +import {AVSDirectory} from "@eigenlayer/contracts/core/AVSDirectory.sol"; +import {Slasher} from "@eigenlayer/contracts/core/Slasher.sol"; +import {EigenPodManager} from "@eigenlayer/contracts/pods/EigenPodManager.sol"; +import {RewardsCoordinator} from "@eigenlayer/contracts/core/RewardsCoordinator.sol"; +import {StrategyBase} from "@eigenlayer/contracts/strategies/StrategyBase.sol"; +import {EigenPod} from "@eigenlayer/contracts/pods/EigenPod.sol"; +import {IETHPOSDeposit} from "@eigenlayer/contracts/interfaces/IETHPOSDeposit.sol"; +import {StrategyBaseTVLLimits} from "@eigenlayer/contracts/strategies/StrategyBaseTVLLimits.sol"; +import {PauserRegistry} from "@eigenlayer/contracts/permissions/PauserRegistry.sol"; +import {IStrategy} from "@eigenlayer/contracts/interfaces/IStrategy.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {ISignatureUtils} from "@eigenlayer/contracts/interfaces/ISignatureUtils.sol"; +import {IDelegationManager} from "@eigenlayer/contracts/interfaces/IDelegationManager.sol"; +import {IBeacon} from "@openzeppelin/contracts/proxy/beacon/IBeacon.sol"; +import {IStrategyManager} from "@eigenlayer/contracts/interfaces/IStrategyManager.sol"; +import {ISlasher} from "@eigenlayer/contracts/interfaces/ISlasher.sol"; +import {IEigenPodManager} from "@eigenlayer/contracts/interfaces/IEigenPodManager.sol"; +import {IAVSDirectory} from "@eigenlayer/contracts/interfaces/IAVSDirectory.sol"; +import {IPauserRegistry} from "@eigenlayer/contracts/interfaces/IPauserRegistry.sol"; +import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; +import {StrategyFactory} from "@eigenlayer/contracts/strategies/StrategyFactory.sol"; + +import {UpgradeableProxyLib} from "./UpgradeableProxyLib.sol"; + +library CoreDeploymentLib { + using stdJson for *; + using Strings for *; + using UpgradeableProxyLib for address; + + Vm internal constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + struct StrategyManagerConfig { + uint256 initPausedStatus; + uint256 initWithdrawalDelayBlocks; + } + + struct SlasherConfig { + uint256 initPausedStatus; + } + + struct DelegationManagerConfig { + uint256 initPausedStatus; + uint256 withdrawalDelayBlocks; + } + + struct EigenPodManagerConfig { + uint256 initPausedStatus; + } + + struct RewardsCoordinatorConfig { + uint256 initPausedStatus; + uint256 maxRewardsDuration; + uint256 maxRetroactiveLength; + uint256 maxFutureLength; + uint256 genesisRewardsTimestamp; + address updater; + uint256 updaterKey; + uint256 activationDelay; + uint256 calculationIntervalSeconds; + uint256 globalOperatorCommissionBips; + } + + struct StrategyFactoryConfig { + uint256 initPausedStatus; + } + + struct DeploymentData { + address delegationManager; + address avsDirectory; + address strategyManager; + address eigenPodManager; + address rewardsCoordinator; + address eigenPodBeacon; + address pauserRegistry; + address strategyFactory; + address strategyBeacon; + address initialOwner; + } + + function deployContracts( + address proxyAdmin, + DeploymentConfigData memory configData + ) internal returns (DeploymentData memory) { + DeploymentData memory result; + + result.delegationManager = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); + result.avsDirectory = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); + result.strategyManager = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); + result.eigenPodManager = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); + result.rewardsCoordinator = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); + result.eigenPodBeacon = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); + result.pauserRegistry = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); + result.strategyFactory = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); + + // Deploy the implementation contracts, using the proxy contracts as inputs + address delegationManagerImpl = address( + new DelegationManager( + IStrategyManager(result.strategyManager), + ISlasher(address(0)), + IEigenPodManager(result.eigenPodManager) + ) + ); + address avsDirectoryImpl = + address(new AVSDirectory(IDelegationManager(result.delegationManager))); + + address strategyManagerImpl = address( + new StrategyManager( + IDelegationManager(result.delegationManager), + IEigenPodManager(result.eigenPodManager), + ISlasher(address(0)) + ) + ); + + address strategyFactoryImpl = + address(new StrategyFactory(IStrategyManager(result.strategyManager))); + + address ethPOSDeposit; + if (block.chainid == 1) { + ethPOSDeposit = 0x00000000219ab540356cBB839Cbe05303d7705Fa; + } else { + // For non-mainnet chains, you might want to deploy a mock or read from a config + // This assumes you have a similar config setup as in M2_Deploy_From_Scratch.s.sol + /// TODO: Handle Eth pos + } + + address eigenPodManagerImpl = address( + new EigenPodManager( + IETHPOSDeposit(ethPOSDeposit), + IBeacon(result.eigenPodBeacon), + IStrategyManager(result.strategyManager), + ISlasher(address(0)), + IDelegationManager(result.delegationManager) + ) + ); + + /// TODO: Get actual values + uint32 CALCULATION_INTERVAL_SECONDS = 1 days; + uint32 MAX_REWARDS_DURATION = 1 days; + uint32 MAX_RETROACTIVE_LENGTH = 1 days; + uint32 MAX_FUTURE_LENGTH = 2 days; + uint32 GENESIS_REWARDS_TIMESTAMP = 0; + address rewardsCoordinatorImpl = address( + new RewardsCoordinator( + IDelegationManager(result.delegationManager), + IStrategyManager(result.strategyManager), + CALCULATION_INTERVAL_SECONDS, + MAX_REWARDS_DURATION, + MAX_RETROACTIVE_LENGTH, + MAX_FUTURE_LENGTH, + GENESIS_REWARDS_TIMESTAMP + ) + ); + + /// TODO: Get actual genesis time + uint64 GENESIS_TIME = 1_564_000; + + address eigenPodImpl = address( + new EigenPod( + IETHPOSDeposit(ethPOSDeposit), + IEigenPodManager(result.eigenPodManager), + GENESIS_TIME + ) + ); + address eigenPodBeaconImpl = address(new UpgradeableBeacon(eigenPodImpl)); + address baseStrategyImpl = + address(new StrategyBase(IStrategyManager(result.strategyManager))); + /// TODO: PauserRegistry isn't upgradeable + address pauserRegistryImpl = address( + new PauserRegistry( + new address[](0), // Empty array for pausers + proxyAdmin // ProxyAdmin as the unpauser + ) + ); + + // Deploy and configure the strategy beacon + result.strategyBeacon = address(new UpgradeableBeacon(baseStrategyImpl)); + + // Upgrade contracts + /// TODO: Get from config + bytes memory upgradeCall = abi.encodeCall( + DelegationManager.initialize, + ( + proxyAdmin, // initialOwner + IPauserRegistry(result.pauserRegistry), // _pauserRegistry + configData.delegationManager.initPausedStatus, // initialPausedStatus + configData.delegationManager.withdrawalDelayBlocks, // _minWithdrawalDelayBlocks + new IStrategy[](0), // _strategies (empty array for now) + new uint256[](0) // _withdrawalDelayBlocks (empty array for now) + ) + ); + UpgradeableProxyLib.upgradeAndCall( + result.delegationManager, delegationManagerImpl, upgradeCall + ); + + // Upgrade StrategyManager contract + upgradeCall = abi.encodeCall( + StrategyManager.initialize, + ( + proxyAdmin, // initialOwner + result.strategyFactory, // initialStrategyWhitelister + IPauserRegistry(result.pauserRegistry), // _pauserRegistry + configData.strategyManager.initPausedStatus // initialPausedStatus + ) + ); + UpgradeableProxyLib.upgradeAndCall(result.strategyManager, strategyManagerImpl, upgradeCall); + + // Upgrade StrategyFactory contract + upgradeCall = abi.encodeCall( + StrategyFactory.initialize, + ( + proxyAdmin, // initialOwner + IPauserRegistry(result.pauserRegistry), // _pauserRegistry + configData.strategyFactory.initPausedStatus, // initialPausedStatus + IBeacon(result.strategyBeacon) + ) + ); + UpgradeableProxyLib.upgradeAndCall(result.strategyFactory, strategyFactoryImpl, upgradeCall); + + // Upgrade EigenPodManager contract + upgradeCall = abi.encodeCall( + EigenPodManager.initialize, + ( + proxyAdmin, // initialOwner + IPauserRegistry(result.pauserRegistry), // _pauserRegistry + configData.eigenPodManager.initPausedStatus // initialPausedStatus + ) + ); + UpgradeableProxyLib.upgradeAndCall(result.eigenPodManager, eigenPodManagerImpl, upgradeCall); + + // Upgrade AVSDirectory contract + upgradeCall = abi.encodeCall( + AVSDirectory.initialize, + ( + proxyAdmin, // initialOwner + IPauserRegistry(result.pauserRegistry), // _pauserRegistry + 0 // TODO: AVS Missing configinitialPausedStatus + ) + ); + UpgradeableProxyLib.upgradeAndCall(result.avsDirectory, avsDirectoryImpl, upgradeCall); + + // Upgrade RewardsCoordinator contract + upgradeCall = abi.encodeCall( + RewardsCoordinator.initialize, + ( + proxyAdmin, // initialOwner + IPauserRegistry(result.pauserRegistry), // _pauserRegistry + configData.rewardsCoordinator.initPausedStatus, // initialPausedStatus + configData.rewardsCoordinator.updater, + uint32(configData.rewardsCoordinator.activationDelay), // _activationDelay + uint16(configData.rewardsCoordinator.globalOperatorCommissionBips) // _globalCommissionBips + ) + ); + UpgradeableProxyLib.upgradeAndCall( + result.rewardsCoordinator, rewardsCoordinatorImpl, upgradeCall + ); + + // Upgrade EigenPod contract + upgradeCall = abi.encodeCall( + EigenPod.initialize, + // TODO: Double check this + (address(result.eigenPodManager)) // _podOwner + ); + UpgradeableProxyLib.upgradeAndCall(result.eigenPodBeacon, eigenPodImpl, upgradeCall); + + return result; + } + + struct DeploymentConfigData { + StrategyManagerConfig strategyManager; + DelegationManagerConfig delegationManager; + SlasherConfig slasher; + EigenPodManagerConfig eigenPodManager; + RewardsCoordinatorConfig rewardsCoordinator; + StrategyFactoryConfig strategyFactory; + } + // StrategyConfig[] strategies; + + function readDeploymentConfigValues( + string memory directoryPath, + string memory fileName + ) internal view returns (DeploymentConfigData memory) { + string memory pathToFile = string.concat(directoryPath, fileName); + + require(vm.exists(pathToFile), "CoreDeployment: Deployment config file does not exist"); + + string memory json = vm.readFile(pathToFile); + + DeploymentConfigData memory data; + + // StrategyManager start + data.strategyManager.initPausedStatus = json.readUint(".strategyManager.init_paused_status"); + data.strategyManager.initWithdrawalDelayBlocks = + uint32(json.readUint(".strategyManager.init_withdrawal_delay_blocks")); + // slasher config end + + // DelegationManager config start + data.delegationManager.initPausedStatus = json.readUint(".delegation.init_paused_status"); + data.delegationManager.withdrawalDelayBlocks = + json.readUint(".delegation.init_withdrawal_delay_blocks"); + // DelegationManager config end + + // Slasher config start + data.slasher.initPausedStatus = json.readUint(".slasher.init_paused_status"); + + // Slasher config end + + // EigenPodManager config start + data.eigenPodManager.initPausedStatus = json.readUint(".eigenPodManager.init_paused_status"); + // EigenPodManager config end + + // RewardsCoordinator config start + data.rewardsCoordinator.initPausedStatus = + json.readUint(".rewardsCoordinator.init_paused_status"); + data.rewardsCoordinator.maxRewardsDuration = + json.readUint(".rewardsCoordinator.MAX_REWARDS_DURATION"); + data.rewardsCoordinator.maxRetroactiveLength = + json.readUint(".rewardsCoordinator.MAX_RETROACTIVE_LENGTH"); + data.rewardsCoordinator.maxFutureLength = + json.readUint(".rewardsCoordinator.MAX_FUTURE_LENGTH"); + data.rewardsCoordinator.genesisRewardsTimestamp = + json.readUint(".rewardsCoordinator.GENESIS_REWARDS_TIMESTAMP"); + data.rewardsCoordinator.updater = + json.readAddress(".rewardsCoordinator.rewards_updater_address"); + data.rewardsCoordinator.updaterKey = + json.readUint(".rewardsCoordinator.rewards_updater_key"); + data.rewardsCoordinator.activationDelay = + json.readUint(".rewardsCoordinator.activation_delay"); + data.rewardsCoordinator.calculationIntervalSeconds = + json.readUint(".rewardsCoordinator.calculation_interval_seconds"); + data.rewardsCoordinator.globalOperatorCommissionBips = + json.readUint(".rewardsCoordinator.global_operator_commission_bips"); + // RewardsCoordinator config end + + return data; + } + + function readDeploymentConfigValues( + string memory directoryPath, + uint256 chainId + ) internal view returns (DeploymentConfigData memory) { + return + readDeploymentConfigValues(directoryPath, string.concat(vm.toString(chainId), ".json")); + } + + function readDeploymentJson( + string memory directoryPath, + uint256 chainId + ) internal view returns (DeploymentData memory) { + return readDeploymentJson(directoryPath, string.concat(vm.toString(chainId), ".json")); + } + + function readDeploymentJson( + string memory path, + string memory fileName + ) internal view returns (DeploymentData memory) { + string memory pathToFile = string.concat(path, fileName); + + require(vm.exists(pathToFile), "CoreDeployment: Deployment file does not exist"); + + string memory json = vm.readFile(pathToFile); + + DeploymentData memory data; + data.strategyFactory = json.readAddress(".addresses.strategyFactory"); + data.strategyManager = json.readAddress(".addresses.strategyManager"); + data.eigenPodManager = json.readAddress(".addresses.eigenPodManager"); + data.delegationManager = json.readAddress(".addresses.delegation"); + data.avsDirectory = json.readAddress(".addresses.avsDirectory"); + data.rewardsCoordinator = json.readAddress(".addresses.rewardsCoordinator"); + data.initialOwner = json.readAddress(".addresses.proxyAdmin"); + + return data; + } + + /// TODO: Need to be able to read json from eigenlayer-contracts repo for holesky/mainnet and output the json here + function writeDeploymentJson( + DeploymentData memory data + ) internal { + writeDeploymentJson("deployments/core/", block.chainid, data); + } + + function writeDeploymentJson( + string memory path, + uint256 chainId, + DeploymentData memory data + ) internal { + address proxyAdmin = address(UpgradeableProxyLib.getProxyAdmin(data.strategyManager)); + + string memory deploymentData = _generateDeploymentJson(data, proxyAdmin); + + string memory fileName = string.concat(path, vm.toString(chainId), ".json"); + if (!vm.exists(path)) { + vm.createDir(path, true); + } + + vm.writeFile(fileName, deploymentData); + console2.log("Deployment artifacts written to:", fileName); + } + + function _generateDeploymentJson( + DeploymentData memory data, + address proxyAdmin + ) private view returns (string memory) { + return string.concat( + '{"lastUpdate":{"timestamp":"', + vm.toString(block.timestamp), + '","block_number":"', + vm.toString(block.number), + '"},"addresses":', + _generateContractsJson(data, proxyAdmin), + "}" + ); + } + + function _generateContractsJson( + DeploymentData memory data, + address proxyAdmin + ) private view returns (string memory) { + /// TODO: namespace contracts -> {avs, core} + return string.concat( + '{"proxyAdmin":"', + proxyAdmin.toHexString(), + '","delegation":"', + data.delegationManager.toHexString(), + '","delegationManagerImpl":"', + data.delegationManager.getImplementation().toHexString(), + '","avsDirectory":"', + data.avsDirectory.toHexString(), + '","avsDirectoryImpl":"', + data.avsDirectory.getImplementation().toHexString(), + '","strategyManager":"', + data.strategyManager.toHexString(), + '","strategyManagerImpl":"', + data.strategyManager.getImplementation().toHexString(), + '","eigenPodManager":"', + data.eigenPodManager.toHexString(), + '","eigenPodManagerImpl":"', + data.eigenPodManager.getImplementation().toHexString(), + '","strategyFactory":"', + data.strategyFactory.toHexString(), + '","strategyFactoryImpl":"', + data.strategyFactory.getImplementation().toHexString(), + '","strategyBeacon":"', + data.strategyBeacon.toHexString(), + '","rewardsCoordinator":"', + data.rewardsCoordinator.toHexString(), + '"}' + ); + } +} \ No newline at end of file diff --git a/avs/contracts/script/utils/UpgradeableProxyLib.sol b/avs/contracts/script/utils/UpgradeableProxyLib.sol new file mode 100644 index 00000000..82bc2c93 --- /dev/null +++ b/avs/contracts/script/utils/UpgradeableProxyLib.sol @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +import {Vm} from "forge-std/Vm.sol"; +import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import {TransparentUpgradeableProxy} from + "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import {EmptyContract} from "@eigenlayer/test/mocks/EmptyContract.sol"; + +library UpgradeableProxyLib { + bytes32 internal constant IMPLEMENTATION_SLOT = + 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + bytes32 internal constant ADMIN_SLOT = + 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; + + Vm internal constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + function deployProxyAdmin() internal returns (address) { + return address(new ProxyAdmin()); + } + + function setUpEmptyProxy( + address admin + ) internal returns (address) { + address emptyContract = address(new EmptyContract()); + return address(new TransparentUpgradeableProxy(emptyContract, admin, "")); + } + + function upgrade(address proxy, address impl) internal { + ProxyAdmin admin = getProxyAdmin(proxy); + admin.upgrade(TransparentUpgradeableProxy(payable(proxy)), impl); + } + + function upgradeAndCall(address proxy, address impl, bytes memory initData) internal { + ProxyAdmin admin = getProxyAdmin(proxy); + admin.upgradeAndCall(TransparentUpgradeableProxy(payable(proxy)), impl, initData); + } + + function getImplementation( + address proxy + ) internal view returns (address) { + bytes32 value = vm.load(proxy, IMPLEMENTATION_SLOT); + return address(uint160(uint256(value))); + } + + function getProxyAdmin( + address proxy + ) internal view returns (ProxyAdmin) { + bytes32 value = vm.load(proxy, ADMIN_SLOT); + return ProxyAdmin(address(uint160(uint256(value)))); + } +} \ No newline at end of file diff --git a/package.json b/package.json index e507ef00..c1b7e515 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "verify:root-ca": "npm run run:tsc -- src/scripts/verify-root-ca.ts", "create:claim": "npm run run:tsc -- src/scripts/generate-receipt.ts", "build-contracts": "cd avs/contracts && forge build", + "deploy:eigen-core": "cd avs/contracts && forge script script/DeployEigenLayerCore.s.sol --rpc-url http://localhost:8545 --broadcast --via-ir --revert-strings debug", "deploy:contracts": "sh avs/utils/anvil/deploy-all-to-anvil-and-save-state.sh", "deploy:contracts-to-chain": "sh avs/utils/anvil/deploy-to-chain.sh", "register:avs-operator": "npm run run:tsc -- src/scripts/register-avs-operator.ts", From 0cbf9102045715f902d4a33bf17bb1502de689b8 Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Wed, 12 Feb 2025 12:24:14 +0530 Subject: [PATCH 03/26] feat: deploy reclaim working --- avs/contracts/config/reclaim/31337.json | 10 + avs/contracts/deployments/reclaim/31337.json | 1 + avs/contracts/script/ReclaimDeployer.s.sol | 95 ++++++ .../script/utils/ReclaimDeploymentLib.sol | 188 +++++++++++ avs/contracts/src/ERC20Mock.sol | 306 +----------------- avs/contracts/src/ReclaimServiceManager.sol | 10 +- package.json | 1 + 7 files changed, 309 insertions(+), 302 deletions(-) create mode 100644 avs/contracts/config/reclaim/31337.json create mode 100644 avs/contracts/deployments/reclaim/31337.json create mode 100644 avs/contracts/script/ReclaimDeployer.s.sol create mode 100644 avs/contracts/script/utils/ReclaimDeploymentLib.sol diff --git a/avs/contracts/config/reclaim/31337.json b/avs/contracts/config/reclaim/31337.json new file mode 100644 index 00000000..91fa44e5 --- /dev/null +++ b/avs/contracts/config/reclaim/31337.json @@ -0,0 +1,10 @@ +{ + "addresses": { + "rewardsOwner": "0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f", + "rewardsInitiator": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720" + }, + "keys": { + "rewardsOwner": "0xdbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97", + "rewardsInitiator": "0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6" + } +} \ No newline at end of file diff --git a/avs/contracts/deployments/reclaim/31337.json b/avs/contracts/deployments/reclaim/31337.json new file mode 100644 index 00000000..553c3741 --- /dev/null +++ b/avs/contracts/deployments/reclaim/31337.json @@ -0,0 +1 @@ +{"lastUpdate":{"timestamp":"1739339387","block_number":"14"},"addresses":{"proxyAdmin":"0xf5059a5d33d5853360d16c683c16e67980206f36","reclaimServiceManager":"0x998abeb3e57409262ae5b751f60747921b33613e","reclaimServiceManagerImpl":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","stakeRegistry":"0x4826533b4897376654bb4d4ad88b7fafd0c98528","stakeRegistryImpl":"0x99bba657f2bbc93c02d617f8ba121cb8fc104acf","strategy":"0x24b3c7704709ed1491473f30393ffc93cfb0fc34","token":"0x1613beb3b2c4f22ee086b2b38c1476a3ce7f78e8"}} \ No newline at end of file diff --git a/avs/contracts/script/ReclaimDeployer.s.sol b/avs/contracts/script/ReclaimDeployer.s.sol new file mode 100644 index 00000000..a1621425 --- /dev/null +++ b/avs/contracts/script/ReclaimDeployer.s.sol @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +import {Script} from "forge-std/Script.sol"; +import {console2} from "forge-std/Test.sol"; +import {ReclaimDeploymentLib} from "./utils/ReclaimDeploymentLib.sol"; +import {CoreDeploymentLib} from "./utils/CoreDeploymentLib.sol"; +import {UpgradeableProxyLib} from "./utils/UpgradeableProxyLib.sol"; +import {StrategyBase} from "@eigenlayer/contracts/strategies/StrategyBase.sol"; +import {ERC20Mock} from "../src/ERC20Mock.sol"; +import {TransparentUpgradeableProxy} from + "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import {StrategyFactory} from "@eigenlayer/contracts/strategies/StrategyFactory.sol"; +import {StrategyManager} from "@eigenlayer/contracts/core/StrategyManager.sol"; +import {IRewardsCoordinator} from "@eigenlayer/contracts/interfaces/IRewardsCoordinator.sol"; + + + +import { + Quorum, + StrategyParams, + IStrategy +} from "@eigenlayer-middleware/src/interfaces/IECDSAStakeRegistryEventsAndErrors.sol"; + +import "forge-std/Test.sol"; + +contract ReclaimDeployer is Script, Test { + using CoreDeploymentLib for *; + using UpgradeableProxyLib for address; + + address private deployer; + address proxyAdmin; + address rewardsOwner; + address rewardsInitiator; + IStrategy reclaimStrategy; + CoreDeploymentLib.DeploymentData coreDeployment; + ReclaimDeploymentLib.DeploymentData reclaimDeployment; + ReclaimDeploymentLib.DeploymentConfigData reclaimConfig; + Quorum internal quorum; + ERC20Mock token; + function setUp() public virtual { + deployer = vm.rememberKey(vm.envUint("PRIVATE_KEY")); + vm.label(deployer, "Deployer"); + + reclaimConfig = ReclaimDeploymentLib.readDeploymentConfigValues("config/reclaim/", block.chainid); + + + coreDeployment = CoreDeploymentLib.readDeploymentJson("deployments/core/", block.chainid); + } + + function run() external { + vm.startBroadcast(deployer); + rewardsOwner = reclaimConfig.rewardsOwner; + rewardsInitiator = reclaimConfig.rewardsInitiator; + + token = new ERC20Mock(); + reclaimStrategy = IStrategy(StrategyFactory(coreDeployment.strategyFactory).deployNewStrategy(token)); + + + quorum.strategies.push( + StrategyParams({strategy: reclaimStrategy, multiplier: 10_000}) + ); + + + proxyAdmin = UpgradeableProxyLib.deployProxyAdmin(); + + + reclaimDeployment = + ReclaimDeploymentLib.deployContracts(proxyAdmin, coreDeployment, quorum, rewardsInitiator, rewardsOwner); + + reclaimDeployment.strategy = address(reclaimStrategy); + reclaimDeployment.token = address(token); + + vm.stopBroadcast(); + verifyDeployment(); + ReclaimDeploymentLib.writeDeploymentJson(reclaimDeployment); + } + + function verifyDeployment() internal view { + require( + reclaimDeployment.stakeRegistry != address(0), "StakeRegistry address cannot be zero" + ); + require( + reclaimDeployment.reclaimServiceManager != address(0), + "ReclaimServiceManager address cannot be zero" + ); + require(reclaimDeployment.strategy != address(0), "Strategy address cannot be zero"); + require(proxyAdmin != address(0), "ProxyAdmin address cannot be zero"); + require( + coreDeployment.delegationManager != address(0), + "DelegationManager address cannot be zero" + ); + require(coreDeployment.avsDirectory != address(0), "AVSDirectory address cannot be zero"); + } +} \ No newline at end of file diff --git a/avs/contracts/script/utils/ReclaimDeploymentLib.sol b/avs/contracts/script/utils/ReclaimDeploymentLib.sol new file mode 100644 index 00000000..a52d01c1 --- /dev/null +++ b/avs/contracts/script/utils/ReclaimDeploymentLib.sol @@ -0,0 +1,188 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import {TransparentUpgradeableProxy} from + "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import {Script} from "forge-std/Script.sol"; +import {console2} from "forge-std/Test.sol"; +import {Vm} from "forge-std/Vm.sol"; +import {stdJson} from "forge-std/StdJson.sol"; +import {ECDSAStakeRegistry} from "@eigenlayer-middleware/src/unaudited/ECDSAStakeRegistry.sol"; +import {ReclaimServiceManager} from "../../src/ReclaimServiceManager.sol"; +import {IDelegationManager} from "@eigenlayer/contracts/interfaces/IDelegationManager.sol"; +import {Quorum} from "@eigenlayer-middleware/src/interfaces/IECDSAStakeRegistryEventsAndErrors.sol"; +import {UpgradeableProxyLib} from "./UpgradeableProxyLib.sol"; +import {CoreDeploymentLib} from "./CoreDeploymentLib.sol"; +import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; + +library ReclaimDeploymentLib { + using stdJson for *; + using Strings for *; + using UpgradeableProxyLib for address; + + Vm internal constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + struct DeploymentData { + address reclaimServiceManager; + address stakeRegistry; + address strategy; + address token; + } + + struct DeploymentConfigData { + address rewardsOwner; + address rewardsInitiator; + uint256 rewardsOwnerKey; + uint256 rewardsInitiatorKey; + } + + function deployContracts( + address proxyAdmin, + CoreDeploymentLib.DeploymentData memory core, + Quorum memory quorum, + address rewardsInitiator, + address owner + ) internal returns (DeploymentData memory) { + DeploymentData memory result; + + // First, deploy upgradeable proxy contracts that will point to the implementations. + result.reclaimServiceManager = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); + result.stakeRegistry = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); + // Deploy the implementation contracts, using the proxy contracts as inputs + address stakeRegistryImpl = + address(new ECDSAStakeRegistry(IDelegationManager(core.delegationManager))); + address reclaimServiceManagerImpl = address( + new ReclaimServiceManager( + core.avsDirectory, result.stakeRegistry, core.rewardsCoordinator, core.delegationManager + ) + ); + // Upgrade contracts + bytes memory upgradeCall = abi.encodeCall( + ECDSAStakeRegistry.initialize, (result.reclaimServiceManager, 0, quorum) + ); + UpgradeableProxyLib.upgradeAndCall(result.stakeRegistry, stakeRegistryImpl, upgradeCall); + upgradeCall = abi.encodeCall(ReclaimServiceManager.initialize, (owner, rewardsInitiator)); + UpgradeableProxyLib.upgradeAndCall(result.reclaimServiceManager, reclaimServiceManagerImpl, upgradeCall); + + return result; + } + + function readDeploymentJson( + uint256 chainId + ) internal view returns (DeploymentData memory) { + return readDeploymentJson("deployments/", chainId); + } + + function readDeploymentJson( + string memory directoryPath, + uint256 chainId + ) internal view returns (DeploymentData memory) { + string memory fileName = string.concat(directoryPath, vm.toString(chainId), ".json"); + + require(vm.exists(fileName), "ReclaimDeployment: Deployment file does not exist"); + + string memory json = vm.readFile(fileName); + + DeploymentData memory data; + /// TODO: 2 Step for reading deployment json. Read to the core and the AVS data + data.reclaimServiceManager = json.readAddress(".addresses.reclaimServiceManager"); + data.stakeRegistry = json.readAddress(".addresses.stakeRegistry"); + data.strategy = json.readAddress(".addresses.strategy"); + data.token = json.readAddress(".addresses.token"); + + return data; + } + + + /// write to default output path + function writeDeploymentJson( + DeploymentData memory data + ) internal { + writeDeploymentJson("deployments/reclaim/", block.chainid, data); + } + + function writeDeploymentJson( + string memory outputPath, + uint256 chainId, + DeploymentData memory data + ) internal { + address proxyAdmin = + address(UpgradeableProxyLib.getProxyAdmin(data.reclaimServiceManager)); + + string memory deploymentData = _generateDeploymentJson(data, proxyAdmin); + + string memory fileName = string.concat(outputPath, vm.toString(chainId), ".json"); + if (!vm.exists(outputPath)) { + vm.createDir(outputPath, true); + } + + vm.writeFile(fileName, deploymentData); + console2.log("Deployment artifacts written to:", fileName); + } + + + function readDeploymentConfigValues( + string memory directoryPath, + string memory fileName + ) internal view returns (DeploymentConfigData memory) { + string memory pathToFile = string.concat(directoryPath, fileName); + + require(vm.exists(pathToFile), "ReclaimDeployment: Deployment Config file does not exist"); + + string memory json = vm.readFile(pathToFile); + + DeploymentConfigData memory data; + data.rewardsOwner = json.readAddress(".addresses.rewardsOwner"); + data.rewardsInitiator = json.readAddress(".addresses.rewardsInitiator"); + data.rewardsOwnerKey = json.readUint(".keys.rewardsOwner"); + data.rewardsInitiatorKey = json.readUint(".keys.rewardsInitiator"); + return data; + } + + function readDeploymentConfigValues( + string memory directoryPath, + uint256 chainId + ) internal view returns (DeploymentConfigData memory) { + return + readDeploymentConfigValues(directoryPath, string.concat(vm.toString(chainId), ".json")); + } + + function _generateDeploymentJson( + DeploymentData memory data, + address proxyAdmin + ) private view returns (string memory) { + return string.concat( + '{"lastUpdate":{"timestamp":"', + vm.toString(block.timestamp), + '","block_number":"', + vm.toString(block.number), + '"},"addresses":', + _generateContractsJson(data, proxyAdmin), + "}" + ); + } + + function _generateContractsJson( + DeploymentData memory data, + address proxyAdmin + ) private view returns (string memory) { + return string.concat( + '{"proxyAdmin":"', + proxyAdmin.toHexString(), + '","reclaimServiceManager":"', + data.reclaimServiceManager.toHexString(), + '","reclaimServiceManagerImpl":"', + data.reclaimServiceManager.getImplementation().toHexString(), + '","stakeRegistry":"', + data.stakeRegistry.toHexString(), + '","stakeRegistryImpl":"', + data.stakeRegistry.getImplementation().toHexString(), + '","strategy":"', + data.strategy.toHexString(), + '","token":"', + data.token.toHexString(), + '"}' + ); + } +} \ No newline at end of file diff --git a/avs/contracts/src/ERC20Mock.sol b/avs/contracts/src/ERC20Mock.sol index 0fc4c3c1..81531531 100644 --- a/avs/contracts/src/ERC20Mock.sol +++ b/avs/contracts/src/ERC20Mock.sol @@ -1,308 +1,12 @@ // SPDX-License-Identifier: MIT -// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol) - pragma solidity ^0.8.12; -import "@openzeppelin/contracts/interfaces/IERC20.sol"; -import "@openzeppelin/contracts/utils/Context.sol"; - -/** - * @dev Implementation of the {IERC20} interface. - * - * This implementation is agnostic to the way tokens are created. This means - * that a supply mechanism has to be added in a derived contract using {_mint}. - * For a generic mechanism see {ERC20PresetMinterPauser}. - * - * TIP: For a detailed writeup see our guide - * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How - * to implement supply mechanisms]. - * - * The default value of {decimals} is 18. To change this, you should override - * this function so it returns a different value. - * - * We have followed general OpenZeppelin Contracts guidelines: functions revert - * instead returning `false` on failure. This behavior is nonetheless - * conventional and does not conflict with the expectations of ERC20 - * applications. - * - * Additionally, an {Approval} event is emitted on calls to {transferFrom}. - * This allows applications to reconstruct the allowance for all accounts just - * by listening to said events. Other implementations of the EIP may not emit - * these events, as it isn't required by the specification. - * - * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} - * functions have been added to mitigate the well-known issues around setting - * allowances. See {IERC20-approve}. - */ -contract ERC20Mock is Context, IERC20 { - mapping(address => uint256) private _balances; - - mapping(address => mapping(address => uint256)) private _allowances; - - uint256 private _totalSupply; - - /** - * @dev See {IERC20-totalSupply}. - */ - function totalSupply() public view virtual override returns (uint256) { - return _totalSupply; - } - - /** - * @dev See {IERC20-balanceOf}. - */ - function balanceOf( - address account - ) public view virtual override returns (uint256) { - return _balances[account]; - } +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +contract ERC20Mock is ERC20 { + constructor() ERC20("", "") {} + function mint(address account, uint256 amount) public { _mint(account, amount); } - - /** - * @dev See {IERC20-transfer}. - * - * Requirements: - * - * - `to` cannot be the zero address. - * - the caller must have a balance of at least `amount`. - */ - function transfer( - address to, - uint256 amount - ) public virtual override returns (bool) { - address owner = _msgSender(); - _transfer(owner, to, amount); - return true; - } - - /** - * @dev See {IERC20-allowance}. - */ - function allowance( - address owner, - address spender - ) public view virtual override returns (uint256) { - return _allowances[owner][spender]; - } - - /** - * @dev See {IERC20-approve}. - * - * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on - * `transferFrom`. This is semantically equivalent to an infinite approval. - * - * Requirements: - * - * - `spender` cannot be the zero address. - */ - function approve( - address /*spender*/, - uint256 /*amount*/ - ) public virtual override returns (bool) { - return true; - } - - /** - * @dev See {IERC20-transferFrom}. - * - * Emits an {Approval} event indicating the updated allowance. This is not - * required by the EIP. See the note at the beginning of {ERC20}. - * - * NOTE: Does not update the allowance if the current allowance - * is the maximum `uint256`. - * - * Requirements: - * - * - `from` and `to` cannot be the zero address. - * - `from` must have a balance of at least `amount`. - * - the caller must have allowance for ``from``'s tokens of at least - * `amount`. - */ - function transferFrom( - address from, - address to, - uint256 amount - ) public virtual override returns (bool) { - _transfer(from, to, amount); - return true; - } - - /** - * @dev Moves `amount` of tokens from `from` to `to`. - * - * This internal function is equivalent to {transfer}, and can be used to - * e.g. implement automatic token fees, slashing mechanisms, etc. - * - * Emits a {Transfer} event. - * - * Requirements: - * - * - `from` cannot be the zero address. - * - `to` cannot be the zero address. - * - `from` must have a balance of at least `amount`. - */ - function _transfer( - address from, - address to, - uint256 amount - ) internal virtual { - require(from != address(0), "ERC20: transfer from the zero address"); - require(to != address(0), "ERC20: transfer to the zero address"); - - _beforeTokenTransfer(from, to, amount); - - require( - _balances[from] >= amount, - "ERC20: transfer amount exceeds balance" - ); - unchecked { - _balances[from] = _balances[from] - amount; - // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by - // decrementing then incrementing. - _balances[to] += amount; - } - - emit Transfer(from, to, amount); - - _afterTokenTransfer(from, to, amount); - } - - /** @dev Creates `amount` tokens and assigns them to `account`, increasing - * the total supply. - * - * Emits a {Transfer} event with `from` set to the zero address. - * - * Requirements: - * - * - `account` cannot be the zero address. - */ - function _mint(address account, uint256 amount) internal virtual { - require(account != address(0), "ERC20: mint to the zero address"); - - _totalSupply += amount; - unchecked { - // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. - _balances[account] += amount; - } - emit Transfer(address(0), account, amount); - } - - /** - * @dev Destroys `amount` tokens from `account`, reducing the - * total supply. - * - * Emits a {Transfer} event with `to` set to the zero address. - * - * Requirements: - * - * - `account` cannot be the zero address. - * - `account` must have at least `amount` tokens. - */ - function _burn(address account, uint256 amount) internal virtual { - require(account != address(0), "ERC20: burn from the zero address"); - - _beforeTokenTransfer(account, address(0), amount); - - uint256 accountBalance = _balances[account]; - require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); - unchecked { - _balances[account] = accountBalance - amount; - // Overflow not possible: amount <= accountBalance <= totalSupply. - _totalSupply -= amount; - } - - emit Transfer(account, address(0), amount); - - _afterTokenTransfer(account, address(0), amount); - } - - /** - * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. - * - * This internal function is equivalent to `approve`, and can be used to - * e.g. set automatic allowances for certain subsystems, etc. - * - * Emits an {Approval} event. - * - * Requirements: - * - * - `owner` cannot be the zero address. - * - `spender` cannot be the zero address. - */ - function _approve( - address owner, - address spender, - uint256 amount - ) internal virtual { - require(owner != address(0), "ERC20: approve from the zero address"); - require(spender != address(0), "ERC20: approve to the zero address"); - - _allowances[owner][spender] = amount; - emit Approval(owner, spender, amount); - } - - /** - * @dev Updates `owner` s allowance for `spender` based on spent `amount`. - * - * Does not update the allowance amount in case of infinite allowance. - * Revert if not enough allowance is available. - * - * Might emit an {Approval} event. - */ - function _spendAllowance( - address owner, - address spender, - uint256 amount - ) internal virtual { - uint256 currentAllowance = allowance(owner, spender); - if (currentAllowance != type(uint256).max) { - require( - currentAllowance >= amount, - "ERC20: insufficient allowance" - ); - } - } - - /** - * @dev Hook that is called before any transfer of tokens. This includes - * minting and burning. - * - * Calling conditions: - * - * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens - * will be transferred to `to`. - * - when `from` is zero, `amount` tokens will be minted for `to`. - * - when `to` is zero, `amount` of ``from``'s tokens will be burned. - * - `from` and `to` are never both zero. - * - * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. - */ - function _beforeTokenTransfer( - address from, - address to, - uint256 amount - ) internal virtual {} - - /** - * @dev Hook that is called after any transfer of tokens. This includes - * minting and burning. - * - * Calling conditions: - * - * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens - * has been transferred to `to`. - * - when `from` is zero, `amount` tokens have been minted for `to`. - * - when `to` is zero, `amount` of ``from``'s tokens have been burned. - * - `from` and `to` are never both zero. - * - * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. - */ - function _afterTokenTransfer( - address from, - address to, - uint256 amount - ) internal virtual {} -} +} \ No newline at end of file diff --git a/avs/contracts/src/ReclaimServiceManager.sol b/avs/contracts/src/ReclaimServiceManager.sol index 3f279084..904a0f2c 100644 --- a/avs/contracts/src/ReclaimServiceManager.sol +++ b/avs/contracts/src/ReclaimServiceManager.sol @@ -62,16 +62,24 @@ contract ReclaimServiceManager is constructor( address _avsDirectory, address _stakeRegistry, + address _rewardsCoordinator, address _delegationManager ) ECDSAServiceManagerBase( _avsDirectory, _stakeRegistry, - address(0), // TODO: payments + _rewardsCoordinator, _delegationManager ) {} + function initialize( + address initialOwner, + address _rewardsInitiator + ) external initializer { + __ServiceManagerBase_init(initialOwner, _rewardsInitiator); + } + function setup(address initialAdmin) external initializer { taskCreationMetadata = TaskCreationMetadata( // 30m diff --git a/package.json b/package.json index c1b7e515..d55b2277 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "create:claim": "npm run run:tsc -- src/scripts/generate-receipt.ts", "build-contracts": "cd avs/contracts && forge build", "deploy:eigen-core": "cd avs/contracts && forge script script/DeployEigenLayerCore.s.sol --rpc-url http://localhost:8545 --broadcast --via-ir --revert-strings debug", + "deploy:reclaim-debug": "cd avs/contracts && forge script script/ReclaimDeployer.s.sol --rpc-url http://localhost:8545 --broadcast --via-ir --revert-strings debug", "deploy:contracts": "sh avs/utils/anvil/deploy-all-to-anvil-and-save-state.sh", "deploy:contracts-to-chain": "sh avs/utils/anvil/deploy-to-chain.sh", "register:avs-operator": "npm run run:tsc -- src/scripts/register-avs-operator.ts", From e68fabe46909e4a7a777d180d1b83408298210d1 Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Wed, 12 Feb 2025 13:32:02 +0530 Subject: [PATCH 04/26] feat: run chain w docker --- avs/contracts/deployments/core/31337.json | 2 +- avs/contracts/deployments/reclaim/31337.json | 2 +- ...o_world_avs_holesky_deployment_output.json | 9 ---- .../31337/eigenlayer_deployment_output.json | 31 ------------ .../hello_world_avs_deployment_output.json | 10 ---- ...o_world_avs_holesky_deployment_output.json | 8 --- .../state.json | 1 - avs/utils/anvil/clean-deployments.sh | 17 ------- .../deploy-all-to-anvil-and-save-state.sh | 2 - .../anvil/deploy-avs-save-anvil-state.sh | 44 ----------------- .../deploy-eigenlayer-save-anvil-state.sh | 35 ------------- avs/utils/anvil/deploy-to-chain.sh | 8 --- .../state.json | 1 - avs/utils/anvil/genesis.json | 49 ------------------- ...rt-anvil-chain-with-el-and-avs-deployed.sh | 32 ++++++------ avs/utils/anvil/utils.sh | 40 --------------- package.json | 2 +- src/avs/config.ts | 8 +-- src/avs/tests/test.operator.ts | 3 ++ src/avs/tests/utils.ts | 13 ++++- 20 files changed, 36 insertions(+), 281 deletions(-) delete mode 100644 avs/contracts/script/output/17000/hello_world_avs_holesky_deployment_output.json delete mode 100644 avs/contracts/script/output/31337/eigenlayer_deployment_output.json delete mode 100644 avs/contracts/script/output/31337/hello_world_avs_deployment_output.json delete mode 100644 avs/contracts/script/output/31337/hello_world_avs_holesky_deployment_output.json delete mode 100644 avs/utils/anvil/avs-and-eigenlayer-deployed-anvil-state.json/state.json delete mode 100755 avs/utils/anvil/clean-deployments.sh delete mode 100644 avs/utils/anvil/deploy-all-to-anvil-and-save-state.sh delete mode 100755 avs/utils/anvil/deploy-avs-save-anvil-state.sh delete mode 100755 avs/utils/anvil/deploy-eigenlayer-save-anvil-state.sh delete mode 100644 avs/utils/anvil/deploy-to-chain.sh delete mode 100644 avs/utils/anvil/eigenlayer-deployed-anvil-state.json/state.json delete mode 100644 avs/utils/anvil/genesis.json delete mode 100644 avs/utils/anvil/utils.sh diff --git a/avs/contracts/deployments/core/31337.json b/avs/contracts/deployments/core/31337.json index d9535338..b0bfbc45 100644 --- a/avs/contracts/deployments/core/31337.json +++ b/avs/contracts/deployments/core/31337.json @@ -1 +1 @@ -{"lastUpdate":{"timestamp":"1739337820","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","avsDirectory":"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9","avsDirectoryImpl":"0x68b1d87f95878fe05b998f19b66f4baba5de1aed","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","eigenPodManagerImpl":"0x59b670e9fa9d0a427751af201d676719a970857b","strategyFactory":"0x959922be3caee4b8cd9a407cc3ac1c251c2007b1","strategyFactoryImpl":"0xc6e7df5e7b4f2a278906862b61205850344d4e7d","strategyBeacon":"0x09635f643e140090a9a8dcd712ed6285858cebef","rewardsCoordinator":"0x610178da211fef7d417bc0e6fed39f05609ad788"}} \ No newline at end of file +{"lastUpdate":{"timestamp":"1739347271","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","avsDirectory":"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9","avsDirectoryImpl":"0x68b1d87f95878fe05b998f19b66f4baba5de1aed","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","eigenPodManagerImpl":"0x59b670e9fa9d0a427751af201d676719a970857b","strategyFactory":"0x959922be3caee4b8cd9a407cc3ac1c251c2007b1","strategyFactoryImpl":"0xc6e7df5e7b4f2a278906862b61205850344d4e7d","strategyBeacon":"0x09635f643e140090a9a8dcd712ed6285858cebef","rewardsCoordinator":"0x610178da211fef7d417bc0e6fed39f05609ad788"}} \ No newline at end of file diff --git a/avs/contracts/deployments/reclaim/31337.json b/avs/contracts/deployments/reclaim/31337.json index 553c3741..73f02d2f 100644 --- a/avs/contracts/deployments/reclaim/31337.json +++ b/avs/contracts/deployments/reclaim/31337.json @@ -1 +1 @@ -{"lastUpdate":{"timestamp":"1739339387","block_number":"14"},"addresses":{"proxyAdmin":"0xf5059a5d33d5853360d16c683c16e67980206f36","reclaimServiceManager":"0x998abeb3e57409262ae5b751f60747921b33613e","reclaimServiceManagerImpl":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","stakeRegistry":"0x4826533b4897376654bb4d4ad88b7fafd0c98528","stakeRegistryImpl":"0x99bba657f2bbc93c02d617f8ba121cb8fc104acf","strategy":"0x24b3c7704709ed1491473f30393ffc93cfb0fc34","token":"0x1613beb3b2c4f22ee086b2b38c1476a3ce7f78e8"}} \ No newline at end of file +{"lastUpdate":{"timestamp":"1739347273","block_number":"21"},"addresses":{"proxyAdmin":"0xf5059a5d33d5853360d16c683c16e67980206f36","reclaimServiceManager":"0x998abeb3e57409262ae5b751f60747921b33613e","reclaimServiceManagerImpl":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","stakeRegistry":"0x4826533b4897376654bb4d4ad88b7fafd0c98528","stakeRegistryImpl":"0x99bba657f2bbc93c02d617f8ba121cb8fc104acf","strategy":"0x24b3c7704709ed1491473f30393ffc93cfb0fc34","token":"0x1613beb3b2c4f22ee086b2b38c1476a3ce7f78e8"}} \ No newline at end of file diff --git a/avs/contracts/script/output/17000/hello_world_avs_holesky_deployment_output.json b/avs/contracts/script/output/17000/hello_world_avs_holesky_deployment_output.json deleted file mode 100644 index cb01d8ad..00000000 --- a/avs/contracts/script/output/17000/hello_world_avs_holesky_deployment_output.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "addresses": { - "ECDSAStakeRegistry": "0xDa11C9Da04Ab02C4AF9374B27A5E727944D3E1dD", - "ECDSAStakeRegistryImplementation": "0x69fD299adC6Cd86899569819d604C45568ED4cdD", - "HelloWorldServiceManagerImplementation": "0x683e94F274B9c2F72dD3eD5b40bc8bE579F2479D", - "HelloWorldServiceManagerProxy": "0x0861afc305999bfD3028dB66145395BdD7299366", - "ProxyAdmin": "0xb7D823008d9f3E08F9C8b89475781DA0d852fB1C" - } -} \ No newline at end of file diff --git a/avs/contracts/script/output/31337/eigenlayer_deployment_output.json b/avs/contracts/script/output/31337/eigenlayer_deployment_output.json deleted file mode 100644 index eaaaa2a0..00000000 --- a/avs/contracts/script/output/31337/eigenlayer_deployment_output.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "addresses": { - "avsDirectory": "0x5FC8d32690cc91D4c39d9d3abcBD16989F875707", - "avsDirectoryImplementation": "0x0DCd1Bf9A1b36cE34237eEaFef220932846BCD82", - "baseStrategyImplementation": "0x322813Fd9A801c5507c9de605d63CEA4f2CE6c44", - "delayedWithdrawalRouter": "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6", - "delayedWithdrawalRouterImplementation": "0x959922bE3CAee4b8Cd9a407cc3ac1C251C2007B1", - "delegation": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", - "delegationImplementation": "0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e", - "eigenLayerPauserReg": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", - "eigenLayerProxyAdmin": "0x5FbDB2315678afecb367f032d93F642f64180aa3", - "eigenPodBeacon": "0x610178dA211FEF7D417bC0e6FeD39F05609AD788", - "eigenPodImplementation": "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318", - "eigenPodManager": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853", - "eigenPodManagerImplementation": "0x0B306BF915C4d645ff596e518fAf3F9669b97016", - "emptyContract": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - "slasher": "0x0165878A594ca255338adfa4d48449f69242Eb8F", - "slasherImplementation": "0x9A676e781A523b5d0C0e43731313A708CB607508", - "strategies": "", - "strategyManager": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", - "strategyManagerImplementation": "0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0" - }, - "chainInfo": { - "chainId": 31337, - "deploymentBlock": 0 - }, - "parameters": { - "executorMultisig": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "operationsMultisig": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" - } -} \ No newline at end of file diff --git a/avs/contracts/script/output/31337/hello_world_avs_deployment_output.json b/avs/contracts/script/output/31337/hello_world_avs_deployment_output.json deleted file mode 100644 index aadf3f6f..00000000 --- a/avs/contracts/script/output/31337/hello_world_avs_deployment_output.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "addresses": { - "ECDSAStakeRegistry": "0x9E545E3C0baAB3E08CdfD552C960A1050f373042", - "ECDSAStakeRegistryImplementation": "0xa82fF9aFd8f496c3d6ac40E2a0F282E47488CFc9", - "ServiceManagerImplementation": "0xf5059a5D33d5853360D16C683c16e67980206f36", - "ServiceManagerProxy": "0x84eA74d481Ee0A5332c457a4d796187F6Ba67fEB", - "erc20Mock": "0x7a2088a1bFc9d81c55368AE168C2C02570cB814F", - "erc20MockStrategy": "0x09635F643e140090A9A8Dcd712eD6285858ceBef" - } -} \ No newline at end of file diff --git a/avs/contracts/script/output/31337/hello_world_avs_holesky_deployment_output.json b/avs/contracts/script/output/31337/hello_world_avs_holesky_deployment_output.json deleted file mode 100644 index 65870e7e..00000000 --- a/avs/contracts/script/output/31337/hello_world_avs_holesky_deployment_output.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "addresses": { - "ECDSAStakeRegistry": "0x50EEf481cae4250d252Ae577A09bF514f224C6C4", - "ECDSAStakeRegistryImplementation": "0x62c20Aa1e0272312BC100b4e23B4DC1Ed96dD7D1", - "HelloWorldServiceManagerImplementation": "0x4f559F30f5eB88D635FDe1548C4267DB8FaB0351", - "HelloWorldServiceManagerProxy": "0xDB8cFf278adCCF9E9b5da745B44E754fC4EE3C76" - } -} \ No newline at end of file diff --git a/avs/utils/anvil/avs-and-eigenlayer-deployed-anvil-state.json/state.json b/avs/utils/anvil/avs-and-eigenlayer-deployed-anvil-state.json/state.json deleted file mode 100644 index bd75d843..00000000 --- a/avs/utils/anvil/avs-and-eigenlayer-deployed-anvil-state.json/state.json +++ /dev/null @@ -1 +0,0 @@ -{"accounts":{"0x0000000000000000000000000000000000000000":{"nonce":0,"balance":"0x240983d","code":"0x","storage":{}},"0x0165878a594ca255338adfa4d48449f69242eb8f":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122061dc9392cf6ba7869fe7bc6ba05d8409fb69605ae4794b23a59c97020514de6d64736f6c634300080c0033","storage":{"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0x9a676e781a523b5d0c0e43731313a708cb607508","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0x09635f643e140090a9a8dcd712ed6285858cebef":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106a6565b610118565b61005b6100933660046106c1565b610155565b3480156100a457600080fd5b506100ad6101bc565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106a6565b6101ed565b3480156100f557600080fd5b506100ad61020d565b61010661022e565b6101166101116102c3565b6102cd565b565b6101206102f1565b6001600160a01b0316330361014d5761014a81604051806020016040528060008152506000610324565b50565b61014a6100fe565b61015d6102f1565b6001600160a01b031633036101b4576101af8383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610324915050565b505050565b6101af6100fe565b60006101c66102f1565b6001600160a01b031633036101e2576101dd6102c3565b905090565b6101ea6100fe565b90565b6101f56102f1565b6001600160a01b0316330361014d5761014a8161034f565b60006102176102f1565b6001600160a01b031633036101e2576101dd6102f1565b6102366102f1565b6001600160a01b031633036101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101dd6103a3565b3660008037600080366000845af43d6000803e8080156102ec573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b61032d836103cb565b60008251118061033a5750805b156101af57610349838361040b565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103786102f1565b604080516001600160a01b03928316815291841660208301520160405180910390a161014a81610437565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610315565b6103d4816104e0565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606061043083836040518060600160405280602781526020016107ba60279139610574565b9392505050565b6001600160a01b03811661049c5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084016102ba565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b0381163b61054d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016102ba565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6104bf565b60606001600160a01b0384163b6105dc5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016102ba565b600080856001600160a01b0316856040516105f7919061076a565b600060405180830381855af49150503d8060008114610632576040519150601f19603f3d011682016040523d82523d6000602084013e610637565b606091505b5091509150610647828286610651565b9695505050505050565b60608315610660575081610430565b8251156106705782518084602001fd5b8160405162461bcd60e51b81526004016102ba9190610786565b80356001600160a01b03811681146106a157600080fd5b919050565b6000602082840312156106b857600080fd5b6104308261068a565b6000806000604084860312156106d657600080fd5b6106df8461068a565b9250602084013567ffffffffffffffff8111156106fb57600080fd5b8401601f8101861361070c57600080fd5b803567ffffffffffffffff81111561072357600080fd5b86602082840101111561073557600080fd5b939660209190910195509293505050565b60005b83811015610761578181015183820152602001610749565b50506000910152565b6000825161077c818460208701610746565b9190910192915050565b60208152600082518060208401526107a5816040850160208701610746565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122044336dde1fd288dccdc1db34736506c22b7bb081ddb4bbc9dccde116ff44295864736f6c634300081a0033","storage":{"0x0":"0xe7f1725e7734ce288f8367e1bb143e90bb3f05120001","0x1":"0x0","0x32":"0x7a2088a1bfc9d81c55368ae168c2c02570cb814f","0x64":"0xde0b6b3a7640000","0x65":"0x56bc75e2d63100000","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0x322813fd9a801c5507c9de605d63cea4f2ce6c44","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0x0b306bf915c4d645ff596e518faf3f9669b97016":{"nonce":1,"balance":"0x0","code":"0x6080604052600436106101ee5760003560e01c80638da5cb5b1161010d578063c052bd61116100a0578063d1c64cc91161006f578063d1c64cc914610604578063ea4d3c9b14610624578063f2fde38b14610658578063f6848d2414610678578063fabc1cbc146106b357600080fd5b8063c052bd6114610584578063c1de3aef146105a4578063c2c51c40146105c4578063cf756fdf146105e457600080fd5b8063a38406a3116100dc578063a38406a3146104fa578063a6a509be1461051a578063b134427114610530578063beffbb891461056457600080fd5b80638da5cb5b1461046b5780639104c319146104895780639b4e4634146104b15780639ba06275146104c457600080fd5b8063595c6a6711610185578063715018a611610154578063715018a6146103ed57806374cdd7981461040257806384d8106214610436578063886f11951461044b57600080fd5b8063595c6a67146103565780635ac86ab71461036b5780635c975abb146103ab57806360f4062b146103c057600080fd5b8063387b1300116101c1578063387b1300146102b457806339b70e38146102d457806344e71c8014610308578063463db0381461033657600080fd5b80630e81073c146101f357806310d67a2f14610226578063136439dd14610248578063292b7b2b14610268575b600080fd5b3480156101ff57600080fd5b5061021361020e366004612406565b6106d3565b6040519081526020015b60405180910390f35b34801561023257600080fd5b50610246610241366004612432565b610911565b005b34801561025457600080fd5b5061024661026336600461244f565b6109c4565b34801561027457600080fd5b5061029c7f000000000000000000000000610178da211fef7d417bc0e6fed39f05609ad78881565b6040516001600160a01b03909116815260200161021d565b3480156102c057600080fd5b506102466102cf366004612468565b610b03565b3480156102e057600080fd5b5061029c7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b34801561031457600080fd5b5061031d610ea1565b60405167ffffffffffffffff909116815260200161021d565b34801561034257600080fd5b506102466103513660046124a9565b610eca565b34801561036257600080fd5b50610246611056565b34801561037757600080fd5b5061039b6103863660046124d3565b606654600160ff9092169190911b9081161490565b604051901515815260200161021d565b3480156103b757600080fd5b50606654610213565b3480156103cc57600080fd5b506102136103db366004612432565b609b6020526000908152604090205481565b3480156103f957600080fd5b5061024661111d565b34801561040e57600080fd5b5061029c7f00000000000000000000000000000000219ab540356cbb839cbe05303d7705fa81565b34801561044257600080fd5b5061029c611131565b34801561045757600080fd5b5060655461029c906001600160a01b031681565b34801561047757600080fd5b506033546001600160a01b031661029c565b34801561049557600080fd5b5061029c73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6102466104bf36600461253f565b61121b565b3480156104d057600080fd5b5061029c6104df366004612432565b6098602052600090815260409020546001600160a01b031681565b34801561050657600080fd5b5061029c610515366004612432565b61130a565b34801561052657600080fd5b5061021360995481565b34801561053c57600080fd5b5061029c7f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b34801561057057600080fd5b5061024661057f366004612406565b6113dc565b34801561059057600080fd5b5060975461029c906001600160a01b031681565b3480156105b057600080fd5b506102466105bf366004612432565b6115f3565b3480156105d057600080fd5b506102466105df366004612406565b611604565b3480156105f057600080fd5b506102466105ff3660046125b3565b611a07565b34801561061057600080fd5b5061021361061f3660046124a9565b611b30565b34801561063057600080fd5b5061029c7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b34801561066457600080fd5b50610246610673366004612432565b611c3b565b34801561068457600080fd5b5061039b610693366004612432565b6001600160a01b0390811660009081526098602052604090205416151590565b3480156106bf57600080fd5b506102466106ce36600461244f565b611cb1565b6000336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916146107265760405162461bcd60e51b815260040161071d90612604565b60405180910390fd5b6001600160a01b0383166107a25760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f644d616e616765722e6164645368617265733a20706f644f7760448201527f6e65722063616e6e6f74206265207a65726f2061646472657373000000000000606482015260840161071d565b60008212156108105760405162461bcd60e51b815260206004820152603460248201527f456967656e506f644d616e616765722e6164645368617265733a207368617265604482015273732063616e6e6f74206265206e6567617469766560601b606482015260840161071d565b61081e633b9aca0083612678565b156108915760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f644d616e616765722e6164645368617265733a20736861726560448201527f73206d75737420626520612077686f6c65204777656920616d6f756e74000000606482015260840161071d565b6001600160a01b0383166000908152609b6020526040812054906108b584836126a2565b6001600160a01b0386166000818152609b6020526040908190208390555191925090600080516020613231833981519152906108f49087815260200190565b60405180910390a26109068282611e0d565b925050505b92915050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610964573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098891906126e3565b6001600160a01b0316336001600160a01b0316146109b85760405162461bcd60e51b815260040161071d90612700565b6109c181611e4f565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a30919061274a565b610a4c5760405162461bcd60e51b815260040161071d9061276c565b60665481811614610ac55760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161071d565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91614610b4b5760405162461bcd60e51b815260040161071d90612604565b6001600160a01b038316610bc55760405162461bcd60e51b8152602060048201526047602482015260008051602061325183398151915260448201527f546f6b656e733a20706f644f776e65722063616e6e6f74206265207a65726f206064820152666164647265737360c81b608482015260a40161071d565b6001600160a01b038216610c425760405162461bcd60e51b815260206004820152604a602482015260008051602061325183398151915260448201527f546f6b656e733a2064657374696e6174696f6e2063616e6e6f74206265207a65606482015269726f206164647265737360b01b608482015260a40161071d565b6000811215610cb15760405162461bcd60e51b8152602060048201526041602482015260008051602061325183398151915260448201527f546f6b656e733a207368617265732063616e6e6f74206265206e6567617469766064820152606560f81b608482015260a40161071d565b610cbf633b9aca0082612678565b15610d335760405162461bcd60e51b815260206004820152604a602482015260008051602061325183398151915260448201527f546f6b656e733a20736861726573206d75737420626520612077686f6c6520476064820152691dd95a48185b5bdd5b9d60b21b608482015260a40161071d565b6001600160a01b0383166000908152609b602052604081205490811215610e26576000610d5f826127b4565b905080831115610dc4576001600160a01b0385166000908152609b6020526040812055610d8c81846127d1565b9250846001600160a01b031660008051602061323183398151915282604051610db791815260200190565b60405180910390a2610e24565b6001600160a01b0385166000908152609b602052604081208054859290610dec9084906126a2565b90915550506040518381526001600160a01b038616906000805160206132318339815191529060200160405180910390a25050505050565b505b6001600160a01b03848116600090815260986020526040908190205490516362483a2160e11b815285831660048201526024810185905291169063c490744290604401600060405180830381600087803b158015610e8357600080fd5b505af1158015610e97573d6000803e3d6000fd5b5050505050505050565b609c5460009067ffffffffffffffff1680610ec55767ffffffffffffffff91505090565b919050565b610ed2611f46565b67ffffffffffffffff8116610f645760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f644d616e616765722e73657444656e6562466f726b54696d6560448201527f7374616d703a2063616e6e6f7420736574206e657744656e6562466f726b546960648201526b06d657374616d7020746f20360a41b608482015260a40161071d565b609c5467ffffffffffffffff16156110005760405162461bcd60e51b815260206004820152605360248201527f456967656e506f644d616e616765722e73657444656e6562466f726b54696d6560448201527f7374616d703a2063616e6e6f74207365742064656e6562466f726b54696d657360648201527274616d70206d6f7265207468616e206f6e636560681b608482015260a40161071d565b609c805467ffffffffffffffff191667ffffffffffffffff83169081179091556040519081527f19200b6fdad58f91b2f496b0c444fc4be3eff74a7e24b07770e04a7137bfd9db9060200160405180910390a150565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561109e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c2919061274a565b6110de5760405162461bcd60e51b815260040161071d9061276c565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b611125611f46565b61112f6000611fa0565b565b6066546000908190600190811614156111885760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161071d565b336000908152609860205260409020546001600160a01b03161561120a5760405162461bcd60e51b815260206004820152603360248201527f456967656e506f644d616e616765722e637265617465506f643a2053656e64656044820152721c88185b1c9958591e481a185cc818481c1bd9606a1b606482015260840161071d565b6000611214611ff2565b9250505090565b606654600090600190811614156112705760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161071d565b336000908152609860205260409020546001600160a01b03168061129957611296611ff2565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e46349034906112cf908b908b908b908b908b90600401612811565b6000604051808303818588803b1580156112e857600080fd5b505af11580156112fc573d6000803e3d6000fd5b505050505050505050505050565b6001600160a01b038082166000908152609860205260408120549091168061090b576113d5836001600160a01b031660001b60405180610940016040528061090e815260200161292361090e9139604080516001600160a01b037f000000000000000000000000610178da211fef7d417bc0e6fed39f05609ad788166020820152808201919091526000606082015260800160408051601f19818403018152908290526113ba9291602001612886565b60405160208183030381529060405280519060200120612157565b9392505050565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916146114245760405162461bcd60e51b815260040161071d90612604565b600081121561149b5760405162461bcd60e51b815260206004820152603760248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f617265732063616e6e6f74206265206e65676174697665000000000000000000606482015260840161071d565b6114a9633b9aca0082612678565b1561151e576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f61726573206d75737420626520612077686f6c65204777656920616d6f756e74606482015260840161071d565b6001600160a01b0382166000908152609b602052604081205461154290839061289b565b905060008112156115d35760405162461bcd60e51b815260206004820152604f60248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20636160448201527f6e6e6f7420726573756c7420696e20706f64206f776e657220686176696e672060648201526e6e656761746976652073686172657360881b608482015260a40161071d565b6001600160a01b039092166000908152609b602052604090209190915550565b6115fb611f46565b6109c1816121b3565b6001600160a01b03808316600090815260986020526040902054839116331461167f5760405162461bcd60e51b815260206004820152602760248201527f456967656e506f644d616e616765722e6f6e6c79456967656e506f643a206e6f6044820152661d0818481c1bd960ca1b606482015260840161071d565b600260c95414156116d25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161071d565b600260c9556001600160a01b03831661176e5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a20706f644f776e65722063616e6e6064820152716f74206265207a65726f206164647265737360701b608482015260a40161071d565b61177c633b9aca00836128da565b156118155760405162461bcd60e51b815260206004820152605a60248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a2073686172657344656c7461206d60648201527f75737420626520612077686f6c65204777656920616d6f756e74000000000000608482015260a40161071d565b6001600160a01b0383166000908152609b60205260408120549061183984836126a2565b6001600160a01b0386166000908152609b602052604081208290559091506118618383611e0d565b905080156119c957600081121561192c576001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91663132d49678773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06118c0856127b4565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561190f57600080fd5b505af1158015611923573d6000803e3d6000fd5b505050506119c9565b604051631452b9d760e11b81526001600160a01b03878116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152604482018390527f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916906328a573ae90606401600060405180830381600087803b1580156119b057600080fd5b505af11580156119c4573d6000803e3d6000fd5b505050505b856001600160a01b0316600080516020613231833981519152866040516119f291815260200190565b60405180910390a25050600160c95550505050565b600054610100900460ff1615808015611a275750600054600160ff909116105b80611a415750303b158015611a41575060005460ff166001145b611aa45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161071d565b6000805460ff191660011790558015611ac7576000805461ff0019166101001790555b611ad0856121b3565b611ad984611fa0565b611ae383836121fd565b8015611b29576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60975460405163321accf960e11b815267ffffffffffffffff8316600482015260009182916001600160a01b039091169063643599f290602401602060405180830381865afa158015611b87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bab91906128ee565b90508061090b5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e676574426c6f636b526f6f744174546960448201527f6d657374616d703a20737461746520726f6f742061742074696d657374616d70606482015271081b9bdd081e595d08199a5b985b1a5e995960721b608482015260a40161071d565b611c43611f46565b6001600160a01b038116611ca85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161071d565b6109c181611fa0565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2891906126e3565b6001600160a01b0316336001600160a01b031614611d585760405162461bcd60e51b815260040161071d90612700565b606654198119606654191614611dd65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161071d565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610af8565b6000808313611e2d5760008213611e265750600061090b565b508061090b565b60008213611e4557611e3e836127b4565b905061090b565b611e3e838361289b565b6001600160a01b038116611edd5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161071d565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b0316331461112f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161071d565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600060996000815461200390612907565b9091555060408051610940810190915261090e8082526000916120a291839133916129236020830139604080516001600160a01b037f000000000000000000000000610178da211fef7d417bc0e6fed39f05609ad788166020820152808201919091526000606082015260800160408051601f198184030181529082905261208e9291602001612886565b6040516020818303038152906040526122e7565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de890602401600060405180830381600087803b1580156120e657600080fd5b505af11580156120fa573d6000803e3d6000fd5b50503360008181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b604080516001600160f81b03196020808301919091526bffffffffffffffffffffffff193060601b16602183015260358201859052605580830185905283518084039091018152607590920190925280519101206000906113d5565b609780546001600160a01b0319166001600160a01b0383169081179091556040517f08f0470754946ccfbb446ff7fd2d6ae6af1bbdae19f85794c0cc5ed5e8ceb4f690600090a250565b6065546001600160a01b031615801561221e57506001600160a01b03821615155b6122a05760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161071d565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26122e382611e4f565b5050565b6000808447101561233a5760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e6365000000604482015260640161071d565b82516123885760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f604482015260640161071d565b8383516020850187f590506001600160a01b0381166123e95760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f7900000000000000604482015260640161071d565b949350505050565b6001600160a01b03811681146109c157600080fd5b6000806040838503121561241957600080fd5b8235612424816123f1565b946020939093013593505050565b60006020828403121561244457600080fd5b81356113d5816123f1565b60006020828403121561246157600080fd5b5035919050565b60008060006060848603121561247d57600080fd5b8335612488816123f1565b92506020840135612498816123f1565b929592945050506040919091013590565b6000602082840312156124bb57600080fd5b813567ffffffffffffffff811681146113d557600080fd5b6000602082840312156124e557600080fd5b813560ff811681146113d557600080fd5b60008083601f84011261250857600080fd5b50813567ffffffffffffffff81111561252057600080fd5b60208301915083602082850101111561253857600080fd5b9250929050565b60008060008060006060868803121561255757600080fd5b853567ffffffffffffffff8082111561256f57600080fd5b61257b89838a016124f6565b9097509550602088013591508082111561259457600080fd5b506125a1888289016124f6565b96999598509660400135949350505050565b600080600080608085870312156125c957600080fd5b84356125d4816123f1565b935060208501356125e4816123f1565b925060408501356125f4816123f1565b9396929550929360600135925050565b602080825260409082018190527f456967656e506f644d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261268757612687612662565b500690565b634e487b7160e01b600052601160045260246000fd5b600080821280156001600160ff1b03849003851316156126c4576126c461268c565b600160ff1b83900384128116156126dd576126dd61268c565b50500190565b6000602082840312156126f557600080fd5b81516113d5816123f1565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561275c57600080fd5b815180151581146113d557600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000600160ff1b8214156127ca576127ca61268c565b5060000390565b6000828210156127e3576127e361268c565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006128256060830187896127e8565b82810360208401526128388186886127e8565b9150508260408301529695505050505050565b6000815160005b8181101561286c5760208185018101518683015201612852565b8181111561287b576000828601525b509290920192915050565b60006123e9612895838661284b565b8461284b565b60008083128015600160ff1b8501841216156128b9576128b961268c565b6001600160ff1b03840183138116156128d4576128d461268c565b50500390565b6000826128e9576128e9612662565b500790565b60006020828403121561290057600080fd5b5051919050565b600060001982141561291b5761291b61268c565b506001019056fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65644e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193456967656e506f644d616e616765722e77697468647261775368617265734173a2646970667358221220c991066f9cb1c27d23c853a026251b3ff6d44f4cdd1151285b79c5181ca5d71264736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x0dcd1bf9a1b36ce34237eeafef220932846bcd82":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106101425760003560e01c80638da5cb5b116100b8578063d79aceab1161007c578063d79aceab146102f8578063df5cf7231461031f578063ec76f44214610346578063f2fde38b14610359578063f698da251461036c578063fabc1cbc1461037457600080fd5b80638da5cb5b1461029b5780639926ee7d146102ac578063a1060c88146102bf578063a364f4da146102d2578063a98fb355146102e557600080fd5b806349075da31161010a57806349075da3146101fa578063595c6a67146102355780635ac86ab71461023d5780635c975abb14610260578063715018a614610268578063886f11951461027057600080fd5b806310d67a2f14610147578063136439dd1461015c5780631794bb3c1461016f57806320606b7014610182578063374823b5146101bc575b600080fd5b61015a6101553660046118ab565b610387565b005b61015a61016a3660046118cf565b610443565b61015a61017d3660046118e8565b610582565b6101a97f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b6101ea6101ca366004611929565b609960209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016101b3565b610228610208366004611955565b609860209081526000928352604080842090915290825290205460ff1681565b6040516101b391906119a4565b61015a6106ac565b6101ea61024b3660046119cc565b606654600160ff9092169190911b9081161490565b6066546101a9565b61015a610773565b606554610283906001600160a01b031681565b6040516001600160a01b0390911681526020016101b3565b6033546001600160a01b0316610283565b61015a6102ba366004611a5f565b610787565b6101a96102cd366004611b46565b610b1a565b61015a6102e03660046118ab565b610bd3565b61015a6102f3366004611b8c565b610d3c565b6101a97fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102837f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b61015a6103543660046118cf565b610d83565b61015a6103673660046118ab565b610e2e565b6101a9610ea4565b61015a6103823660046118cf565b610ee2565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103fe9190611bfe565b6001600160a01b0316336001600160a01b0316146104375760405162461bcd60e51b815260040161042e90611c1b565b60405180910390fd5b6104408161103e565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561048b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104af9190611c65565b6104cb5760405162461bcd60e51b815260040161042e90611c87565b606654818116146105445760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156105a25750600054600160ff909116105b806105bc5750303b1580156105bc575060005460ff166001145b61061f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161042e565b6000805460ff191660011790558015610642576000805461ff0019166101001790555b61064c8383611135565b61065461121f565b609755610660846112b6565b80156106a6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107189190611c65565b6107345760405162461bcd60e51b815260040161042e90611c87565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b61077b611308565b61078560006112b6565b565b606654600090600190811614156107dc5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b42826040015110156108445760405162461bcd60e51b815260206004820152603e6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72207369676e617475726520657870697265640000606482015260840161042e565b60013360009081526098602090815260408083206001600160a01b038816845290915290205460ff16600181111561087e5761087e61198e565b14156108e05760405162461bcd60e51b815260206004820152603f6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f7220616c7265616479207265676973746572656400606482015260840161042e565b6001600160a01b038316600090815260996020908152604080832085830151845290915290205460ff16156109645760405162461bcd60e51b81526020600482015260366024820152600080516020611dac8339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b606482015260840161042e565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91690636d70f7ae90602401602060405180830381865afa1580156109ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee9190611c65565b610a645760405162461bcd60e51b815260206004820152604d6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a40161042e565b6000610a7a843385602001518660400151610b1a565b9050610a8b84828560000151611362565b3360008181526098602090815260408083206001600160a01b0389168085529083528184208054600160ff199182168117909255609985528386208a860151875290945293829020805490931684179092555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610b0c91906119a4565b60405180910390a350505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd6020808301919091526001600160a01b0387811683850152861660608301526080820185905260a08083018590528351808403909101815260c0909201909252805191012060009081610b90610ea4565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b60665460009060019081161415610c285760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b60013360009081526098602090815260408083206001600160a01b038716845290915290205460ff166001811115610c6257610c6261198e565b14610cd55760405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f74207265676973746572656400606482015260840161042e565b3360008181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610d3091906119a4565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138383604051610d77929190611ccf565b60405180910390a25050565b33600090815260996020908152604080832084845290915290205460ff1615610e085760405162461bcd60e51b815260206004820152603160248201527f4156534469726563746f72792e63616e63656c53616c743a2063616e6e6f742060448201527018d85b98d95b081cdc195b9d081cd85b1d607a1b606482015260840161042e565b33600090815260996020908152604080832093835292905220805460ff19166001179055565b610e36611308565b6001600160a01b038116610e9b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161042e565b610440816112b6565b60007f0000000000000000000000000000000000000000000000000000000000007a69461415610ed5575060975490565b610edd61121f565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f599190611bfe565b6001600160a01b0316336001600160a01b031614610f895760405162461bcd60e51b815260040161042e90611c1b565b6066541981196066541916146110075760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610577565b6001600160a01b0381166110cc5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161042e565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b031615801561115657506001600160a01b03821615155b6111d85760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261121b8261103e565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6033546001600160a01b031633146107855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161042e565b6001600160a01b0383163b1561148157604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906113a29086908690600401611cfe565b602060405180830381865afa1580156113bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e39190611d5b565b6001600160e01b0319161461147c5760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a40161042e565b505050565b826001600160a01b03166114958383611521565b6001600160a01b03161461147c5760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a40161042e565b60008060006115308585611545565b9150915061153d816115b5565b509392505050565b60008082516041141561157c5760208301516040840151606085015160001a61157087828585611770565b945094505050506115ae565b8251604014156115a6576020830151604084015161159b86838361185d565b9350935050506115ae565b506000905060025b9250929050565b60008160048111156115c9576115c961198e565b14156115d25750565b60018160048111156115e6576115e661198e565b14156116345760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161042e565b60028160048111156116485761164861198e565b14156116965760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161042e565b60038160048111156116aa576116aa61198e565b14156117035760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161042e565b60048160048111156117175761171761198e565b14156104405760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161042e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156117a75750600090506003611854565b8460ff16601b141580156117bf57508460ff16601c14155b156117d05750600090506004611854565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611824573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661184d57600060019250925050611854565b9150600090505b94509492505050565b6000806001600160ff1b0383168161187a60ff86901c601b611d85565b905061188887828885611770565b935093505050935093915050565b6001600160a01b038116811461044057600080fd5b6000602082840312156118bd57600080fd5b81356118c881611896565b9392505050565b6000602082840312156118e157600080fd5b5035919050565b6000806000606084860312156118fd57600080fd5b833561190881611896565b9250602084013561191881611896565b929592945050506040919091013590565b6000806040838503121561193c57600080fd5b823561194781611896565b946020939093013593505050565b6000806040838503121561196857600080fd5b823561197381611896565b9150602083013561198381611896565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60208101600283106119c657634e487b7160e01b600052602160045260246000fd5b91905290565b6000602082840312156119de57600080fd5b813560ff811681146118c857600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715611a2857611a286119ef565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611a5757611a576119ef565b604052919050565b60008060408385031215611a7257600080fd5b8235611a7d81611896565b915060208381013567ffffffffffffffff80821115611a9b57600080fd5b9085019060608288031215611aaf57600080fd5b611ab7611a05565b823582811115611ac657600080fd5b8301601f81018913611ad757600080fd5b803583811115611ae957611ae96119ef565b611afb601f8201601f19168701611a2e565b93508084528986828401011115611b1157600080fd5b808683018786013760008682860101525050818152838301358482015260408301356040820152809450505050509250929050565b60008060008060808587031215611b5c57600080fd5b8435611b6781611896565b93506020850135611b7781611896565b93969395505050506040820135916060013590565b60008060208385031215611b9f57600080fd5b823567ffffffffffffffff80821115611bb757600080fd5b818501915085601f830112611bcb57600080fd5b813581811115611bda57600080fd5b866020828501011115611bec57600080fd5b60209290920196919550909350505050565b600060208284031215611c1057600080fd5b81516118c881611896565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611c7757600080fd5b815180151581146118c857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b82815260006020604081840152835180604085015260005b81811015611d3257858101830151858201606001528201611d16565b81811115611d44576000606083870101525b50601f01601f191692909201606001949350505050565b600060208284031215611d6d57600080fd5b81516001600160e01b0319811681146118c857600080fd5b60008219821115611da657634e487b7160e01b600052601160045260246000fd5b50019056fe4156534469726563746f72792e72656769737465724f70657261746f72546f41a26469706673582212200b8fd531a1737eb07ac96c13c463a31b209583aa74d7e2f8475548371ad8ac6c64736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x14dc79964da2c08b23698b3d3cc7ca32193d9955":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x15d34aaf54267db7d7c367839aaf71a00a2c6a65":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122061dc9392cf6ba7869fe7bc6ba05d8409fb69605ae4794b23a59c97020514de6d64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x97":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x98":"0x0","0xc9":"0x1","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0x959922be3caee4b8cd9a407cc3ac1c251c2007b1","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0x23618e81e3f5cdf7f54c3d65f7fbc0abf5b21e8f":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x322813fd9a801c5507c9de605d63cea4f2ce6c44":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80635c975abb116100de578063ab5921e111610097578063df6fadc111610071578063df6fadc114610366578063e3dae51c14610381578063f3e7387514610394578063fabc1cbc146103a757600080fd5b8063ab5921e11461032b578063ce7c2ac214610340578063d9caed121461035357600080fd5b80635c975abb146102c857806361b01b5d146102d05780637a8b2637146102d9578063886f1195146102ec5780638c871019146103055780638f6a62401461031857600080fd5b80633a98ef391161014b578063485cc95511610125578063485cc9551461026b578063553ca5f81461027e578063595c6a67146102915780635ac86ab71461029957600080fd5b80633a98ef391461023857806343fe08b01461024f57806347e7ef241461025857600080fd5b8063019e27291461019357806310d67a2f146101a857806311c70c9d146101bb578063136439dd146101ce5780632495a599146101e157806339b70e3814610211575b600080fd5b6101a66101a13660046117b8565b6103ba565b005b6101a66101b6366004611802565b61049d565b6101a66101c936600461181f565b610550565b6101a66101dc366004611841565b610605565b6032546101f4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101f47f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b61024160335481565b604051908152602001610208565b61024160645481565b61024161026636600461185a565b610749565b6101a6610279366004611886565b6108ed565b61024161028c366004611802565b6109bb565b6101a66109cf565b6102b86102a73660046118bf565b6001805460ff9092161b9081161490565b6040519015158152602001610208565b600154610241565b61024160655481565b6102416102e7366004611841565b610a9b565b6000546101f4906201000090046001600160a01b031681565b610241610313366004611841565b610ae6565b610241610326366004611802565b610af1565b610333610aff565b6040516102089190611912565b61024161034e366004611802565b610b1f565b6101a6610361366004611945565b610bb4565b60645460655460408051928352602083019190915201610208565b61024161038f366004611841565b610d7d565b6102416103a2366004611841565b610db6565b6101a66103b5366004611841565b610dc1565b600054610100900460ff16158080156103da5750600054600160ff909116105b806103f45750303b1580156103f4575060005460ff166001145b6104195760405162461bcd60e51b815260040161041090611986565b60405180910390fd5b6000805460ff19166001179055801561043c576000805461ff0019166101001790555b6104468585610f1d565b610450838361102a565b8015610496576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051491906119d4565b6001600160a01b0316336001600160a01b0316146105445760405162461bcd60e51b8152600401610410906119f1565b61054d816110bb565b50565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c791906119d4565b6001600160a01b0316336001600160a01b0316146105f75760405162461bcd60e51b8152600401610410906119f1565b6106018282610f1d565b5050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610652573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106769190611a3b565b6106925760405162461bcd60e51b815260040161041090611a5d565b6001548181161461070b5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001805460009182918116141561079e5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c916146108165760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b61082084846111c0565b60335460006108316103e883611abb565b905060006103e86108406112a2565b61084a9190611abb565b905060006108588783611ad3565b9050806108658489611aea565b61086f9190611b09565b9550856108d55760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b6064820152608401610410565b6108df8685611abb565b603355505050505092915050565b600054610100900460ff161580801561090d5750600054600160ff909116105b806109275750303b158015610927575060005460ff166001145b6109435760405162461bcd60e51b815260040161041090611986565b6000805460ff191660011790558015610966576000805461ff0019166101001790555b610970838361102a565b80156109b6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006109c96102e783610b1f565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a409190611a3b565b610a5c5760405162461bcd60e51b815260040161041090611a5d565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e8603354610aae9190611abb565b905060006103e8610abd6112a2565b610ac79190611abb565b905081610ad48583611aea565b610ade9190611b09565b949350505050565b60006109c982610d7d565b60006109c96103a283610b1f565b60606040518060800160405280604d8152602001611b61604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c990911690637a7e0d9290604401602060405180830381865afa158015610b90573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c99190611b2b565b6001805460029081161415610c075760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91614610c7f5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b610c8a848484611314565b60335480831115610d195760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a401610410565b6000610d276103e883611abb565b905060006103e8610d366112a2565b610d409190611abb565b9050600082610d4f8784611aea565b610d599190611b09565b9050610d658685611ad3565b603355610d73888883611397565b5050505050505050565b6000806103e8603354610d909190611abb565b905060006103e8610d9f6112a2565b610da99190611abb565b905080610ad48386611aea565b60006109c982610a9b565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3891906119d4565b6001600160a01b0316336001600160a01b031614610e685760405162461bcd60e51b8152600401610410906119f1565b600154198119600154191614610ee65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161073e565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a18082111561101f5760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794261736554564c4c696d6974732e5f73657454564c4c696d60448201527f6974733a206d61785065724465706f7369742065786365656473206d6178546f60648201526a74616c4465706f7369747360a81b608482015260a401610410565b606491909155606555565b600054610100900460ff166110955760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610410565b603280546001600160a01b0319166001600160a01b0384161790556106018160006113ab565b6001600160a01b0381166111495760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610410565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60645481111561122a5760405162461bcd60e51b815260206004820152602f60248201527f53747261746567794261736554564c4c696d6974733a206d617820706572206460448201526e195c1bdcda5d08195e18d959591959608a1b6064820152608401610410565b6065546112356112a2565b11156112985760405162461bcd60e51b815260206004820152602c60248201527f53747261746567794261736554564c4c696d6974733a206d6178206465706f7360448201526b1a5d1cc8195e18d95959195960a21b6064820152608401610410565b6106018282611497565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156112eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130f9190611b2b565b905090565b6032546001600160a01b038381169116146109b65760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e00000000006064820152608401610410565b6109b66001600160a01b0383168483611513565b6000546201000090046001600160a01b03161580156113d257506001600160a01b03821615155b6114545760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610601826110bb565b6032546001600160a01b038381169116146106015760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b6064820152608401610410565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526109b6928692916000916115a3918516908490611620565b8051909150156109b657808060200190518101906115c19190611a3b565b6109b65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610410565b606061162f8484600085611639565b90505b9392505050565b60608247101561169a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610410565b6001600160a01b0385163b6116f15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610410565b600080866001600160a01b0316858760405161170d9190611b44565b60006040518083038185875af1925050503d806000811461174a576040519150601f19603f3d011682016040523d82523d6000602084013e61174f565b606091505b509150915061175f82828661176a565b979650505050505050565b60608315611779575081611632565b8251156117895782518084602001fd5b8160405162461bcd60e51b81526004016104109190611912565b6001600160a01b038116811461054d57600080fd5b600080600080608085870312156117ce57600080fd5b843593506020850135925060408501356117e7816117a3565b915060608501356117f7816117a3565b939692955090935050565b60006020828403121561181457600080fd5b8135611632816117a3565b6000806040838503121561183257600080fd5b50508035926020909101359150565b60006020828403121561185357600080fd5b5035919050565b6000806040838503121561186d57600080fd5b8235611878816117a3565b946020939093013593505050565b6000806040838503121561189957600080fd5b82356118a4816117a3565b915060208301356118b4816117a3565b809150509250929050565b6000602082840312156118d157600080fd5b813560ff8116811461163257600080fd5b60005b838110156118fd5781810151838201526020016118e5565b8381111561190c576000848401525b50505050565b60208152600082518060208401526119318160408501602087016118e2565b601f01601f19169190910160400192915050565b60008060006060848603121561195a57600080fd5b8335611965816117a3565b92506020840135611975816117a3565b929592945050506040919091013590565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119e657600080fd5b8151611632816117a3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611a4d57600080fd5b8151801515811461163257600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611ace57611ace611aa5565b500190565b600082821015611ae557611ae5611aa5565b500390565b6000816000190483118215151615611b0457611b04611aa5565b500290565b600082611b2657634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611b3d57600080fd5b5051919050565b60008251611b568184602087016118e2565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a264697066735822122092b74236c58f48095954709d1e79c480aa0532dccbe7cdc271b4cbe5919a80c864736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x4e59b44847b379578588920ca78fbf26c0b4956c":{"nonce":0,"balance":"0x0","code":"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3","storage":{}},"0x5fbdb2315678afecb367f032d93f642f64180aa3":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461011157806399a88ec414610124578063f2fde38b14610144578063f3b7dead1461016457600080fd5b8063204e1c7a14610080578063715018a6146100bc5780637eff275e146100d35780638da5cb5b146100f3575b600080fd5b34801561008c57600080fd5b506100a061009b366004610499565b610184565b6040516001600160a01b03909116815260200160405180910390f35b3480156100c857600080fd5b506100d1610215565b005b3480156100df57600080fd5b506100d16100ee3660046104bd565b610229565b3480156100ff57600080fd5b506000546001600160a01b03166100a0565b6100d161011f36600461050c565b610291565b34801561013057600080fd5b506100d161013f3660046104bd565b610300565b34801561015057600080fd5b506100d161015f366004610499565b610336565b34801561017057600080fd5b506100a061017f366004610499565b6103b4565b6000806000836001600160a01b03166040516101aa90635c60da1b60e01b815260040190565b600060405180830381855afa9150503d80600081146101e5576040519150601f19603f3d011682016040523d82523d6000602084013e6101ea565b606091505b5091509150816101f957600080fd5b8080602001905181019061020d91906105e2565b949350505050565b61021d6103da565b6102276000610434565b565b6102316103da565b6040516308f2839760e41b81526001600160a01b038281166004830152831690638f283970906024015b600060405180830381600087803b15801561027557600080fd5b505af1158015610289573d6000803e3d6000fd5b505050505050565b6102996103da565b60405163278f794360e11b81526001600160a01b03841690634f1ef2869034906102c990869086906004016105ff565b6000604051808303818588803b1580156102e257600080fd5b505af11580156102f6573d6000803e3d6000fd5b5050505050505050565b6103086103da565b604051631b2ce7f360e11b81526001600160a01b038281166004830152831690633659cfe69060240161025b565b61033e6103da565b6001600160a01b0381166103a85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6103b181610434565b50565b6000806000836001600160a01b03166040516101aa906303e1469160e61b815260040190565b6000546001600160a01b031633146102275760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161039f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146103b157600080fd5b6000602082840312156104ab57600080fd5b81356104b681610484565b9392505050565b600080604083850312156104d057600080fd5b82356104db81610484565b915060208301356104eb81610484565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561052157600080fd5b833561052c81610484565b9250602084013561053c81610484565b9150604084013567ffffffffffffffff8082111561055957600080fd5b818601915086601f83011261056d57600080fd5b81358181111561057f5761057f6104f6565b604051601f8201601f19908116603f011681019083821181831017156105a7576105a76104f6565b816040528281528960208487010111156105c057600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b6000602082840312156105f457600080fd5b81516104b681610484565b60018060a01b038316815260006020604081840152835180604085015260005b8181101561063b5785810183015185820160600152820161061f565b8181111561064d576000606083870101525b50601f01601f19169290920160600194935050505056fea2646970667358221220651125a925a83a65dcbfa2d7690370d9d9fe79830f102e414af3b475d33b17de64736f6c634300080c0033","storage":{"0x0":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"}},"0x5fc8d32690cc91d4c39d9d3abcbd16989f875707":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122061dc9392cf6ba7869fe7bc6ba05d8409fb69605ae4794b23a59c97020514de6d64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x65":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x66":"0x0","0x97":"0x5bc5b424ff8db9bd8202cae3beb193c946b905d8ebddb990e36a723af40eb1c4","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xdcd1bf9a1b36ce34237eeafef220932846bcd82","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0x610178da211fef7d417bc0e6fed39f05609ad788":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106100575760003560e01c80633659cfe61461005c5780635c60da1b14610071578063715018a61461009a5780638da5cb5b146100a2578063f2fde38b146100b3575b600080fd5b61006f61006a3660046102ee565b6100c6565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61006f61010e565b6000546001600160a01b031661007e565b61006f6100c13660046102ee565b610122565b6100ce6101af565b6100d781610209565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6101166101af565b610120600061029e565b565b61012a6101af565b6001600160a01b0381166101945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61019d8161029e565b50565b6001600160a01b03163b151590565b6000546001600160a01b031633146101205760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161018b565b6001600160a01b0381163b61027c5760405162461bcd60e51b815260206004820152603360248201527f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f6044820152721b881a5cc81b9bdd08184818dbdb9d1c9858dd606a1b606482015260840161018b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561030057600080fd5b81356001600160a01b038116811461031757600080fd5b939250505056fea2646970667358221220a3ac13c5077ef109a0140e73b3fdfa3adbf1b6915e38f3d3dd4457bec43994db64736f6c634300080c0033","storage":{"0x0":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x1":"0x8a791620dd6260079bf849dc5567adc3f2fdc318"}},"0x67d269191c92caf3cd7723f116c85e6e9bf55933":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461011157806399a88ec414610124578063f2fde38b14610144578063f3b7dead1461016457600080fd5b8063204e1c7a14610080578063715018a6146100bc5780637eff275e146100d35780638da5cb5b146100f3575b600080fd5b34801561008c57600080fd5b506100a061009b366004610499565b610184565b6040516001600160a01b03909116815260200160405180910390f35b3480156100c857600080fd5b506100d1610215565b005b3480156100df57600080fd5b506100d16100ee3660046104bd565b610229565b3480156100ff57600080fd5b506000546001600160a01b03166100a0565b6100d161011f36600461050c565b610291565b34801561013057600080fd5b506100d161013f3660046104bd565b610300565b34801561015057600080fd5b506100d161015f366004610499565b610336565b34801561017057600080fd5b506100a061017f366004610499565b6103b4565b6000806000836001600160a01b03166040516101aa90635c60da1b60e01b815260040190565b600060405180830381855afa9150503d80600081146101e5576040519150601f19603f3d011682016040523d82523d6000602084013e6101ea565b606091505b5091509150816101f957600080fd5b8080602001905181019061020d91906105ea565b949350505050565b61021d6103da565b6102276000610434565b565b6102316103da565b6040516308f2839760e41b81526001600160a01b038281166004830152831690638f283970906024015b600060405180830381600087803b15801561027557600080fd5b505af1158015610289573d6000803e3d6000fd5b505050505050565b6102996103da565b60405163278f794360e11b81526001600160a01b03841690634f1ef2869034906102c99086908690600401610607565b6000604051808303818588803b1580156102e257600080fd5b505af11580156102f6573d6000803e3d6000fd5b5050505050505050565b6103086103da565b604051631b2ce7f360e11b81526001600160a01b038281166004830152831690633659cfe69060240161025b565b61033e6103da565b6001600160a01b0381166103a85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6103b181610434565b50565b6000806000836001600160a01b03166040516101aa906303e1469160e61b815260040190565b6000546001600160a01b031633146102275760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161039f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146103b157600080fd5b6000602082840312156104ab57600080fd5b81356104b681610484565b9392505050565b600080604083850312156104d057600080fd5b82356104db81610484565b915060208301356104eb81610484565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561052157600080fd5b833561052c81610484565b9250602084013561053c81610484565b9150604084013567ffffffffffffffff81111561055857600080fd5b8401601f8101861361056957600080fd5b803567ffffffffffffffff811115610583576105836104f6565b604051601f8201601f19908116603f0116810167ffffffffffffffff811182821017156105b2576105b26104f6565b6040528181528282016020018810156105ca57600080fd5b816020840160208301376000602083830101528093505050509250925092565b6000602082840312156105fc57600080fd5b81516104b681610484565b60018060a01b0383168152604060208201526000825180604084015260005b818110156106435760208186018101516060868401015201610626565b506000606082850101526060601f19601f830116840101915050939250505056fea2646970667358221220345d6db34190586a6656be98a881ab919b32922da783b78d63fc50f8a85a1fc864736f6c634300081a0033","storage":{"0x0":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"}},"0x70997970c51812dc3a010c7d01b50e0d17dc79c8":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x7a2088a1bfc9d81c55368ae168c2c02570cb814f":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061007d5760003560e01c806340c10f191161005b57806340c10f19146100cf57806370a08231146100e4578063a9059cbb1461010d578063dd62ed3e1461012057600080fd5b8063095ea7b31461008257806318160ddd146100aa57806323b872dd146100bc575b600080fd5b610095610090366004610416565b610159565b60405190151581526020015b60405180910390f35b6002545b6040519081526020016100a1565b6100956100ca366004610440565b610162565b6100e26100dd366004610416565b610179565b005b6100ae6100f236600461047d565b6001600160a01b031660009081526020819052604090205490565b61009561011b366004610416565b610187565b6100ae61012e36600461049f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60015b92915050565b600061016f848484610191565b5060019392505050565b610183828261033b565b5050565b60003361016f8185855b6001600160a01b0383166101fa5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084015b60405180910390fd5b6001600160a01b03821661025c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016101f1565b6001600160a01b0383166000908152602081905260409020548111156102d35760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016101f1565b6001600160a01b038381166000818152602081815260408083208054879003905593861680835291849020805486019055925184815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6001600160a01b0382166103915760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016101f1565b80600260008282546103a391906104d2565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b80356001600160a01b038116811461041157600080fd5b919050565b6000806040838503121561042957600080fd5b610432836103fa565b946020939093013593505050565b60008060006060848603121561045557600080fd5b61045e846103fa565b925061046c602085016103fa565b929592945050506040919091013590565b60006020828403121561048f57600080fd5b610498826103fa565b9392505050565b600080604083850312156104b257600080fd5b6104bb836103fa565b91506104c9602084016103fa565b90509250929050565b8082018082111561015c57634e487b7160e01b600052601160045260246000fdfea2646970667358221220b0ad2a44572320e2c705e0ce99dab43ed1a431bd4d2a1179e0925d3145ebb84264736f6c634300081a0033","storage":{}},"0x84ea74d481ee0a5332c457a4d796187f6ba67feb":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106a6565b610118565b61005b6100933660046106c1565b610155565b3480156100a457600080fd5b506100ad6101bc565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106a6565b6101ed565b3480156100f557600080fd5b506100ad61020d565b61010661022e565b6101166101116102c3565b6102cd565b565b6101206102f1565b6001600160a01b0316330361014d5761014a81604051806020016040528060008152506000610324565b50565b61014a6100fe565b61015d6102f1565b6001600160a01b031633036101b4576101af8383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610324915050565b505050565b6101af6100fe565b60006101c66102f1565b6001600160a01b031633036101e2576101dd6102c3565b905090565b6101ea6100fe565b90565b6101f56102f1565b6001600160a01b0316330361014d5761014a8161034f565b60006102176102f1565b6001600160a01b031633036101e2576101dd6102f1565b6102366102f1565b6001600160a01b031633036101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101dd6103a3565b3660008037600080366000845af43d6000803e8080156102ec573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b61032d836103cb565b60008251118061033a5750805b156101af57610349838361040b565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103786102f1565b604080516001600160a01b03928316815291841660208301520160405180910390a161014a81610437565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610315565b6103d4816104e0565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606061043083836040518060600160405280602781526020016107ba60279139610574565b9392505050565b6001600160a01b03811661049c5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084016102ba565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b0381163b61054d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016102ba565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6104bf565b60606001600160a01b0384163b6105dc5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016102ba565b600080856001600160a01b0316856040516105f7919061076a565b600060405180830381855af49150503d8060008114610632576040519150601f19603f3d011682016040523d82523d6000602084013e610637565b606091505b5091509150610647828286610651565b9695505050505050565b60608315610660575081610430565b8251156106705782518084602001fd5b8160405162461bcd60e51b81526004016102ba9190610786565b80356001600160a01b03811681146106a157600080fd5b919050565b6000602082840312156106b857600080fd5b6104308261068a565b6000806000604084860312156106d657600080fd5b6106df8461068a565b9250602084013567ffffffffffffffff8111156106fb57600080fd5b8401601f8101861361070c57600080fd5b803567ffffffffffffffff81111561072357600080fd5b86602082840101111561073557600080fd5b939660209190910195509293505050565b60005b83811015610761578181015183820152602001610749565b50506000910152565b6000825161077c818460208701610746565b9190910192915050565b60208152600082518060208401526107a5816040850160208701610746565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122044336dde1fd288dccdc1db34736506c22b7bb081ddb4bbc9dccde116ff44295864736f6c634300081a0033","storage":{"0x0":"0x1","0xca":"0x12c0100000708","0xcd":"0x1","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xf5059a5d33d5853360d16c683c16e67980206f36","0x83978b4c69c48dd978ab43fe30f077615294f938fb7f936d9eb340e51ea7db2e":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x67d269191c92caf3cd7723f116c85e6e9bf55933"}},"0x860b6912c2d0337ef05bbc89b0c2cb6cbaeab4a5":{"nonce":0,"balance":"0x8ac7230489e80000","code":"0x","storage":{}},"0x8a791620dd6260079bf849dc5567adc3f2fdc318":{"nonce":1,"balance":"0x0","code":"0x6080604052600436106101855760003560e01c806374cdd798116100d1578063c49074421161008a578063e251ef5211610064578063e251ef5214610563578063e2c8344514610583578063f2882461146105a3578063fe80b087146105d757600080fd5b8063c490744214610503578063c4d66de814610523578063dda3346c1461054357600080fd5b806374cdd7981461044057806387e0d289146104745780639b4e46341461049b578063a50600f4146104ae578063b522538a146104ce578063baa7145a146104ee57600080fd5b806334bea20a1161013e57806358eaee791161011857806358eaee791461038f5780635d3f65b6146103bc5780636fcd0e53146103dc5780637439841f1461040957600080fd5b806334bea20a146103005780633f65cf191461033b5780634665bcda1461035b57600080fd5b80630b18ff66146101db5780630cd4649e146102185780631a5057be1461022f5780631d905d5c146102635780633106ab53146102af5780633474aa16146102e057600080fd5b366101d657346037600082825461019c9190614b56565b90915550506040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b3480156101e757600080fd5b506033546101fb906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561022457600080fd5b5061022d6105fb565b005b34801561023b57600080fd5b506101fb7f0000000000000000000000002279b7a0a67db372996a5fab50d91eaa73d2ebe681565b34801561026f57600080fd5b506102977f000000000000000000000000000000000000000000000000000000077359400081565b6040516001600160401b03909116815260200161020f565b3480156102bb57600080fd5b506034546102d090600160401b900460ff1681565b604051901515815260200161020f565b3480156102ec57600080fd5b50603454610297906001600160401b031681565b34801561030c57600080fd5b506102d061031b366004614b93565b603560209081526000928352604080842090915290825290205460ff1681565b34801561034757600080fd5b5061022d610356366004614c26565b610764565b34801561036757600080fd5b506101fb7f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c85381565b34801561039b57600080fd5b506103af6103aa366004614d37565b610c06565b60405161020f9190614db0565b3480156103c857600080fd5b50603854610297906001600160401b031681565b3480156103e857600080fd5b506103fc6103f7366004614dbe565b610c6b565b60405161020f9190614dd7565b34801561041557600080fd5b506103af610424366004614dbe565b600090815260366020526040902054600160c01b900460ff1690565b34801561044c57600080fd5b506101fb7f00000000000000000000000000000000219ab540356cbb839cbe05303d7705fa81565b34801561048057600080fd5b5060335461029790600160a01b90046001600160401b031681565b61022d6104a9366004614e1f565b610d18565b3480156104ba57600080fd5b5061022d6104c9366004614e92565b610ec5565b3480156104da57600080fd5b506103fc6104e9366004614d37565b611294565b3480156104fa57600080fd5b5061022d611387565b34801561050f57600080fd5b5061022d61051e366004614f3c565b6113f2565b34801561052f57600080fd5b5061022d61053e366004614f68565b61162f565b34801561054f57600080fd5b5061022d61055e366004615082565b611807565b34801561056f57600080fd5b5061022d61057e366004615153565b6119da565b34801561058f57600080fd5b5061022d61059e366004614f3c565b611da5565b3480156105af57600080fd5b506102977f000000000000000000000000000000000000000000000000000000006059f46081565b3480156105e357600080fd5b506105ed60375481565b60405190815260200161020f565b604051635ac86ab760e01b8152600260048201819052907f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8536001600160a01b031690635ac86ab790602401602060405180830381865afa158015610663573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610687919061524e565b156106ad5760405162461bcd60e51b81526004016106a490615270565b60405180910390fd5b6033546001600160a01b031633146106d75760405162461bcd60e51b81526004016106a4906152cd565b603454600160401b900460ff16156107015760405162461bcd60e51b81526004016106a490615315565b6034805460ff60401b1916600160401b179055603354610729906001600160a01b0316611f88565b6033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a250565b6033546001600160a01b0316331461078e5760405162461bcd60e51b81526004016106a4906152cd565b604051635ac86ab760e01b8152600260048201819052907f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8536001600160a01b031690635ac86ab790602401602060405180830381865afa1580156107f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081a919061524e565b156108375760405162461bcd60e51b81526004016106a490615270565b60335489906001600160401b03600160a01b9091048116908216101561086f5760405162461bcd60e51b81526004016106a490615364565b603454600160401b900460ff166108e75760405162461bcd60e51b815260206004820152603660248201527f456967656e506f642e686173456e61626c656452657374616b696e673a2072656044820152751cdd185ada5b99c81a5cc81b9bdd08195b98589b195960521b60648201526084016106a4565b86851480156108f557508483145b6109855760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a4016106a4565b4261099b613f486001600160401b038d16614b56565b1015610a245760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a4016106a4565b60405163d1c64cc960e01b81526001600160401b038b166004820152610acd907f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8536001600160a01b03169063d1c64cc990602401602060405180830381865afa158015610a95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab991906153f7565b8a35610ac860208d018d615410565b611fbc565b6000805b88811015610b7157610b538c8c358c8c85818110610af157610af1615456565b9050602002016020810190610b06919061546c565b8b8b86818110610b1857610b18615456565b9050602002810190610b2a9190615410565b8b8b88818110610b3c57610b3c615456565b9050602002810190610b4e9190615493565b61214a565b610b5d9083614b56565b915080610b69816154dc565b915050610ad1565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8539091169063c2c51c4090604401600060405180830381600087803b158015610be157600080fd5b505af1158015610bf5573d6000803e3d6000fd5b505050505050505050505050505050565b600080610c4884848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061260492505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610c936040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610cfe57610cfe614d78565b6002811115610d0f57610d0f614d78565b90525092915050565b336001600160a01b037f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8531614610d605760405162461bcd60e51b81526004016106a4906154f7565b346801bc16d674ec80000014610dec5760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a4016106a4565b7f00000000000000000000000000000000219ab540356cbb839cbe05303d7705fa6001600160a01b031663228951186801bc16d674ec8000008787610e2f6126fe565b8888886040518863ffffffff1660e01b8152600401610e53969594939291906155c9565b6000604051808303818588803b158015610e6c57600080fd5b505af1158015610e80573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e238585604051610eb6929190615618565b60405180910390a15050505050565b604051635ac86ab760e01b8152600360048201819052907f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8536001600160a01b031690635ac86ab790602401602060405180830381865afa158015610f2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f51919061524e565b15610f6e5760405162461bcd60e51b81526004016106a490615270565b8684148015610f7c57508382145b6110055760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e76657269667942616c616e6365557064617465733a207660448201527f616c696461746f72496e646963657320616e642070726f6f6673206d7573742060648201526d0c4ca40e6c2daca40d8cadccee8d60931b608482015260a4016106a4565b4261101b613f486001600160401b038c16614b56565b101561109d5760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e76657269667942616c616e6365557064617465733a207360448201527f70656369666965642074696d657374616d7020697320746f6f2066617220696e606482015264081c185cdd60da1b608482015260a4016106a4565b60405163d1c64cc960e01b81526001600160401b038a166004820152611141907f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8536001600160a01b03169063d1c64cc990602401602060405180830381865afa15801561110e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113291906153f7565b8735610ac860208a018a615410565b6000805b888110156111e5576111c78b8b8b8481811061116357611163615456565b9050602002016020810190611178919061546c565b8a358a8a8681811061118c5761118c615456565b905060200281019061119e9190615410565b8a8a888181106111b0576111b0615456565b90506020028101906111c29190615493565b612743565b6111d1908361562c565b9150806111dd816154dc565b915050611145565b506033546001600160a01b037f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c85381169163c2c51c40911661122a633b9aca008561566d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561127057600080fd5b505af1158015611284573d6000803e3d6000fd5b5050505050505050505050505050565b6112bc6040805160808101825260008082526020820181905291810182905290606082015290565b603660006112ff85858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061260492505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff16600281111561136c5761136c614d78565b600281111561137d5761137d614d78565b9052509392505050565b6033546001600160a01b031633146113b15760405162461bcd60e51b81526004016106a4906152cd565b603454600160401b900460ff16156113db5760405162461bcd60e51b81526004016106a490615315565b6033546113f0906001600160a01b0316611f88565b565b336001600160a01b037f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c853161461143a5760405162461bcd60e51b81526004016106a4906154f7565b611448633b9aca0082615708565b156114d25760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a4016106a4565b60006114e2633b9aca008361571c565b6034549091506001600160401b03908116908216111561159b5760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c4016106a4565b603480548291906000906115b99084906001600160401b0316615730565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161161891815260200190565b60405180910390a261162a8383612c21565b505050565b600054610100900460ff161580801561164f5750600054600160ff909116105b806116695750303b158015611669575060005460ff166001145b6116cc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106a4565b6000805460ff1916600117905580156116ef576000805461ff0019166101001790555b6001600160a01b0382166117625760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b60648201526084016106a4565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a28015611803576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6033546001600160a01b031633146118315760405162461bcd60e51b81526004016106a4906152cd565b604051635ac86ab760e01b8152600560048201819052907f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8536001600160a01b031690635ac86ab790602401602060405180830381865afa158015611899573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bd919061524e565b156118da5760405162461bcd60e51b81526004016106a490615270565b82518451146119655760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a4016106a4565b60005b84518110156119d3576119c18385838151811061198757611987615456565b60200260200101518784815181106119a1576119a1615456565b60200260200101516001600160a01b0316612c2b9092919063ffffffff16565b806119cb816154dc565b915050611968565b5050505050565b604051635ac86ab760e01b81526004808201819052907f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8536001600160a01b031690635ac86ab790602401602060405180830381865afa158015611a41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a65919061524e565b15611a825760405162461bcd60e51b81526004016106a490615270565b8386148015611a9057508588145b8015611a9b57508782145b611b0f576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f642e766572696679416e6450726f636573735769746864726160448201527f77616c733a20696e70757473206d7573742062652073616d65206c656e67746860648201526084016106a4565b60405163d1c64cc960e01b81526001600160401b038c166004820152611bb3907f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8536001600160a01b03169063d1c64cc990602401602060405180830381865afa158015611b80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba491906153f7565b8b35610ac860208e018e615410565b604080518082019091526000808252602082015260005b83811015611cb3576000611c6e8d358d8d85818110611beb57611beb615456565b9050602002810190611bfd9190615758565b8c8c86818110611c0f57611c0f615456565b9050602002810190611c219190615410565b8c8c88818110611c3357611c33615456565b9050602002810190611c459190615493565b8c8c8a818110611c5757611c57615456565b9050602002810190611c699190615493565b612c7d565b80518451919250908490611c83908390614b56565b9052506020808201519084018051611c9c90839061562c565b905250819050611cab816154dc565b915050611bca565b50805115611ce2576033548151611ce2916001600160a01b031690611cdd90633b9aca0090615779565b613169565b602081015115611d975760335460208201516001600160a01b037f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c85381169263c2c51c4092911690611d3890633b9aca009061566d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611d7e57600080fd5b505af1158015611d92573d6000803e3d6000fd5b505050505b505050505050505050505050565b6033546001600160a01b03163314611dcf5760405162461bcd60e51b81526004016106a4906152cd565b604051635ac86ab760e01b8152600560048201819052907f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8536001600160a01b031690635ac86ab790602401602060405180830381865afa158015611e37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5b919061524e565b15611e785760405162461bcd60e51b81526004016106a490615270565b603754821115611f295760405162461bcd60e51b815260206004820152606a60248201527f456967656e506f642e77697468647261776e6f6e426561636f6e436861696e4560448201527f544842616c616e63655765693a20616d6f756e74546f5769746864726177206960648201527f732067726561746572207468616e206e6f6e426561636f6e436861696e45544860848201526942616c616e636557656960b01b60a482015260c4016106a4565b8160376000828254611f3b9190615798565b90915550506040518281526001600160a01b038416907f30420aacd028abb3c1fd03aba253ae725d6ddd52d16c9ac4cb5742cd43f530969060200160405180910390a261162a8383613169565b6033805467ffffffffffffffff60a01b19164263ffffffff16600160a01b021790556000603755611fb98147613169565b50565b611fc860036020615779565b81146120585760405162461bcd60e51b815260206004820152605360248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a2050726f6f6620686064820152720c2e640d2dcc6dee4e4cac6e840d8cadccee8d606b1b608482015260a4016106a4565b61209d82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250889250879150600390506131f7565b6121445760405162461bcd60e51b815260206004820152606660248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a20496e76616c696460648201527f206c617465737420626c6f636b2068656164657220726f6f74206d65726b6c6560848201526510383937b7b360d11b60a482015260c4016106a4565b50505050565b60008061218984848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061320f92505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156121f8576121f8614d78565b600281111561220957612209614d78565b905250905060008160600151600281111561222657612226614d78565b146122cf5760405162461bcd60e51b815260206004820152606760248201527f456967656e506f642e766572696679436f72726563745769746864726177616c60448201527f43726564656e7469616c733a2056616c696461746f72206d757374206265206960648201527f6e61637469766520746f2070726f7665207769746864726177616c2063726564608482015266656e7469616c7360c81b60a482015260c4016106a4565b6122d76126fe565b6122e0906157af565b61231c86868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061323392505050565b146123a35760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e766572696679436f72726563745769746864726177616c60448201527f43726564656e7469616c733a2050726f6f66206973206e6f7420666f7220746860648201526a1a5cc8115a59d95b941bd960aa1b608482015260a4016106a4565b60006123e186868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061324892505050565b90506123f18a87878b8b8e61326d565b60398054906000612401836154dc565b90915550506001606083015264ffffffffff891682526001600160401b038b811660408401527f000000000000000000000000000000000000000000000000000000077359400081169082161115612487576001600160401b037f0000000000000000000000000000000000000000000000000000000773594000166020830152612497565b6001600160401b03811660208301525b6000838152603660209081526040918290208451815492860151938601516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060850151859391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b83600281111561253557612535614d78565b02179055505060405164ffffffffff8b1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a17f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df898c84602001516040516125d09392919064ffffffffff9390931683526001600160401b03918216602084015216604082015260600190565b60405180910390a1633b9aca0082602001516001600160401b03166125f59190615779565b9b9a5050505050505050505050565b6000815160301461268d5760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a4016106a4565b6040516002906126a49084906000906020016157d3565b60408051601f19818403018152908290526126be91615802565b602060405180830381855afa1580156126db573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610c6591906153f7565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b60008061278284848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061324892505050565b905060006127c285858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061320f92505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561283157612831614d78565b600281111561284257612842614d78565b8152505090508a6001600160401b031681604001516001600160401b0316106128f95760405162461bcd60e51b815260206004820152605c60248201527f456967656e506f642e76657269667942616c616e63655570646174653a20566160448201527f6c696461746f72732062616c616e63652068617320616c72656164792062656560648201527f6e207570646174656420666f7220746869732074696d657374616d7000000000608482015260a4016106a4565b60018160600151600281111561291157612911614d78565b146129795760405162461bcd60e51b815260206004820152603260248201527f456967656e506f642e76657269667942616c616e63655570646174653a2056616044820152716c696461746f72206e6f742061637469766560701b60648201526084016106a4565b6129828b6134c4565b6001600160401b03166129c78787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506135ae92505050565b6001600160401b031611612a6a576000836001600160401b031611612a6a5760405162461bcd60e51b815260206004820152604d60248201527f456967656e506f642e76657269667942616c616e63655570646174653a20766160448201527f6c696461746f7220697320776974686472617761626c6520627574206861732060648201526c3737ba103bb4ba34323930bbb760991b608482015260a4016106a4565b612a788987878b8b8f61326d565b602081015160006001600160401b037f000000000000000000000000000000000000000000000000000000077359400081169086161115612ada57507f0000000000000000000000000000000000000000000000000000000773594000612add565b50835b6001600160401b0380821660208086019182528f831660408088019182526000898152603690935290912086518154935192518516600160801b0267ffffffffffffffff60801b19938616600160401b026001600160801b031990951691909516179290921790811683178255606086015186939091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836002811115612b8557612b85614d78565b0217905550905050816001600160401b0316816001600160401b031614612c11577f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df8c8e83604051612bfc9392919064ffffffffff9390931683526001600160401b03918216602084015216604082015260600190565b60405180910390a1612c0e81836135c6565b95505b5050505050979650505050505050565b61180382826135e5565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261162a9084906136fe565b6040805180820190915260008082526020820152612ca2612c9d89615883565b6137d0565b6033546001600160401b03600160a01b90910481169082161015612cd85760405162461bcd60e51b81526004016106a490615364565b6000612ce6612c9d8b615883565b90506000612d2688888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061320f92505050565b905060008082815260366020526040902054600160c01b900460ff166002811115612d5357612d53614d78565b1415612e0a5760405162461bcd60e51b815260206004820152607460248201527f456967656e506f642e5f766572696679416e6450726f6365737357697468647260448201527f6177616c3a2056616c696461746f72206e657665722070726f76656e20746f2060648201527f68617665207769746864726177616c2063726564656e7469616c7320706f696e6084820152731d1959081d1bc81d1a1a5cc818dbdb9d1c9858dd60621b60a482015260c4016106a4565b60008181526035602090815260408083206001600160401b038616845290915290205460ff1615612ec95760405162461bcd60e51b815260206004820152605b60248201527f456967656e506f642e5f766572696679416e6450726f6365737357697468647260448201527f6177616c3a207769746864726177616c2068617320616c72656164792062656560648201527f6e2070726f76656e20666f7220746869732074696d657374616d700000000000608482015260a4016106a4565b6001603560008381526020019081526020016000206000846001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550612fa68c87878e7f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8536001600160a01b03166344e71c806040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fa191906159bf565b6137e0565b6000612fe487878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061420192505050565b9050612ff48d8a8a8e8e8661326d565b600061303288888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061421992505050565b90506130708a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506135ae92505050565b6001600160401b031661308a6130858f615883565b614231565b6001600160401b03161061314257603354600084815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b81049093169381019390935261313793869388938a936001600160a01b03909316928892916060830190600160c01b900460ff16600281111561311e5761311e614d78565b600281111561312f5761312f614d78565b905250614243565b95505050505061315c565b60335461313790839086906001600160a01b031684614481565b5098975050505050505050565b603354604051633036cd5360e21b81526001600160a01b03918216600482015283821660248201527f0000000000000000000000002279b7a0a67db372996a5fab50d91eaa73d2ebe69091169063c0db354c9083906044016000604051808303818588803b1580156131da57600080fd5b505af11580156131ee573d6000803e3d6000fd5b50505050505050565b60008361320586858561455f565b1495945050505050565b60008160008151811061322457613224615456565b60200260200101519050919050565b60008160018151811061322457613224615456565b6000610c658260028151811061326057613260615456565b60200260200101516146ab565b61327960036002615ac0565b84146133045760405162461bcd60e51b815260206004820152604e60248201527f426561636f6e436861696e50726f6f66732e76657269667956616c696461746f60448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a4016106a4565b600561331260286001614b56565b61331c9190614b56565b613327906020615779565b82146133a75760405162461bcd60e51b815260206004820152604360248201527f426561636f6e436861696e50726f6f66732e76657269667956616c696461746f60448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a4016106a4565b600064ffffffffff82166133bd60286001614b56565b600b901b179050600061340287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061471292505050565b905061344885858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c92508591508690506131f7565b6134ba5760405162461bcd60e51b815260206004820152603d60248201527f426561636f6e436861696e50726f6f66732e76657269667956616c696461746f60448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f6600000060648201526084016106a4565b5050505050505050565b60007f000000000000000000000000000000000000000000000000000000006059f4606001600160401b0316826001600160401b0316101561356e5760405162461bcd60e51b815260206004820152603760248201527f456967656e506f642e5f74696d657374616d70546f45706f63683a2074696d6560448201527f7374616d70206973206265666f72652067656e6573697300000000000000000060648201526084016106a4565b61357a600c6020615acc565b6135a47f000000000000000000000000000000000000000000000000000000006059f46084615730565b610c659190615afb565b6000610c658260078151811061326057613260615456565b60006135de6001600160401b03808416908516615b21565b9392505050565b804710156136355760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016106a4565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613682576040519150601f19603f3d011682016040523d82523d6000602084013e613687565b606091505b505090508061162a5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016106a4565b6000613753826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166149bf9092919063ffffffff16565b80519091501561162a5780806020019051810190613771919061524e565b61162a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106a4565b6000610c658261014001516146ab565b6137eb600280615ac0565b831461385f5760405162461bcd60e51b81526020600482015260496024820152600080516020615bd383398151915260448201527f616c3a207769746864726177616c4669656c64732068617320696e636f7272656064820152680c6e840d8cadccee8d60bb1b608482015260a4016106a4565b61386b600d6002615ac0565b61387b60c0840160a08501615b60565b6001600160401b0316106138e55760405162461bcd60e51b815260206004820152603f6024820152600080516020615bd383398151915260448201527f616c3a20626c6f636b526f6f74496e64657820697320746f6f206c617267650060648201526084016106a4565b6138f160046002615ac0565b613902610100840160e08501615b60565b6001600160401b03161061396e576040805162461bcd60e51b8152602060048201526024810191909152600080516020615bd383398151915260448201527f616c3a207769746864726177616c496e64657820697320746f6f206c6172676560648201526084016106a4565b61397a60186002615ac0565b61398a60e0840160c08501615b60565b6001600160401b031610613a045760405162461bcd60e51b81526020600482015260476024820152600080516020615bd383398151915260448201527f616c3a20686973746f726963616c53756d6d617279496e64657820697320746f6064820152666f206c6172676560c81b608482015260a4016106a4565b60006001600160401b038216613a1c612c9d85615883565b6001600160401b031610613a31576005613a34565b60045b9050613a41600482614b56565b613a4c906001614b56565b613a57906020615779565b613a618480615410565b905014613ad55760405162461bcd60e51b81526020600482015260486024820152600080516020615bd383398151915260448201527f616c3a207769746864726177616c50726f6f662068617320696e636f727265636064820152670e840d8cadccee8d60c31b608482015260a4016106a4565b613ae160046003614b56565b613aec906020615779565b613af96040850185615410565b905014613b735760405162461bcd60e51b815260206004820152604e6024820152600080516020615bd383398151915260448201527f616c3a20657865637574696f6e5061796c6f616450726f6f662068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a4016106a4565b613b7f60036020615779565b613b8c6020850185615410565b905014613bfa5760405162461bcd60e51b81526020600482015260426024820152600080516020615bd383398151915260448201527f616c3a20736c6f7450726f6f662068617320696e636f7272656374206c656e676064820152610e8d60f31b608482015260a4016106a4565b613c05816020615779565b613c126060850185615410565b905014613c855760405162461bcd60e51b81526020600482015260476024820152600080516020615bd383398151915260448201527f616c3a2074696d657374616d7050726f6f662068617320696e636f7272656374606482015266040d8cadccee8d60cb1b608482015260a4016106a4565b600d613c9360186001614b56565b613c9e906005614b56565b613ca9906001614b56565b613cb39190614b56565b613cbe906020615779565b613ccb6080850185615410565b905014613d545760405162461bcd60e51b81526020600482015260586024820152600080516020615bd383398151915260448201527f616c3a20686973746f726963616c53756d6d617279426c6f636b526f6f74507260648201527f6f6f662068617320696e636f7272656374206c656e6774680000000000000000608482015260a4016106a4565b6000613d6660c0850160a08601615b60565b6001600160401b03166000613d7d600d6001614b56565b613d8d60e0880160c08901615b60565b6001600160401b0316901b600d613da660186001614b56565b613db1906001614b56565b613dbb9190614b56565b601b901b1717179050613e16613dd46080860186615410565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b92505050610100870135846131f7565b613e895760405162461bcd60e51b815260206004820152604a6024820152600080516020615bd383398151915260448201527f616c3a20496e76616c696420686973746f726963616c73756d6d617279206d656064820152693935b63290383937b7b360b11b608482015260a4016106a4565b613ee0613e996020860186615410565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052506101008a013593506101208a0135925090506131f7565b613f405760405162461bcd60e51b815260206004820152603d6024820152600080516020615bd383398151915260448201527f616c3a20496e76616c696420736c6f74206d65726b6c652070726f6f6600000060648201526084016106a4565b6049613f98613f526040870187615410565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610100870135610160880135846131f7565b61400a5760405162461bcd60e51b81526020600482015260496024820152600080516020615bd383398151915260448201527f616c3a20496e76616c696420657865637574696f6e5061796c6f6164206d657260648201526835b63290383937b7b360b91b608482015260a4016106a4565b5061406261401b6060860186615410565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061016086013561014087013560096131f7565b6140cd5760405162461bcd60e51b81526020600482015260426024820152600080516020615bd383398151915260448201527f616c3a20496e76616c69642074696d657374616d70206d65726b6c652070726f60648201526137b360f11b608482015260a4016106a4565b60006140e0610100860160e08701615b60565b6001600160401b03166140f560046001614b56565b600e901b179050600061413a88888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061471292505050565b905061418a6141498780615410565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061016088013583856131f7565b6141f65760405162461bcd60e51b81526020600482015260436024820152600080516020615bd383398151915260448201527f616c3a20496e76616c6964207769746864726177616c206d65726b6c6520707260648201526237b7b360e91b608482015260a4016106a4565b505050505050505050565b6000610c658260018151811061326057613260615456565b6000610c658260038151811061326057613260615456565b600060206135a48361012001516146ab565b604080518082019091526000808252602082015260007f00000000000000000000000000000000000000000000000000000007735940006001600160401b0316846001600160401b031611156142ba57507f00000000000000000000000000000000000000000000000000000007735940006142bd565b50825b60408051808201909152600080825260208201526142db8286615730565b6001600160401b0390811682526034805484926000916142fd91859116615b7d565b92506101000a8154816001600160401b0302191690836001600160401b0316021790555061432f8285602001516135c6565b602082015260028460600151600281111561434c5761434c614d78565b1461436e576039805490600061436183615ba8565b9091555050600260608501525b600060208086018281528a83526036909152604091829020865181549251938801516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516929091169190911792909217928316821781556060870151879391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b83600281111561441357614413614d78565b0217905550506040805164ffffffffff8c1681526001600160401b038a8116602083015288168183015290516001600160a01b03891692507fb76a93bb649ece524688f1a01d184e0bbebcda58eae80c28a898bec3fb5a09639181900360600190a298975050505050505050565b60408051808201909152600080825260208201526040805164ffffffffff871681526001600160401b0380871660208301528416918101919091526001600160a01b038416907f8a7335714231dbd551aaba6314f4a97a14c201e53a3e25e1140325cdf67d7a4e9060600160405180910390a2603880548391906000906145129084906001600160401b0316615b7d565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506040518060400160405280836001600160401b0316815260200160008152509050949350505050565b6000835160001415801561457e57506020845161457c9190615708565b155b61460d5760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a4016106a4565b604080516020808201909252848152905b855181116146a157614631600285615708565b614664578151600052808601516020526020826040600060026107d05a03fa61465957600080fd5b60028404935061468f565b8086015160005281516020526020826040600060026107d05a03fa61468857600080fd5b6002840493505b61469a602082614b56565b905061461e565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b60008060028351614723919061571c565b90506000816001600160401b0381111561473f5761473f614f85565b604051908082528060200260200182016040528015614768578160200160208202803683370190505b50905060005b8281101561486f576002856147838383615779565b8151811061479357614793615456565b6020026020010151868360026147a99190615779565b6147b4906001614b56565b815181106147c4576147c4615456565b60200260200101516040516020016147e6929190918252602082015260400190565b60408051601f198184030181529082905261480091615802565b602060405180830381855afa15801561481d573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061484091906153f7565b82828151811061485257614852615456565b602090810291909101015280614867816154dc565b91505061476e565b5061487b60028361571c565b91505b811561499b5760005b828110156149885760028261489c8383615779565b815181106148ac576148ac615456565b6020026020010151838360026148c29190615779565b6148cd906001614b56565b815181106148dd576148dd615456565b60200260200101516040516020016148ff929190918252602082015260400190565b60408051601f198184030181529082905261491991615802565b602060405180830381855afa158015614936573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061495991906153f7565b82828151811061496b5761496b615456565b602090810291909101015280614980816154dc565b915050614887565b5061499460028361571c565b915061487e565b806000815181106149ae576149ae615456565b602002602001015192505050919050565b60606149ce84846000856149d6565b949350505050565b606082471015614a375760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106a4565b6001600160a01b0385163b614a8e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106a4565b600080866001600160a01b03168587604051614aaa9190615802565b60006040518083038185875af1925050503d8060008114614ae7576040519150601f19603f3d011682016040523d82523d6000602084013e614aec565b606091505b5091509150614afc828286614b07565b979650505050505050565b60608315614b165750816135de565b825115614b265782518084602001fd5b8160405162461bcd60e51b81526004016106a49190615bbf565b634e487b7160e01b600052601160045260246000fd5b60008219821115614b6957614b69614b40565b500190565b6001600160401b0381168114611fb957600080fd5b8035614b8e81614b6e565b919050565b60008060408385031215614ba657600080fd5b823591506020830135614bb881614b6e565b809150509250929050565b600060408284031215614bd557600080fd5b50919050565b60008083601f840112614bed57600080fd5b5081356001600160401b03811115614c0457600080fd5b6020830191508360208260051b8501011115614c1f57600080fd5b9250929050565b60008060008060008060008060a0898b031215614c4257600080fd5b8835614c4d81614b6e565b975060208901356001600160401b0380821115614c6957600080fd5b614c758c838d01614bc3565b985060408b0135915080821115614c8b57600080fd5b614c978c838d01614bdb565b909850965060608b0135915080821115614cb057600080fd5b614cbc8c838d01614bdb565b909650945060808b0135915080821115614cd557600080fd5b50614ce28b828c01614bdb565b999c989b5096995094979396929594505050565b60008083601f840112614d0857600080fd5b5081356001600160401b03811115614d1f57600080fd5b602083019150836020828501011115614c1f57600080fd5b60008060208385031215614d4a57600080fd5b82356001600160401b03811115614d6057600080fd5b614d6c85828601614cf6565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110614dac57634e487b7160e01b600052602160045260246000fd5b9052565b60208101610c658284614d8e565b600060208284031215614dd057600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151614e186060840182614d8e565b5092915050565b600080600080600060608688031215614e3757600080fd5b85356001600160401b0380821115614e4e57600080fd5b614e5a89838a01614cf6565b90975095506020880135915080821115614e7357600080fd5b50614e8088828901614cf6565b96999598509660400135949350505050565b60008060008060008060008060a0898b031215614eae57600080fd5b8835614eb981614b6e565b975060208901356001600160401b0380821115614ed557600080fd5b614ee18c838d01614bdb565b909950975060408b0135915080821115614efa57600080fd5b614f068c838d01614bc3565b965060608b0135915080821115614cb057600080fd5b6001600160a01b0381168114611fb957600080fd5b8035614b8e81614f1c565b60008060408385031215614f4f57600080fd5b8235614f5a81614f1c565b946020939093013593505050565b600060208284031215614f7a57600080fd5b81356135de81614f1c565b634e487b7160e01b600052604160045260246000fd5b60405161018081016001600160401b0381118282101715614fbe57614fbe614f85565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614fec57614fec614f85565b604052919050565b60006001600160401b0382111561500d5761500d614f85565b5060051b60200190565b600082601f83011261502857600080fd5b8135602061503d61503883614ff4565b614fc4565b82815260059290921b8401810191818101908684111561505c57600080fd5b8286015b848110156150775780358352918301918301615060565b509695505050505050565b60008060006060848603121561509757600080fd5b83356001600160401b03808211156150ae57600080fd5b818601915086601f8301126150c257600080fd5b813560206150d261503883614ff4565b82815260059290921b8401810191818101908a8411156150f157600080fd5b948201945b8386101561511857853561510981614f1c565b825294820194908201906150f6565b9750508701359250508082111561512e57600080fd5b5061513b86828701615017565b92505061514a60408501614f31565b90509250925092565b60008060008060008060008060008060c08b8d03121561517257600080fd5b61517b8b614b83565b995060208b01356001600160401b038082111561519757600080fd5b6151a38e838f01614bc3565b9a5060408d01359150808211156151b957600080fd5b6151c58e838f01614bdb565b909a50985060608d01359150808211156151de57600080fd5b6151ea8e838f01614bdb565b909850965060808d013591508082111561520357600080fd5b61520f8e838f01614bdb565b909650945060a08d013591508082111561522857600080fd5b506152358d828e01614bdb565b915080935050809150509295989b9194979a5092959850565b60006020828403121561526057600080fd5b815180151581146135de57600080fd5b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b6020808252602f908201527f456967656e506f642e6861734e6576657252657374616b65643a20726573746160408201526e1ada5b99c81a5cc8195b98589b1959608a1b606082015260800190565b60208082526067908201527f456967656e506f642e70726f6f664973466f7256616c696454696d657374616d60408201527f703a20626561636f6e20636861696e2070726f6f66206d75737420626520617460608201527f206f72206166746572206d6f7374526563656e745769746864726177616c546960808201526606d657374616d760cc1b60a082015260c00190565b60006020828403121561540957600080fd5b5051919050565b6000808335601e1984360301811261542757600080fd5b8301803591506001600160401b0382111561544157600080fd5b602001915036819003821315614c1f57600080fd5b634e487b7160e01b600052603260045260246000fd5b60006020828403121561547e57600080fd5b813564ffffffffff811681146135de57600080fd5b6000808335601e198436030181126154aa57600080fd5b8301803591506001600160401b038211156154c457600080fd5b6020019150600581901b3603821315614c1f57600080fd5b60006000198214156154f0576154f0614b40565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b8381101561558c578181015183820152602001615574565b838111156121445750506000910152565b600081518084526155b5816020860160208601615571565b601f01601f19169290920160200192915050565b6080815260006155dd60808301888a615548565b82810360208401526155ef818861559d565b90508281036040840152615604818688615548565b915050826060830152979650505050505050565b6020815260006149ce602083018486615548565b600080821280156001600160ff1b038490038513161561564e5761564e614b40565b600160ff1b839003841281161561566757615667614b40565b50500190565b60006001600160ff1b038184138284138082168684048611161561569357615693614b40565b600160ff1b60008712828116878305891216156156b2576156b2614b40565b600087129250878205871284841616156156ce576156ce614b40565b878505871281841616156156e4576156e4614b40565b505050929093029392505050565b634e487b7160e01b600052601260045260246000fd5b600082615717576157176156f2565b500690565b60008261572b5761572b6156f2565b500490565b60006001600160401b038381169083168181101561575057615750614b40565b039392505050565b6000823561017e1983360301811261576f57600080fd5b9190910192915050565b600081600019048311821515161561579357615793614b40565b500290565b6000828210156157aa576157aa614b40565b500390565b80516020808301519190811015614bd55760001960209190910360031b1b16919050565b600083516157e5818460208801615571565b6001600160801b0319939093169190920190815260100192915050565b6000825161576f818460208701615571565b600082601f83011261582557600080fd5b81356001600160401b0381111561583e5761583e614f85565b615851601f8201601f1916602001614fc4565b81815284602083860101111561586657600080fd5b816020850160208301376000918101602001919091529392505050565b6000610180823603121561589657600080fd5b61589e614f9b565b82356001600160401b03808211156158b557600080fd5b6158c136838701615814565b835260208501359150808211156158d757600080fd5b6158e336838701615814565b602084015260408501359150808211156158fc57600080fd5b61590836838701615814565b6040840152606085013591508082111561592157600080fd5b61592d36838701615814565b6060840152608085013591508082111561594657600080fd5b5061595336828601615814565b60808301525061596560a08401614b83565b60a082015261597660c08401614b83565b60c082015261598760e08401614b83565b60e082015261010083810135908201526101208084013590820152610140808401359082015261016092830135928101929092525090565b6000602082840312156159d157600080fd5b81516135de81614b6e565b600181815b80851115615a175781600019048211156159fd576159fd614b40565b80851615615a0a57918102915b93841c93908002906159e1565b509250929050565b600082615a2e57506001610c65565b81615a3b57506000610c65565b8160018114615a515760028114615a5b57615a77565b6001915050610c65565b60ff841115615a6c57615a6c614b40565b50506001821b610c65565b5060208310610133831016604e8410600b8410161715615a9a575081810a610c65565b615aa483836159dc565b8060001904821115615ab857615ab8614b40565b029392505050565b60006135de8383615a1f565b60006001600160401b0380831681851681830481118215151615615af257615af2614b40565b02949350505050565b60006001600160401b0380841680615b1557615b156156f2565b92169190910492915050565b60008083128015600160ff1b850184121615615b3f57615b3f614b40565b6001600160ff1b0384018313811615615b5a57615b5a614b40565b50500390565b600060208284031215615b7257600080fd5b81356135de81614b6e565b60006001600160401b03808316818516808303821115615b9f57615b9f614b40565b01949350505050565b600081615bb757615bb7614b40565b506000190190565b6020815260006135de602083018461559d56fe426561636f6e436861696e50726f6f66732e7665726966795769746864726177a2646970667358221220656981dc5145bc9ae56cad10b3325a82c4c3e09907c3ad02552c669c762bf1c664736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x90f79bf6eb2c4f870365e785982e1f101e93b906":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x959922be3caee4b8cd9a407cc3ac1c251c2007b1":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061014b5760003560e01c806385594e58116100b6578063e4f4f8871161006f578063e4f4f887146103cc578063e5db06c014610405578063eb990c5914610425578063ecb7cb1b14610445578063f2fde38b14610472578063fabc1cbc1461049257600080fd5b806385594e5814610317578063886f1195146103445780638da5cb5b14610364578063c0db354c14610382578063ca661c0414610395578063d44e1b76146103ac57600080fd5b806350f73e7c1161010857806350f73e7c14610254578063595c6a67146102785780635ac86ab71461028d5780635c975abb146102cd578063715018a6146102e257806375608896146102f757600080fd5b806310d67a2f14610150578063136439dd146101725780631f39d87f146101925780633e1de008146101c85780634665bcda146101e85780634d50f9a414610234575b600080fd5b34801561015c57600080fd5b5061017061016b36600461196d565b6104b2565b005b34801561017e57600080fd5b5061017061018d366004611991565b61056e565b34801561019e57600080fd5b506101b26101ad36600461196d565b6106ad565b6040516101bf91906119c8565b60405180910390f35b3480156101d457600080fd5b506101b26101e336600461196d565b6108a8565b3480156101f457600080fd5b5061021c7f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c85381565b6040516001600160a01b0390911681526020016101bf565b34801561024057600080fd5b5061017061024f366004611991565b6109ee565b34801561026057600080fd5b5061026a60c95481565b6040519081526020016101bf565b34801561028457600080fd5b506101706109ff565b34801561029957600080fd5b506102bd6102a8366004611a15565b609854600160ff9092169190911b9081161490565b60405190151581526020016101bf565b3480156102d957600080fd5b5060985461026a565b3480156102ee57600080fd5b50610170610ac6565b34801561030357600080fd5b506102bd610312366004611a38565b610ada565b34801561032357600080fd5b50610337610332366004611a38565b610b5d565b6040516101bf9190611a64565b34801561035057600080fd5b5060975461021c906001600160a01b031681565b34801561037057600080fd5b506033546001600160a01b031661021c565b610170610390366004611a72565b610bdd565b3480156103a157600080fd5b5061026a62034bc081565b3480156103b857600080fd5b506101706103c7366004611991565b610e9d565b3480156103d857600080fd5b5061026a6103e736600461196d565b6001600160a01b0316600090815260ca602052604090206001015490565b34801561041157600080fd5b50610170610420366004611a38565b610f31565b34801561043157600080fd5b50610170610440366004611aab565b610fc6565b34801561045157600080fd5b5061046561046036600461196d565b6110ee565b6040516101bf9190611af1565b34801561047e57600080fd5b5061017061048d36600461196d565b6111a8565b34801561049e57600080fd5b506101706104ad366004611991565b61121e565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610505573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105299190611b47565b6001600160a01b0316336001600160a01b0316146105625760405162461bcd60e51b815260040161055990611b64565b60405180910390fd5b61056b8161137a565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156105b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105da9190611bae565b6105f65760405162461bcd60e51b815260040161055990611bd0565b6098548181161461066f5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610559565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926106da8383611c2e565b90508060005b82811015610786576001600160a01b038716600090815260ca6020526040812060010161070d8388611c45565b8154811061071d5761071d611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061076391611c45565b4310156107735781925050610786565b508061077e81611c73565b9150506106e0565b508060008167ffffffffffffffff8111156107a3576107a3611c8e565b6040519080825280602002602001820160405280156107e857816020015b60408051808201909152600080825260208201528152602001906001900390816107c15790505b509050811561089d5760005b8281101561089b576001600160a01b038916600090815260ca602052604090206001016108218289611c45565b8154811061083157610831611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810191909152825183908390811061087d5761087d611c5d565b6020026020010181905250808061089390611c73565b9150506107f4565b505b979650505050505050565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926108d58383611c2e565b905060008167ffffffffffffffff8111156108f2576108f2611c8e565b60405190808252806020026020018201604052801561093757816020015b60408051808201909152600080825260208201528152602001906001900390816109105790505b50905060005b828110156109e4576001600160a01b038716600090815260ca6020526040902060010161096a8287611c45565b8154811061097a5761097a611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff169181019190915282518390839081106109c6576109c6611c5d565b602002602001018190525080806109dc90611c73565b91505061093d565b5095945050505050565b6109f6611471565b61056b816114cb565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6b9190611bae565b610a875760405162461bcd60e51b815260040161055990611bd0565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610ace611471565b610ad86000611593565b565b6001600160a01b038216600090815260ca60205260408120548210801590610b54575060c9546001600160a01b038416600090815260ca60205260409020600101805484908110610b2d57610b2d611c5d565b600091825260209091200154610b509190600160e01b900463ffffffff16611c45565b4310155b90505b92915050565b60408051808201909152600080825260208201526001600160a01b038316600090815260ca60205260409020600101805483908110610b9e57610b9e611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff16918101919091529392505050565b60405163a38406a360e01b81526001600160a01b038084166004830152839133917f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c853169063a38406a390602401602060405180830381865afa158015610c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6b9190611b47565b6001600160a01b031614610ce75760405162461bcd60e51b815260206004820152603d60248201527f44656c617965645769746864726177616c526f757465722e6f6e6c794569676560448201527f6e506f643a206e6f7420706f644f776e6572277320456967656e506f640000006064820152608401610559565b60985460009060019081161415610d105760405162461bcd60e51b815260040161055990611ca4565b6001600160a01b038316610da65760405162461bcd60e51b815260206004820152605160248201527f44656c617965645769746864726177616c526f757465722e637265617465446560448201527f6c617965645769746864726177616c3a20726563697069656e742063616e6e6f60648201527074206265207a65726f206164647265737360781b608482015260a401610559565b346001600160e01b03811615610e96576040805180820182526001600160e01b03808416825263ffffffff43811660208085019182526001600160a01b038a16600081815260ca8352968720600190810180548083018255818a5293892088519551909616600160e01b029490961693909317939091019290925593525490917fb8f1b14c7caf74150801dcc9bc18d575cbeaf5b421943497e409df92c92e0f5991889188918691610e5791611c2e565b604080516001600160a01b0395861681529490931660208501526001600160e01b039091169183019190915260608201526080015b60405180910390a1505b5050505050565b60026065541415610ef05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610559565b600260655560985460009060019081161415610f1e5760405162461bcd60e51b815260040161055990611ca4565b610f2833836115e5565b50506001606555565b60026065541415610f845760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610559565b600260655560985460009060019081161415610fb25760405162461bcd60e51b815260040161055990611ca4565b610fbc83836115e5565b5050600160655550565b600054610100900460ff1615808015610fe65750600054600160ff909116105b806110005750303b158015611000575060005460ff166001145b6110635760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610559565b6000805460ff191660011790558015611086576000805461ff0019166101001790555b61108f85611593565b6110998484611750565b6110a2826114cb565b8015610e96576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6040805180820190915260008152606060208201526001600160a01b038216600090815260ca6020908152604080832081518083018352815481526001820180548451818702810187019095528085529195929486810194939192919084015b8282101561119a57600084815260209081902060408051808201909152908401546001600160e01b0381168252600160e01b900463ffffffff168183015282526001909201910161114e565b505050915250909392505050565b6111b0611471565b6001600160a01b0381166112155760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610559565b61056b81611593565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611271573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112959190611b47565b6001600160a01b0316336001600160a01b0316146112c55760405162461bcd60e51b815260040161055990611b64565b6098541981196098541916146113435760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610559565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016106a2565b6001600160a01b0381166114085760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610559565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314610ad85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610559565b62034bc08111156115525760405162461bcd60e51b815260206004820152604560248201527f44656c617965645769746864726177616c526f757465722e5f7365745769746860448201527f64726177616c44656c6179426c6f636b733a206e657756616c756520746f6f206064820152646c6172676560d81b608482015260a401610559565b60c95460408051918252602082018390527f4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e910160405180910390a160c955565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600090815260ca602052604081208054600190910154825b848110801561161e57508161161c8285611c45565b105b156116cb576001600160a01b038616600090815260ca602052604081206001016116488386611c45565b8154811061165857611658611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061169e91611c45565b4310156116ab57506116cb565b80516116c0906001600160e01b031686611c45565b945050600101611607565b6116d58184611c45565b6001600160a01b038716600090815260ca602052604090205583156116fe576116fe868561183a565b7f6b7151500bd0b5cc211bcc47b3029831b769004df4549e8e1c9a69da05bb0943868561172b8487611c45565b604080516001600160a01b039094168452602084019290925290820152606001610e8c565b6097546001600160a01b031615801561177157506001600160a01b03821615155b6117f35760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610559565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26118368261137a565b5050565b8047101561188a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610559565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146118d7576040519150601f19603f3d011682016040523d82523d6000602084013e6118dc565b606091505b50509050806119535760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610559565b505050565b6001600160a01b038116811461056b57600080fd5b60006020828403121561197f57600080fd5b813561198a81611958565b9392505050565b6000602082840312156119a357600080fd5b5035919050565b80516001600160e01b0316825260209081015163ffffffff16910152565b602080825282518282018190526000919060409081850190868401855b82811015611a08576119f88483516119aa565b92840192908501906001016119e5565b5091979650505050505050565b600060208284031215611a2757600080fd5b813560ff8116811461198a57600080fd5b60008060408385031215611a4b57600080fd5b8235611a5681611958565b946020939093013593505050565b60408101610b5782846119aa565b60008060408385031215611a8557600080fd5b8235611a9081611958565b91506020830135611aa081611958565b809150509250929050565b60008060008060808587031215611ac157600080fd5b8435611acc81611958565b93506020850135611adc81611958565b93969395505050506040820135916060013590565b602080825282518282015282810151604080840181905281516060850181905260009392830191849160808701905b8084101561089b57611b338286516119aa565b938501936001939093019290820190611b20565b600060208284031215611b5957600080fd5b815161198a81611958565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611bc057600080fd5b8151801515811461198a57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015611c4057611c40611c18565b500390565b60008219821115611c5857611c58611c18565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415611c8757611c87611c18565b5060010190565b634e487b7160e01b600052604160045260246000fd5b60208082526019908201527f5061757361626c653a20696e646578206973207061757365640000000000000060408201526060019056fea2646970667358221220b8660745cc3b9b958e75e5d12c71052676f8295b2a767105fa42f36d63e58d2164736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x976ea74026e726554db657fa54763abd0c3a0aa9":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x9965507d1a55bcc2695c58ba16fb37d819b0a4dc":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x9a676e781a523b5d0c0e43731313a708cb607508":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106101f05760003560e01c80637cf72bba1161010f578063d98128c0116100a2578063e921d4fa11610071578063e921d4fa146103c6578063f2fde38b1461044c578063f73b7519146102a9578063fabc1cbc1461045f57600080fd5b8063d98128c014610430578063da16e29b14610322578063df5cf723146102ba578063e58398361461043e57600080fd5b80638da5cb5b116100de5780638da5cb5b146103b5578063a49db732146103c6578063c747075b146103da578063d7b7fa13146103ee57600080fd5b80637cf72bba146103465780638105e04314610354578063855fcc4a1461036b578063886f1195146103a257600080fd5b806339b70e38116101875780636f0c2f74116101565780636f0c2f7414610322578063715018a614610330578063723e59c7146103385780637259a45c1461024257600080fd5b806339b70e38146102ba578063595c6a67146102d55780635ac86ab7146102dd5780635c975abb1461031057600080fd5b80631794bb3c116101c35780631794bb3c1461022f5780631874e5ae14610242578063282670fc1461027257806338c8ee64146102a957600080fd5b80630ffabbce146101f557806310d67a2f14610209578063136439dd1461021c578063175d3205146101f5575b600080fd5b610207610203366004610b25565b5050565b005b610207610217366004610b5a565b610472565b61020761022a366004610b7e565b61052b565b61020761023d366004610b97565b505050565b610258610250366004610b25565b600092915050565b60405163ffffffff90911681526020015b60405180910390f35b610285610280366004610bd8565b61066a565b60408051825163ffffffff9081168252602093840151169281019290925201610269565b6102076102b7366004610b5a565b50565b60005b6040516001600160a01b039091168152602001610269565b610207610685565b6103006102eb366004610c04565b606654600160ff9092169190911b9081161490565b6040519015158152602001610269565b6066545b604051908152602001610269565b610258610250366004610c27565b61020761074c565b610314610250366004610b25565b610207610203366004610c60565b610300610362366004610cd5565b60009392505050565b610385610379366004610c27565b60008060009250925092565b604080519315158452602084019290925290820152606001610269565b6065546102bd906001600160a01b031681565b6033546001600160a01b03166102bd565b6103146103d4366004610b5a565b50600090565b6102076103e8366004610d13565b50505050565b6104016103fc366004610c27565b610760565b60408051825163ffffffff90811682526020808501518216908301529282015190921690820152606001610269565b610300610250366004610c27565b6103006103d4366004610b5a565b61020761045a366004610b5a565b610782565b61020761046d366004610b7e565b6107f8565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e99190610d60565b6001600160a01b0316336001600160a01b0316146105225760405162461bcd60e51b815260040161051990610d7d565b60405180910390fd5b6102b781610954565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610573573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105979190610dc7565b6105b35760405162461bcd60e51b815260040161051990610de9565b6066548181161461062c5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610519565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b60408051808201909152600080825260208201525b92915050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f19190610dc7565b61070d5760405162461bcd60e51b815260040161051990610de9565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610754610a4b565b61075e6000610aa5565b565b604080516060810182526000808252602082018190529181019190915261067f565b61078a610a4b565b6001600160a01b0381166107ef5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610519565b6102b781610aa5565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561084b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086f9190610d60565b6001600160a01b0316336001600160a01b03161461089f5760405162461bcd60e51b815260040161051990610d7d565b60665419811960665419161461091d5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610519565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161065f565b6001600160a01b0381166109e25760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610519565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b0316331461075e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610519565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03811681146102b757600080fd5b803563ffffffff81168114610b2057600080fd5b919050565b60008060408385031215610b3857600080fd5b8235610b4381610af7565b9150610b5160208401610b0c565b90509250929050565b600060208284031215610b6c57600080fd5b8135610b7781610af7565b9392505050565b600060208284031215610b9057600080fd5b5035919050565b600080600060608486031215610bac57600080fd5b8335610bb781610af7565b92506020840135610bc781610af7565b929592945050506040919091013590565b60008060408385031215610beb57600080fd5b8235610bf681610af7565b946020939093013593505050565b600060208284031215610c1657600080fd5b813560ff81168114610b7757600080fd5b60008060408385031215610c3a57600080fd5b8235610c4581610af7565b91506020830135610c5581610af7565b809150509250929050565b60008060208385031215610c7357600080fd5b823567ffffffffffffffff80821115610c8b57600080fd5b818501915085601f830112610c9f57600080fd5b813581811115610cae57600080fd5b8660208260051b8501011115610cc357600080fd5b60209290920196919550909350505050565b600080600060608486031215610cea57600080fd5b8335610cf581610af7565b9250610d0360208501610b0c565b9150604084013590509250925092565b60008060008060808587031215610d2957600080fd5b8435610d3481610af7565b9350610d4260208601610b0c565b9250610d5060408601610b0c565b9396929550929360600135925050565b600060208284031215610d7257600080fd5b8151610b7781610af7565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215610dd957600080fd5b81518015158114610b7757600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b60608201526080019056fea2646970667358221220ec99a32f2c569b5578da9dbc14954b22f3a80ad1a966a02eb8121148f8fe942464736f6c634300080c0033","storage":{}},"0x9e545e3c0baab3e08cdfd552c960a1050f373042":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106a6565b610118565b61005b6100933660046106c1565b610155565b3480156100a457600080fd5b506100ad6101bc565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106a6565b6101ed565b3480156100f557600080fd5b506100ad61020d565b61010661022e565b6101166101116102c3565b6102cd565b565b6101206102f1565b6001600160a01b0316330361014d5761014a81604051806020016040528060008152506000610324565b50565b61014a6100fe565b61015d6102f1565b6001600160a01b031633036101b4576101af8383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525060019250610324915050565b505050565b6101af6100fe565b60006101c66102f1565b6001600160a01b031633036101e2576101dd6102c3565b905090565b6101ea6100fe565b90565b6101f56102f1565b6001600160a01b0316330361014d5761014a8161034f565b60006102176102f1565b6001600160a01b031633036101e2576101dd6102f1565b6102366102f1565b6001600160a01b031633036101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101dd6103a3565b3660008037600080366000845af43d6000803e8080156102ec573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b61032d836103cb565b60008251118061033a5750805b156101af57610349838361040b565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103786102f1565b604080516001600160a01b03928316815291841660208301520160405180910390a161014a81610437565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610315565b6103d4816104e0565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606061043083836040518060600160405280602781526020016107ba60279139610574565b9392505050565b6001600160a01b03811661049c5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084016102ba565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b0381163b61054d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016102ba565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6104bf565b60606001600160a01b0384163b6105dc5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016102ba565b600080856001600160a01b0316856040516105f7919061076a565b600060405180830381855af49150503d8060008114610632576040519150601f19603f3d011682016040523d82523d6000602084013e610637565b606091505b5091509150610647828286610651565b9695505050505050565b60608315610660575081610430565b8251156106705782518084602001fd5b8160405162461bcd60e51b81526004016102ba9190610786565b80356001600160a01b03811681146106a157600080fd5b919050565b6000602082840312156106b857600080fd5b6104308261068a565b6000806000604084860312156106d657600080fd5b6106df8461068a565b9250602084013567ffffffffffffffff8111156106fb57600080fd5b8401601f8101861361070c57600080fd5b803567ffffffffffffffff81111561072357600080fd5b86602082840101111561073557600080fd5b939660209190910195509293505050565b60005b83811015610761578181015183820152602001610749565b50506000910152565b6000825161077c818460208701610746565b9190910192915050565b60208152600082518060208401526107a5816040850160208701610746565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122044336dde1fd288dccdc1db34736506c22b7bb081ddb4bbc9dccde116ff44295864736f6c634300081a0033","storage":{"0x0":"0x1","0x33":"0x67d269191c92caf3cd7723f116c85e6e9bf55933","0x66":"0x1","0x68":"0x84ea74d481ee0a5332c457a4d796187f6ba67feb","0x6b":"0x1","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xa82ff9afd8f496c3d6ac40e2a0f282e47488cfc9","0x46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e94354":"0x271009635f643e140090a9a8dcd712ed6285858cebef","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x67d269191c92caf3cd7723f116c85e6e9bf55933","0xbd43cb8ece8cd1863bcd6082d65c5b0d25665b1ce17980f0da43c0ed545f98b4":"0x100000004"}},"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0":{"nonce":1,"balance":"0x0","code":"0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063c298557814602d575b600080fd5b600060405190815260200160405180910390f3fea2646970667358221220911e890115ba4d90995b51eca07ab7d0f34b9d8c6d41bd770b671745d3c513e764736f6c634300080c0033","storage":{}},"0xa0ee7a142d267c1f36714e4a8f75612f20a79720":{"nonce":1,"balance":"0x21d8f199a7051785220","code":"0x","storage":{}},"0xa513e6e4b8f2a923d98304ec87f64353c4d5c853":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122061dc9392cf6ba7869fe7bc6ba05d8409fb69605ae4794b23a59c97020514de6d64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x65":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x66":"0x1e","0x97":"0x0","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xb306bf915c4d645ff596e518faf3f9669b97016","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106102275760003560e01c806394f649dd11610130578063c6656702116100b8578063df5cf7231161007c578063df5cf72314610596578063e7a050aa146105bd578063f2fde38b146105d0578063f698da25146105e3578063fabc1cbc146105eb57600080fd5b8063c665670214610520578063cbc2bd6214610533578063cd293f6f14610546578063cf756fdf14610570578063df5b35471461058357600080fd5b8063b43b514b116100ff578063b43b514b146104b1578063b5d8b5b8146104c4578063c3c6b3a9146104d7578063c4623ea1146104fa578063c608c7f31461050d57600080fd5b806394f649dd14610433578063967fc0d2146104545780639b4da03d14610467578063b13442711461048a57600080fd5b80635c975abb116101b35780637ecebe00116101825780637ecebe00146103b3578063886f1195146103d35780638b8aac3c146103e65780638c80d4e51461040f5780638da5cb5b1461042257600080fd5b80635c975abb14610355578063663c1de41461035d578063715018a6146103805780637a7e0d921461038857600080fd5b80634665bcda116101fa5780634665bcda146102a157806348825e94146102e05780634e5a426314610307578063595c6a671461031a5780635ac86ab71461032257600080fd5b806310d67a2f1461022c578063136439dd1461024157806320606b701461025457806332e89ace1461028e575b600080fd5b61023f61023a366004612b4a565b6105fe565b005b61023f61024f366004612b67565b6106ba565b61027b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b61027b61029c366004612c00565b6107f9565b6102c87f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c85381565b6040516001600160a01b039091168152602001610285565b61027b7f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b61023f610315366004612ced565b610ae7565b61023f610b1f565b610345610330366004612d26565b609854600160ff9092169190911b9081161490565b6040519015158152602001610285565b60985461027b565b61034561036b366004612b4a565b60d16020526000908152604090205460ff1681565b61023f610be6565b61027b610396366004612d49565b60cd60209081526000928352604080842090915290825290205481565b61027b6103c1366004612b4a565b60ca6020526000908152604090205481565b6097546102c8906001600160a01b031681565b61027b6103f4366004612b4a565b6001600160a01b0316600090815260ce602052604090205490565b61023f61041d366004612d77565b610bfa565b6033546001600160a01b03166102c8565b610446610441366004612b4a565b610c53565b604051610285929190612e2c565b60cb546102c8906001600160a01b031681565b610345610475366004612b4a565b60d36020526000908152604090205460ff1681565b6102c87f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b61027b6104bf366004612fd5565b610dd3565b61023f6104d23660046130f0565b610e20565b6103456104e5366004612b67565b60cf6020526000908152604090205460ff1681565b61023f610508366004613132565b610f94565b61023f61051b366004613183565b610fe8565b61023f61052e366004612b4a565b6110a0565b6102c86105413660046131d6565b6110b1565b610559610554366004612fd5565b6110e9565b604080519215158352602083019190915201610285565b61023f61057e366004613132565b61117d565b61023f610591366004613202565b6112b1565b6102c87f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b61027b6105cb366004612d77565b6114da565b61023f6105de366004612b4a565b6115a3565b61027b611619565b61023f6105f9366004612b67565b611657565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610651573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610675919061326e565b6001600160a01b0316336001600160a01b0316146106ae5760405162461bcd60e51b81526004016106a59061328b565b60405180910390fd5b6106b7816117b3565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610702573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072691906132d5565b6107425760405162461bcd60e51b81526004016106a5906132f2565b609854818116146107bb5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016106a5565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6098546000908190600190811614156108505760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016106a5565b600260655414156108a35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106a5565b60026065556001600160a01b038816600090815260d3602052604090205460ff161561094a5760405162461bcd60e51b815260206004820152604a60248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207468697264207472616e736665726064820152691cc8191a5cd8589b195960b21b608482015260a4016106a5565b428410156109cc5760405162461bcd60e51b815260206004820152604360248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207369676e617475726520657870696064820152621c995960ea1b608482015260a4016106a5565b6001600160a01b03858116600081815260ca602090815260408083205481517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922493810193909352908201939093528b84166060820152928a16608084015260a0830189905260c0830182905260e0830187905290916101000160408051601f1981840301815291815281516020928301206001600160a01b038a16600090815260ca9093529082206001850190559150610a84611619565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050610ac78882886118aa565b610ad3888c8c8c611a69565b60016065559b9a5050505050505050505050565b60cb546001600160a01b03163314610b115760405162461bcd60e51b81526004016106a59061333a565b610b1b8282611c38565b5050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610b67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8b91906132d5565b610ba75760405162461bcd60e51b81526004016106a5906132f2565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610bee611ca6565b610bf86000611d00565b565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91614610c425760405162461bcd60e51b81526004016106a5906133a4565b610c4d838383611d52565b50505050565b6001600160a01b038116600090815260ce60205260408120546060918291908167ffffffffffffffff811115610c8b57610c8b612b90565b604051908082528060200260200182016040528015610cb4578160200160208202803683370190505b50905060005b82811015610d45576001600160a01b038616600090815260cd6020908152604080832060ce9092528220805491929184908110610cf957610cf9613402565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610d3257610d32613402565b6020908102919091010152600101610cba565b5060ce6000866001600160a01b03166001600160a01b031681526020019081526020016000208181805480602002602001604051908101604052809291908181526020018280548015610dc157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610da3575b50505050509150935093505050915091565b80516020808301516040808501516060860151608087015160a08801519351600097610e03979096959101613418565b604051602081830303815290604052805190602001209050919050565b60cb546001600160a01b03163314610e4a5760405162461bcd60e51b81526004016106a59061333a565b8060005b81811015610c4d5760d16000858584818110610e6c57610e6c613402565b9050602002016020810190610e819190612b4a565b6001600160a01b0316815260208101919091526040016000205460ff1615610f8c57600060d16000868685818110610ebb57610ebb613402565b9050602002016020810190610ed09190612b4a565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610f2b57610f2b613402565b9050602002016020810190610f409190612b4a565b6040516001600160a01b03909116815260200160405180910390a1610f8c848483818110610f7057610f70613402565b9050602002016020810190610f859190612b4a565b6000611c38565b600101610e4e565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91614610fdc5760405162461bcd60e51b81526004016106a5906133a4565b610c4d84848484611eae565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916146110305760405162461bcd60e51b81526004016106a5906133a4565b604051636ce5768960e11b81526001600160a01b03858116600483015282811660248301526044820184905284169063d9caed1290606401600060405180830381600087803b15801561108257600080fd5b505af1158015611096573d6000803e3d6000fd5b5050505050505050565b6110a8611ca6565b6106b78161213b565b60ce60205281600052604060002081815481106110cd57600080fd5b6000918252602090912001546001600160a01b03169150829050565b600080336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916146111345760405162461bcd60e51b81526004016106a5906133a4565b600061113f84610dd3565b600081815260cf60205260408120549192509060ff16156111745750600081815260cf60205260409020805460ff1916905560015b92509050915091565b600054610100900460ff161580801561119d5750600054600160ff909116105b806111b75750303b1580156111b7575060005460ff166001145b61121a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106a5565b6000805460ff19166001179055801561123d576000805461ff0019166101001790555b6112456121a4565b60c955611252838361223b565b61125b85611d00565b6112648461213b565b80156112aa576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60cb546001600160a01b031633146112db5760405162461bcd60e51b81526004016106a59061333a565b8281146113645760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794d616e616765722e61646453747261746567696573546f4460448201527f65706f73697457686974656c6973743a206172726179206c656e67746873206460648201526a0de40dcdee840dac2e8c6d60ab1b608482015260a4016106a5565b8260005b818110156114d25760d1600087878481811061138657611386613402565b905060200201602081019061139b9190612b4a565b6001600160a01b0316815260208101919091526040016000205460ff166114ca57600160d160008888858181106113d4576113d4613402565b90506020020160208101906113e99190612b4a565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe86868381811061144457611444613402565b90506020020160208101906114599190612b4a565b6040516001600160a01b03909116815260200160405180910390a16114ca86868381811061148957611489613402565b905060200201602081019061149e9190612b4a565b8585848181106114b0576114b0613402565b90506020020160208101906114c59190613491565b611c38565b600101611368565b505050505050565b6098546000908190600190811614156115315760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016106a5565b600260655414156115845760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106a5565b600260655561159533868686611a69565b600160655595945050505050565b6115ab611ca6565b6001600160a01b0381166116105760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106a5565b6106b781611d00565b60007f0000000000000000000000000000000000000000000000000000000000007a6946141561164a575060c95490565b6116526121a4565b905090565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ce919061326e565b6001600160a01b0316336001600160a01b0316146116fe5760405162461bcd60e51b81526004016106a59061328b565b60985419811960985419161461177c5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016106a5565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016107ee565b6001600160a01b0381166118415760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016106a5565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383163b156119c957604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906118ea9086908690600401613506565b602060405180830381865afa158015611907573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192b919061351f565b6001600160e01b031916146119c45760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a4016106a5565b505050565b826001600160a01b03166119dd8383612321565b6001600160a01b0316146119c45760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a4016106a5565b6001600160a01b038316600090815260d16020526040812054849060ff16611b0f5760405162461bcd60e51b815260206004820152604d60248201527f53747261746567794d616e616765722e6f6e6c7953747261746567696573576860448201527f6974656c6973746564466f724465706f7369743a207374726174656779206e6f60648201526c1d081dda1a5d195b1a5cdd1959609a1b608482015260a4016106a5565b611b246001600160a01b038516338786612345565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303816000875af1158015611b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b979190613549565b9150611ba586858785611eae565b604051631452b9d760e11b81526001600160a01b0387811660048301528681166024830152604482018490527f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916906328a573ae90606401600060405180830381600087803b158015611c1757600080fd5b505af1158015611c2b573d6000803e3d6000fd5b5050505050949350505050565b604080516001600160a01b038416815282151560208201527f77d930df4937793473a95024d87a98fd2ccb9e92d3c2463b3dacd65d3e6a5786910160405180910390a16001600160a01b0391909116600090815260d360205260409020805460ff1916911515919091179055565b6033546001600160a01b03163314610bf85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106a5565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081611dc75760405162461bcd60e51b815260206004820152603e60248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a207360448201527f68617265416d6f756e742073686f756c64206e6f74206265207a65726f21000060648201526084016106a5565b6001600160a01b03808516600090815260cd602090815260408083209387168352929052205480831115611e595760405162461bcd60e51b815260206004820152603360248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a20736044820152720d0c2e4ca82dadeeadce840e8dede40d0d2ced606b1b60648201526084016106a5565b6001600160a01b03808616600090815260cd602090815260408083209388168352929052208382039081905590831415611ea157611e97858561239f565b6001915050611ea7565b60009150505b9392505050565b6001600160a01b038416611f2a5760405162461bcd60e51b815260206004820152603960248201527f53747261746567794d616e616765722e5f6164645368617265733a207374616b60448201527f65722063616e6e6f74206265207a65726f20616464726573730000000000000060648201526084016106a5565b80611f965760405162461bcd60e51b815260206004820152603660248201527f53747261746567794d616e616765722e5f6164645368617265733a207368617260448201527565732073686f756c64206e6f74206265207a65726f2160501b60648201526084016106a5565b6001600160a01b03808516600090815260cd60209081526040808320938616835292905220546120a7576001600160a01b038416600090815260ce6020908152604090912054106120685760405162461bcd60e51b815260206004820152605060248201527f53747261746567794d616e616765722e5f6164645368617265733a206465706f60448201527f73697420776f756c6420657863656564204d41585f5354414b45525f5354524160648201526f0a88a8eb2be9892a6a8be988a9c8ea8960831b608482015260a4016106a5565b6001600160a01b03848116600090815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169184169190911790555b6001600160a01b03808516600090815260cd60209081526040808320938616835292905290812080548392906120de908490613578565b9091555050604080516001600160a01b03868116825285811660208301528416818301526060810183905290517f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a969181900360800190a150505050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6097546001600160a01b031615801561225c57506001600160a01b03821615155b6122de5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016106a5565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610b1b826117b3565b60008060006123308585612591565b9150915061233d81612601565b509392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610c4d9085906127bc565b6001600160a01b038216600090815260ce6020526040812054905b818110156124ba576001600160a01b03848116600090815260ce60205260409020805491851691839081106123f1576123f1613402565b6000918252602090912001546001600160a01b031614156124b2576001600160a01b038416600090815260ce60205260409020805461243290600190613590565b8154811061244257612442613402565b60009182526020808320909101546001600160a01b03878116845260ce909252604090922080549190921691908390811061247f5761247f613402565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506124ba565b6001016123ba565b818114156125425760405162461bcd60e51b815260206004820152604960248201527f53747261746567794d616e616765722e5f72656d6f766553747261746567794660448201527f726f6d5374616b657253747261746567794c6973743a207374726174656779206064820152681b9bdd08199bdd5b9960ba1b608482015260a4016106a5565b6001600160a01b038416600090815260ce60205260409020805480612569576125696135a7565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000808251604114156125c85760208301516040840151606085015160001a6125bc8782858561288e565b945094505050506125fa565b8251604014156125f257602083015160408401516125e786838361297b565b9350935050506125fa565b506000905060025b9250929050565b6000816004811115612615576126156135bd565b141561261e5750565b6001816004811115612632576126326135bd565b14156126805760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016106a5565b6002816004811115612694576126946135bd565b14156126e25760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016106a5565b60038160048111156126f6576126f66135bd565b141561274f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016106a5565b6004816004811115612763576127636135bd565b14156106b75760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016106a5565b6000612811826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166129b49092919063ffffffff16565b8051909150156119c4578080602001905181019061282f91906132d5565b6119c45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106a5565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156128c55750600090506003612972565b8460ff16601b141580156128dd57508460ff16601c14155b156128ee5750600090506004612972565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612942573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661296b57600060019250925050612972565b9150600090505b94509492505050565b6000806001600160ff1b0383168161299860ff86901c601b613578565b90506129a68782888561288e565b935093505050935093915050565b60606129c384846000856129cb565b949350505050565b606082471015612a2c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106a5565b6001600160a01b0385163b612a835760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106a5565b600080866001600160a01b03168587604051612a9f91906135d3565b60006040518083038185875af1925050503d8060008114612adc576040519150601f19603f3d011682016040523d82523d6000602084013e612ae1565b606091505b5091509150612af1828286612afc565b979650505050505050565b60608315612b0b575081611ea7565b825115612b1b5782518084602001fd5b8160405162461bcd60e51b81526004016106a591906135ef565b6001600160a01b03811681146106b757600080fd5b600060208284031215612b5c57600080fd5b8135611ea781612b35565b600060208284031215612b7957600080fd5b5035919050565b8035612b8b81612b35565b919050565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715612bc957612bc9612b90565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612bf857612bf8612b90565b604052919050565b60008060008060008060c08789031215612c1957600080fd5b8635612c2481612b35565b9550602087810135612c3581612b35565b9550604088013594506060880135612c4c81612b35565b93506080880135925060a088013567ffffffffffffffff80821115612c7057600080fd5b818a0191508a601f830112612c8457600080fd5b813581811115612c9657612c96612b90565b612ca8601f8201601f19168501612bcf565b91508082528b84828501011115612cbe57600080fd5b80848401858401376000848284010152508093505050509295509295509295565b80151581146106b757600080fd5b60008060408385031215612d0057600080fd5b8235612d0b81612b35565b91506020830135612d1b81612cdf565b809150509250929050565b600060208284031215612d3857600080fd5b813560ff81168114611ea757600080fd5b60008060408385031215612d5c57600080fd5b8235612d6781612b35565b91506020830135612d1b81612b35565b600080600060608486031215612d8c57600080fd5b8335612d9781612b35565b92506020840135612da781612b35565b929592945050506040919091013590565b600081518084526020808501945080840160005b83811015612df15781516001600160a01b031687529582019590820190600101612dcc565b509495945050505050565b600081518084526020808501945080840160005b83811015612df157815187529582019590820190600101612e10565b604081526000612e3f6040830185612db8565b8281036020840152612e518185612dfc565b95945050505050565b600067ffffffffffffffff821115612e7457612e74612b90565b5060051b60200190565b600082601f830112612e8f57600080fd5b81356020612ea4612e9f83612e5a565b612bcf565b82815260059290921b84018101918181019086841115612ec357600080fd5b8286015b84811015612ee7578035612eda81612b35565b8352918301918301612ec7565b509695505050505050565b600082601f830112612f0357600080fd5b81356020612f13612e9f83612e5a565b82815260059290921b84018101918181019086841115612f3257600080fd5b8286015b84811015612ee75780358352918301918301612f36565b600060408284031215612f5f57600080fd5b6040516040810181811067ffffffffffffffff82111715612f8257612f82612b90565b6040529050808235612f9381612b35565b815260208301356bffffffffffffffffffffffff81168114612fb457600080fd5b6020919091015292915050565b803563ffffffff81168114612b8b57600080fd5b600060208284031215612fe757600080fd5b813567ffffffffffffffff80821115612fff57600080fd5b9083019060e0828603121561301357600080fd5b61301b612ba6565b82358281111561302a57600080fd5b61303687828601612e7e565b82525060208301358281111561304b57600080fd5b61305787828601612ef2565b60208301525061306960408401612b80565b604082015261307b8660608501612f4d565b606082015261308c60a08401612fc1565b608082015261309d60c08401612b80565b60a082015295945050505050565b60008083601f8401126130bd57600080fd5b50813567ffffffffffffffff8111156130d557600080fd5b6020830191508360208260051b85010111156125fa57600080fd5b6000806020838503121561310357600080fd5b823567ffffffffffffffff81111561311a57600080fd5b613126858286016130ab565b90969095509350505050565b6000806000806080858703121561314857600080fd5b843561315381612b35565b9350602085013561316381612b35565b9250604085013561317381612b35565b9396929550929360600135925050565b6000806000806080858703121561319957600080fd5b84356131a481612b35565b935060208501356131b481612b35565b92506040850135915060608501356131cb81612b35565b939692955090935050565b600080604083850312156131e957600080fd5b82356131f481612b35565b946020939093013593505050565b6000806000806040858703121561321857600080fd5b843567ffffffffffffffff8082111561323057600080fd5b61323c888389016130ab565b9096509450602087013591508082111561325557600080fd5b50613262878288016130ab565b95989497509550505050565b60006020828403121561328057600080fd5b8151611ea781612b35565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156132e757600080fd5b8151611ea781612cdf565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526044908201527f53747261746567794d616e616765722e6f6e6c7953747261746567795768697460408201527f656c69737465723a206e6f742074686520737472617465677957686974656c6960608201526339ba32b960e11b608082015260a00190565b602080825260409082018190527f53747261746567794d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60e08152600061342b60e0830189612db8565b828103602084015261343d8189612dfc565b6001600160a01b0397881660408501528651881660608501526020909601516bffffffffffffffffffffffff166080840152505063ffffffff9290921660a083015290921660c09092019190915292915050565b6000602082840312156134a357600080fd5b8135611ea781612cdf565b60005b838110156134c95781810151838201526020016134b1565b83811115610c4d5750506000910152565b600081518084526134f28160208601602086016134ae565b601f01601f19169290920160200192915050565b8281526040602082015260006129c360408301846134da565b60006020828403121561353157600080fd5b81516001600160e01b031981168114611ea757600080fd5b60006020828403121561355b57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561358b5761358b613562565b500190565b6000828210156135a2576135a2613562565b500390565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b600082516135e58184602087016134ae565b9190910192915050565b602081526000611ea760208301846134da56fea2646970667358221220a9321ba6a17c119069bd734db22816aec78c1855a712690d703374d58cd4f96764736f6c634300080c0033","storage":{"0x0":"0xff"}},"0xa82ff9afd8f496c3d6ac40e2a0f282e47488cfc9":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106101415760003560e01c8063696255be116100b857806398ec1ac91161007c57806398ec1ac914610282578063ab11899514610295578063b933fa74146102a8578063dec5d1f6146102b0578063ec7fbb31146102c3578063f2fde38b146102ff57600080fd5b8063696255be14610231578063715018a614610244578063857dc1901461024c5780638da5cb5b14610254578063955f2d901461026f57600080fd5b80631e4cd85e1161010a5780631e4cd85e146101d5578063314f3a49146101e85780633b242e4a146101f057806340bf2fb7146102035780635140a5481461020b5780635ef533291461021e57600080fd5b8062cf2ab5146101465780630a601a121461015b5780630dba33941461016e5780631626ba7e146101945780631703a018146101c0575b600080fd5b610159610154366004611bac565b610312565b005b610159610169366004611c60565b61031e565b61018161017c366004611d29565b61032c565b6040519081526020015b60405180910390f35b6101a76101a2366004611d46565b610348565b6040516001600160e01b0319909116815260200161018b565b6101c8610386565b60405161018b9190611dea565b6101816101e3366004611d29565b610419565b61018161042f565b6101816101fe366004611dfd565b610440565b606754610181565b610159610219366004611e1a565b610461565b61015961022c366004611ee4565b610484565b61015961023f366004611efd565b610495565b6101596104af565b6101596104c3565b6033546040516001600160a01b03909116815260200161018b565b61018161027d366004611f39565b6104cc565b610181610290366004611dfd565b6104fe565b6101596102a336600461205b565b610751565b61018161086d565b6101596102be3660046120b3565b610879565b6102ef6102d1366004611dfd565b6001600160a01b03166000908152606d602052604090205460ff1690565b604051901515815260200161018b565b61015961030d366004611dfd565b61088a565b61031b81610900565b50565b610328828261094d565b5050565b6000610342606a63ffffffff80851690610a7a16565b92915050565b6000806000808480602001905181019061036291906121ef565b92509250925061037486848484610b89565b50630b135d3f60e11b95945050505050565b6040805160208101909152606081526040805160668054602081810284018501855283018181529293919284929091849160009085015b8282101561040c57600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b0316818301528252600190920191016103bd565b5050505081525050905090565b6000610342606b63ffffffff80851690610a7a16565b600061043b606a610c2f565b905090565b6001600160a01b0381166000908152606c6020526040812061034290610c2f565b61032882600081518110610477576104776122ca565b6020026020010151610c8b565b61048c610cae565b61031b81610d08565b61049d610cae565b6104a682610d4b565b61032881610900565b6104b7610cae565b6104c16000610d91565b565b6104c133610de3565b6001600160a01b0382166000908152606c602052604081206104f79063ffffffff80851690610a7a16565b9392505050565b6000806066600001805480602002602001604051908101604052809291908181526020016000905b8282101561057557600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b031681830152825260019092019101610526565b50505050905060008082516001600160401b0381111561059757610597611a6e565b6040519080825280602002602001820160405280156105c0578160200160208202803683370190505b50905060005b835181101561061f578381815181106105e1576105e16122ca565b6020026020010151600001518282815181106105ff576105ff6122ca565b6001600160a01b03909216602092830291909101909101526001016105c6565b50604051639004134760e01b81526000906001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc9169063900413479061067190899086906004016122e0565b600060405180830381865afa15801561068e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106b6919081019061233f565b905060005b8451811015610723578481815181106106d6576106d66122ca565b6020026020010151602001516001600160601b03168282815181106106fd576106fd6122ca565b602002602001015161070f91906123ea565b6107199085612401565b93506001016106bb565b5061073061271084612414565b92506067548310610745575090949350505050565b50600095945050505050565b600054610100900460ff16158080156107715750600054600160ff909116105b8061078b5750303b15801561078b575060005460ff166001145b6107f35760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff191660011790558015610816576000805461ff0019166101001790555b610821848484610f06565b8015610867576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b600061043b606b610c2f565b610881610cae565b6104a682610f67565b610892610cae565b6001600160a01b0381166108f75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107ea565b61031b81610d91565b6000805b82518110156109435761092f838281518110610922576109226122ca565b60200260200101516110be565b6109399083612436565b9150600101610904565b50610867816111e7565b6001600160a01b0382166000908152606d602052604090205460ff1615610987576040516342ee68b560e01b815260040160405180910390fd5b606580549060006109978361245e565b90915550506001600160a01b0382166000908152606d60205260408120805460ff191660011790556109c8836110be565b90506109d3816111e7565b5050606854604051639926ee7d60e01b81526001600160a01b0390911690639926ee7d90610a0790869086906004016124a3565b600060405180830381600087803b158015610a2157600080fd5b505af1158015610a35573d6000803e3d6000fd5b50506068546040516001600160a01b03918216935090861691507fa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c190600090a3505050565b6000438210610acb5760405162461bcd60e51b815260206004820181905260248201527f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e656460448201526064016107ea565b825460005b81811015610b30576000610ae48284611253565b905084866000018281548110610afc57610afc6122ca565b60009182526020909120015463ffffffff161115610b1c57809250610b2a565b610b27816001612401565b91505b50610ad0565b8115610b745784610b426001846124ee565b81548110610b5257610b526122ca565b60009182526020909120015464010000000090046001600160e01b0316610b77565b60005b6001600160e01b031695945050505050565b600083519050600080610b9d83865161126e565b60005b83811015610c1b576000878281518110610bbc57610bbc6122ca565b60200260200101519050610bd084826112b2565b610bf4818a898581518110610be757610be76122ca565b60200260200101516112e4565b8093506000610c038288611315565b9050610c0f8185612401565b93505050600101610ba0565b50610c26818561137c565b50505050505050565b80546000908015610c785782610c466001836124ee565b81548110610c5657610c566122ca565b60009182526020909120015464010000000090046001600160e01b0316610c7b565b60005b6001600160e01b03169392505050565b6065548151146103125760405163169efb5b60e11b815260040160405180910390fd5b6033546001600160a01b031633146104c15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107ea565b610d13606b826113d8565b50506040518181527f9324f7e5a7c0288808a634ccde44b8e979676474b22e29ee9dd569b55e791a4b9060200160405180910390a150565b606780549082905560408051828152602081018490527f713ca53b88d6eb63f5b1854cb8cbdd736ec51eda225e46791aa9298b0160648f91015b60405180910390a15050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0381166000908152606d602052604090205460ff16610e1c576040516325ec6c1f60e01b815260040160405180910390fd5b60658054906000610e2c83612501565b90915550506001600160a01b0381166000908152606d60205260408120805460ff19169055610e5a826110be565b9050610e65816111e7565b50506068546040516351b27a6d60e11b81526001600160a01b0384811660048301529091169063a364f4da90602401600060405180830381600087803b158015610eae57600080fd5b505af1158015610ec2573d6000803e3d6000fd5b50506068546040516001600160a01b03918216935090851691507f31e0adfec71bccee37b6e83a90c2fedb17d8f1693fee863c4771e7bfe2aed58090600090a35050565b600054610100900460ff16610f2d5760405162461bcd60e51b81526004016107ea90612518565b606880546001600160a01b0319166001600160a01b038516179055610f5182610d08565b610f5a81610f67565b610f62611503565b505050565b610f7081611532565b610f8d5760405163d173577960e01b815260040160405180910390fd5b60408051606680546020818102840185018552830181815260009484928491879085015b8282101561100057600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b90046001600160601b031681830152825260019092019101610fb1565b5050509152509091506066905060006110198282611a40565b505060005b82515181101561108c57825180516066919083908110611040576110406122ca565b602090810291909101810151825460018181018555600094855293839020825192909301516001600160601b0316600160a01b026001600160a01b03909216919091179101550161101e565b507f23aad4e61744ece164130aa415c1616e80136b0f0770e56589438b90b269265e8183604051610d85929190612563565b6001600160a01b0381166000908152606c602052604081208190819081906110e590610c2f565b6001600160a01b0386166000908152606d602052604090205490915060ff1661114d576111128184612591565b9250826000036111255750909392505050565b6001600160a01b0385166000908152606c60205260408120611146916113d8565b505061119a565b611156856104fe565b91506111628183612591565b9250826000036111755750909392505050565b6001600160a01b0385166000908152606c6020526040902061119790836113d8565b50505b60408051828152602081018490526001600160a01b038716917f88770dc862e47a7ed586907857eb1b75e4c5ffc8b707c7ee10eb74d6885fe594910160405180910390a250909392505050565b6000806111f4606a610c2f565b915060006112028484612436565b9150819050611212606a826113d8565b505060408051848152602081018490527f86dcf86b12dfeedea74ae9300dbdaa193bcce5809369c8177ea2f4eaaa65729b910160405180910390a150915091565b60006112626002848418612414565b6104f790848416612401565b808214611291576040516001621398b960e31b0319815260040160405180910390fd5b816000036103285760405163251f56a160e21b815260040160405180910390fd5b806001600160a01b0316826001600160a01b0316106103285760405163ba50f91160e01b815260040160405180910390fd5b6112f86001600160a01b03841683836115f8565b610f6257604051638baa579f60e01b815260040160405180910390fd5b600063fffffffe1963ffffffff831601611351576001600160a01b0383166000908152606c6020526040902061134a90610c2f565b9050610342565b6001600160a01b0383166000908152606c6020526040902061134a9063ffffffff80851690610a7a16565b600061138782611744565b9050808311156113aa57604051634b05a0f760e11b815260040160405180910390fd5b60006113b58361177b565b9050838111156108675760405163e121632f60e01b815260040160405180910390fd5b81546000908190816113e986610c2f565b9050600082118015611427575043866114036001856124ee565b81548110611413576114136122ca565b60009182526020909120015463ffffffff16145b1561148757611435856117ad565b866114416001856124ee565b81548110611451576114516122ca565b9060005260206000200160000160046101000a8154816001600160e01b0302191690836001600160e01b031602179055506114f5565b85600001604051806040016040528061149f4361181a565b63ffffffff1681526020016114b3886117ad565b6001600160e01b0390811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b9250839150505b9250929050565b600054610100900460ff1661152a5760405162461bcd60e51b81526004016107ea90612518565b6104c161187f565b8051600090818080805b84518110156115d657848181518110611557576115576122ca565b6020026020010151600001519250826001600160a01b0316846001600160a01b0316106115975760405163ba50f91160e01b815260040160405180910390fd5b8293508481815181106115ac576115ac6122ca565b6020026020010151602001516001600160601b0316826115cc9190612401565b915060010161153c565b5061271081146115ec5750600095945050505050565b50600195945050505050565b600080600061160785856118af565b90925090506000816004811115611620576116206125b8565b14801561163e5750856001600160a01b0316826001600160a01b0316145b1561164e576001925050506104f7565b600080876001600160a01b0316631626ba7e60e01b88886040516024016116769291906125ce565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516116b491906125e7565b600060405180830381855afa9150503d80600081146116ef576040519150601f19603f3d011682016040523d82523d6000602084013e6116f4565b606091505b5091509150818015611707575080516020145b801561173857508051630b135d3f60e11b9061172c9083016020908101908401612603565b6001600160e01b031916145b98975050505050505050565b600063fffffffe1963ffffffff83160161176257610342606a610c2f565b610342606a63ffffffff80851690610a7a16565b919050565b600063fffffffe1963ffffffff83160161179957610342606b610c2f565b610342606b63ffffffff80851690610a7a16565b60006001600160e01b038211156118165760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b60648201526084016107ea565b5090565b600063ffffffff8211156118165760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b60648201526084016107ea565b600054610100900460ff166118a65760405162461bcd60e51b81526004016107ea90612518565b6104c133610d91565b60008082516041036118e55760208301516040840151606085015160001a6118d98782858561191a565b945094505050506114fc565b825160400361190e5760208301516040840151611903868383611a07565b9350935050506114fc565b506000905060026114fc565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561195157506000905060036119fe565b8460ff16601b1415801561196957508460ff16601c14155b1561197a57506000905060046119fe565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156119ce573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166119f7576000600192509250506119fe565b9150600090505b94509492505050565b6000806001600160ff1b03831681611a2460ff86901c601b612401565b9050611a328782888561191a565b935093505050935093915050565b508054600082559060005260206000209081019061031b91905b808211156118165760008155600101611a5a565b634e487b7160e01b600052604160045260246000fd5b604051602081016001600160401b0381118282101715611aa657611aa6611a6e565b60405290565b604080519081016001600160401b0381118282101715611aa657611aa6611a6e565b604051601f8201601f191681016001600160401b0381118282101715611af657611af6611a6e565b604052919050565b60006001600160401b03821115611b1757611b17611a6e565b5060051b60200190565b6001600160a01b038116811461031b57600080fd5b600082601f830112611b4757600080fd5b8135611b5a611b5582611afe565b611ace565b8082825260208201915060208360051b860101925085831115611b7c57600080fd5b602085015b83811015611ba2578035611b9481611b21565b835260209283019201611b81565b5095945050505050565b600060208284031215611bbe57600080fd5b81356001600160401b03811115611bd457600080fd5b611be084828501611b36565b949350505050565b60006001600160401b03821115611c0157611c01611a6e565b50601f01601f191660200190565b600082601f830112611c2057600080fd5b8135611c2e611b5582611be8565b818152846020838601011115611c4357600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215611c7357600080fd5b8235611c7e81611b21565b915060208301356001600160401b03811115611c9957600080fd5b830160608186031215611cab57600080fd5b604051606081016001600160401b0381118282101715611ccd57611ccd611a6e565b60405281356001600160401b03811115611ce657600080fd5b611cf287828501611c0f565b8252506020828101359082015260409182013591810191909152919491935090915050565b63ffffffff8116811461031b57600080fd5b600060208284031215611d3b57600080fd5b81356104f781611d17565b60008060408385031215611d5957600080fd5b8235915060208301356001600160401b03811115611d7657600080fd5b611d8285828601611c0f565b9150509250929050565b80516020808452815184820181905260009290910190829060408601905b80831015611ba257835180516001600160a01b031683526020908101516001600160601b0316818401529093019260019290920191604090910190611daa565b6020815260006104f76020830184611d8c565b600060208284031215611e0f57600080fd5b81356104f781611b21565b60008060408385031215611e2d57600080fd5b82356001600160401b03811115611e4357600080fd5b8301601f81018513611e5457600080fd5b8035611e62611b5582611afe565b8082825260208201915060208360051b850101925087831115611e8457600080fd5b602084015b83811015611ec55780356001600160401b03811115611ea757600080fd5b611eb68a602083890101611b36565b84525060209283019201611e89565b50945050505060208301356001600160401b03811115611d7657600080fd5b600060208284031215611ef657600080fd5b5035919050565b60008060408385031215611f1057600080fd5b8235915060208301356001600160401b03811115611f2d57600080fd5b611d8285828601611b36565b60008060408385031215611f4c57600080fd5b8235611f5781611b21565b91506020830135611f6781611d17565b809150509250929050565b600060208284031215611f8457600080fd5b611f8c611a84565b905081356001600160401b03811115611fa457600080fd5b8201601f81018413611fb557600080fd5b8035611fc3611b5582611afe565b8082825260208201915060208360061b850101925086831115611fe557600080fd5b6020840193505b8284101561204f576040848803121561200457600080fd5b61200c611aac565b843561201781611b21565b815260208501356001600160601b038116811461203357600080fd5b8060208301525080835250602082019150604084019350611fec565b84525091949350505050565b60008060006060848603121561207057600080fd5b833561207b81611b21565b92506020840135915060408401356001600160401b0381111561209d57600080fd5b6120a986828701611f72565b9150509250925092565b600080604083850312156120c657600080fd5b82356001600160401b038111156120dc57600080fd5b6120e885828601611f72565b92505060208301356001600160401b03811115611f2d57600080fd5b60005b8381101561211f578181015183820152602001612107565b50506000910152565b600082601f83011261213957600080fd5b8151612147611b5582611afe565b8082825260208201915060208360051b86010192508583111561216957600080fd5b602085015b83811015611ba25780516001600160401b0381111561218c57600080fd5b8601603f8101881361219d57600080fd5b60208101516121ae611b5582611be8565b8181526040838301018a10156121c357600080fd5b6121d4826020830160408601612104565b855250506020928301920161216e565b805161177681611d17565b60008060006060848603121561220457600080fd5b83516001600160401b0381111561221a57600080fd5b8401601f8101861361222b57600080fd5b8051612239611b5582611afe565b8082825260208201915060208360051b85010192508883111561225b57600080fd5b6020840193505b8284101561228657835161227581611b21565b825260209384019390910190612262565b8096505050505060208401516001600160401b038111156122a657600080fd5b6122b286828701612128565b9250506122c1604085016121e4565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0383168152604060208083018290528351918301829052600091908401906060840190835b818110156123335783516001600160a01b031683526020938401939092019160010161230c565b50909695505050505050565b60006020828403121561235157600080fd5b81516001600160401b0381111561236757600080fd5b8201601f8101841361237857600080fd5b8051612386611b5582611afe565b8082825260208201915060208360051b8501019250868311156123a857600080fd5b6020840193505b828410156123ca5783518252602093840193909101906123af565b9695505050505050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610342576103426123d4565b80820180821115610342576103426123d4565b60008261243157634e487b7160e01b600052601260045260246000fd5b500490565b8082018281126000831280158216821582161715612456576124566123d4565b505092915050565b600060018201612470576124706123d4565b5060010190565b6000815180845261248f816020860160208601612104565b601f01601f19169290920160200192915050565b60018060a01b03831681526040602082015260008251606060408401526124cd60a0840182612477565b90506020840151606084015260408401516080840152809150509392505050565b81810381811115610342576103426123d4565b600081612510576125106123d4565b506000190190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6040815260006125766040830185611d8c565b82810360208401526125888185611d8c565b95945050505050565b81810360008312801583831316838312821617156125b1576125b16123d4565b5092915050565b634e487b7160e01b600052602160045260246000fd5b828152604060208201526000611be06040830184612477565b600082516125f9818460208701612104565b9190910192915050565b60006020828403121561261557600080fd5b81516001600160e01b0319811681146104f757600080fdfea26469706673582212200fd4fa28f019ef0c1a451bd7987c4ad27e7427c9bab84a0f8bcd58509968fecc64736f6c634300081a0033","storage":{}},"0xb7f8bc63bbcad18155201308c8f3540b07f84f5e":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106103785760003560e01c806360d7faed116101d3578063b7f06ebe11610104578063cf80873e116100a2578063f16172b01161007c578063f16172b01461097d578063f2fde38b14610990578063f698da25146109a3578063fabc1cbc146109ab57600080fd5b8063cf80873e14610936578063da8be86414610957578063eea9064b1461096a57600080fd5b8063c488375a116100de578063c488375a14610853578063c5e480db14610873578063c94b511114610919578063ca661c041461092c57600080fd5b8063b7f06ebe146107f9578063bb45fef21461081c578063c448feb81461084a57600080fd5b8063886f1195116101715780639104c3191161014b5780639104c3191461078457806399be81c81461079f578063a1788484146107b2578063b1344271146107d257600080fd5b8063886f1195146107405780638da5cb5b14610753578063900413471461076457600080fd5b80636d70f7ae116101ad5780636d70f7ae146106e7578063715018a6146106fa578063778e55f3146107025780637f5480711461072d57600080fd5b806360d7faed14610698578063635bbd10146106ab57806365da1264146106be57600080fd5b806329c77d4f116102ad5780634fc40b611161024b5780635ac86ab7116102255780635ac86ab71461062e5780635c975abb146106515780635cfe8d2c146106595780635f966f141461066c57600080fd5b80634fc40b6114610609578063595c6a6714610613578063597b36da1461061b57600080fd5b80633cdeb5e0116102875780633cdeb5e0146105695780633e28391d1461059857806343377382146105bb5780634665bcda146105e257600080fd5b806329c77d4f146104f7578063334043961461051757806339b70e381461052a57600080fd5b8063136439dd1161031a5780631bbce091116102f45780631bbce0911461049757806320606b70146104aa57806322bf40e4146104d157806328a573ae146104e457600080fd5b8063136439dd146104385780631522bf021461044b578063169283651461045e57600080fd5b80630dd8dd02116103565780630dd8dd02146103dd5780630f589e59146103fd57806310d67a2f14610412578063132d49671461042557600080fd5b80630449ca391461037d57806304a4f979146103a35780630b9f487a146103ca575b600080fd5b61039061038b366004614adb565b6109be565b6040519081526020015b60405180910390f35b6103907f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b6103906103d8366004614b41565b610a43565b6103f06103eb366004614adb565b610b05565b60405161039a9190614b9c565b61041061040b366004614c39565b610e6e565b005b610410610420366004614c8c565b610fbe565b610410610433366004614cb0565b611071565b610410610446366004614cf1565b611128565b610410610459366004614d0a565b611267565b61039061046c366004614c8c565b6001600160a01b0316600090815260996020526040902060010154600160a01b900463ffffffff1690565b6103906104a5366004614cb0565b61127b565b6103907f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6104106104df366004614d75565b6112a9565b6104106104f2366004614cb0565b6113ed565b610390610505366004614c8c565b609b6020526000908152604090205481565b610410610525366004614e1c565b61149d565b6105517f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b6040516001600160a01b03909116815260200161039a565b610551610577366004614c8c565b6001600160a01b039081166000908152609960205260409020600101541690565b6105ab6105a6366004614c8c565b6115da565b604051901515815260200161039a565b6103907f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b81565b6105517f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c85381565b6103906213c68081565b6104106115fa565b61039061062936600461513b565b6116c1565b6105ab61063c366004615177565b606654600160ff9092169190911b9081161490565b606654610390565b6104106106673660046151ed565b6116f1565b61055161067a366004614c8c565b6001600160a01b039081166000908152609960205260409020541690565b6104106106a636600461534d565b61199c565b6104106106b9366004614cf1565b611a37565b6105516106cc366004614c8c565b609a602052600090815260409020546001600160a01b031681565b6105ab6106f5366004614c8c565b611a48565b610410611a68565b6103906107103660046153dc565b609860209081526000928352604080842090915290825290205481565b61041061073b3660046154bd565b611a7c565b606554610551906001600160a01b031681565b6033546001600160a01b0316610551565b61077761077236600461554d565b611b81565b60405161039a91906155d7565b61055173beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6104106107ad3660046155ea565b611c5b565b6103906107c0366004614c8c565b609f6020526000908152604090205481565b6105517f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b6105ab610807366004614cf1565b609e6020526000908152604090205460ff1681565b6105ab61082a36600461561f565b609c60209081526000928352604080842090915290825290205460ff1681565b610390609d5481565b610390610861366004614c8c565b60a16020526000908152604090205481565b6108e3610881366004614c8c565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03948516815260998352839020835191820184528054851682526001015493841691810191909152600160a01b90920463ffffffff169082015290565b6040805182516001600160a01b039081168252602080850151909116908201529181015163ffffffff169082015260600161039a565b61039061092736600461564b565b611d2d565b61039062034bc081565b610949610944366004614c8c565b611de6565b60405161039a9291906156cc565b6103f0610965366004614c8c565b61219e565b6104106109783660046156f1565b612662565b61041061098b366004615749565b61266e565b61041061099e366004614c8c565b6126ff565b610390612775565b6104106109b9366004614cf1565b6127b3565b609d54600090815b83811015610a3b57600060a160008787858181106109e6576109e6615765565b90506020020160208101906109fb9190614c8c565b6001600160a01b03166001600160a01b0316815260200190815260200160002054905082811115610a2a578092505b50610a3481615791565b90506109c6565b509392505050565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad6020808301919091526001600160a01b038681168385015288811660608401528716608083015260a0820185905260c08083018590528351808403909101815260e0909201909252805191012060009081610ac1612775565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f19018152919052805160209091012098975050505050505050565b60665460609060019060029081161415610b3a5760405162461bcd60e51b8152600401610b31906157ac565b60405180910390fd5b6000836001600160401b03811115610b5457610b54614ebe565b604051908082528060200260200182016040528015610b7d578160200160208202803683370190505b50336000908152609a60205260408120549192506001600160a01b03909116905b85811015610e6357868682818110610bb857610bb8615765565b9050602002810190610bca91906157e3565b610bd8906020810190615803565b9050878783818110610bec57610bec615765565b9050602002810190610bfe91906157e3565b610c089080615803565b905014610c7d5760405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608401610b31565b33878783818110610c9057610c90615765565b9050602002810190610ca291906157e3565b610cb3906060810190604001614c8c565b6001600160a01b031614610d2f5760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a2077697468647261776572206d757374206265207374616b6572000000006064820152608401610b31565b610e343383898985818110610d4657610d46615765565b9050602002810190610d5891906157e3565b610d69906060810190604001614c8c565b8a8a86818110610d7b57610d7b615765565b9050602002810190610d8d91906157e3565b610d979080615803565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508e92508d9150889050818110610ddd57610ddd615765565b9050602002810190610def91906157e3565b610dfd906020810190615803565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061290f92505050565b838281518110610e4657610e46615765565b602090810291909101015280610e5b81615791565b915050610b9e565b509095945050505050565b336000908152609960205260409020546001600160a01b031615610f085760405162461bcd60e51b815260206004820152604560248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a206f70657261746f722068617320616c72656164792072656769736064820152641d195c995960da1b608482015260a401610b31565b610f123384612ecf565b604080518082019091526060815260006020820152610f34338083600061316b565b336001600160a01b03167f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e285604051610f6d919061584c565b60405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610fb092919061589e565b60405180910390a250505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611011573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103591906158cd565b6001600160a01b0316336001600160a01b0316146110655760405162461bcd60e51b8152600401610b31906158ea565b61106e81613510565b50565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91614806110d05750336001600160a01b037f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c85316145b6110ec5760405162461bcd60e51b8152600401610b3190615934565b6110f5836115da565b15611123576001600160a01b038084166000908152609a60205260409020541661112181858585613607565b505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015611170573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111949190615991565b6111b05760405162461bcd60e51b8152600401610b31906159ae565b606654818116146112295760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610b31565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b61126f613682565b611121848484846136dc565b6001600160a01b0383166000908152609b60205260408120546112a085828686611d2d565b95945050505050565b600054610100900460ff16158080156112c95750600054600160ff909116105b806112e35750303b1580156112e3575060005460ff166001145b6113465760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610b31565b6000805460ff191660011790558015611369576000805461ff0019166101001790555b6113738888613902565b61137b6139e8565b60975561138789613a7f565b61139086613ad1565b61139c858585856136dc565b80156113e2576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c916148061144c5750336001600160a01b037f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c85316145b6114685760405162461bcd60e51b8152600401610b3190615934565b611471836115da565b15611123576001600160a01b038084166000908152609a60205260409020541661112181858585613bcb565b606654600290600490811614156114c65760405162461bcd60e51b8152600401610b31906157ac565b600260c95414156115195760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b31565b600260c95560005b888110156115c9576115b98a8a8381811061153e5761153e615765565b905060200281019061155091906159f6565b89898481811061156257611562615765565b90506020028101906115749190615803565b89898681811061158657611586615765565b9050602002013588888781811061159f5761159f615765565b90506020020160208101906115b49190615a0c565b613c46565b6115c281615791565b9050611521565b5050600160c9555050505050505050565b6001600160a01b039081166000908152609a602052604090205416151590565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015611642573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116669190615991565b6116825760405162461bcd60e51b8152600401610b31906159ae565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000816040516020016116d49190615a9d565b604051602081830303815290604052805190602001209050919050565b60005b815181101561199857600082828151811061171157611711615765565b602002602001015190506000807f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663cd293f6f846040518263ffffffff1660e01b815260040161176a9190615ab0565b60408051808303816000875af1158015611788573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ac9190615b5c565b91509150811561198a576040808401516001600160a01b0381166000908152609f602052918220805491928291906117e383615791565b919050555060006040518060e00160405280846001600160a01b031681526020018760a001516001600160a01b031681526020018760600151600001516001600160a01b03168152602001838152602001876080015163ffffffff16815260200187600001518152602001876020015181525090506000611863826116c1565b6000818152609e602052604090205490915060ff16156118f95760405162461bcd60e51b815260206004820152604560248201527f44656c65676174696f6e4d616e616765722e6d6967726174655175657565645760448201527f69746864726177616c733a207769746864726177616c20616c72656164792065606482015264786973747360d81b608482015260a401610b31565b6000818152609e602052604090819020805460ff19166001179055517f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f9906119449083908590615b8a565b60405180910390a160408051868152602081018390527fdc00758b65eef71dc3780c04ebe36cab6bdb266c3a698187e29e0f0dca012630910160405180910390a1505050505b8360010193505050506116f4565b5050565b606654600290600490811614156119c55760405162461bcd60e51b8152600401610b31906157ac565b600260c9541415611a185760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b31565b600260c955611a2a8686868686613c46565b5050600160c95550505050565b611a3f613682565b61106e81613ad1565b6001600160a01b0390811660009081526099602052604090205416151590565b611a70613682565b611a7a6000613a7f565b565b4283602001511015611b005760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a401610b31565b6000609b6000876001600160a01b03166001600160a01b031681526020019081526020016000205490506000611b3c8783888860200151611d2d565b6001600160a01b0388166000908152609b602052604090206001840190558551909150611b6c9088908390614430565b611b788787868661316b565b50505050505050565b6060600082516001600160401b03811115611b9e57611b9e614ebe565b604051908082528060200260200182016040528015611bc7578160200160208202803683370190505b50905060005b8351811015610a3b576001600160a01b03851660009081526098602052604081208551909190869084908110611c0557611c05615765565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110611c4057611c40615765565b6020908102919091010152611c5481615791565b9050611bcd565b611c6433611a48565b611ce65760405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a401610b31565b336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051611d2192919061589e565b60405180910390a25050565b604080517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b6020808301919091526001600160a01b0387811683850152851660608301526080820186905260a08083018590528351808403909101815260c0909201909252805191012060009081611da3612775565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b6040516360f4062b60e01b81526001600160a01b03828116600483015260609182916000917f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c853909116906360f4062b90602401602060405180830381865afa158015611e56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7a9190615ba3565b6040516394f649dd60e01b81526001600160a01b03868116600483015291925060009182917f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9909116906394f649dd90602401600060405180830381865afa158015611eea573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f129190810190615c17565b9150915060008313611f2957909590945092505050565b606080835160001415611fe3576040805160018082528183019092529060208083019080368337505060408051600180825281830190925292945090506020808301908036833701905050905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082600081518110611f9e57611f9e615765565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600081518110611fd257611fd2615765565b602002602001018181525050612191565b8351611ff0906001615cd1565b6001600160401b0381111561200757612007614ebe565b604051908082528060200260200182016040528015612030578160200160208202803683370190505b50915081516001600160401b0381111561204c5761204c614ebe565b604051908082528060200260200182016040528015612075578160200160208202803683370190505b50905060005b845181101561210f5784818151811061209657612096615765565b60200260200101518382815181106120b0576120b0615765565b60200260200101906001600160a01b031690816001600160a01b0316815250508381815181106120e2576120e2615765565b60200260200101518282815181106120fc576120fc615765565b602090810291909101015260010161207b565b5073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082600184516121349190615ce9565b8151811061214457612144615765565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600184516121749190615ce9565b8151811061218457612184615765565b6020026020010181815250505b9097909650945050505050565b606654606090600190600290811614156121ca5760405162461bcd60e51b8152600401610b31906157ac565b6121d3836115da565b6122535760405162461bcd60e51b8152602060048201526044602482018190527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a207374908201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b608482015260a401610b31565b61225c83611a48565b156122cf5760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608401610b31565b6001600160a01b03831661234b5760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608401610b31565b6001600160a01b038084166000818152609a60205260409020549091169033148061237e5750336001600160a01b038216145b806123a557506001600160a01b038181166000908152609960205260409020600101541633145b6124175760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608401610b31565b60008061242386611de6565b9092509050336001600160a01b0387161461247957826001600160a01b0316866001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a35b826001600160a01b0316866001600160a01b03167ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467660405160405180910390a36001600160a01b0386166000908152609a6020526040902080546001600160a01b031916905581516124fb576040805160008152602081019091529450612659565b81516001600160401b0381111561251457612514614ebe565b60405190808252806020026020018201604052801561253d578160200160208202803683370190505b50945060005b8251811015612657576040805160018082528183019092526000916020808301908036833750506040805160018082528183019092529293506000929150602080830190803683370190505090508483815181106125a3576125a3615765565b6020026020010151826000815181106125be576125be615765565b60200260200101906001600160a01b031690816001600160a01b0316815250508383815181106125f0576125f0615765565b60200260200101518160008151811061260b5761260b615765565b60200260200101818152505061262489878b858561290f565b88848151811061263657612636615765565b6020026020010181815250505050808061264f90615791565b915050612543565b505b50505050919050565b6111233384848461316b565b61267733611a48565b6126f55760405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a401610b31565b61106e3382612ecf565b612707613682565b6001600160a01b03811661276c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b31565b61106e81613a7f565b60007f0000000000000000000000000000000000000000000000000000000000007a694614156127a6575060975490565b6127ae6139e8565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612806573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282a91906158cd565b6001600160a01b0316336001600160a01b03161461285a5760405162461bcd60e51b8152600401610b31906158ea565b6066541981196066541916146128d85760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610b31565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161125c565b60006001600160a01b0386166129a65760405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a401610b31565b8251612a305760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374726174656769657320636160648201526c6e6e6f7420626520656d70747960981b608482015260a401610b31565b60005b8351811015612ddd576001600160a01b03861615612a8957612a898688868481518110612a6257612a62615765565b6020026020010151868581518110612a7c57612a7c615765565b6020026020010151613607565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b0316848281518110612ab957612ab9615765565b60200260200101516001600160a01b03161415612b82577f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8536001600160a01b031663beffbb8988858481518110612b1257612b12615765565b60200260200101516040518363ffffffff1660e01b8152600401612b4b9291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015612b6557600080fd5b505af1158015612b79573d6000803e3d6000fd5b50505050612dd5565b846001600160a01b0316876001600160a01b03161480612c5457507f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639b4da03d858381518110612bde57612bde615765565b60200260200101516040518263ffffffff1660e01b8152600401612c1191906001600160a01b0391909116815260200190565b602060405180830381865afa158015612c2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c529190615991565b155b612d205760405162461bcd60e51b8152602060048201526084602482018190527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448301527f6e6451756575655769746864726177616c3a2077697468647261776572206d7560648301527f73742062652073616d652061646472657373206173207374616b657220696620908201527f746869726450617274795472616e7366657273466f7262696464656e2061726560a482015263081cd95d60e21b60c482015260e401610b31565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316638c80d4e588868481518110612d6257612d62615765565b6020026020010151868581518110612d7c57612d7c615765565b60200260200101516040518463ffffffff1660e01b8152600401612da293929190615d00565b600060405180830381600087803b158015612dbc57600080fd5b505af1158015612dd0573d6000803e3d6000fd5b505050505b600101612a33565b506001600160a01b0386166000908152609f60205260408120805491829190612e0583615791565b919050555060006040518060e00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018381526020014363ffffffff1681526020018681526020018581525090506000612e6d826116c1565b6000818152609e602052604090819020805460ff19166001179055519091507f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f990612ebb9083908590615b8a565b60405180910390a198975050505050505050565b6000612ede6020830183614c8c565b6001600160a01b03161415612f785760405162461bcd60e51b815260206004820152605460248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a2063616e6e6f742073657420606561726e696e677352656365696064820152737665726020746f207a65726f206164647265737360601b608482015260a401610b31565b6213c680612f8c6060830160408401615d24565b63ffffffff1611156130415760405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c401610b31565b6001600160a01b0382166000908152609960205260409081902060010154600160a01b900463ffffffff169061307d9060608401908401615d24565b63ffffffff1610156131135760405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a401610b31565b6001600160a01b038216600090815260996020526040902081906131378282615d61565b505060405133907ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac90611d2190849061584c565b606654600090600190811614156131945760405162461bcd60e51b8152600401610b31906157ac565b61319d856115da565b1561321a5760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2073746160448201527f6b657220697320616c7265616479206163746976656c792064656c65676174656064820152601960fa1b608482015260a401610b31565b61322384611a48565b6132a35760405162461bcd60e51b815260206004820152604560248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a206f706560448201527f7261746f72206973206e6f74207265676973746572656420696e20456967656e6064820152642630bcb2b960d91b608482015260a401610b31565b6001600160a01b038085166000908152609960205260409020600101541680158015906132d95750336001600160a01b03821614155b80156132ee5750336001600160a01b03861614155b1561345b57428460200151101561336d5760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608401610b31565b6001600160a01b0381166000908152609c6020908152604080832086845290915290205460ff16156134075760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608401610b31565b6001600160a01b0381166000908152609c6020908152604080832086845282528220805460ff19166001179055850151613448908890889085908890610a43565b905061345982828760000151614430565b505b6001600160a01b038681166000818152609a602052604080822080546001600160a01b031916948a169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a36000806134ba88611de6565b9150915060005b82518110156113e257613508888a8584815181106134e1576134e1615765565b60200260200101518585815181106134fb576134fb615765565b6020026020010151613bcb565b6001016134c1565b6001600160a01b03811661359e5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610b31565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0380851660009081526098602090815260408083209386168352929052908120805483929061363e908490615ce9565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610fb093929190615d00565b6033546001600160a01b03163314611a7a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b31565b8281146137645760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a20696e707574206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610b31565b8260005b818110156138fa57600086868381811061378457613784615765565b90506020020160208101906137999190614c8c565b6001600160a01b038116600090815260a160205260408120549192508686858181106137c7576137c7615765565b90506020020135905062034bc081111561388b5760405162461bcd60e51b815260206004820152607360248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a205f7769746864726177616c60648201527f44656c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544860848201527244524157414c5f44454c41595f424c4f434b5360681b60a482015260c401610b31565b6001600160a01b038316600081815260a160209081526040918290208490558151928352820184905281018290527f0e7efa738e8b0ce6376a0c1af471655540d2e9a81647d7b09ed823018426576d9060600160405180910390a1505050806138f390615791565b9050613768565b505050505050565b6065546001600160a01b031615801561392357506001600160a01b03821615155b6139a55760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610b31565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261199882613510565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62034bc0811115613b8a5760405162461bcd60e51b815260206004820152607160248201527f44656c65676174696f6e4d616e616765722e5f7365744d696e5769746864726160448201527f77616c44656c6179426c6f636b733a205f6d696e5769746864726177616c446560648201527f6c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544844526084820152704157414c5f44454c41595f424c4f434b5360781b60a482015260c401610b31565b609d5460408051918252602082018390527fafa003cd76f87ff9d62b35beea889920f33c0c42b8d45b74954d61d50f4b6b69910160405180910390a1609d55565b6001600160a01b03808516600090815260986020908152604080832093861683529290529081208054839290613c02908490615cd1565b92505081905550836001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c848484604051610fb093929190615d00565b6000613c5461062987615dc4565b6000818152609e602052604090205490915060ff16613cd55760405162461bcd60e51b81526020600482015260436024820152600080516020615efc83398151915260448201527f645769746864726177616c3a20616374696f6e206973206e6f7420696e20717560648201526265756560e81b608482015260a401610b31565b609d544390613cea60a0890160808a01615d24565b63ffffffff16613cfa9190615cd1565b1115613d825760405162461bcd60e51b815260206004820152605f6024820152600080516020615efc83398151915260448201527f645769746864726177616c3a206d696e5769746864726177616c44656c61794260648201527f6c6f636b7320706572696f6420686173206e6f74207965742070617373656400608482015260a401610b31565b613d926060870160408801614c8c565b6001600160a01b0316336001600160a01b031614613e1f5760405162461bcd60e51b81526020600482015260506024820152600080516020615efc83398151915260448201527f645769746864726177616c3a206f6e6c7920776974686472617765722063616e60648201526f1031b7b6b83632ba329030b1ba34b7b760811b608482015260a401610b31565b8115613ea157613e3260a0870187615803565b85149050613ea15760405162461bcd60e51b81526020600482015260426024820152600080516020615efc83398151915260448201527f645769746864726177616c3a20696e707574206c656e677468206d69736d61746064820152610c6d60f31b608482015260a401610b31565b6000818152609e60205260409020805460ff1916905581156140065760005b613ecd60a0880188615803565b9050811015614000574360a16000613ee860a08b018b615803565b85818110613ef857613ef8615765565b9050602002016020810190613f0d9190614c8c565b6001600160a01b03168152602081019190915260400160002054613f3760a08a0160808b01615d24565b63ffffffff16613f479190615cd1565b1115613f655760405162461bcd60e51b8152600401610b3190615dd6565b613ff8613f756020890189614c8c565b33613f8360a08b018b615803565b85818110613f9357613f93615765565b9050602002016020810190613fa89190614c8c565b613fb560c08c018c615803565b86818110613fc557613fc5615765565b905060200201358a8a87818110613fde57613fde615765565b9050602002016020810190613ff39190614c8c565b6145ea565b600101613ec0565b506143f5565b336000908152609a60205260408120546001600160a01b0316905b61402e60a0890189615803565b90508110156143f2574360a1600061404960a08c018c615803565b8581811061405957614059615765565b905060200201602081019061406e9190614c8c565b6001600160a01b0316815260208101919091526040016000205461409860a08b0160808c01615d24565b63ffffffff166140a89190615cd1565b11156140c65760405162461bcd60e51b8152600401610b3190615dd6565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06140e860a08a018a615803565b838181106140f8576140f8615765565b905060200201602081019061410d9190614c8c565b6001600160a01b0316141561425d57600061412b60208a018a614c8c565b905060006001600160a01b037f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c85316630e81073c8361416c60c08e018e615803565b8781811061417c5761417c615765565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044016020604051808303816000875af11580156141d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141f49190615ba3565b6001600160a01b038084166000908152609a602052604090205491925016801561425557614255818461422a60a08f018f615803565b8881811061423a5761423a615765565b905060200201602081019061424f9190614c8c565b85613bcb565b5050506143ea565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663c4623ea13389898581811061429f5761429f615765565b90506020020160208101906142b49190614c8c565b6142c160a08d018d615803565b868181106142d1576142d1615765565b90506020020160208101906142e69190614c8c565b6142f360c08e018e615803565b8781811061430357614303615765565b60405160e088901b6001600160e01b03191681526001600160a01b03968716600482015294861660248601529290941660448401526020909102013560648201526084019050600060405180830381600087803b15801561436357600080fd5b505af1158015614377573d6000803e3d6000fd5b505050506001600160a01b038216156143ea576143ea823361439c60a08c018c615803565b858181106143ac576143ac615765565b90506020020160208101906143c19190614c8c565b6143ce60c08d018d615803565b868181106143de576143de615765565b90506020020135613bcb565b600101614021565b50505b6040518181527fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d9060200160405180910390a1505050505050565b6001600160a01b0383163b1561454a57604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906144709086908690600401615e5e565b602060405180830381865afa15801561448d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144b19190615ebb565b6001600160e01b031916146111235760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610b31565b826001600160a01b031661455e838361472a565b6001600160a01b0316146111235760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610b31565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014156146955760405162387b1360e81b81526001600160a01b037f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c853169063387b13009061465e90889088908790600401615d00565b600060405180830381600087803b15801561467857600080fd5b505af115801561468c573d6000803e3d6000fd5b50505050614723565b60405163c608c7f360e01b81526001600160a01b03858116600483015284811660248301526044820184905282811660648301527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9169063c608c7f390608401600060405180830381600087803b15801561470f57600080fd5b505af11580156113e2573d6000803e3d6000fd5b5050505050565b60008060006147398585614746565b91509150610a3b816147b6565b60008082516041141561477d5760208301516040840151606085015160001a61477187828585614971565b945094505050506147af565b8251604014156147a7576020830151604084015161479c868383614a5e565b9350935050506147af565b506000905060025b9250929050565b60008160048111156147ca576147ca615ee5565b14156147d35750565b60018160048111156147e7576147e7615ee5565b14156148355760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610b31565b600281600481111561484957614849615ee5565b14156148975760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610b31565b60038160048111156148ab576148ab615ee5565b14156149045760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610b31565b600481600481111561491857614918615ee5565b141561106e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610b31565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156149a85750600090506003614a55565b8460ff16601b141580156149c057508460ff16601c14155b156149d15750600090506004614a55565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614a25573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116614a4e57600060019250925050614a55565b9150600090505b94509492505050565b6000806001600160ff1b03831681614a7b60ff86901c601b615cd1565b9050614a8987828885614971565b935093505050935093915050565b60008083601f840112614aa957600080fd5b5081356001600160401b03811115614ac057600080fd5b6020830191508360208260051b85010111156147af57600080fd5b60008060208385031215614aee57600080fd5b82356001600160401b03811115614b0457600080fd5b614b1085828601614a97565b90969095509350505050565b6001600160a01b038116811461106e57600080fd5b8035614b3c81614b1c565b919050565b600080600080600060a08688031215614b5957600080fd5b8535614b6481614b1c565b94506020860135614b7481614b1c565b93506040860135614b8481614b1c565b94979396509394606081013594506080013592915050565b6020808252825182820181905260009190848201906040850190845b81811015614bd457835183529284019291840191600101614bb8565b50909695505050505050565b600060608284031215614bf257600080fd5b50919050565b60008083601f840112614c0a57600080fd5b5081356001600160401b03811115614c2157600080fd5b6020830191508360208285010111156147af57600080fd5b600080600060808486031215614c4e57600080fd5b614c588585614be0565b925060608401356001600160401b03811115614c7357600080fd5b614c7f86828701614bf8565b9497909650939450505050565b600060208284031215614c9e57600080fd5b8135614ca981614b1c565b9392505050565b600080600060608486031215614cc557600080fd5b8335614cd081614b1c565b92506020840135614ce081614b1c565b929592945050506040919091013590565b600060208284031215614d0357600080fd5b5035919050565b60008060008060408587031215614d2057600080fd5b84356001600160401b0380821115614d3757600080fd5b614d4388838901614a97565b90965094506020870135915080821115614d5c57600080fd5b50614d6987828801614a97565b95989497509550505050565b60008060008060008060008060c0898b031215614d9157600080fd5b8835614d9c81614b1c565b97506020890135614dac81614b1c565b9650604089013595506060890135945060808901356001600160401b0380821115614dd657600080fd5b614de28c838d01614a97565b909650945060a08b0135915080821115614dfb57600080fd5b50614e088b828c01614a97565b999c989b5096995094979396929594505050565b6000806000806000806000806080898b031215614e3857600080fd5b88356001600160401b0380821115614e4f57600080fd5b614e5b8c838d01614a97565b909a50985060208b0135915080821115614e7457600080fd5b614e808c838d01614a97565b909850965060408b0135915080821115614e9957600080fd5b614ea58c838d01614a97565b909650945060608b0135915080821115614dfb57600080fd5b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715614ef657614ef6614ebe565b60405290565b604080519081016001600160401b0381118282101715614ef657614ef6614ebe565b60405160c081016001600160401b0381118282101715614ef657614ef6614ebe565b604051601f8201601f191681016001600160401b0381118282101715614f6857614f68614ebe565b604052919050565b63ffffffff8116811461106e57600080fd5b8035614b3c81614f70565b60006001600160401b03821115614fa657614fa6614ebe565b5060051b60200190565b600082601f830112614fc157600080fd5b81356020614fd6614fd183614f8d565b614f40565b82815260059290921b84018101918181019086841115614ff557600080fd5b8286015b8481101561501957803561500c81614b1c565b8352918301918301614ff9565b509695505050505050565b600082601f83011261503557600080fd5b81356020615045614fd183614f8d565b82815260059290921b8401810191818101908684111561506457600080fd5b8286015b848110156150195780358352918301918301615068565b600060e0828403121561509157600080fd5b615099614ed4565b90506150a482614b31565b81526150b260208301614b31565b60208201526150c360408301614b31565b6040820152606082013560608201526150de60808301614f82565b608082015260a08201356001600160401b03808211156150fd57600080fd5b61510985838601614fb0565b60a084015260c084013591508082111561512257600080fd5b5061512f84828501615024565b60c08301525092915050565b60006020828403121561514d57600080fd5b81356001600160401b0381111561516357600080fd5b61516f8482850161507f565b949350505050565b60006020828403121561518957600080fd5b813560ff81168114614ca957600080fd5b6000604082840312156151ac57600080fd5b6151b4614efc565b905081356151c181614b1c565b815260208201356bffffffffffffffffffffffff811681146151e257600080fd5b602082015292915050565b6000602080838503121561520057600080fd5b82356001600160401b038082111561521757600080fd5b818501915085601f83011261522b57600080fd5b8135615239614fd182614f8d565b81815260059190911b8301840190848101908883111561525857600080fd5b8585015b83811015615332578035858111156152745760008081fd5b860160e0818c03601f190181131561528c5760008081fd5b615294614f1e565b89830135888111156152a65760008081fd5b6152b48e8c83870101614fb0565b825250604080840135898111156152cb5760008081fd5b6152d98f8d83880101615024565b8c8401525060606152eb818601614b31565b82840152608091506152ff8f83870161519a565b9083015261530f60c08501614f82565b9082015261531e838301614b31565b60a08201528552505091860191860161525c565b5098975050505050505050565b801515811461106e57600080fd5b60008060008060006080868803121561536557600080fd5b85356001600160401b038082111561537c57600080fd5b9087019060e0828a03121561539057600080fd5b909550602087013590808211156153a657600080fd5b506153b388828901614a97565b9095509350506040860135915060608601356153ce8161533f565b809150509295509295909350565b600080604083850312156153ef57600080fd5b82356153fa81614b1c565b9150602083013561540a81614b1c565b809150509250929050565b60006040828403121561542757600080fd5b61542f614efc565b905081356001600160401b038082111561544857600080fd5b818401915084601f83011261545c57600080fd5b813560208282111561547057615470614ebe565b615482601f8301601f19168201614f40565b9250818352868183860101111561549857600080fd5b8181850182850137600081838501015282855280860135818601525050505092915050565b600080600080600060a086880312156154d557600080fd5b85356154e081614b1c565b945060208601356154f081614b1c565b935060408601356001600160401b038082111561550c57600080fd5b61551889838a01615415565b9450606088013591508082111561552e57600080fd5b5061553b88828901615415565b95989497509295608001359392505050565b6000806040838503121561556057600080fd5b823561556b81614b1c565b915060208301356001600160401b0381111561558657600080fd5b61559285828601614fb0565b9150509250929050565b600081518084526020808501945080840160005b838110156155cc578151875295820195908201906001016155b0565b509495945050505050565b602081526000614ca9602083018461559c565b600080602083850312156155fd57600080fd5b82356001600160401b0381111561561357600080fd5b614b1085828601614bf8565b6000806040838503121561563257600080fd5b823561563d81614b1c565b946020939093013593505050565b6000806000806080858703121561566157600080fd5b843561566c81614b1c565b935060208501359250604085013561568381614b1c565b9396929550929360600135925050565b600081518084526020808501945080840160005b838110156155cc5781516001600160a01b0316875295820195908201906001016156a7565b6040815260006156df6040830185615693565b82810360208401526112a0818561559c565b60008060006060848603121561570657600080fd5b833561571181614b1c565b925060208401356001600160401b0381111561572c57600080fd5b61573886828701615415565b925050604084013590509250925092565b60006060828403121561575b57600080fd5b614ca98383614be0565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156157a5576157a561577b565b5060010190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b60008235605e198336030181126157f957600080fd5b9190910192915050565b6000808335601e1984360301811261581a57600080fd5b8301803591506001600160401b0382111561583457600080fd5b6020019150600581901b36038213156147af57600080fd5b60608101823561585b81614b1c565b6001600160a01b03908116835260208401359061587782614b1c565b166020830152604083013561588b81614f70565b63ffffffff811660408401525092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b6000602082840312156158df57600080fd5b8151614ca981614b1c565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60208082526037908201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60408201527f616e616765724f72456967656e506f644d616e61676572000000000000000000606082015260800190565b6000602082840312156159a357600080fd5b8151614ca98161533f565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000823560de198336030181126157f957600080fd5b600060208284031215615a1e57600080fd5b8135614ca98161533f565b600060018060a01b03808351168452806020840151166020850152806040840151166040850152506060820151606084015263ffffffff608083015116608084015260a082015160e060a0850152615a8460e0850182615693565b905060c083015184820360c08601526112a0828261559c565b602081526000614ca96020830184615a29565b602081526000825160e06020840152615acd610100840182615693565b90506020840151601f19848303016040850152615aea828261559c565b915050604084015160018060a01b03808216606086015260608601519150808251166080860152506bffffffffffffffffffffffff60208201511660a0850152506080840151615b4260c085018263ffffffff169052565b5060a08401516001600160a01b03811660e0850152610a3b565b60008060408385031215615b6f57600080fd5b8251615b7a8161533f565b6020939093015192949293505050565b82815260406020820152600061516f6040830184615a29565b600060208284031215615bb557600080fd5b5051919050565b600082601f830112615bcd57600080fd5b81516020615bdd614fd183614f8d565b82815260059290921b84018101918181019086841115615bfc57600080fd5b8286015b848110156150195780518352918301918301615c00565b60008060408385031215615c2a57600080fd5b82516001600160401b0380821115615c4157600080fd5b818501915085601f830112615c5557600080fd5b81516020615c65614fd183614f8d565b82815260059290921b84018101918181019089841115615c8457600080fd5b948201945b83861015615cab578551615c9c81614b1c565b82529482019490820190615c89565b91880151919650909350505080821115615cc457600080fd5b5061559285828601615bbc565b60008219821115615ce457615ce461577b565b500190565b600082821015615cfb57615cfb61577b565b500390565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060208284031215615d3657600080fd5b8135614ca981614f70565b80546001600160a01b0319166001600160a01b0392909216919091179055565b8135615d6c81614b1c565b615d768183615d41565b50600181016020830135615d8981614b1c565b615d938183615d41565b506040830135615da281614f70565b815463ffffffff60a01b191660a09190911b63ffffffff60a01b161790555050565b6000615dd0368361507f565b92915050565b6020808252606e90820152600080516020615efc83398151915260408201527f645769746864726177616c3a207769746864726177616c44656c6179426c6f6360608201527f6b7320706572696f6420686173206e6f74207965742070617373656420666f7260808201526d207468697320737472617465677960901b60a082015260c00190565b82815260006020604081840152835180604085015260005b81811015615e9257858101830151858201606001528201615e76565b81811115615ea4576000606083870101525b50601f01601f191692909201606001949350505050565b600060208284031215615ecd57600080fd5b81516001600160e01b031981168114614ca957600080fd5b634e487b7160e01b600052602160045260246000fdfe44656c65676174696f6e4d616e616765722e5f636f6d706c6574655175657565a2646970667358221220ffb5e101f50fc5f699cdea78c0c203cfab0ab248c3fc5db98d12b11d1eb9d13464736f6c634300080c0033","storage":{"0x0":"0xff"}},"0xc3e53f4d16ae77db1c982e75a937b9f60fe63690":{"nonce":1,"balance":"0x0","code":"0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063c298557814602d575b600080fd5b600060405190815260200160405180910390f3fea26469706673582212200b1606d024a562b7e6af692290381511436181bd5da5886a60bf8773d01604f164736f6c634300081a0033","storage":{}},"0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122061dc9392cf6ba7869fe7bc6ba05d8409fb69605ae4794b23a59c97020514de6d64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x65":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x66":"0x0","0x97":"0x831f01b2aeb61d5d8c019704e62c25763057a8806c5c790bc8b4c99ee54ac8a7","0x9d":"0x1","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xb7f8bc63bbcad18155201308c8f3540b07f84f5e","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122061dc9392cf6ba7869fe7bc6ba05d8409fb69605ae4794b23a59c97020514de6d64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x97":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x98":"0x0","0xc9":"0xd65ac9700cec4e530497617d02afdf0d5de3ed18466aca1578edcbce0d40ee16","0xcb":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0","0x74a9579f8366568b2792a7aa47988633896f9826ad6936da0f98ccff5c8ddab9":"0x0","0xac02fc4b95e25e4d2039d07a7ec79c323d4ec14f0cd7375b739e011a1bc7f187":"0x1","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0xe6e340d132b5f46d1e472debcd681b2abc16e57e":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806346fbf68e146100515780638568520614610089578063ce5484281461009e578063eab66d7a146100b1575b600080fd5b61007461005f366004610313565b60006020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61009c610097366004610335565b6100dc565b005b61009c6100ac366004610313565b61011d565b6001546100c4906001600160a01b031681565b6040516001600160a01b039091168152602001610080565b6001546001600160a01b0316331461010f5760405162461bcd60e51b815260040161010690610371565b60405180910390fd5b6101198282610153565b5050565b6001546001600160a01b031633146101475760405162461bcd60e51b815260040161010690610371565b61015081610220565b50565b6001600160a01b0382166101bf5760405162461bcd60e51b815260206004820152602d60248201527f50617573657252656769737472792e5f7365745061757365723a207a65726f2060448201526c1859191c995cdcc81a5b9c1d5d609a1b6064820152608401610106565b6001600160a01b03821660008181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b03811661028e5760405162461bcd60e51b815260206004820152602f60248201527f50617573657252656769737472792e5f736574556e7061757365723a207a657260448201526e1bc81859191c995cdcc81a5b9c1d5d608a1b6064820152608401610106565b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b038116811461030e57600080fd5b919050565b60006020828403121561032557600080fd5b61032e826102f7565b9392505050565b6000806040838503121561034857600080fd5b610351836102f7565b91506020830135801515811461036657600080fd5b809150509250929050565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b60608201526080019056fea26469706673582212206efc7dda728de21b0b958c44926362ec165fd212fe621c3f0d39b82fd0427a9364736f6c634300081a0033","storage":{"0x1":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x723077b8a1b173adc35e5f0e7e3662fd1208212cb629f9c128551ea7168da722":"0x1"}},"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806346fbf68e146100515780638568520614610089578063ce5484281461009e578063eab66d7a146100b1575b600080fd5b61007461005f366004610313565b60006020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61009c610097366004610335565b6100dc565b005b61009c6100ac366004610313565b61011d565b6001546100c4906001600160a01b031681565b6040516001600160a01b039091168152602001610080565b6001546001600160a01b0316331461010f5760405162461bcd60e51b815260040161010690610371565b60405180910390fd5b6101198282610153565b5050565b6001546001600160a01b031633146101475760405162461bcd60e51b815260040161010690610371565b61015081610220565b50565b6001600160a01b0382166101bf5760405162461bcd60e51b815260206004820152602d60248201527f50617573657252656769737472792e5f7365745061757365723a207a65726f2060448201526c1859191c995cdcc81a5b9c1d5d609a1b6064820152608401610106565b6001600160a01b03821660008181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b03811661028e5760405162461bcd60e51b815260206004820152602f60248201527f50617573657252656769737472792e5f736574556e7061757365723a207a657260448201526e1bc81859191c995cdcc81a5b9c1d5d608a1b6064820152608401610106565b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b038116811461030e57600080fd5b919050565b60006020828403121561032557600080fd5b61032e826102f7565b9392505050565b6000806040838503121561034857600080fd5b610351836102f7565b91506020830135801515811461036657600080fd5b809150509250929050565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b60608201526080019056fea26469706673582212209d16b337e572efd6aa7c9a1f129223998361e2c66fd3f3315454d1a0590f6f0e64736f6c634300080c0033","storage":{"0x1":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x723077b8a1b173adc35e5f0e7e3662fd1208212cb629f9c128551ea7168da722":"0x1"}},"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266":{"nonce":39,"balance":"0x21e197f4789c9e00fc8","code":"0x","storage":{}},"0xf5059a5d33d5853360d16c683c16e67980206f36":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061021c5760003560e01c8063715018a611610125578063a98fb355116100ad578063d5dba76d1161007c578063d5dba76d14610514578063e481af9d14610527578063f289a7fb1461052f578063f2fde38b14610582578063fabc1cbc1461059557600080fd5b8063a98fb355146104bb578063aa5b9cad146104ce578063abd3b6bd146104e1578063b224b9791461050157600080fd5b806394bb371b116100f457806394bb371b146104415780639926ee7d14610461578063a3524f9514610474578063a364f4da14610487578063a551c1b81461049a57600080fd5b8063715018a6146103f0578063886f1195146103f85780638b00ce7c1461040b5780638da5cb5b1461043057600080fd5b80632e8da829116101a85780635c975abb116101775780635c975abb14610374578063630868dc1461037c57806366d382031461038f57806368304835146103a25780636b3aa72e146103c957600080fd5b80632e8da8291461031657806333cfb7b714610329578063595c6a67146103495780635ac86ab71461035157600080fd5b80631b445516116101ef5780631b4455161461028c5780631be785ac1461029f5780631ee3ca10146102b257806324d7806c146102c55780632d89f6fc146102e857600080fd5b806310d67a2f14610221578063136439dd1461023657806314bfd6d01461024957806316bd83c314610279575b600080fd5b61023461022f36600461349a565b6105a8565b005b6102346102443660046134b7565b610664565b61025c6102573660046134b7565b6107a3565b6040516001600160a01b0390911681526020015b60405180910390f35b610234610287366004613674565b6107cd565b61023461029a3660046136a8565b610b35565b6102346102ad36600461372b565b610b4b565b6102346102c0366004613789565b610c44565b6102d86102d336600461349a565b610d03565b6040519015158152602001610270565b6103086102f63660046137d9565b60cb6020526000908152604090205481565b604051908152602001610270565b6102d861032436600461349a565b610d8c565b61033c61033736600461349a565b610df9565b60405161027091906137f4565b610234610e0a565b6102d861035f366004613840565b609854600160ff9092169190911b9081161490565b609854610308565b61025c61038a3660046134b7565b610ed1565b61023461039d36600461349a565b610ee1565b61025c7f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f37304281565b61025c7f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570781565b61023461106c565b60975461025c906001600160a01b031681565b60c95461041b9063ffffffff1681565b60405163ffffffff9091168152602001610270565b6033546001600160a01b031661025c565b61045461044f36600461349a565b611080565b60405161027091906138d2565b61023461046f3660046138e5565b6111c2565b610234610482366004613b4a565b611269565b61023461049536600461349a565b6114d2565b6104ad6104a83660046134b7565b611523565b604051610270929190613c94565b6102346104c9366004613cb8565b6115e5565b61025c6104dc366004613cec565b611613565b6104f46104ef366004613d53565b61164a565b6040516102709190613d87565b61023461050f366004613cec565b611673565b6102d861052236600461349a565b61193c565b61033c611a5c565b60ca546105599063ffffffff8082169160ff64010000000082041691650100000000009091041683565b6040805163ffffffff948516815260ff9093166020840152921691810191909152606001610270565b61023461059036600461349a565b611a6b565b6102346105a33660046134b7565b611ae1565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061061f9190613d9a565b6001600160a01b0316336001600160a01b0316146106585760405162461bcd60e51b815260040161064f90613db7565b60405180910390fd5b61066181611c3d565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d09190613e01565b6106ec5760405162461bcd60e51b815260040161064f90613e1e565b609854818116146107655760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161064f565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b60cd81815481106107b357600080fd5b6000918252602090912001546001600160a01b0316905081565b60405163ec7fbb3160e01b81523360048201527f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f3730426001600160a01b03169063ec7fbb3190602401602060405180830381865afa158015610831573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108559190613e01565b15156001146108a65760405162461bcd60e51b815260206004820152601b60248201527f4f70657261746f72206d757374206265207468652063616c6c65720000000000604482015260640161064f565b80516001600160a01b0316331461090e5760405162461bcd60e51b815260206004820152602660248201527f4d657461646174612061646472657373206d757374206d61746368207468652060448201526531b0b63632b960d11b606482015260840161064f565b6020810151511580156109f35760005b60ce548110156109b55782600001516001600160a01b031660ce828154811061094957610949613e66565b60009182526020909120600290910201546001600160a01b0316036109ad5760ce818154811061097b5761097b613e66565b60009182526020822060029091020180546001600160a01b0319168155906109a66001830182613437565b5050505050565b60010161091e565b5060405162461bcd60e51b815260206004820152601260248201527113dc195c985d1bdc881b9bdd08199bdd5b9960721b604482015260640161064f565b60005b60ce54811015610aa85782600001516001600160a01b031660ce8281548110610a2157610a21613e66565b60009182526020909120600290910201546001600160a01b031603610aa0578260ce8281548110610a5457610a54613e66565b600091825260209182902083516002929092020180546001600160a01b0319166001600160a01b03909216919091178155908201516001820190610a989082613f02565b505050505050565b6001016109f6565b5060ce805460018101825560009190915282517fd36cd1c74ef8d7326d8021b776c18fb5a5724b7f7bc93c2f42e43e10ef27d12a600290920291820180546001600160a01b0319166001600160a01b03909216919091178155602084015184927fd36cd1c74ef8d7326d8021b776c18fb5a5724b7f7bc93c2f42e43e10ef27d12b01906109a69082613f02565b610b3d611d34565b610b478282611d8e565b5050565b610b5433610d03565b610b705760405162461bcd60e51b815260040161064f90613fc0565b8015610bc75760cc80546001810182556000919091527f47197230e1e4b29fc0bd84d7d78966c0925452aff72a2a121538b102457e9ebe0180546001600160a01b0384166001600160a01b03199091161790555050565b60005b60cc548110156109b557826001600160a01b031660cc8281548110610bf157610bf1613e66565b6000918252602090912001546001600160a01b031603610c3c5760cc8181548110610c1e57610c1e613e66565b600091825260209091200180546001600160a01b0319169055505050565b600101610bca565b610c4d33610d03565b610c695760405162461bcd60e51b815260040161064f90613fc0565b805163ffffffff1615610c9257805160ca805463ffffffff191663ffffffff9092169190911790555b602081015160ff1615610cc557602081015160ca805460ff9092166401000000000264ff00000000199092169190911790555b604081015163ffffffff1615610661576040015160ca805463ffffffff909216650100000000000268ffffffff000000000019909216919091179055565b6000610d176033546001600160a01b031690565b6001600160a01b03163303610d2e57506001919050565b60005b60cd54811015610d8357826001600160a01b031660cd8281548110610d5857610d58613e66565b6000918252602090912001546001600160a01b031603610d7b5750600192915050565b600101610d31565b50600092915050565b6000610d9782610d03565b15610da457506001919050565b60005b60cc54811015610d8357826001600160a01b031660cc8281548110610dce57610dce613e66565b6000918252602090912001546001600160a01b031603610df15750600192915050565b600101610da7565b6060610e0482611ffe565b92915050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610e52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e769190613e01565b610e925760405162461bcd60e51b815260040161064f90613e1e565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60cc81815481106107b357600080fd5b600054610100900460ff1615808015610f015750600054600160ff909116105b80610f1b5750303b158015610f1b575060005460ff166001145b610f7e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161064f565b6000805460ff191660011790558015610fa1576000805461ff0019166101001790555b60408051606081018252610708815260016020820181905261012c919092015260ca805468ffffffffffffffffff191666012c010000070817905560cd805491820181556000527f83978b4c69c48dd978ab43fe30f077615294f938fb7f936d9eb340e51ea7db2e0180546001600160a01b0319166001600160a01b0384161790558015610b47576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b611074611d34565b61107e600061232a565b565b60408051808201909152600081526060602082015260005b60ce548110156109b557826001600160a01b031660ce82815481106110bf576110bf613e66565b60009182526020909120600290910201546001600160a01b0316036111ba5760ce81815481106110f1576110f1613e66565b60009182526020918290206040805180820190915260029092020180546001600160a01b03168252600181018054929391929184019161113090613e7c565b80601f016020809104026020016040519081016040528092919081815260200182805461115c90613e7c565b80156111a95780601f1061117e576101008083540402835291602001916111a9565b820191906000526020600020905b81548152906001019060200180831161118c57829003601f168201915b505050505081525050915050919050565b600101611098565b336001600160a01b037f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f373042161461120a5760405162461bcd60e51b815260040161064f90613fed565b61121382610d8c565b61125f5760405162461bcd60e51b815260206004820152601860248201527f4f70657261746f72206e6f742077686974656c69737465640000000000000000604482015260640161064f565b610b47828261237c565b63ffffffff8116600090815260cb6020908152604091829020548451925190926112959290910161416d565b604051602081830303815290604052805190602001201461131e5760405162461bcd60e51b815260206004820152603d60248201527f737570706c696564207461736b20646f6573206e6f74206d617463682074686560448201527f206f6e65207265636f7264656420696e2074686520636f6e7472616374000000606482015260840161064f565b81516040015163ffffffff42811691161161136e5760405162461bcd60e51b815260206004820152601060248201526f15185cdac81a185cc8195e1c1a5c995960821b604482015260640161064f565b6040805160c0810182528351518201519181019182528351516080908101516001600160a01b03166060830152845160209081015163ffffffff1682840152600160a08401529282528285015192820192909252835190910151516000906001600160401b038111156113e3576113e36134d0565b60405190808252806020026020018201604052801561140c578160200160208202803683370190505b50905060005b81518110156114715784516080015180518290811061143357611433613e66565b60200260200101516000015182828151811061145157611451613e66565b6001600160a01b0390921660209283029190910190910152600101611412565b5061147c82826123ca565b63ffffffff8316600081815260cb602052604080822091909155517fa5be567caa88ff11b6da2cf017f9cefffcafa24111a9ecbf0b0bc476944f0f09906114c4908790614180565b60405180910390a250505050565b336001600160a01b037f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f373042161461151a5760405162461bcd60e51b815260040161064f90613fed565b610661816124ee565b60ce818154811061153357600080fd5b6000918252602090912060029091020180546001820180546001600160a01b0390921693509061156290613e7c565b80601f016020809104026020016040519081016040528092919081815260200182805461158e90613e7c565b80156115db5780601f106115b0576101008083540402835291602001916115db565b820191906000526020600020905b8154815290600101906020018083116115be57829003601f168201915b5050505050905082565b6115ee33610d03565b61160a5760405162461bcd60e51b815260040161064f90613fc0565b61066181612566565b600080836040516020016116279190614205565b604051602081830303815290604052905061164281846125b2565b949350505050565b60608160405160200161165d9190614205565b6040516020818303038152906040529050919050565b60808201516001600160a01b031633146117395760008260405160200161169a9190614205565b604051602081830303815290604052905060006116b782846125b2565b905083608001516001600160a01b0316816001600160a01b0316146117365760405162461bcd60e51b815260206004820152602f60248201527f5369676e6572206f6620726571756573745369676e6174757265206973206e6f60448201526e3a103932b8bab2b9ba1737bbb732b960891b606482015260840161064f565b50505b60006117498360600151426125f3565b60ca5490915063ffffffff65010000000000909104811690821611156117b15760405162461bcd60e51b815260206004820152601e60248201527f526571756573742074696d657374616d7020746f6f2066617220617761790000604482015260640161064f565b6040805161016081018252606060c08201819052600060e08301819052610100830181905261012083018190526101408301819052928201839052808201839052608082015260a081019190915283815263ffffffff4281166020830181905260ca5461181f92169061422e565b63ffffffff1660408281019190915260ca54640100000000900460ff1660608301525160009061185390839060200161416d565b60408051808303601f19018152919052805160209091012060ca5490915061188690640100000000900460ff1682612628565b608083015260405161189c90839060200161416d565b60408051601f19818403018152828252805160209182012060c9805463ffffffff908116600090815260cb90945293909220555416907f7738d1b30deac7824a0580de02efde3bb766c7b7b5ea79da34869ebd887cebf3906118ff90859061416d565b60405180910390a260c95461191b9063ffffffff16600161422e565b60c9805463ffffffff191663ffffffff929092169190911790555050505050565b6040516398ec1ac960e01b81526001600160a01b03828116600483015260009182917f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f37304216906398ec1ac990602401602060405180830381865afa1580156119a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119cb919061424a565b905060007f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f3730426001600160a01b03166340bf2fb76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a51919061424a565b909110159392505050565b6060611a666129d3565b905090565b611a73611d34565b6001600160a01b038116611ad85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161064f565b6106618161232a565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b589190613d9a565b6001600160a01b0316336001600160a01b031614611b885760405162461bcd60e51b815260040161064f90613db7565b609854198119609854191614611c065760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161064f565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610798565b6001600160a01b038116611ccb5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161064f565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b0316331461107e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161064f565b60005b81811015611f8157828282818110611dab57611dab613e66565b9050602002810190611dbd9190614263565b611dce90604081019060200161349a565b6001600160a01b03166323b872dd3330868686818110611df057611df0613e66565b9050602002810190611e029190614263565b604080516001600160e01b031960e087901b1681526001600160a01b039485166004820152939092166024840152013560448201526064016020604051808303816000875af1158015611e59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7d9190613e01565b50828282818110611e9057611e90613e66565b9050602002810190611ea29190614263565b611eb390604081019060200161349a565b6001600160a01b031663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000858585818110611ef457611ef4613e66565b9050602002810190611f069190614263565b604080516001600160e01b031960e086901b1681526001600160a01b039093166004840152013560248201526044016020604051808303816000875af1158015611f54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f789190613e01565b50600101611d91565b50604051630da22a8b60e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631b44551690611fd09085908590600401614313565b600060405180830381600087803b158015611fea57600080fd5b505af1158015610a98573d6000803e3d6000fd5b606060007f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f3730426001600160a01b0316631703a0186040518163ffffffff1660e01b8152600401600060405180830381865afa158015612060573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612088919081019061442d565b8051519091506000816001600160401b038111156120a8576120a86134d0565b6040519080825280602002602001820160405280156120d1578160200160208202803683370190505b50905060005b828110156121315783518051829081106120f3576120f3613e66565b60200260200101516000015182828151811061211157612111613e66565b6001600160a01b03909216602092830291909101909101526001016120d7565b50604051639004134760e01b81526000906001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916906390041347906121839089908690600401614535565b600060405180830381865afa1580156121a0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526121c89190810190614594565b90506000836001600160401b038111156121e4576121e46134d0565b60405190808252806020026020018201604052801561220d578160200160208202803683370190505b5090506000805b8581101561225457600084828151811061223057612230613e66565b6020026020010151111561224c578161224881614629565b9250505b600101612214565b506000816001600160401b0381111561226f5761226f6134d0565b604051908082528060200260200182016040528015612298578160200160208202803683370190505b50905060005b8681101561231d5760008582815181106122ba576122ba613e66565b60200260200101511115612315578381815181106122da576122da613e66565b60200260200101518282815181106122f4576122f4613e66565b60200260200101906001600160a01b031690816001600160a01b0316815250505b60010161229e565b5098975050505050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051639926ee7d60e01b81526001600160a01b037f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f8757071690639926ee7d90611fd09085908590600401614642565b60008260200151511161240f5760405162461bcd60e51b815260206004820152600d60248201526c4e6f207369676e61747572657360981b604482015260640161064f565b600061241a83612b10565b905060005b82518110156124e8576000805b83518110156124915784838151811061244757612447613e66565b60200260200101516001600160a01b031684828151811061246a5761246a613e66565b60200260200101516001600160a01b0316036124895760019150612491565b60010161242c565b50806124df5760405162461bcd60e51b815260206004820152601960248201527f4d697373696e67207769746e657373207369676e617475726500000000000000604482015260640161064f565b5060010161241f565b50505050565b6040516351b27a6d60e11b81526001600160a01b0382811660048301527f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f875707169063a364f4da906024015b600060405180830381600087803b15801561255257600080fd5b505af11580156109a6573d6000803e3d6000fd5b60405163a98fb35560e01b81526001600160a01b037f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f875707169063a98fb35590612538908490600401613d87565b6000806125bf8451612bdf565b846040516020016125d192919061468d565b6040516020818303038152906040528051906020012090506116428184612d0a565b60008163ffffffff168363ffffffff16116126175761261283836146e8565b612621565b61262182846146e8565b9392505050565b60ce5460609060ff841611156126805760405162461bcd60e51b815260206004820152601e60248201527f496e7465726e616c3a204e6f7420656e6f756768206f70657261746f72730000604482015260640161064f565b600060ce805480602002602001604051908101604052809291908181526020016000905b8282101561277d576000848152602090819020604080518082019091526002850290910180546001600160a01b0316825260018101805492939192918401916126ec90613e7c565b80601f016020809104026020016040519081016040528092919081815260200182805461271890613e7c565b80156127655780601f1061273a57610100808354040283529160200191612765565b820191906000526020600020905b81548152906001019060200180831161274857829003601f168201915b505050505081525050815260200190600101906126a4565b50508251929350600091505060ff86166001600160401b038111156127a4576127a46134d0565b6040519080825280602002602001820160405280156127ea57816020015b6040805180820190915260008152606060208201528152602001906001900390816127c25790505b50905060005b81518160ff1610156129c957600083116128725760405162461bcd60e51b815260206004820152603760248201527f496e7465726e616c3a204665657320746f6f206c6f772e204e6f206f7065726160448201527f746f7273206c65667420746f207069636b2066726f6d2e000000000000000000606482015260840161064f565b6000836128bb61288560ff85168a614704565b60408051446020808301919091524282840152606080830194909452825180830390940184526080909101909152815191012090565b6128c5919061472d565b905060008582815181106128db576128db613e66565b60200260200101519050856001866128f39190614741565b8151811061290357612903613e66565b602002602001015186838151811061291d5761291d613e66565b6020908102919091010152612933600186614741565b9450612942816000015161193c565b61294d5750506127f0565b8060000151848460ff168151811061296757612967613e66565b6020026020010151600001906001600160a01b031690816001600160a01b0316815250508060200151848460ff16815181106129a5576129a5613e66565b60200260200101516020018190525082806129bf90614754565b93505050506127f0565b5095945050505050565b606060007f0000000000000000000000009e545e3c0baab3e08cdfd552c960a1050f3730426001600160a01b0316631703a0186040518163ffffffff1660e01b8152600401600060405180830381865afa158015612a35573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a5d919081019061442d565b905060008160000151516001600160401b03811115612a7e57612a7e6134d0565b604051908082528060200260200182016040528015612aa7578160200160208202803683370190505b50905060005b825151811015612b09578251805182908110612acb57612acb613e66565b602002602001015160000151828281518110612ae957612ae9613e66565b6001600160a01b0390921660209283029190910190910152600101612aad565b5092915050565b60606000612b218360000151612d26565b905060008360200151516001600160401b03811115612b4257612b426134d0565b604051908082528060200260200182016040528015612b6b578160200160208202803683370190505b50905060005b846020015151811015612bd757612ba58386602001518381518110612b9857612b98613e66565b60200260200101516125b2565b828281518110612bb757612bb7613e66565b6001600160a01b0390921660209283029190910190910152600101612b71565b509392505050565b606081600003612c065750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612c305780612c1a81614629565b9150612c299050600a83614773565b9150612c0a565b6000816001600160401b03811115612c4a57612c4a6134d0565b6040519080825280601f01601f191660200182016040528015612c74576020820181803683370190505b509050815b8515612d0157612c8a600182614741565b90506000612c99600a88614773565b612ca490600a614787565b612cae9088614741565b612cb990603061479e565b905060008160f81b905080848481518110612cd657612cd6613e66565b60200101906001600160f81b031916908160001a905350612cf8600a89614773565b97505050612c79565b50949350505050565b6000806000612d198585612d96565b91509150612bd781612e04565b6060612d568260000151604051602001612d4291815260200190565b604051602081830303815290604052612fba565b612d638360200151613173565b612d76846040015163ffffffff16612bdf565b612d838560600151612bdf565b60405160200161165d94939291906147b7565b6000808251604103612dcc5760208301516040840151606085015160001a612dc0878285856132d5565b94509450505050612dfd565b8251604003612df55760208301516040840151612dea8683836133c2565b935093505050612dfd565b506000905060025b9250929050565b6000816004811115612e1857612e1861483d565b03612e205750565b6001816004811115612e3457612e3461483d565b03612e815760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161064f565b6002816004811115612e9557612e9561483d565b03612ee25760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161064f565b6003816004811115612ef657612ef661483d565b03612f4e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161064f565b6004816004811115612f6257612f6261483d565b036106615760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161064f565b6060600082516002612fcc9190614787565b6001600160401b03811115612fe357612fe36134d0565b6040519080825280601f01601f19166020018201604052801561300d576020820181803683370190505b5060408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b602082015290915060005b84518110156131495781825186838151811061305957613059613e66565b016020015161306b919060f81c614773565b8151811061307b5761307b613e66565b01602001516001600160f81b03191683613096836002614787565b815181106130a6576130a6613e66565b60200101906001600160f81b031916908160001a9053508182518683815181106130d2576130d2613e66565b01602001516130e4919060f81c61472d565b815181106130f4576130f4613e66565b01602001516001600160f81b0319168361310f836002614787565b61311a906001614704565b8151811061312a5761312a613e66565b60200101906001600160f81b031916908160001a90535060010161303b565b508160405160200161315b9190614853565b60405160208183030381529060405292505050919050565b60408051602880825260608281019093526000919060208201818036833701905050905060005b60148110156132ac5760006131b0826013614741565b6131bb906008614787565b6131c690600261495c565b6131d9906001600160a01b038716614773565b60f81b9050600060108260f81c6131f09190614968565b60f81b905060008160f81c6010613207919061498a565b8360f81c61321591906149a6565b60f81b9050613223826133fc565b8561322f866002614787565b8151811061323f5761323f613e66565b60200101906001600160f81b031916908160001a90535061325f816133fc565b8561326b866002614787565b613276906001614704565b8151811061328657613286613e66565b60200101906001600160f81b031916908160001a905350506001909201915061319a9050565b50806040516020016132be9190614853565b604051602081830303815290604052915050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561330c57506000905060036133b9565b8460ff16601b1415801561332457508460ff16601c14155b1561333557506000905060046133b9565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613389573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166133b2576000600192509250506133b9565b9150600090505b94509492505050565b6000806001600160ff1b038316816133df60ff86901c601b614704565b90506133ed878288856132d5565b9350935050505b935093915050565b6000600a60f883901c10156134235761341a60f883901c603061479e565b60f81b92915050565b61341a60f883901c605761479e565b919050565b50805461344390613e7c565b6000825580601f10613453575050565b601f01602090049060005260206000209081019061066191905b80821115613481576000815560010161346d565b5090565b6001600160a01b038116811461066157600080fd5b6000602082840312156134ac57600080fd5b813561262181613485565b6000602082840312156134c957600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715613508576135086134d0565b60405290565b604051606081016001600160401b0381118282101715613508576135086134d0565b60405160c081016001600160401b0381118282101715613508576135086134d0565b604051602081016001600160401b0381118282101715613508576135086134d0565b604051601f8201601f191681016001600160401b038111828210171561359c5761359c6134d0565b604052919050565b600082601f8301126135b557600080fd5b8135602083016000806001600160401b038411156135d5576135d56134d0565b50601f8301601f19166020016135ea81613574565b9150508281528583830111156135ff57600080fd5b82826020830137600092810160200192909252509392505050565b60006040828403121561362c57600080fd5b6136346134e6565b9050813561364181613485565b815260208201356001600160401b0381111561365c57600080fd5b613668848285016135a4565b60208301525092915050565b60006020828403121561368657600080fd5b81356001600160401b0381111561369c57600080fd5b6116428482850161361a565b600080602083850312156136bb57600080fd5b82356001600160401b038111156136d157600080fd5b8301601f810185136136e257600080fd5b80356001600160401b038111156136f857600080fd5b8560208260051b840101111561370d57600080fd5b6020919091019590945092505050565b801515811461066157600080fd5b6000806040838503121561373e57600080fd5b823561374981613485565b915060208301356137598161371d565b809150509250929050565b803563ffffffff8116811461343257600080fd5b803560ff8116811461343257600080fd5b6000606082840312801561379c57600080fd5b506137a561350e565b6137ae83613764565b81526137bc60208401613778565b60208201526137cd60408401613764565b60408201529392505050565b6000602082840312156137eb57600080fd5b61262182613764565b602080825282518282018190526000918401906040840190835b818110156138355783516001600160a01b031683526020938401939092019160010161380e565b509095945050505050565b60006020828403121561385257600080fd5b61262182613778565b60005b8381101561387657818101518382015260200161385e565b50506000910152565b6000815180845261389781602086016020860161385b565b601f01601f19169290920160200192915050565b60018060a01b0381511682526000602082015160406020850152611642604085018261387f565b60208152600061262160208301846138ab565b600080604083850312156138f857600080fd5b823561390381613485565b915060208301356001600160401b0381111561391e57600080fd5b83016060818603121561393057600080fd5b61393861350e565b81356001600160401b0381111561394e57600080fd5b61395a878285016135a4565b8252506020828101359082015260409182013591810191909152919491935090915050565b600060a0828403121561399157600080fd5b60405160a081016001600160401b03811182821017156139b3576139b36134d0565b60405290508082356001600160401b038111156139cf57600080fd5b6139db858286016135a4565b82525060208381013590820152604080840135908201526139fe60608401613764565b60608201526080830135613a1181613485565b6080919091015292915050565b60006001600160401b03821115613a3757613a376134d0565b5060051b60200190565b600082601f830112613a5257600080fd5b8135613a65613a6082613a1e565b613574565b8082825260208201915060208360051b860101925085831115613a8757600080fd5b602085015b838110156129c95780356001600160401b03811115613aaa57600080fd5b613ab9886020838a010161361a565b84525060209283019201613a8c565b600082601f830112613ad957600080fd5b8135613ae7613a6082613a1e565b8082825260208201915060208360051b860101925085831115613b0957600080fd5b602085015b838110156129c95780356001600160401b03811115613b2c57600080fd5b613b3b886020838a01016135a4565b84525060209283019201613b0e565b60008060408385031215613b5d57600080fd5b82356001600160401b03811115613b7357600080fd5b830160408186031215613b8557600080fd5b613b8d6134e6565b81356001600160401b03811115613ba357600080fd5b820160c08188031215613bb557600080fd5b613bbd613530565b81356001600160401b03811115613bd357600080fd5b613bdf8982850161397f565b825250613bee60208301613764565b6020820152613bff60408301613764565b6040820152613c1060608301613778565b606082015260808201356001600160401b03811115613c2e57600080fd5b613c3a89828501613a41565b60808301525060a09182013591810191909152815260208201356001600160401b03811115613c6857600080fd5b613c7487828501613ac8565b6020830152508093505050613c8b60208401613764565b90509250929050565b6001600160a01b03831681526040602082018190526000906116429083018461387f565b600060208284031215613cca57600080fd5b81356001600160401b03811115613ce057600080fd5b611642848285016135a4565b60008060408385031215613cff57600080fd5b82356001600160401b03811115613d1557600080fd5b613d218582860161397f565b92505060208301356001600160401b03811115613d3d57600080fd5b613d49858286016135a4565b9150509250929050565b600060208284031215613d6557600080fd5b81356001600160401b03811115613d7b57600080fd5b6116428482850161397f565b602081526000612621602083018461387f565b600060208284031215613dac57600080fd5b815161262181613485565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215613e1357600080fd5b81516126218161371d565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680613e9057607f821691505b602082108103613eb057634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115613efd57806000526020600020601f840160051c81016020851015613edd5750805b601f840160051c820191505b818110156109a65760008155600101613ee9565b505050565b81516001600160401b03811115613f1b57613f1b6134d0565b613f2f81613f298454613e7c565b84613eb6565b6020601f821160018114613f635760008315613f4b5750848201515b600019600385901b1c1916600184901b1784556109a6565b600084815260208120601f198516915b82811015613f935787850151825560209485019460019092019101613f73565b5084821015613fb15786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60208082526013908201527221b0b63632b91034b9903737ba1030b236b4b760691b604082015260600190565b6020808252604a908201527f4543445341536572766963654d616e61676572426173652e6f6e6c795374616b60408201527f6552656769737472793a2063616c6c6572206973206e6f7420746865207374616060820152696b65526567697374727960b01b608082015260a00190565b6000815160a0845261407260a085018261387f565b602084810151908601526040808501519086015260608085015163ffffffff16908601526080938401516001600160a01b031693909401929092525090919050565b6000815160c084526140c960c085018261405d565b905063ffffffff602084015116602085015263ffffffff604084015116604085015260ff60608401511660608501526080830151848203608086015281815180845260208401915060208160051b85010160208401935060005b8281101561415457601f1986830301845261413f8286516138ab565b60209586019594909401939150600101614123565b5060a087015160a0890152809550505050505092915050565b60208152600061262160208301846140b4565b60208152600082516040602084015261419c60608401826140b4565b602085810151858303601f19016040870152805180845292935081019181840191600582901b85010160005b828110156141f957601f198683030184526141e482865161387f565b602095860195949094019391506001016141c8565b50979650505050505050565b602081526000612621602083018461405d565b634e487b7160e01b600052601160045260246000fd5b63ffffffff8181168382160190811115610e0457610e04614218565b60006020828403121561425c57600080fd5b5051919050565b60008235609e1983360301811261427957600080fd5b9190910192915050565b803561343281613485565b6bffffffffffffffffffffffff8116811461066157600080fd5b81835260208301925060008160005b848110156143095781356142ca81613485565b6001600160a01b0316865260208201356142e38161428e565b6bffffffffffffffffffffffff16602087015260409586019591909101906001016142b7565b5093949350505050565b6020808252810182905260006040600584901b830181019083018583609e1936839003015b8782101561442057868503603f19018452823581811261435757600080fd5b8901803536829003601e1901811261436e57600080fd5b81016020810190356001600160401b0381111561438a57600080fd5b8060061b360382131561439c57600080fd5b60a088526143ae60a0890182846142a8565b9150506143bd60208301614283565b6001600160a01b03166020880152604082810135908801526143e160608301613764565b63ffffffff1660608801526143f860808301613764565b63ffffffff811660808901529150955050602093840193929092019160019190910190614338565b5092979650505050505050565b60006020828403121561443f57600080fd5b81516001600160401b0381111561445557600080fd5b82016020818503121561446757600080fd5b61446f613552565b81516001600160401b0381111561448557600080fd5b80830192505084601f83011261449a57600080fd5b81516144a8613a6082613a1e565b8082825260208201915060208360061b8601019250878311156144ca57600080fd5b6020850194505b8285101561452857604085890312156144e957600080fd5b6144f16134e6565b85516144fc81613485565b8152602086015161450c8161428e565b80602083015250808352506020820191506040850194506144d1565b8352509095945050505050565b6001600160a01b0383168152604060208083018290528351918301829052600091908401906060840190835b818110156145885783516001600160a01b0316835260209384019390920191600101614561565b50909695505050505050565b6000602082840312156145a657600080fd5b81516001600160401b038111156145bc57600080fd5b8201601f810184136145cd57600080fd5b80516145db613a6082613a1e565b8082825260208201915060208360051b8501019250868311156145fd57600080fd5b6020840193505b8284101561461f578351825260209384019390910190614604565b9695505050505050565b60006001820161463b5761463b614218565b5060010190565b60018060a01b038316815260406020820152600082516060604084015261466c60a084018261387f565b90506020840151606084015260408401516080840152809150509392505050565b7f19457468657265756d205369676e6564204d6573736167653a0a0000000000008152600083516146c581601a85016020880161385b565b8351908301906146dc81601a84016020880161385b565b01601a01949350505050565b63ffffffff8281168282160390811115610e0457610e04614218565b80820180821115610e0457610e04614218565b634e487b7160e01b600052601260045260246000fd5b60008261473c5761473c614717565b500690565b81810381811115610e0457610e04614218565b600060ff821660ff810361476a5761476a614218565b60010192915050565b60008261478257614782614717565b500490565b8082028115828204841417610e0457610e04614218565b60ff8181168382160190811115610e0457610e04614218565b600085516147c9818460208a0161385b565b600560f91b90830190815285516147e7816001840160208a0161385b565b600560f91b60019290910191820152845161480981600284016020890161385b565b600181830101915050600560f91b6001820152835161482f81600284016020880161385b565b016002019695505050505050565b634e487b7160e01b600052602160045260246000fd5b61060f60f31b81526000825161487081600285016020870161385b565b9190910160020192915050565b6001815b60018411156133f45780850481111561489c5761489c614218565b60018416156148aa57908102905b60019390931c928002614881565b6000826148c757506001610e04565b816148d457506000610e04565b81600181146148ea57600281146148f457614910565b6001915050610e04565b60ff84111561490557614905614218565b50506001821b610e04565b5060208310610133831016604e8410600b8410161715614933575081810a610e04565b614940600019848461487d565b806000190482111561495457614954614218565b029392505050565b600061262183836148b8565b600060ff83168061497b5761497b614717565b8060ff84160491505092915050565b60ff8181168382160290811690818114612b0957612b09614218565b60ff8281168282160390811115610e0457610e0461421856fea26469706673582212205b54d39db01ec87955542a63c3a53e876a29b21585e12d554ae6989e796dedf764736f6c634300081a0033","storage":{"0x0":"0xff"}}}} \ No newline at end of file diff --git a/avs/utils/anvil/clean-deployments.sh b/avs/utils/anvil/clean-deployments.sh deleted file mode 100755 index 3c6f2db5..00000000 --- a/avs/utils/anvil/clean-deployments.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -set -e -o nounset - -# cd to the directory of this script so that this can be run from anywhere -parent_path=$( - cd "$(dirname "${BASH_SOURCE[0]}")" - pwd -P -) -# At this point we are in tests/anvil -cd "$parent_path" - -set -a -source ./utils.sh -set +a - -rm -rf $EIGENLAYER_CONTRACTS_DEPLOYMENT_STATE_FILE $FULL_DEPLOYMENT_ANVIL_STATE_FILE diff --git a/avs/utils/anvil/deploy-all-to-anvil-and-save-state.sh b/avs/utils/anvil/deploy-all-to-anvil-and-save-state.sh deleted file mode 100644 index a343e500..00000000 --- a/avs/utils/anvil/deploy-all-to-anvil-and-save-state.sh +++ /dev/null @@ -1,2 +0,0 @@ -sh avs/utils/anvil/deploy-eigenlayer-save-anvil-state.sh -sh avs/utils/anvil/deploy-avs-save-anvil-state.sh \ No newline at end of file diff --git a/avs/utils/anvil/deploy-avs-save-anvil-state.sh b/avs/utils/anvil/deploy-avs-save-anvil-state.sh deleted file mode 100755 index 19e24061..00000000 --- a/avs/utils/anvil/deploy-avs-save-anvil-state.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash - -RPC_URL=http://localhost:8545 -PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 - -# cd to the directory of this script so that this can be run from anywhere -parent_path=$( - cd "$(dirname "${BASH_SOURCE[0]}")" - pwd -P -) -cd "$parent_path" - -set -a -source ./utils.sh -set +a - -cleanup() { - echo "Executing cleanup function..." - set +e - docker rm -f anvil - exit_status=$? - if [ $exit_status -ne 0 ]; then - echo "Script exited due to set -e on line $1 with command '$2'. Exit status: $exit_status" - fi -} -trap 'cleanup $LINENO "$BASH_COMMAND"' EXIT - -# start an anvil instance in the background that has eigenlayer contracts deployed -start_anvil_docker $parent_path/eigenlayer-deployed-anvil-state.json $parent_path/avs-and-eigenlayer-deployed-anvil-state.json - -cd ../../contracts -forge script script/Deployer.s.sol --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast -v -# save the block-number in the genesis file which we also need to restart the anvil chain at the correct block -# otherwise the indexRegistry has a quorumUpdate at a high block number, and when we restart a clean anvil (without genesis.json) file -# it starts at block 0, and so calling getOperatorListAtBlockNumber reverts because it thinks there are no quorums registered at block 0 -# EDIT: this doesn't actually work... since we can't both load a state and a genesis.json file... see https://github.com/foundry-rs/foundry/issues/6679 -# will keep here in case this PR ever gets merged. -GENESIS_FILE=$parent_path/genesis.json -TMP_GENESIS_FILE=$parent_path/genesis.json.tmp -jq '.number = "'$(cast block-number)'"' $GENESIS_FILE >$TMP_GENESIS_FILE -mv $TMP_GENESIS_FILE $GENESIS_FILE - -# we also do this here to make sure the operator has funds to register with the eigenlayer contracts -cast send 0x860B6912C2d0337ef05bbC89b0C2CB6CbAEAB4A5 --value 10ether --private-key 0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6 \ No newline at end of file diff --git a/avs/utils/anvil/deploy-eigenlayer-save-anvil-state.sh b/avs/utils/anvil/deploy-eigenlayer-save-anvil-state.sh deleted file mode 100755 index 42a37e8a..00000000 --- a/avs/utils/anvil/deploy-eigenlayer-save-anvil-state.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - -# cd to the directory of this script so that this can be run from anywhere -parent_path=$( - cd "$(dirname "${BASH_SOURCE[0]}")" - pwd -P -) -# At this point we are in tests/anvil -cd "$parent_path" - -set -a -source ./utils.sh -set +a - -cleanup() { - echo "Executing cleanup function..." - set +e - docker rm -f anvil - exit_status=$? - if [ $exit_status -ne 0 ]; then - echo "Script exited due to set -e on line $1 with command '$2'. Exit status: $exit_status" - fi -} -trap 'cleanup $LINENO "$BASH_COMMAND"' EXIT - -# start an empty anvil chain in the background and dump its state to a json file upon exit -start_anvil_docker "" $parent_path/eigenlayer-deployed-anvil-state.json - -cd ../../contracts/lib/eigenlayer-middleware/lib/eigenlayer-contracts -# deployment overwrites this file, so we save it as backup, because we want that output in our local files, and not in the eigenlayer-contracts submodule files -mv script/output/devnet/M2_from_scratch_deployment_data.json script/output/devnet/M2_from_scratch_deployment_data.json.bak -# M2_Deploy_From_Scratch.s.sol prepends "script/testing/" to the configFile passed as input (M2_deploy_from_scratch.anvil.config.json) -forge script script/deploy/devnet/M2_Deploy_From_Scratch.s.sol --rpc-url http://localhost:8545 --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --broadcast --sig "run(string memory configFile)" -- M2_deploy_from_scratch.anvil.config.json -mv script/output/devnet/M2_from_scratch_deployment_data.json ../../../../script/output/31337/eigenlayer_deployment_output.json -mv script/output/devnet/M2_from_scratch_deployment_data.json.bak script/output/devnet/M2_from_scratch_deployment_data.json \ No newline at end of file diff --git a/avs/utils/anvil/deploy-to-chain.sh b/avs/utils/anvil/deploy-to-chain.sh deleted file mode 100644 index 6f399e16..00000000 --- a/avs/utils/anvil/deploy-to-chain.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -set -e - -# Load environment variables from production file -export $(grep -v '^#' .env.production | xargs) -# Deploy to chain -cd avs/contracts -forge script script/HoleskyDeployer.s.sol --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast -v \ No newline at end of file diff --git a/avs/utils/anvil/eigenlayer-deployed-anvil-state.json/state.json b/avs/utils/anvil/eigenlayer-deployed-anvil-state.json/state.json deleted file mode 100644 index 5b786f22..00000000 --- a/avs/utils/anvil/eigenlayer-deployed-anvil-state.json/state.json +++ /dev/null @@ -1 +0,0 @@ -{"accounts":{"0x0000000000000000000000000000000000000000":{"nonce":0,"balance":"0x1aaa5aa","code":"0x","storage":{}},"0x0165878a594ca255338adfa4d48449f69242eb8f":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122061dc9392cf6ba7869fe7bc6ba05d8409fb69605ae4794b23a59c97020514de6d64736f6c634300080c0033","storage":{"0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0x9a676e781a523b5d0c0e43731313a708cb607508","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0x0b306bf915c4d645ff596e518faf3f9669b97016":{"nonce":1,"balance":"0x0","code":"0x6080604052600436106101ee5760003560e01c80638da5cb5b1161010d578063c052bd61116100a0578063d1c64cc91161006f578063d1c64cc914610604578063ea4d3c9b14610624578063f2fde38b14610658578063f6848d2414610678578063fabc1cbc146106b357600080fd5b8063c052bd6114610584578063c1de3aef146105a4578063c2c51c40146105c4578063cf756fdf146105e457600080fd5b8063a38406a3116100dc578063a38406a3146104fa578063a6a509be1461051a578063b134427114610530578063beffbb891461056457600080fd5b80638da5cb5b1461046b5780639104c319146104895780639b4e4634146104b15780639ba06275146104c457600080fd5b8063595c6a6711610185578063715018a611610154578063715018a6146103ed57806374cdd7981461040257806384d8106214610436578063886f11951461044b57600080fd5b8063595c6a67146103565780635ac86ab71461036b5780635c975abb146103ab57806360f4062b146103c057600080fd5b8063387b1300116101c1578063387b1300146102b457806339b70e38146102d457806344e71c8014610308578063463db0381461033657600080fd5b80630e81073c146101f357806310d67a2f14610226578063136439dd14610248578063292b7b2b14610268575b600080fd5b3480156101ff57600080fd5b5061021361020e366004612406565b6106d3565b6040519081526020015b60405180910390f35b34801561023257600080fd5b50610246610241366004612432565b610911565b005b34801561025457600080fd5b5061024661026336600461244f565b6109c4565b34801561027457600080fd5b5061029c7f000000000000000000000000610178da211fef7d417bc0e6fed39f05609ad78881565b6040516001600160a01b03909116815260200161021d565b3480156102c057600080fd5b506102466102cf366004612468565b610b03565b3480156102e057600080fd5b5061029c7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b34801561031457600080fd5b5061031d610ea1565b60405167ffffffffffffffff909116815260200161021d565b34801561034257600080fd5b506102466103513660046124a9565b610eca565b34801561036257600080fd5b50610246611056565b34801561037757600080fd5b5061039b6103863660046124d3565b606654600160ff9092169190911b9081161490565b604051901515815260200161021d565b3480156103b757600080fd5b50606654610213565b3480156103cc57600080fd5b506102136103db366004612432565b609b6020526000908152604090205481565b3480156103f957600080fd5b5061024661111d565b34801561040e57600080fd5b5061029c7f00000000000000000000000000000000219ab540356cbb839cbe05303d7705fa81565b34801561044257600080fd5b5061029c611131565b34801561045757600080fd5b5060655461029c906001600160a01b031681565b34801561047757600080fd5b506033546001600160a01b031661029c565b34801561049557600080fd5b5061029c73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6102466104bf36600461253f565b61121b565b3480156104d057600080fd5b5061029c6104df366004612432565b6098602052600090815260409020546001600160a01b031681565b34801561050657600080fd5b5061029c610515366004612432565b61130a565b34801561052657600080fd5b5061021360995481565b34801561053c57600080fd5b5061029c7f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b34801561057057600080fd5b5061024661057f366004612406565b6113dc565b34801561059057600080fd5b5060975461029c906001600160a01b031681565b3480156105b057600080fd5b506102466105bf366004612432565b6115f3565b3480156105d057600080fd5b506102466105df366004612406565b611604565b3480156105f057600080fd5b506102466105ff3660046125b3565b611a07565b34801561061057600080fd5b5061021361061f3660046124a9565b611b30565b34801561063057600080fd5b5061029c7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b34801561066457600080fd5b50610246610673366004612432565b611c3b565b34801561068457600080fd5b5061039b610693366004612432565b6001600160a01b0390811660009081526098602052604090205416151590565b3480156106bf57600080fd5b506102466106ce36600461244f565b611cb1565b6000336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916146107265760405162461bcd60e51b815260040161071d90612604565b60405180910390fd5b6001600160a01b0383166107a25760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f644d616e616765722e6164645368617265733a20706f644f7760448201527f6e65722063616e6e6f74206265207a65726f2061646472657373000000000000606482015260840161071d565b60008212156108105760405162461bcd60e51b815260206004820152603460248201527f456967656e506f644d616e616765722e6164645368617265733a207368617265604482015273732063616e6e6f74206265206e6567617469766560601b606482015260840161071d565b61081e633b9aca0083612678565b156108915760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f644d616e616765722e6164645368617265733a20736861726560448201527f73206d75737420626520612077686f6c65204777656920616d6f756e74000000606482015260840161071d565b6001600160a01b0383166000908152609b6020526040812054906108b584836126a2565b6001600160a01b0386166000818152609b6020526040908190208390555191925090600080516020613231833981519152906108f49087815260200190565b60405180910390a26109068282611e0d565b925050505b92915050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610964573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098891906126e3565b6001600160a01b0316336001600160a01b0316146109b85760405162461bcd60e51b815260040161071d90612700565b6109c181611e4f565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a30919061274a565b610a4c5760405162461bcd60e51b815260040161071d9061276c565b60665481811614610ac55760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161071d565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91614610b4b5760405162461bcd60e51b815260040161071d90612604565b6001600160a01b038316610bc55760405162461bcd60e51b8152602060048201526047602482015260008051602061325183398151915260448201527f546f6b656e733a20706f644f776e65722063616e6e6f74206265207a65726f206064820152666164647265737360c81b608482015260a40161071d565b6001600160a01b038216610c425760405162461bcd60e51b815260206004820152604a602482015260008051602061325183398151915260448201527f546f6b656e733a2064657374696e6174696f6e2063616e6e6f74206265207a65606482015269726f206164647265737360b01b608482015260a40161071d565b6000811215610cb15760405162461bcd60e51b8152602060048201526041602482015260008051602061325183398151915260448201527f546f6b656e733a207368617265732063616e6e6f74206265206e6567617469766064820152606560f81b608482015260a40161071d565b610cbf633b9aca0082612678565b15610d335760405162461bcd60e51b815260206004820152604a602482015260008051602061325183398151915260448201527f546f6b656e733a20736861726573206d75737420626520612077686f6c6520476064820152691dd95a48185b5bdd5b9d60b21b608482015260a40161071d565b6001600160a01b0383166000908152609b602052604081205490811215610e26576000610d5f826127b4565b905080831115610dc4576001600160a01b0385166000908152609b6020526040812055610d8c81846127d1565b9250846001600160a01b031660008051602061323183398151915282604051610db791815260200190565b60405180910390a2610e24565b6001600160a01b0385166000908152609b602052604081208054859290610dec9084906126a2565b90915550506040518381526001600160a01b038616906000805160206132318339815191529060200160405180910390a25050505050565b505b6001600160a01b03848116600090815260986020526040908190205490516362483a2160e11b815285831660048201526024810185905291169063c490744290604401600060405180830381600087803b158015610e8357600080fd5b505af1158015610e97573d6000803e3d6000fd5b5050505050505050565b609c5460009067ffffffffffffffff1680610ec55767ffffffffffffffff91505090565b919050565b610ed2611f46565b67ffffffffffffffff8116610f645760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f644d616e616765722e73657444656e6562466f726b54696d6560448201527f7374616d703a2063616e6e6f7420736574206e657744656e6562466f726b546960648201526b06d657374616d7020746f20360a41b608482015260a40161071d565b609c5467ffffffffffffffff16156110005760405162461bcd60e51b815260206004820152605360248201527f456967656e506f644d616e616765722e73657444656e6562466f726b54696d6560448201527f7374616d703a2063616e6e6f74207365742064656e6562466f726b54696d657360648201527274616d70206d6f7265207468616e206f6e636560681b608482015260a40161071d565b609c805467ffffffffffffffff191667ffffffffffffffff83169081179091556040519081527f19200b6fdad58f91b2f496b0c444fc4be3eff74a7e24b07770e04a7137bfd9db9060200160405180910390a150565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561109e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c2919061274a565b6110de5760405162461bcd60e51b815260040161071d9061276c565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b611125611f46565b61112f6000611fa0565b565b6066546000908190600190811614156111885760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161071d565b336000908152609860205260409020546001600160a01b03161561120a5760405162461bcd60e51b815260206004820152603360248201527f456967656e506f644d616e616765722e637265617465506f643a2053656e64656044820152721c88185b1c9958591e481a185cc818481c1bd9606a1b606482015260840161071d565b6000611214611ff2565b9250505090565b606654600090600190811614156112705760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161071d565b336000908152609860205260409020546001600160a01b03168061129957611296611ff2565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e46349034906112cf908b908b908b908b908b90600401612811565b6000604051808303818588803b1580156112e857600080fd5b505af11580156112fc573d6000803e3d6000fd5b505050505050505050505050565b6001600160a01b038082166000908152609860205260408120549091168061090b576113d5836001600160a01b031660001b60405180610940016040528061090e815260200161292361090e9139604080516001600160a01b037f000000000000000000000000610178da211fef7d417bc0e6fed39f05609ad788166020820152808201919091526000606082015260800160408051601f19818403018152908290526113ba9291602001612886565b60405160208183030381529060405280519060200120612157565b9392505050565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916146114245760405162461bcd60e51b815260040161071d90612604565b600081121561149b5760405162461bcd60e51b815260206004820152603760248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f617265732063616e6e6f74206265206e65676174697665000000000000000000606482015260840161071d565b6114a9633b9aca0082612678565b1561151e576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f61726573206d75737420626520612077686f6c65204777656920616d6f756e74606482015260840161071d565b6001600160a01b0382166000908152609b602052604081205461154290839061289b565b905060008112156115d35760405162461bcd60e51b815260206004820152604f60248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20636160448201527f6e6e6f7420726573756c7420696e20706f64206f776e657220686176696e672060648201526e6e656761746976652073686172657360881b608482015260a40161071d565b6001600160a01b039092166000908152609b602052604090209190915550565b6115fb611f46565b6109c1816121b3565b6001600160a01b03808316600090815260986020526040902054839116331461167f5760405162461bcd60e51b815260206004820152602760248201527f456967656e506f644d616e616765722e6f6e6c79456967656e506f643a206e6f6044820152661d0818481c1bd960ca1b606482015260840161071d565b600260c95414156116d25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161071d565b600260c9556001600160a01b03831661176e5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a20706f644f776e65722063616e6e6064820152716f74206265207a65726f206164647265737360701b608482015260a40161071d565b61177c633b9aca00836128da565b156118155760405162461bcd60e51b815260206004820152605a60248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a2073686172657344656c7461206d60648201527f75737420626520612077686f6c65204777656920616d6f756e74000000000000608482015260a40161071d565b6001600160a01b0383166000908152609b60205260408120549061183984836126a2565b6001600160a01b0386166000908152609b602052604081208290559091506118618383611e0d565b905080156119c957600081121561192c576001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91663132d49678773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06118c0856127b4565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561190f57600080fd5b505af1158015611923573d6000803e3d6000fd5b505050506119c9565b604051631452b9d760e11b81526001600160a01b03878116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152604482018390527f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916906328a573ae90606401600060405180830381600087803b1580156119b057600080fd5b505af11580156119c4573d6000803e3d6000fd5b505050505b856001600160a01b0316600080516020613231833981519152866040516119f291815260200190565b60405180910390a25050600160c95550505050565b600054610100900460ff1615808015611a275750600054600160ff909116105b80611a415750303b158015611a41575060005460ff166001145b611aa45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161071d565b6000805460ff191660011790558015611ac7576000805461ff0019166101001790555b611ad0856121b3565b611ad984611fa0565b611ae383836121fd565b8015611b29576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60975460405163321accf960e11b815267ffffffffffffffff8316600482015260009182916001600160a01b039091169063643599f290602401602060405180830381865afa158015611b87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bab91906128ee565b90508061090b5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e676574426c6f636b526f6f744174546960448201527f6d657374616d703a20737461746520726f6f742061742074696d657374616d70606482015271081b9bdd081e595d08199a5b985b1a5e995960721b608482015260a40161071d565b611c43611f46565b6001600160a01b038116611ca85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161071d565b6109c181611fa0565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2891906126e3565b6001600160a01b0316336001600160a01b031614611d585760405162461bcd60e51b815260040161071d90612700565b606654198119606654191614611dd65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161071d565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610af8565b6000808313611e2d5760008213611e265750600061090b565b508061090b565b60008213611e4557611e3e836127b4565b905061090b565b611e3e838361289b565b6001600160a01b038116611edd5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161071d565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b0316331461112f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161071d565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600060996000815461200390612907565b9091555060408051610940810190915261090e8082526000916120a291839133916129236020830139604080516001600160a01b037f000000000000000000000000610178da211fef7d417bc0e6fed39f05609ad788166020820152808201919091526000606082015260800160408051601f198184030181529082905261208e9291602001612886565b6040516020818303038152906040526122e7565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de890602401600060405180830381600087803b1580156120e657600080fd5b505af11580156120fa573d6000803e3d6000fd5b50503360008181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b604080516001600160f81b03196020808301919091526bffffffffffffffffffffffff193060601b16602183015260358201859052605580830185905283518084039091018152607590920190925280519101206000906113d5565b609780546001600160a01b0319166001600160a01b0383169081179091556040517f08f0470754946ccfbb446ff7fd2d6ae6af1bbdae19f85794c0cc5ed5e8ceb4f690600090a250565b6065546001600160a01b031615801561221e57506001600160a01b03821615155b6122a05760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161071d565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26122e382611e4f565b5050565b6000808447101561233a5760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e6365000000604482015260640161071d565b82516123885760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f604482015260640161071d565b8383516020850187f590506001600160a01b0381166123e95760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f7900000000000000604482015260640161071d565b949350505050565b6001600160a01b03811681146109c157600080fd5b6000806040838503121561241957600080fd5b8235612424816123f1565b946020939093013593505050565b60006020828403121561244457600080fd5b81356113d5816123f1565b60006020828403121561246157600080fd5b5035919050565b60008060006060848603121561247d57600080fd5b8335612488816123f1565b92506020840135612498816123f1565b929592945050506040919091013590565b6000602082840312156124bb57600080fd5b813567ffffffffffffffff811681146113d557600080fd5b6000602082840312156124e557600080fd5b813560ff811681146113d557600080fd5b60008083601f84011261250857600080fd5b50813567ffffffffffffffff81111561252057600080fd5b60208301915083602082850101111561253857600080fd5b9250929050565b60008060008060006060868803121561255757600080fd5b853567ffffffffffffffff8082111561256f57600080fd5b61257b89838a016124f6565b9097509550602088013591508082111561259457600080fd5b506125a1888289016124f6565b96999598509660400135949350505050565b600080600080608085870312156125c957600080fd5b84356125d4816123f1565b935060208501356125e4816123f1565b925060408501356125f4816123f1565b9396929550929360600135925050565b602080825260409082018190527f456967656e506f644d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261268757612687612662565b500690565b634e487b7160e01b600052601160045260246000fd5b600080821280156001600160ff1b03849003851316156126c4576126c461268c565b600160ff1b83900384128116156126dd576126dd61268c565b50500190565b6000602082840312156126f557600080fd5b81516113d5816123f1565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561275c57600080fd5b815180151581146113d557600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000600160ff1b8214156127ca576127ca61268c565b5060000390565b6000828210156127e3576127e361268c565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006128256060830187896127e8565b82810360208401526128388186886127e8565b9150508260408301529695505050505050565b6000815160005b8181101561286c5760208185018101518683015201612852565b8181111561287b576000828601525b509290920192915050565b60006123e9612895838661284b565b8461284b565b60008083128015600160ff1b8501841216156128b9576128b961268c565b6001600160ff1b03840183138116156128d4576128d461268c565b50500390565b6000826128e9576128e9612662565b500790565b60006020828403121561290057600080fd5b5051919050565b600060001982141561291b5761291b61268c565b506001019056fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65644e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193456967656e506f644d616e616765722e77697468647261775368617265734173a2646970667358221220c991066f9cb1c27d23c853a026251b3ff6d44f4cdd1151285b79c5181ca5d71264736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x0dcd1bf9a1b36ce34237eeafef220932846bcd82":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106101425760003560e01c80638da5cb5b116100b8578063d79aceab1161007c578063d79aceab146102f8578063df5cf7231461031f578063ec76f44214610346578063f2fde38b14610359578063f698da251461036c578063fabc1cbc1461037457600080fd5b80638da5cb5b1461029b5780639926ee7d146102ac578063a1060c88146102bf578063a364f4da146102d2578063a98fb355146102e557600080fd5b806349075da31161010a57806349075da3146101fa578063595c6a67146102355780635ac86ab71461023d5780635c975abb14610260578063715018a614610268578063886f11951461027057600080fd5b806310d67a2f14610147578063136439dd1461015c5780631794bb3c1461016f57806320606b7014610182578063374823b5146101bc575b600080fd5b61015a6101553660046118ab565b610387565b005b61015a61016a3660046118cf565b610443565b61015a61017d3660046118e8565b610582565b6101a97f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b6101ea6101ca366004611929565b609960209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016101b3565b610228610208366004611955565b609860209081526000928352604080842090915290825290205460ff1681565b6040516101b391906119a4565b61015a6106ac565b6101ea61024b3660046119cc565b606654600160ff9092169190911b9081161490565b6066546101a9565b61015a610773565b606554610283906001600160a01b031681565b6040516001600160a01b0390911681526020016101b3565b6033546001600160a01b0316610283565b61015a6102ba366004611a5f565b610787565b6101a96102cd366004611b46565b610b1a565b61015a6102e03660046118ab565b610bd3565b61015a6102f3366004611b8c565b610d3c565b6101a97fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102837f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b61015a6103543660046118cf565b610d83565b61015a6103673660046118ab565b610e2e565b6101a9610ea4565b61015a6103823660046118cf565b610ee2565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103fe9190611bfe565b6001600160a01b0316336001600160a01b0316146104375760405162461bcd60e51b815260040161042e90611c1b565b60405180910390fd5b6104408161103e565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561048b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104af9190611c65565b6104cb5760405162461bcd60e51b815260040161042e90611c87565b606654818116146105445760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156105a25750600054600160ff909116105b806105bc5750303b1580156105bc575060005460ff166001145b61061f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161042e565b6000805460ff191660011790558015610642576000805461ff0019166101001790555b61064c8383611135565b61065461121f565b609755610660846112b6565b80156106a6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107189190611c65565b6107345760405162461bcd60e51b815260040161042e90611c87565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b61077b611308565b61078560006112b6565b565b606654600090600190811614156107dc5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b42826040015110156108445760405162461bcd60e51b815260206004820152603e6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72207369676e617475726520657870697265640000606482015260840161042e565b60013360009081526098602090815260408083206001600160a01b038816845290915290205460ff16600181111561087e5761087e61198e565b14156108e05760405162461bcd60e51b815260206004820152603f6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f7220616c7265616479207265676973746572656400606482015260840161042e565b6001600160a01b038316600090815260996020908152604080832085830151845290915290205460ff16156109645760405162461bcd60e51b81526020600482015260366024820152600080516020611dac8339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b606482015260840161042e565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91690636d70f7ae90602401602060405180830381865afa1580156109ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee9190611c65565b610a645760405162461bcd60e51b815260206004820152604d6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a40161042e565b6000610a7a843385602001518660400151610b1a565b9050610a8b84828560000151611362565b3360008181526098602090815260408083206001600160a01b0389168085529083528184208054600160ff199182168117909255609985528386208a860151875290945293829020805490931684179092555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610b0c91906119a4565b60405180910390a350505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd6020808301919091526001600160a01b0387811683850152861660608301526080820185905260a08083018590528351808403909101815260c0909201909252805191012060009081610b90610ea4565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b60665460009060019081161415610c285760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b60013360009081526098602090815260408083206001600160a01b038716845290915290205460ff166001811115610c6257610c6261198e565b14610cd55760405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f74207265676973746572656400606482015260840161042e565b3360008181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610d3091906119a4565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138383604051610d77929190611ccf565b60405180910390a25050565b33600090815260996020908152604080832084845290915290205460ff1615610e085760405162461bcd60e51b815260206004820152603160248201527f4156534469726563746f72792e63616e63656c53616c743a2063616e6e6f742060448201527018d85b98d95b081cdc195b9d081cd85b1d607a1b606482015260840161042e565b33600090815260996020908152604080832093835292905220805460ff19166001179055565b610e36611308565b6001600160a01b038116610e9b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161042e565b610440816112b6565b60007f0000000000000000000000000000000000000000000000000000000000007a69461415610ed5575060975490565b610edd61121f565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f599190611bfe565b6001600160a01b0316336001600160a01b031614610f895760405162461bcd60e51b815260040161042e90611c1b565b6066541981196066541916146110075760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610577565b6001600160a01b0381166110cc5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161042e565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b031615801561115657506001600160a01b03821615155b6111d85760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261121b8261103e565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6033546001600160a01b031633146107855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161042e565b6001600160a01b0383163b1561148157604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906113a29086908690600401611cfe565b602060405180830381865afa1580156113bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e39190611d5b565b6001600160e01b0319161461147c5760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a40161042e565b505050565b826001600160a01b03166114958383611521565b6001600160a01b03161461147c5760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a40161042e565b60008060006115308585611545565b9150915061153d816115b5565b509392505050565b60008082516041141561157c5760208301516040840151606085015160001a61157087828585611770565b945094505050506115ae565b8251604014156115a6576020830151604084015161159b86838361185d565b9350935050506115ae565b506000905060025b9250929050565b60008160048111156115c9576115c961198e565b14156115d25750565b60018160048111156115e6576115e661198e565b14156116345760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161042e565b60028160048111156116485761164861198e565b14156116965760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161042e565b60038160048111156116aa576116aa61198e565b14156117035760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161042e565b60048160048111156117175761171761198e565b14156104405760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161042e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156117a75750600090506003611854565b8460ff16601b141580156117bf57508460ff16601c14155b156117d05750600090506004611854565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611824573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661184d57600060019250925050611854565b9150600090505b94509492505050565b6000806001600160ff1b0383168161187a60ff86901c601b611d85565b905061188887828885611770565b935093505050935093915050565b6001600160a01b038116811461044057600080fd5b6000602082840312156118bd57600080fd5b81356118c881611896565b9392505050565b6000602082840312156118e157600080fd5b5035919050565b6000806000606084860312156118fd57600080fd5b833561190881611896565b9250602084013561191881611896565b929592945050506040919091013590565b6000806040838503121561193c57600080fd5b823561194781611896565b946020939093013593505050565b6000806040838503121561196857600080fd5b823561197381611896565b9150602083013561198381611896565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60208101600283106119c657634e487b7160e01b600052602160045260246000fd5b91905290565b6000602082840312156119de57600080fd5b813560ff811681146118c857600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715611a2857611a286119ef565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611a5757611a576119ef565b604052919050565b60008060408385031215611a7257600080fd5b8235611a7d81611896565b915060208381013567ffffffffffffffff80821115611a9b57600080fd5b9085019060608288031215611aaf57600080fd5b611ab7611a05565b823582811115611ac657600080fd5b8301601f81018913611ad757600080fd5b803583811115611ae957611ae96119ef565b611afb601f8201601f19168701611a2e565b93508084528986828401011115611b1157600080fd5b808683018786013760008682860101525050818152838301358482015260408301356040820152809450505050509250929050565b60008060008060808587031215611b5c57600080fd5b8435611b6781611896565b93506020850135611b7781611896565b93969395505050506040820135916060013590565b60008060208385031215611b9f57600080fd5b823567ffffffffffffffff80821115611bb757600080fd5b818501915085601f830112611bcb57600080fd5b813581811115611bda57600080fd5b866020828501011115611bec57600080fd5b60209290920196919550909350505050565b600060208284031215611c1057600080fd5b81516118c881611896565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611c7757600080fd5b815180151581146118c857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b82815260006020604081840152835180604085015260005b81811015611d3257858101830151858201606001528201611d16565b81811115611d44576000606083870101525b50601f01601f191692909201606001949350505050565b600060208284031215611d6d57600080fd5b81516001600160e01b0319811681146118c857600080fd5b60008219821115611da657634e487b7160e01b600052601160045260246000fd5b50019056fe4156534469726563746f72792e72656769737465724f70657261746f72546f41a26469706673582212200b8fd531a1737eb07ac96c13c463a31b209583aa74d7e2f8475548371ad8ac6c64736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x14dc79964da2c08b23698b3d3cc7ca32193d9955":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x15d34aaf54267db7d7c367839aaf71a00a2c6a65":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122061dc9392cf6ba7869fe7bc6ba05d8409fb69605ae4794b23a59c97020514de6d64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x97":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x98":"0x0","0xc9":"0x1","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0x959922be3caee4b8cd9a407cc3ac1c251c2007b1","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0x23618e81e3f5cdf7f54c3d65f7fbc0abf5b21e8f":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x322813fd9a801c5507c9de605d63cea4f2ce6c44":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80635c975abb116100de578063ab5921e111610097578063df6fadc111610071578063df6fadc114610366578063e3dae51c14610381578063f3e7387514610394578063fabc1cbc146103a757600080fd5b8063ab5921e11461032b578063ce7c2ac214610340578063d9caed121461035357600080fd5b80635c975abb146102c857806361b01b5d146102d05780637a8b2637146102d9578063886f1195146102ec5780638c871019146103055780638f6a62401461031857600080fd5b80633a98ef391161014b578063485cc95511610125578063485cc9551461026b578063553ca5f81461027e578063595c6a67146102915780635ac86ab71461029957600080fd5b80633a98ef391461023857806343fe08b01461024f57806347e7ef241461025857600080fd5b8063019e27291461019357806310d67a2f146101a857806311c70c9d146101bb578063136439dd146101ce5780632495a599146101e157806339b70e3814610211575b600080fd5b6101a66101a13660046117b8565b6103ba565b005b6101a66101b6366004611802565b61049d565b6101a66101c936600461181f565b610550565b6101a66101dc366004611841565b610605565b6032546101f4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101f47f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b61024160335481565b604051908152602001610208565b61024160645481565b61024161026636600461185a565b610749565b6101a6610279366004611886565b6108ed565b61024161028c366004611802565b6109bb565b6101a66109cf565b6102b86102a73660046118bf565b6001805460ff9092161b9081161490565b6040519015158152602001610208565b600154610241565b61024160655481565b6102416102e7366004611841565b610a9b565b6000546101f4906201000090046001600160a01b031681565b610241610313366004611841565b610ae6565b610241610326366004611802565b610af1565b610333610aff565b6040516102089190611912565b61024161034e366004611802565b610b1f565b6101a6610361366004611945565b610bb4565b60645460655460408051928352602083019190915201610208565b61024161038f366004611841565b610d7d565b6102416103a2366004611841565b610db6565b6101a66103b5366004611841565b610dc1565b600054610100900460ff16158080156103da5750600054600160ff909116105b806103f45750303b1580156103f4575060005460ff166001145b6104195760405162461bcd60e51b815260040161041090611986565b60405180910390fd5b6000805460ff19166001179055801561043c576000805461ff0019166101001790555b6104468585610f1d565b610450838361102a565b8015610496576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051491906119d4565b6001600160a01b0316336001600160a01b0316146105445760405162461bcd60e51b8152600401610410906119f1565b61054d816110bb565b50565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c791906119d4565b6001600160a01b0316336001600160a01b0316146105f75760405162461bcd60e51b8152600401610410906119f1565b6106018282610f1d565b5050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610652573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106769190611a3b565b6106925760405162461bcd60e51b815260040161041090611a5d565b6001548181161461070b5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001805460009182918116141561079e5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c916146108165760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b61082084846111c0565b60335460006108316103e883611abb565b905060006103e86108406112a2565b61084a9190611abb565b905060006108588783611ad3565b9050806108658489611aea565b61086f9190611b09565b9550856108d55760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b6064820152608401610410565b6108df8685611abb565b603355505050505092915050565b600054610100900460ff161580801561090d5750600054600160ff909116105b806109275750303b158015610927575060005460ff166001145b6109435760405162461bcd60e51b815260040161041090611986565b6000805460ff191660011790558015610966576000805461ff0019166101001790555b610970838361102a565b80156109b6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006109c96102e783610b1f565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a409190611a3b565b610a5c5760405162461bcd60e51b815260040161041090611a5d565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e8603354610aae9190611abb565b905060006103e8610abd6112a2565b610ac79190611abb565b905081610ad48583611aea565b610ade9190611b09565b949350505050565b60006109c982610d7d565b60006109c96103a283610b1f565b60606040518060800160405280604d8152602001611b61604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c990911690637a7e0d9290604401602060405180830381865afa158015610b90573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c99190611b2b565b6001805460029081161415610c075760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91614610c7f5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b610c8a848484611314565b60335480831115610d195760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a401610410565b6000610d276103e883611abb565b905060006103e8610d366112a2565b610d409190611abb565b9050600082610d4f8784611aea565b610d599190611b09565b9050610d658685611ad3565b603355610d73888883611397565b5050505050505050565b6000806103e8603354610d909190611abb565b905060006103e8610d9f6112a2565b610da99190611abb565b905080610ad48386611aea565b60006109c982610a9b565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3891906119d4565b6001600160a01b0316336001600160a01b031614610e685760405162461bcd60e51b8152600401610410906119f1565b600154198119600154191614610ee65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161073e565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a18082111561101f5760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794261736554564c4c696d6974732e5f73657454564c4c696d60448201527f6974733a206d61785065724465706f7369742065786365656473206d6178546f60648201526a74616c4465706f7369747360a81b608482015260a401610410565b606491909155606555565b600054610100900460ff166110955760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610410565b603280546001600160a01b0319166001600160a01b0384161790556106018160006113ab565b6001600160a01b0381166111495760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610410565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60645481111561122a5760405162461bcd60e51b815260206004820152602f60248201527f53747261746567794261736554564c4c696d6974733a206d617820706572206460448201526e195c1bdcda5d08195e18d959591959608a1b6064820152608401610410565b6065546112356112a2565b11156112985760405162461bcd60e51b815260206004820152602c60248201527f53747261746567794261736554564c4c696d6974733a206d6178206465706f7360448201526b1a5d1cc8195e18d95959195960a21b6064820152608401610410565b6106018282611497565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156112eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130f9190611b2b565b905090565b6032546001600160a01b038381169116146109b65760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e00000000006064820152608401610410565b6109b66001600160a01b0383168483611513565b6000546201000090046001600160a01b03161580156113d257506001600160a01b03821615155b6114545760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610601826110bb565b6032546001600160a01b038381169116146106015760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b6064820152608401610410565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526109b6928692916000916115a3918516908490611620565b8051909150156109b657808060200190518101906115c19190611a3b565b6109b65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610410565b606061162f8484600085611639565b90505b9392505050565b60608247101561169a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610410565b6001600160a01b0385163b6116f15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610410565b600080866001600160a01b0316858760405161170d9190611b44565b60006040518083038185875af1925050503d806000811461174a576040519150601f19603f3d011682016040523d82523d6000602084013e61174f565b606091505b509150915061175f82828661176a565b979650505050505050565b60608315611779575081611632565b8251156117895782518084602001fd5b8160405162461bcd60e51b81526004016104109190611912565b6001600160a01b038116811461054d57600080fd5b600080600080608085870312156117ce57600080fd5b843593506020850135925060408501356117e7816117a3565b915060608501356117f7816117a3565b939692955090935050565b60006020828403121561181457600080fd5b8135611632816117a3565b6000806040838503121561183257600080fd5b50508035926020909101359150565b60006020828403121561185357600080fd5b5035919050565b6000806040838503121561186d57600080fd5b8235611878816117a3565b946020939093013593505050565b6000806040838503121561189957600080fd5b82356118a4816117a3565b915060208301356118b4816117a3565b809150509250929050565b6000602082840312156118d157600080fd5b813560ff8116811461163257600080fd5b60005b838110156118fd5781810151838201526020016118e5565b8381111561190c576000848401525b50505050565b60208152600082518060208401526119318160408501602087016118e2565b601f01601f19169190910160400192915050565b60008060006060848603121561195a57600080fd5b8335611965816117a3565b92506020840135611975816117a3565b929592945050506040919091013590565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119e657600080fd5b8151611632816117a3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611a4d57600080fd5b8151801515811461163257600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611ace57611ace611aa5565b500190565b600082821015611ae557611ae5611aa5565b500390565b6000816000190483118215151615611b0457611b04611aa5565b500290565b600082611b2657634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611b3d57600080fd5b5051919050565b60008251611b568184602087016118e2565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a264697066735822122092b74236c58f48095954709d1e79c480aa0532dccbe7cdc271b4cbe5919a80c864736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x4e59b44847b379578588920ca78fbf26c0b4956c":{"nonce":0,"balance":"0x0","code":"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3","storage":{}},"0x5fbdb2315678afecb367f032d93f642f64180aa3":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461011157806399a88ec414610124578063f2fde38b14610144578063f3b7dead1461016457600080fd5b8063204e1c7a14610080578063715018a6146100bc5780637eff275e146100d35780638da5cb5b146100f3575b600080fd5b34801561008c57600080fd5b506100a061009b366004610499565b610184565b6040516001600160a01b03909116815260200160405180910390f35b3480156100c857600080fd5b506100d1610215565b005b3480156100df57600080fd5b506100d16100ee3660046104bd565b610229565b3480156100ff57600080fd5b506000546001600160a01b03166100a0565b6100d161011f36600461050c565b610291565b34801561013057600080fd5b506100d161013f3660046104bd565b610300565b34801561015057600080fd5b506100d161015f366004610499565b610336565b34801561017057600080fd5b506100a061017f366004610499565b6103b4565b6000806000836001600160a01b03166040516101aa90635c60da1b60e01b815260040190565b600060405180830381855afa9150503d80600081146101e5576040519150601f19603f3d011682016040523d82523d6000602084013e6101ea565b606091505b5091509150816101f957600080fd5b8080602001905181019061020d91906105e2565b949350505050565b61021d6103da565b6102276000610434565b565b6102316103da565b6040516308f2839760e41b81526001600160a01b038281166004830152831690638f283970906024015b600060405180830381600087803b15801561027557600080fd5b505af1158015610289573d6000803e3d6000fd5b505050505050565b6102996103da565b60405163278f794360e11b81526001600160a01b03841690634f1ef2869034906102c990869086906004016105ff565b6000604051808303818588803b1580156102e257600080fd5b505af11580156102f6573d6000803e3d6000fd5b5050505050505050565b6103086103da565b604051631b2ce7f360e11b81526001600160a01b038281166004830152831690633659cfe69060240161025b565b61033e6103da565b6001600160a01b0381166103a85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6103b181610434565b50565b6000806000836001600160a01b03166040516101aa906303e1469160e61b815260040190565b6000546001600160a01b031633146102275760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161039f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146103b157600080fd5b6000602082840312156104ab57600080fd5b81356104b681610484565b9392505050565b600080604083850312156104d057600080fd5b82356104db81610484565b915060208301356104eb81610484565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060006060848603121561052157600080fd5b833561052c81610484565b9250602084013561053c81610484565b9150604084013567ffffffffffffffff8082111561055957600080fd5b818601915086601f83011261056d57600080fd5b81358181111561057f5761057f6104f6565b604051601f8201601f19908116603f011681019083821181831017156105a7576105a76104f6565b816040528281528960208487010111156105c057600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b6000602082840312156105f457600080fd5b81516104b681610484565b60018060a01b038316815260006020604081840152835180604085015260005b8181101561063b5785810183015185820160600152820161061f565b8181111561064d576000606083870101525b50601f01601f19169290920160600194935050505056fea2646970667358221220651125a925a83a65dcbfa2d7690370d9d9fe79830f102e414af3b475d33b17de64736f6c634300080c0033","storage":{"0x0":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"}},"0x5fc8d32690cc91d4c39d9d3abcbd16989f875707":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122061dc9392cf6ba7869fe7bc6ba05d8409fb69605ae4794b23a59c97020514de6d64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x65":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x66":"0x0","0x97":"0x5bc5b424ff8db9bd8202cae3beb193c946b905d8ebddb990e36a723af40eb1c4","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xdcd1bf9a1b36ce34237eeafef220932846bcd82","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0x610178da211fef7d417bc0e6fed39f05609ad788":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106100575760003560e01c80633659cfe61461005c5780635c60da1b14610071578063715018a61461009a5780638da5cb5b146100a2578063f2fde38b146100b3575b600080fd5b61006f61006a3660046102ee565b6100c6565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61006f61010e565b6000546001600160a01b031661007e565b61006f6100c13660046102ee565b610122565b6100ce6101af565b6100d781610209565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6101166101af565b610120600061029e565b565b61012a6101af565b6001600160a01b0381166101945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61019d8161029e565b50565b6001600160a01b03163b151590565b6000546001600160a01b031633146101205760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161018b565b6001600160a01b0381163b61027c5760405162461bcd60e51b815260206004820152603360248201527f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f6044820152721b881a5cc81b9bdd08184818dbdb9d1c9858dd606a1b606482015260840161018b565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561030057600080fd5b81356001600160a01b038116811461031757600080fd5b939250505056fea2646970667358221220a3ac13c5077ef109a0140e73b3fdfa3adbf1b6915e38f3d3dd4457bec43994db64736f6c634300080c0033","storage":{"0x0":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x1":"0x8a791620dd6260079bf849dc5567adc3f2fdc318"}},"0x70997970c51812dc3a010c7d01b50e0d17dc79c8":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x8a791620dd6260079bf849dc5567adc3f2fdc318":{"nonce":1,"balance":"0x0","code":"0x6080604052600436106101855760003560e01c806374cdd798116100d1578063c49074421161008a578063e251ef5211610064578063e251ef5214610563578063e2c8344514610583578063f2882461146105a3578063fe80b087146105d757600080fd5b8063c490744214610503578063c4d66de814610523578063dda3346c1461054357600080fd5b806374cdd7981461044057806387e0d289146104745780639b4e46341461049b578063a50600f4146104ae578063b522538a146104ce578063baa7145a146104ee57600080fd5b806334bea20a1161013e57806358eaee791161011857806358eaee791461038f5780635d3f65b6146103bc5780636fcd0e53146103dc5780637439841f1461040957600080fd5b806334bea20a146103005780633f65cf191461033b5780634665bcda1461035b57600080fd5b80630b18ff66146101db5780630cd4649e146102185780631a5057be1461022f5780631d905d5c146102635780633106ab53146102af5780633474aa16146102e057600080fd5b366101d657346037600082825461019c9190614b56565b90915550506040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b3480156101e757600080fd5b506033546101fb906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561022457600080fd5b5061022d6105fb565b005b34801561023b57600080fd5b506101fb7f0000000000000000000000002279b7a0a67db372996a5fab50d91eaa73d2ebe681565b34801561026f57600080fd5b506102977f000000000000000000000000000000000000000000000000000000077359400081565b6040516001600160401b03909116815260200161020f565b3480156102bb57600080fd5b506034546102d090600160401b900460ff1681565b604051901515815260200161020f565b3480156102ec57600080fd5b50603454610297906001600160401b031681565b34801561030c57600080fd5b506102d061031b366004614b93565b603560209081526000928352604080842090915290825290205460ff1681565b34801561034757600080fd5b5061022d610356366004614c26565b610764565b34801561036757600080fd5b506101fb7f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c85381565b34801561039b57600080fd5b506103af6103aa366004614d37565b610c06565b60405161020f9190614db0565b3480156103c857600080fd5b50603854610297906001600160401b031681565b3480156103e857600080fd5b506103fc6103f7366004614dbe565b610c6b565b60405161020f9190614dd7565b34801561041557600080fd5b506103af610424366004614dbe565b600090815260366020526040902054600160c01b900460ff1690565b34801561044c57600080fd5b506101fb7f00000000000000000000000000000000219ab540356cbb839cbe05303d7705fa81565b34801561048057600080fd5b5060335461029790600160a01b90046001600160401b031681565b61022d6104a9366004614e1f565b610d18565b3480156104ba57600080fd5b5061022d6104c9366004614e92565b610ec5565b3480156104da57600080fd5b506103fc6104e9366004614d37565b611294565b3480156104fa57600080fd5b5061022d611387565b34801561050f57600080fd5b5061022d61051e366004614f3c565b6113f2565b34801561052f57600080fd5b5061022d61053e366004614f68565b61162f565b34801561054f57600080fd5b5061022d61055e366004615082565b611807565b34801561056f57600080fd5b5061022d61057e366004615153565b6119da565b34801561058f57600080fd5b5061022d61059e366004614f3c565b611da5565b3480156105af57600080fd5b506102977f000000000000000000000000000000000000000000000000000000006059f46081565b3480156105e357600080fd5b506105ed60375481565b60405190815260200161020f565b604051635ac86ab760e01b8152600260048201819052907f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8536001600160a01b031690635ac86ab790602401602060405180830381865afa158015610663573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610687919061524e565b156106ad5760405162461bcd60e51b81526004016106a490615270565b60405180910390fd5b6033546001600160a01b031633146106d75760405162461bcd60e51b81526004016106a4906152cd565b603454600160401b900460ff16156107015760405162461bcd60e51b81526004016106a490615315565b6034805460ff60401b1916600160401b179055603354610729906001600160a01b0316611f88565b6033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a250565b6033546001600160a01b0316331461078e5760405162461bcd60e51b81526004016106a4906152cd565b604051635ac86ab760e01b8152600260048201819052907f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8536001600160a01b031690635ac86ab790602401602060405180830381865afa1580156107f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081a919061524e565b156108375760405162461bcd60e51b81526004016106a490615270565b60335489906001600160401b03600160a01b9091048116908216101561086f5760405162461bcd60e51b81526004016106a490615364565b603454600160401b900460ff166108e75760405162461bcd60e51b815260206004820152603660248201527f456967656e506f642e686173456e61626c656452657374616b696e673a2072656044820152751cdd185ada5b99c81a5cc81b9bdd08195b98589b195960521b60648201526084016106a4565b86851480156108f557508483145b6109855760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a4016106a4565b4261099b613f486001600160401b038d16614b56565b1015610a245760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a4016106a4565b60405163d1c64cc960e01b81526001600160401b038b166004820152610acd907f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8536001600160a01b03169063d1c64cc990602401602060405180830381865afa158015610a95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab991906153f7565b8a35610ac860208d018d615410565b611fbc565b6000805b88811015610b7157610b538c8c358c8c85818110610af157610af1615456565b9050602002016020810190610b06919061546c565b8b8b86818110610b1857610b18615456565b9050602002810190610b2a9190615410565b8b8b88818110610b3c57610b3c615456565b9050602002810190610b4e9190615493565b61214a565b610b5d9083614b56565b915080610b69816154dc565b915050610ad1565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8539091169063c2c51c4090604401600060405180830381600087803b158015610be157600080fd5b505af1158015610bf5573d6000803e3d6000fd5b505050505050505050505050505050565b600080610c4884848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061260492505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610c936040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610cfe57610cfe614d78565b6002811115610d0f57610d0f614d78565b90525092915050565b336001600160a01b037f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8531614610d605760405162461bcd60e51b81526004016106a4906154f7565b346801bc16d674ec80000014610dec5760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a4016106a4565b7f00000000000000000000000000000000219ab540356cbb839cbe05303d7705fa6001600160a01b031663228951186801bc16d674ec8000008787610e2f6126fe565b8888886040518863ffffffff1660e01b8152600401610e53969594939291906155c9565b6000604051808303818588803b158015610e6c57600080fd5b505af1158015610e80573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e238585604051610eb6929190615618565b60405180910390a15050505050565b604051635ac86ab760e01b8152600360048201819052907f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8536001600160a01b031690635ac86ab790602401602060405180830381865afa158015610f2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f51919061524e565b15610f6e5760405162461bcd60e51b81526004016106a490615270565b8684148015610f7c57508382145b6110055760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e76657269667942616c616e6365557064617465733a207660448201527f616c696461746f72496e646963657320616e642070726f6f6673206d7573742060648201526d0c4ca40e6c2daca40d8cadccee8d60931b608482015260a4016106a4565b4261101b613f486001600160401b038c16614b56565b101561109d5760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e76657269667942616c616e6365557064617465733a207360448201527f70656369666965642074696d657374616d7020697320746f6f2066617220696e606482015264081c185cdd60da1b608482015260a4016106a4565b60405163d1c64cc960e01b81526001600160401b038a166004820152611141907f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8536001600160a01b03169063d1c64cc990602401602060405180830381865afa15801561110e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113291906153f7565b8735610ac860208a018a615410565b6000805b888110156111e5576111c78b8b8b8481811061116357611163615456565b9050602002016020810190611178919061546c565b8a358a8a8681811061118c5761118c615456565b905060200281019061119e9190615410565b8a8a888181106111b0576111b0615456565b90506020028101906111c29190615493565b612743565b6111d1908361562c565b9150806111dd816154dc565b915050611145565b506033546001600160a01b037f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c85381169163c2c51c40911661122a633b9aca008561566d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561127057600080fd5b505af1158015611284573d6000803e3d6000fd5b5050505050505050505050505050565b6112bc6040805160808101825260008082526020820181905291810182905290606082015290565b603660006112ff85858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061260492505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff16600281111561136c5761136c614d78565b600281111561137d5761137d614d78565b9052509392505050565b6033546001600160a01b031633146113b15760405162461bcd60e51b81526004016106a4906152cd565b603454600160401b900460ff16156113db5760405162461bcd60e51b81526004016106a490615315565b6033546113f0906001600160a01b0316611f88565b565b336001600160a01b037f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c853161461143a5760405162461bcd60e51b81526004016106a4906154f7565b611448633b9aca0082615708565b156114d25760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a4016106a4565b60006114e2633b9aca008361571c565b6034549091506001600160401b03908116908216111561159b5760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c4016106a4565b603480548291906000906115b99084906001600160401b0316615730565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161161891815260200190565b60405180910390a261162a8383612c21565b505050565b600054610100900460ff161580801561164f5750600054600160ff909116105b806116695750303b158015611669575060005460ff166001145b6116cc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106a4565b6000805460ff1916600117905580156116ef576000805461ff0019166101001790555b6001600160a01b0382166117625760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b60648201526084016106a4565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a28015611803576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6033546001600160a01b031633146118315760405162461bcd60e51b81526004016106a4906152cd565b604051635ac86ab760e01b8152600560048201819052907f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8536001600160a01b031690635ac86ab790602401602060405180830381865afa158015611899573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bd919061524e565b156118da5760405162461bcd60e51b81526004016106a490615270565b82518451146119655760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a4016106a4565b60005b84518110156119d3576119c18385838151811061198757611987615456565b60200260200101518784815181106119a1576119a1615456565b60200260200101516001600160a01b0316612c2b9092919063ffffffff16565b806119cb816154dc565b915050611968565b5050505050565b604051635ac86ab760e01b81526004808201819052907f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8536001600160a01b031690635ac86ab790602401602060405180830381865afa158015611a41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a65919061524e565b15611a825760405162461bcd60e51b81526004016106a490615270565b8386148015611a9057508588145b8015611a9b57508782145b611b0f576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f642e766572696679416e6450726f636573735769746864726160448201527f77616c733a20696e70757473206d7573742062652073616d65206c656e67746860648201526084016106a4565b60405163d1c64cc960e01b81526001600160401b038c166004820152611bb3907f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8536001600160a01b03169063d1c64cc990602401602060405180830381865afa158015611b80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba491906153f7565b8b35610ac860208e018e615410565b604080518082019091526000808252602082015260005b83811015611cb3576000611c6e8d358d8d85818110611beb57611beb615456565b9050602002810190611bfd9190615758565b8c8c86818110611c0f57611c0f615456565b9050602002810190611c219190615410565b8c8c88818110611c3357611c33615456565b9050602002810190611c459190615493565b8c8c8a818110611c5757611c57615456565b9050602002810190611c699190615493565b612c7d565b80518451919250908490611c83908390614b56565b9052506020808201519084018051611c9c90839061562c565b905250819050611cab816154dc565b915050611bca565b50805115611ce2576033548151611ce2916001600160a01b031690611cdd90633b9aca0090615779565b613169565b602081015115611d975760335460208201516001600160a01b037f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c85381169263c2c51c4092911690611d3890633b9aca009061566d565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611d7e57600080fd5b505af1158015611d92573d6000803e3d6000fd5b505050505b505050505050505050505050565b6033546001600160a01b03163314611dcf5760405162461bcd60e51b81526004016106a4906152cd565b604051635ac86ab760e01b8152600560048201819052907f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8536001600160a01b031690635ac86ab790602401602060405180830381865afa158015611e37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5b919061524e565b15611e785760405162461bcd60e51b81526004016106a490615270565b603754821115611f295760405162461bcd60e51b815260206004820152606a60248201527f456967656e506f642e77697468647261776e6f6e426561636f6e436861696e4560448201527f544842616c616e63655765693a20616d6f756e74546f5769746864726177206960648201527f732067726561746572207468616e206e6f6e426561636f6e436861696e45544860848201526942616c616e636557656960b01b60a482015260c4016106a4565b8160376000828254611f3b9190615798565b90915550506040518281526001600160a01b038416907f30420aacd028abb3c1fd03aba253ae725d6ddd52d16c9ac4cb5742cd43f530969060200160405180910390a261162a8383613169565b6033805467ffffffffffffffff60a01b19164263ffffffff16600160a01b021790556000603755611fb98147613169565b50565b611fc860036020615779565b81146120585760405162461bcd60e51b815260206004820152605360248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a2050726f6f6620686064820152720c2e640d2dcc6dee4e4cac6e840d8cadccee8d606b1b608482015260a4016106a4565b61209d82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250889250879150600390506131f7565b6121445760405162461bcd60e51b815260206004820152606660248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a20496e76616c696460648201527f206c617465737420626c6f636b2068656164657220726f6f74206d65726b6c6560848201526510383937b7b360d11b60a482015260c4016106a4565b50505050565b60008061218984848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061320f92505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156121f8576121f8614d78565b600281111561220957612209614d78565b905250905060008160600151600281111561222657612226614d78565b146122cf5760405162461bcd60e51b815260206004820152606760248201527f456967656e506f642e766572696679436f72726563745769746864726177616c60448201527f43726564656e7469616c733a2056616c696461746f72206d757374206265206960648201527f6e61637469766520746f2070726f7665207769746864726177616c2063726564608482015266656e7469616c7360c81b60a482015260c4016106a4565b6122d76126fe565b6122e0906157af565b61231c86868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061323392505050565b146123a35760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e766572696679436f72726563745769746864726177616c60448201527f43726564656e7469616c733a2050726f6f66206973206e6f7420666f7220746860648201526a1a5cc8115a59d95b941bd960aa1b608482015260a4016106a4565b60006123e186868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061324892505050565b90506123f18a87878b8b8e61326d565b60398054906000612401836154dc565b90915550506001606083015264ffffffffff891682526001600160401b038b811660408401527f000000000000000000000000000000000000000000000000000000077359400081169082161115612487576001600160401b037f0000000000000000000000000000000000000000000000000000000773594000166020830152612497565b6001600160401b03811660208301525b6000838152603660209081526040918290208451815492860151938601516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060850151859391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b83600281111561253557612535614d78565b02179055505060405164ffffffffff8b1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a17f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df898c84602001516040516125d09392919064ffffffffff9390931683526001600160401b03918216602084015216604082015260600190565b60405180910390a1633b9aca0082602001516001600160401b03166125f59190615779565b9b9a5050505050505050505050565b6000815160301461268d5760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a4016106a4565b6040516002906126a49084906000906020016157d3565b60408051601f19818403018152908290526126be91615802565b602060405180830381855afa1580156126db573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610c6591906153f7565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b60008061278284848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061324892505050565b905060006127c285858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061320f92505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561283157612831614d78565b600281111561284257612842614d78565b8152505090508a6001600160401b031681604001516001600160401b0316106128f95760405162461bcd60e51b815260206004820152605c60248201527f456967656e506f642e76657269667942616c616e63655570646174653a20566160448201527f6c696461746f72732062616c616e63652068617320616c72656164792062656560648201527f6e207570646174656420666f7220746869732074696d657374616d7000000000608482015260a4016106a4565b60018160600151600281111561291157612911614d78565b146129795760405162461bcd60e51b815260206004820152603260248201527f456967656e506f642e76657269667942616c616e63655570646174653a2056616044820152716c696461746f72206e6f742061637469766560701b60648201526084016106a4565b6129828b6134c4565b6001600160401b03166129c78787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506135ae92505050565b6001600160401b031611612a6a576000836001600160401b031611612a6a5760405162461bcd60e51b815260206004820152604d60248201527f456967656e506f642e76657269667942616c616e63655570646174653a20766160448201527f6c696461746f7220697320776974686472617761626c6520627574206861732060648201526c3737ba103bb4ba34323930bbb760991b608482015260a4016106a4565b612a788987878b8b8f61326d565b602081015160006001600160401b037f000000000000000000000000000000000000000000000000000000077359400081169086161115612ada57507f0000000000000000000000000000000000000000000000000000000773594000612add565b50835b6001600160401b0380821660208086019182528f831660408088019182526000898152603690935290912086518154935192518516600160801b0267ffffffffffffffff60801b19938616600160401b026001600160801b031990951691909516179290921790811683178255606086015186939091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836002811115612b8557612b85614d78565b0217905550905050816001600160401b0316816001600160401b031614612c11577f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df8c8e83604051612bfc9392919064ffffffffff9390931683526001600160401b03918216602084015216604082015260600190565b60405180910390a1612c0e81836135c6565b95505b5050505050979650505050505050565b61180382826135e5565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261162a9084906136fe565b6040805180820190915260008082526020820152612ca2612c9d89615883565b6137d0565b6033546001600160401b03600160a01b90910481169082161015612cd85760405162461bcd60e51b81526004016106a490615364565b6000612ce6612c9d8b615883565b90506000612d2688888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061320f92505050565b905060008082815260366020526040902054600160c01b900460ff166002811115612d5357612d53614d78565b1415612e0a5760405162461bcd60e51b815260206004820152607460248201527f456967656e506f642e5f766572696679416e6450726f6365737357697468647260448201527f6177616c3a2056616c696461746f72206e657665722070726f76656e20746f2060648201527f68617665207769746864726177616c2063726564656e7469616c7320706f696e6084820152731d1959081d1bc81d1a1a5cc818dbdb9d1c9858dd60621b60a482015260c4016106a4565b60008181526035602090815260408083206001600160401b038616845290915290205460ff1615612ec95760405162461bcd60e51b815260206004820152605b60248201527f456967656e506f642e5f766572696679416e6450726f6365737357697468647260448201527f6177616c3a207769746864726177616c2068617320616c72656164792062656560648201527f6e2070726f76656e20666f7220746869732074696d657374616d700000000000608482015260a4016106a4565b6001603560008381526020019081526020016000206000846001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550612fa68c87878e7f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8536001600160a01b03166344e71c806040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fa191906159bf565b6137e0565b6000612fe487878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061420192505050565b9050612ff48d8a8a8e8e8661326d565b600061303288888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061421992505050565b90506130708a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506135ae92505050565b6001600160401b031661308a6130858f615883565b614231565b6001600160401b03161061314257603354600084815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b81049093169381019390935261313793869388938a936001600160a01b03909316928892916060830190600160c01b900460ff16600281111561311e5761311e614d78565b600281111561312f5761312f614d78565b905250614243565b95505050505061315c565b60335461313790839086906001600160a01b031684614481565b5098975050505050505050565b603354604051633036cd5360e21b81526001600160a01b03918216600482015283821660248201527f0000000000000000000000002279b7a0a67db372996a5fab50d91eaa73d2ebe69091169063c0db354c9083906044016000604051808303818588803b1580156131da57600080fd5b505af11580156131ee573d6000803e3d6000fd5b50505050505050565b60008361320586858561455f565b1495945050505050565b60008160008151811061322457613224615456565b60200260200101519050919050565b60008160018151811061322457613224615456565b6000610c658260028151811061326057613260615456565b60200260200101516146ab565b61327960036002615ac0565b84146133045760405162461bcd60e51b815260206004820152604e60248201527f426561636f6e436861696e50726f6f66732e76657269667956616c696461746f60448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a4016106a4565b600561331260286001614b56565b61331c9190614b56565b613327906020615779565b82146133a75760405162461bcd60e51b815260206004820152604360248201527f426561636f6e436861696e50726f6f66732e76657269667956616c696461746f60448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a4016106a4565b600064ffffffffff82166133bd60286001614b56565b600b901b179050600061340287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061471292505050565b905061344885858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c92508591508690506131f7565b6134ba5760405162461bcd60e51b815260206004820152603d60248201527f426561636f6e436861696e50726f6f66732e76657269667956616c696461746f60448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f6600000060648201526084016106a4565b5050505050505050565b60007f000000000000000000000000000000000000000000000000000000006059f4606001600160401b0316826001600160401b0316101561356e5760405162461bcd60e51b815260206004820152603760248201527f456967656e506f642e5f74696d657374616d70546f45706f63683a2074696d6560448201527f7374616d70206973206265666f72652067656e6573697300000000000000000060648201526084016106a4565b61357a600c6020615acc565b6135a47f000000000000000000000000000000000000000000000000000000006059f46084615730565b610c659190615afb565b6000610c658260078151811061326057613260615456565b60006135de6001600160401b03808416908516615b21565b9392505050565b804710156136355760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016106a4565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613682576040519150601f19603f3d011682016040523d82523d6000602084013e613687565b606091505b505090508061162a5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016106a4565b6000613753826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166149bf9092919063ffffffff16565b80519091501561162a5780806020019051810190613771919061524e565b61162a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106a4565b6000610c658261014001516146ab565b6137eb600280615ac0565b831461385f5760405162461bcd60e51b81526020600482015260496024820152600080516020615bd383398151915260448201527f616c3a207769746864726177616c4669656c64732068617320696e636f7272656064820152680c6e840d8cadccee8d60bb1b608482015260a4016106a4565b61386b600d6002615ac0565b61387b60c0840160a08501615b60565b6001600160401b0316106138e55760405162461bcd60e51b815260206004820152603f6024820152600080516020615bd383398151915260448201527f616c3a20626c6f636b526f6f74496e64657820697320746f6f206c617267650060648201526084016106a4565b6138f160046002615ac0565b613902610100840160e08501615b60565b6001600160401b03161061396e576040805162461bcd60e51b8152602060048201526024810191909152600080516020615bd383398151915260448201527f616c3a207769746864726177616c496e64657820697320746f6f206c6172676560648201526084016106a4565b61397a60186002615ac0565b61398a60e0840160c08501615b60565b6001600160401b031610613a045760405162461bcd60e51b81526020600482015260476024820152600080516020615bd383398151915260448201527f616c3a20686973746f726963616c53756d6d617279496e64657820697320746f6064820152666f206c6172676560c81b608482015260a4016106a4565b60006001600160401b038216613a1c612c9d85615883565b6001600160401b031610613a31576005613a34565b60045b9050613a41600482614b56565b613a4c906001614b56565b613a57906020615779565b613a618480615410565b905014613ad55760405162461bcd60e51b81526020600482015260486024820152600080516020615bd383398151915260448201527f616c3a207769746864726177616c50726f6f662068617320696e636f727265636064820152670e840d8cadccee8d60c31b608482015260a4016106a4565b613ae160046003614b56565b613aec906020615779565b613af96040850185615410565b905014613b735760405162461bcd60e51b815260206004820152604e6024820152600080516020615bd383398151915260448201527f616c3a20657865637574696f6e5061796c6f616450726f6f662068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a4016106a4565b613b7f60036020615779565b613b8c6020850185615410565b905014613bfa5760405162461bcd60e51b81526020600482015260426024820152600080516020615bd383398151915260448201527f616c3a20736c6f7450726f6f662068617320696e636f7272656374206c656e676064820152610e8d60f31b608482015260a4016106a4565b613c05816020615779565b613c126060850185615410565b905014613c855760405162461bcd60e51b81526020600482015260476024820152600080516020615bd383398151915260448201527f616c3a2074696d657374616d7050726f6f662068617320696e636f7272656374606482015266040d8cadccee8d60cb1b608482015260a4016106a4565b600d613c9360186001614b56565b613c9e906005614b56565b613ca9906001614b56565b613cb39190614b56565b613cbe906020615779565b613ccb6080850185615410565b905014613d545760405162461bcd60e51b81526020600482015260586024820152600080516020615bd383398151915260448201527f616c3a20686973746f726963616c53756d6d617279426c6f636b526f6f74507260648201527f6f6f662068617320696e636f7272656374206c656e6774680000000000000000608482015260a4016106a4565b6000613d6660c0850160a08601615b60565b6001600160401b03166000613d7d600d6001614b56565b613d8d60e0880160c08901615b60565b6001600160401b0316901b600d613da660186001614b56565b613db1906001614b56565b613dbb9190614b56565b601b901b1717179050613e16613dd46080860186615410565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b92505050610100870135846131f7565b613e895760405162461bcd60e51b815260206004820152604a6024820152600080516020615bd383398151915260448201527f616c3a20496e76616c696420686973746f726963616c73756d6d617279206d656064820152693935b63290383937b7b360b11b608482015260a4016106a4565b613ee0613e996020860186615410565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052506101008a013593506101208a0135925090506131f7565b613f405760405162461bcd60e51b815260206004820152603d6024820152600080516020615bd383398151915260448201527f616c3a20496e76616c696420736c6f74206d65726b6c652070726f6f6600000060648201526084016106a4565b6049613f98613f526040870187615410565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610100870135610160880135846131f7565b61400a5760405162461bcd60e51b81526020600482015260496024820152600080516020615bd383398151915260448201527f616c3a20496e76616c696420657865637574696f6e5061796c6f6164206d657260648201526835b63290383937b7b360b91b608482015260a4016106a4565b5061406261401b6060860186615410565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061016086013561014087013560096131f7565b6140cd5760405162461bcd60e51b81526020600482015260426024820152600080516020615bd383398151915260448201527f616c3a20496e76616c69642074696d657374616d70206d65726b6c652070726f60648201526137b360f11b608482015260a4016106a4565b60006140e0610100860160e08701615b60565b6001600160401b03166140f560046001614b56565b600e901b179050600061413a88888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061471292505050565b905061418a6141498780615410565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050505061016088013583856131f7565b6141f65760405162461bcd60e51b81526020600482015260436024820152600080516020615bd383398151915260448201527f616c3a20496e76616c6964207769746864726177616c206d65726b6c6520707260648201526237b7b360e91b608482015260a4016106a4565b505050505050505050565b6000610c658260018151811061326057613260615456565b6000610c658260038151811061326057613260615456565b600060206135a48361012001516146ab565b604080518082019091526000808252602082015260007f00000000000000000000000000000000000000000000000000000007735940006001600160401b0316846001600160401b031611156142ba57507f00000000000000000000000000000000000000000000000000000007735940006142bd565b50825b60408051808201909152600080825260208201526142db8286615730565b6001600160401b0390811682526034805484926000916142fd91859116615b7d565b92506101000a8154816001600160401b0302191690836001600160401b0316021790555061432f8285602001516135c6565b602082015260028460600151600281111561434c5761434c614d78565b1461436e576039805490600061436183615ba8565b9091555050600260608501525b600060208086018281528a83526036909152604091829020865181549251938801516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516929091169190911792909217928316821781556060870151879391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b83600281111561441357614413614d78565b0217905550506040805164ffffffffff8c1681526001600160401b038a8116602083015288168183015290516001600160a01b03891692507fb76a93bb649ece524688f1a01d184e0bbebcda58eae80c28a898bec3fb5a09639181900360600190a298975050505050505050565b60408051808201909152600080825260208201526040805164ffffffffff871681526001600160401b0380871660208301528416918101919091526001600160a01b038416907f8a7335714231dbd551aaba6314f4a97a14c201e53a3e25e1140325cdf67d7a4e9060600160405180910390a2603880548391906000906145129084906001600160401b0316615b7d565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506040518060400160405280836001600160401b0316815260200160008152509050949350505050565b6000835160001415801561457e57506020845161457c9190615708565b155b61460d5760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a4016106a4565b604080516020808201909252848152905b855181116146a157614631600285615708565b614664578151600052808601516020526020826040600060026107d05a03fa61465957600080fd5b60028404935061468f565b8086015160005281516020526020826040600060026107d05a03fa61468857600080fd5b6002840493505b61469a602082614b56565b905061461e565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b60008060028351614723919061571c565b90506000816001600160401b0381111561473f5761473f614f85565b604051908082528060200260200182016040528015614768578160200160208202803683370190505b50905060005b8281101561486f576002856147838383615779565b8151811061479357614793615456565b6020026020010151868360026147a99190615779565b6147b4906001614b56565b815181106147c4576147c4615456565b60200260200101516040516020016147e6929190918252602082015260400190565b60408051601f198184030181529082905261480091615802565b602060405180830381855afa15801561481d573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061484091906153f7565b82828151811061485257614852615456565b602090810291909101015280614867816154dc565b91505061476e565b5061487b60028361571c565b91505b811561499b5760005b828110156149885760028261489c8383615779565b815181106148ac576148ac615456565b6020026020010151838360026148c29190615779565b6148cd906001614b56565b815181106148dd576148dd615456565b60200260200101516040516020016148ff929190918252602082015260400190565b60408051601f198184030181529082905261491991615802565b602060405180830381855afa158015614936573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061495991906153f7565b82828151811061496b5761496b615456565b602090810291909101015280614980816154dc565b915050614887565b5061499460028361571c565b915061487e565b806000815181106149ae576149ae615456565b602002602001015192505050919050565b60606149ce84846000856149d6565b949350505050565b606082471015614a375760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106a4565b6001600160a01b0385163b614a8e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106a4565b600080866001600160a01b03168587604051614aaa9190615802565b60006040518083038185875af1925050503d8060008114614ae7576040519150601f19603f3d011682016040523d82523d6000602084013e614aec565b606091505b5091509150614afc828286614b07565b979650505050505050565b60608315614b165750816135de565b825115614b265782518084602001fd5b8160405162461bcd60e51b81526004016106a49190615bbf565b634e487b7160e01b600052601160045260246000fd5b60008219821115614b6957614b69614b40565b500190565b6001600160401b0381168114611fb957600080fd5b8035614b8e81614b6e565b919050565b60008060408385031215614ba657600080fd5b823591506020830135614bb881614b6e565b809150509250929050565b600060408284031215614bd557600080fd5b50919050565b60008083601f840112614bed57600080fd5b5081356001600160401b03811115614c0457600080fd5b6020830191508360208260051b8501011115614c1f57600080fd5b9250929050565b60008060008060008060008060a0898b031215614c4257600080fd5b8835614c4d81614b6e565b975060208901356001600160401b0380821115614c6957600080fd5b614c758c838d01614bc3565b985060408b0135915080821115614c8b57600080fd5b614c978c838d01614bdb565b909850965060608b0135915080821115614cb057600080fd5b614cbc8c838d01614bdb565b909650945060808b0135915080821115614cd557600080fd5b50614ce28b828c01614bdb565b999c989b5096995094979396929594505050565b60008083601f840112614d0857600080fd5b5081356001600160401b03811115614d1f57600080fd5b602083019150836020828501011115614c1f57600080fd5b60008060208385031215614d4a57600080fd5b82356001600160401b03811115614d6057600080fd5b614d6c85828601614cf6565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110614dac57634e487b7160e01b600052602160045260246000fd5b9052565b60208101610c658284614d8e565b600060208284031215614dd057600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151614e186060840182614d8e565b5092915050565b600080600080600060608688031215614e3757600080fd5b85356001600160401b0380821115614e4e57600080fd5b614e5a89838a01614cf6565b90975095506020880135915080821115614e7357600080fd5b50614e8088828901614cf6565b96999598509660400135949350505050565b60008060008060008060008060a0898b031215614eae57600080fd5b8835614eb981614b6e565b975060208901356001600160401b0380821115614ed557600080fd5b614ee18c838d01614bdb565b909950975060408b0135915080821115614efa57600080fd5b614f068c838d01614bc3565b965060608b0135915080821115614cb057600080fd5b6001600160a01b0381168114611fb957600080fd5b8035614b8e81614f1c565b60008060408385031215614f4f57600080fd5b8235614f5a81614f1c565b946020939093013593505050565b600060208284031215614f7a57600080fd5b81356135de81614f1c565b634e487b7160e01b600052604160045260246000fd5b60405161018081016001600160401b0381118282101715614fbe57614fbe614f85565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614fec57614fec614f85565b604052919050565b60006001600160401b0382111561500d5761500d614f85565b5060051b60200190565b600082601f83011261502857600080fd5b8135602061503d61503883614ff4565b614fc4565b82815260059290921b8401810191818101908684111561505c57600080fd5b8286015b848110156150775780358352918301918301615060565b509695505050505050565b60008060006060848603121561509757600080fd5b83356001600160401b03808211156150ae57600080fd5b818601915086601f8301126150c257600080fd5b813560206150d261503883614ff4565b82815260059290921b8401810191818101908a8411156150f157600080fd5b948201945b8386101561511857853561510981614f1c565b825294820194908201906150f6565b9750508701359250508082111561512e57600080fd5b5061513b86828701615017565b92505061514a60408501614f31565b90509250925092565b60008060008060008060008060008060c08b8d03121561517257600080fd5b61517b8b614b83565b995060208b01356001600160401b038082111561519757600080fd5b6151a38e838f01614bc3565b9a5060408d01359150808211156151b957600080fd5b6151c58e838f01614bdb565b909a50985060608d01359150808211156151de57600080fd5b6151ea8e838f01614bdb565b909850965060808d013591508082111561520357600080fd5b61520f8e838f01614bdb565b909650945060a08d013591508082111561522857600080fd5b506152358d828e01614bdb565b915080935050809150509295989b9194979a5092959850565b60006020828403121561526057600080fd5b815180151581146135de57600080fd5b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b6020808252602f908201527f456967656e506f642e6861734e6576657252657374616b65643a20726573746160408201526e1ada5b99c81a5cc8195b98589b1959608a1b606082015260800190565b60208082526067908201527f456967656e506f642e70726f6f664973466f7256616c696454696d657374616d60408201527f703a20626561636f6e20636861696e2070726f6f66206d75737420626520617460608201527f206f72206166746572206d6f7374526563656e745769746864726177616c546960808201526606d657374616d760cc1b60a082015260c00190565b60006020828403121561540957600080fd5b5051919050565b6000808335601e1984360301811261542757600080fd5b8301803591506001600160401b0382111561544157600080fd5b602001915036819003821315614c1f57600080fd5b634e487b7160e01b600052603260045260246000fd5b60006020828403121561547e57600080fd5b813564ffffffffff811681146135de57600080fd5b6000808335601e198436030181126154aa57600080fd5b8301803591506001600160401b038211156154c457600080fd5b6020019150600581901b3603821315614c1f57600080fd5b60006000198214156154f0576154f0614b40565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b8381101561558c578181015183820152602001615574565b838111156121445750506000910152565b600081518084526155b5816020860160208601615571565b601f01601f19169290920160200192915050565b6080815260006155dd60808301888a615548565b82810360208401526155ef818861559d565b90508281036040840152615604818688615548565b915050826060830152979650505050505050565b6020815260006149ce602083018486615548565b600080821280156001600160ff1b038490038513161561564e5761564e614b40565b600160ff1b839003841281161561566757615667614b40565b50500190565b60006001600160ff1b038184138284138082168684048611161561569357615693614b40565b600160ff1b60008712828116878305891216156156b2576156b2614b40565b600087129250878205871284841616156156ce576156ce614b40565b878505871281841616156156e4576156e4614b40565b505050929093029392505050565b634e487b7160e01b600052601260045260246000fd5b600082615717576157176156f2565b500690565b60008261572b5761572b6156f2565b500490565b60006001600160401b038381169083168181101561575057615750614b40565b039392505050565b6000823561017e1983360301811261576f57600080fd5b9190910192915050565b600081600019048311821515161561579357615793614b40565b500290565b6000828210156157aa576157aa614b40565b500390565b80516020808301519190811015614bd55760001960209190910360031b1b16919050565b600083516157e5818460208801615571565b6001600160801b0319939093169190920190815260100192915050565b6000825161576f818460208701615571565b600082601f83011261582557600080fd5b81356001600160401b0381111561583e5761583e614f85565b615851601f8201601f1916602001614fc4565b81815284602083860101111561586657600080fd5b816020850160208301376000918101602001919091529392505050565b6000610180823603121561589657600080fd5b61589e614f9b565b82356001600160401b03808211156158b557600080fd5b6158c136838701615814565b835260208501359150808211156158d757600080fd5b6158e336838701615814565b602084015260408501359150808211156158fc57600080fd5b61590836838701615814565b6040840152606085013591508082111561592157600080fd5b61592d36838701615814565b6060840152608085013591508082111561594657600080fd5b5061595336828601615814565b60808301525061596560a08401614b83565b60a082015261597660c08401614b83565b60c082015261598760e08401614b83565b60e082015261010083810135908201526101208084013590820152610140808401359082015261016092830135928101929092525090565b6000602082840312156159d157600080fd5b81516135de81614b6e565b600181815b80851115615a175781600019048211156159fd576159fd614b40565b80851615615a0a57918102915b93841c93908002906159e1565b509250929050565b600082615a2e57506001610c65565b81615a3b57506000610c65565b8160018114615a515760028114615a5b57615a77565b6001915050610c65565b60ff841115615a6c57615a6c614b40565b50506001821b610c65565b5060208310610133831016604e8410600b8410161715615a9a575081810a610c65565b615aa483836159dc565b8060001904821115615ab857615ab8614b40565b029392505050565b60006135de8383615a1f565b60006001600160401b0380831681851681830481118215151615615af257615af2614b40565b02949350505050565b60006001600160401b0380841680615b1557615b156156f2565b92169190910492915050565b60008083128015600160ff1b850184121615615b3f57615b3f614b40565b6001600160ff1b0384018313811615615b5a57615b5a614b40565b50500390565b600060208284031215615b7257600080fd5b81356135de81614b6e565b60006001600160401b03808316818516808303821115615b9f57615b9f614b40565b01949350505050565b600081615bb757615bb7614b40565b506000190190565b6020815260006135de602083018461559d56fe426561636f6e436861696e50726f6f66732e7665726966795769746864726177a2646970667358221220656981dc5145bc9ae56cad10b3325a82c4c3e09907c3ad02552c669c762bf1c664736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x90f79bf6eb2c4f870365e785982e1f101e93b906":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x959922be3caee4b8cd9a407cc3ac1c251c2007b1":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061014b5760003560e01c806385594e58116100b6578063e4f4f8871161006f578063e4f4f887146103cc578063e5db06c014610405578063eb990c5914610425578063ecb7cb1b14610445578063f2fde38b14610472578063fabc1cbc1461049257600080fd5b806385594e5814610317578063886f1195146103445780638da5cb5b14610364578063c0db354c14610382578063ca661c0414610395578063d44e1b76146103ac57600080fd5b806350f73e7c1161010857806350f73e7c14610254578063595c6a67146102785780635ac86ab71461028d5780635c975abb146102cd578063715018a6146102e257806375608896146102f757600080fd5b806310d67a2f14610150578063136439dd146101725780631f39d87f146101925780633e1de008146101c85780634665bcda146101e85780634d50f9a414610234575b600080fd5b34801561015c57600080fd5b5061017061016b36600461196d565b6104b2565b005b34801561017e57600080fd5b5061017061018d366004611991565b61056e565b34801561019e57600080fd5b506101b26101ad36600461196d565b6106ad565b6040516101bf91906119c8565b60405180910390f35b3480156101d457600080fd5b506101b26101e336600461196d565b6108a8565b3480156101f457600080fd5b5061021c7f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c85381565b6040516001600160a01b0390911681526020016101bf565b34801561024057600080fd5b5061017061024f366004611991565b6109ee565b34801561026057600080fd5b5061026a60c95481565b6040519081526020016101bf565b34801561028457600080fd5b506101706109ff565b34801561029957600080fd5b506102bd6102a8366004611a15565b609854600160ff9092169190911b9081161490565b60405190151581526020016101bf565b3480156102d957600080fd5b5060985461026a565b3480156102ee57600080fd5b50610170610ac6565b34801561030357600080fd5b506102bd610312366004611a38565b610ada565b34801561032357600080fd5b50610337610332366004611a38565b610b5d565b6040516101bf9190611a64565b34801561035057600080fd5b5060975461021c906001600160a01b031681565b34801561037057600080fd5b506033546001600160a01b031661021c565b610170610390366004611a72565b610bdd565b3480156103a157600080fd5b5061026a62034bc081565b3480156103b857600080fd5b506101706103c7366004611991565b610e9d565b3480156103d857600080fd5b5061026a6103e736600461196d565b6001600160a01b0316600090815260ca602052604090206001015490565b34801561041157600080fd5b50610170610420366004611a38565b610f31565b34801561043157600080fd5b50610170610440366004611aab565b610fc6565b34801561045157600080fd5b5061046561046036600461196d565b6110ee565b6040516101bf9190611af1565b34801561047e57600080fd5b5061017061048d36600461196d565b6111a8565b34801561049e57600080fd5b506101706104ad366004611991565b61121e565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610505573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105299190611b47565b6001600160a01b0316336001600160a01b0316146105625760405162461bcd60e51b815260040161055990611b64565b60405180910390fd5b61056b8161137a565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156105b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105da9190611bae565b6105f65760405162461bcd60e51b815260040161055990611bd0565b6098548181161461066f5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610559565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926106da8383611c2e565b90508060005b82811015610786576001600160a01b038716600090815260ca6020526040812060010161070d8388611c45565b8154811061071d5761071d611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061076391611c45565b4310156107735781925050610786565b508061077e81611c73565b9150506106e0565b508060008167ffffffffffffffff8111156107a3576107a3611c8e565b6040519080825280602002602001820160405280156107e857816020015b60408051808201909152600080825260208201528152602001906001900390816107c15790505b509050811561089d5760005b8281101561089b576001600160a01b038916600090815260ca602052604090206001016108218289611c45565b8154811061083157610831611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810191909152825183908390811061087d5761087d611c5d565b6020026020010181905250808061089390611c73565b9150506107f4565b505b979650505050505050565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926108d58383611c2e565b905060008167ffffffffffffffff8111156108f2576108f2611c8e565b60405190808252806020026020018201604052801561093757816020015b60408051808201909152600080825260208201528152602001906001900390816109105790505b50905060005b828110156109e4576001600160a01b038716600090815260ca6020526040902060010161096a8287611c45565b8154811061097a5761097a611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff169181019190915282518390839081106109c6576109c6611c5d565b602002602001018190525080806109dc90611c73565b91505061093d565b5095945050505050565b6109f6611471565b61056b816114cb565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6b9190611bae565b610a875760405162461bcd60e51b815260040161055990611bd0565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610ace611471565b610ad86000611593565b565b6001600160a01b038216600090815260ca60205260408120548210801590610b54575060c9546001600160a01b038416600090815260ca60205260409020600101805484908110610b2d57610b2d611c5d565b600091825260209091200154610b509190600160e01b900463ffffffff16611c45565b4310155b90505b92915050565b60408051808201909152600080825260208201526001600160a01b038316600090815260ca60205260409020600101805483908110610b9e57610b9e611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff16918101919091529392505050565b60405163a38406a360e01b81526001600160a01b038084166004830152839133917f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c853169063a38406a390602401602060405180830381865afa158015610c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6b9190611b47565b6001600160a01b031614610ce75760405162461bcd60e51b815260206004820152603d60248201527f44656c617965645769746864726177616c526f757465722e6f6e6c794569676560448201527f6e506f643a206e6f7420706f644f776e6572277320456967656e506f640000006064820152608401610559565b60985460009060019081161415610d105760405162461bcd60e51b815260040161055990611ca4565b6001600160a01b038316610da65760405162461bcd60e51b815260206004820152605160248201527f44656c617965645769746864726177616c526f757465722e637265617465446560448201527f6c617965645769746864726177616c3a20726563697069656e742063616e6e6f60648201527074206265207a65726f206164647265737360781b608482015260a401610559565b346001600160e01b03811615610e96576040805180820182526001600160e01b03808416825263ffffffff43811660208085019182526001600160a01b038a16600081815260ca8352968720600190810180548083018255818a5293892088519551909616600160e01b029490961693909317939091019290925593525490917fb8f1b14c7caf74150801dcc9bc18d575cbeaf5b421943497e409df92c92e0f5991889188918691610e5791611c2e565b604080516001600160a01b0395861681529490931660208501526001600160e01b039091169183019190915260608201526080015b60405180910390a1505b5050505050565b60026065541415610ef05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610559565b600260655560985460009060019081161415610f1e5760405162461bcd60e51b815260040161055990611ca4565b610f2833836115e5565b50506001606555565b60026065541415610f845760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610559565b600260655560985460009060019081161415610fb25760405162461bcd60e51b815260040161055990611ca4565b610fbc83836115e5565b5050600160655550565b600054610100900460ff1615808015610fe65750600054600160ff909116105b806110005750303b158015611000575060005460ff166001145b6110635760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610559565b6000805460ff191660011790558015611086576000805461ff0019166101001790555b61108f85611593565b6110998484611750565b6110a2826114cb565b8015610e96576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6040805180820190915260008152606060208201526001600160a01b038216600090815260ca6020908152604080832081518083018352815481526001820180548451818702810187019095528085529195929486810194939192919084015b8282101561119a57600084815260209081902060408051808201909152908401546001600160e01b0381168252600160e01b900463ffffffff168183015282526001909201910161114e565b505050915250909392505050565b6111b0611471565b6001600160a01b0381166112155760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610559565b61056b81611593565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611271573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112959190611b47565b6001600160a01b0316336001600160a01b0316146112c55760405162461bcd60e51b815260040161055990611b64565b6098541981196098541916146113435760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610559565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016106a2565b6001600160a01b0381166114085760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610559565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314610ad85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610559565b62034bc08111156115525760405162461bcd60e51b815260206004820152604560248201527f44656c617965645769746864726177616c526f757465722e5f7365745769746860448201527f64726177616c44656c6179426c6f636b733a206e657756616c756520746f6f206064820152646c6172676560d81b608482015260a401610559565b60c95460408051918252602082018390527f4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e910160405180910390a160c955565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600090815260ca602052604081208054600190910154825b848110801561161e57508161161c8285611c45565b105b156116cb576001600160a01b038616600090815260ca602052604081206001016116488386611c45565b8154811061165857611658611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061169e91611c45565b4310156116ab57506116cb565b80516116c0906001600160e01b031686611c45565b945050600101611607565b6116d58184611c45565b6001600160a01b038716600090815260ca602052604090205583156116fe576116fe868561183a565b7f6b7151500bd0b5cc211bcc47b3029831b769004df4549e8e1c9a69da05bb0943868561172b8487611c45565b604080516001600160a01b039094168452602084019290925290820152606001610e8c565b6097546001600160a01b031615801561177157506001600160a01b03821615155b6117f35760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610559565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26118368261137a565b5050565b8047101561188a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610559565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146118d7576040519150601f19603f3d011682016040523d82523d6000602084013e6118dc565b606091505b50509050806119535760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610559565b505050565b6001600160a01b038116811461056b57600080fd5b60006020828403121561197f57600080fd5b813561198a81611958565b9392505050565b6000602082840312156119a357600080fd5b5035919050565b80516001600160e01b0316825260209081015163ffffffff16910152565b602080825282518282018190526000919060409081850190868401855b82811015611a08576119f88483516119aa565b92840192908501906001016119e5565b5091979650505050505050565b600060208284031215611a2757600080fd5b813560ff8116811461198a57600080fd5b60008060408385031215611a4b57600080fd5b8235611a5681611958565b946020939093013593505050565b60408101610b5782846119aa565b60008060408385031215611a8557600080fd5b8235611a9081611958565b91506020830135611aa081611958565b809150509250929050565b60008060008060808587031215611ac157600080fd5b8435611acc81611958565b93506020850135611adc81611958565b93969395505050506040820135916060013590565b602080825282518282015282810151604080840181905281516060850181905260009392830191849160808701905b8084101561089b57611b338286516119aa565b938501936001939093019290820190611b20565b600060208284031215611b5957600080fd5b815161198a81611958565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611bc057600080fd5b8151801515811461198a57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015611c4057611c40611c18565b500390565b60008219821115611c5857611c58611c18565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415611c8757611c87611c18565b5060010190565b634e487b7160e01b600052604160045260246000fd5b60208082526019908201527f5061757361626c653a20696e646578206973207061757365640000000000000060408201526060019056fea2646970667358221220b8660745cc3b9b958e75e5d12c71052676f8295b2a767105fa42f36d63e58d2164736f6c634300080c0033","storage":{"0x0":"0xff"}},"0x976ea74026e726554db657fa54763abd0c3a0aa9":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x9965507d1a55bcc2695c58ba16fb37d819b0a4dc":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0x9a676e781a523b5d0c0e43731313a708cb607508":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106101f05760003560e01c80637cf72bba1161010f578063d98128c0116100a2578063e921d4fa11610071578063e921d4fa146103c6578063f2fde38b1461044c578063f73b7519146102a9578063fabc1cbc1461045f57600080fd5b8063d98128c014610430578063da16e29b14610322578063df5cf723146102ba578063e58398361461043e57600080fd5b80638da5cb5b116100de5780638da5cb5b146103b5578063a49db732146103c6578063c747075b146103da578063d7b7fa13146103ee57600080fd5b80637cf72bba146103465780638105e04314610354578063855fcc4a1461036b578063886f1195146103a257600080fd5b806339b70e38116101875780636f0c2f74116101565780636f0c2f7414610322578063715018a614610330578063723e59c7146103385780637259a45c1461024257600080fd5b806339b70e38146102ba578063595c6a67146102d55780635ac86ab7146102dd5780635c975abb1461031057600080fd5b80631794bb3c116101c35780631794bb3c1461022f5780631874e5ae14610242578063282670fc1461027257806338c8ee64146102a957600080fd5b80630ffabbce146101f557806310d67a2f14610209578063136439dd1461021c578063175d3205146101f5575b600080fd5b610207610203366004610b25565b5050565b005b610207610217366004610b5a565b610472565b61020761022a366004610b7e565b61052b565b61020761023d366004610b97565b505050565b610258610250366004610b25565b600092915050565b60405163ffffffff90911681526020015b60405180910390f35b610285610280366004610bd8565b61066a565b60408051825163ffffffff9081168252602093840151169281019290925201610269565b6102076102b7366004610b5a565b50565b60005b6040516001600160a01b039091168152602001610269565b610207610685565b6103006102eb366004610c04565b606654600160ff9092169190911b9081161490565b6040519015158152602001610269565b6066545b604051908152602001610269565b610258610250366004610c27565b61020761074c565b610314610250366004610b25565b610207610203366004610c60565b610300610362366004610cd5565b60009392505050565b610385610379366004610c27565b60008060009250925092565b604080519315158452602084019290925290820152606001610269565b6065546102bd906001600160a01b031681565b6033546001600160a01b03166102bd565b6103146103d4366004610b5a565b50600090565b6102076103e8366004610d13565b50505050565b6104016103fc366004610c27565b610760565b60408051825163ffffffff90811682526020808501518216908301529282015190921690820152606001610269565b610300610250366004610c27565b6103006103d4366004610b5a565b61020761045a366004610b5a565b610782565b61020761046d366004610b7e565b6107f8565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e99190610d60565b6001600160a01b0316336001600160a01b0316146105225760405162461bcd60e51b815260040161051990610d7d565b60405180910390fd5b6102b781610954565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610573573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105979190610dc7565b6105b35760405162461bcd60e51b815260040161051990610de9565b6066548181161461062c5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610519565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b60408051808201909152600080825260208201525b92915050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f19190610dc7565b61070d5760405162461bcd60e51b815260040161051990610de9565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610754610a4b565b61075e6000610aa5565b565b604080516060810182526000808252602082018190529181019190915261067f565b61078a610a4b565b6001600160a01b0381166107ef5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610519565b6102b781610aa5565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561084b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086f9190610d60565b6001600160a01b0316336001600160a01b03161461089f5760405162461bcd60e51b815260040161051990610d7d565b60665419811960665419161461091d5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610519565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161065f565b6001600160a01b0381166109e25760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610519565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b0316331461075e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610519565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03811681146102b757600080fd5b803563ffffffff81168114610b2057600080fd5b919050565b60008060408385031215610b3857600080fd5b8235610b4381610af7565b9150610b5160208401610b0c565b90509250929050565b600060208284031215610b6c57600080fd5b8135610b7781610af7565b9392505050565b600060208284031215610b9057600080fd5b5035919050565b600080600060608486031215610bac57600080fd5b8335610bb781610af7565b92506020840135610bc781610af7565b929592945050506040919091013590565b60008060408385031215610beb57600080fd5b8235610bf681610af7565b946020939093013593505050565b600060208284031215610c1657600080fd5b813560ff81168114610b7757600080fd5b60008060408385031215610c3a57600080fd5b8235610c4581610af7565b91506020830135610c5581610af7565b809150509250929050565b60008060208385031215610c7357600080fd5b823567ffffffffffffffff80821115610c8b57600080fd5b818501915085601f830112610c9f57600080fd5b813581811115610cae57600080fd5b8660208260051b8501011115610cc357600080fd5b60209290920196919550909350505050565b600080600060608486031215610cea57600080fd5b8335610cf581610af7565b9250610d0360208501610b0c565b9150604084013590509250925092565b60008060008060808587031215610d2957600080fd5b8435610d3481610af7565b9350610d4260208601610b0c565b9250610d5060408601610b0c565b9396929550929360600135925050565b600060208284031215610d7257600080fd5b8151610b7781610af7565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215610dd957600080fd5b81518015158114610b7757600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b60608201526080019056fea2646970667358221220ec99a32f2c569b5578da9dbc14954b22f3a80ad1a966a02eb8121148f8fe942464736f6c634300080c0033","storage":{}},"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0":{"nonce":1,"balance":"0x0","code":"0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063c298557814602d575b600080fd5b600060405190815260200160405180910390f3fea2646970667358221220911e890115ba4d90995b51eca07ab7d0f34b9d8c6d41bd770b671745d3c513e764736f6c634300080c0033","storage":{}},"0xa0ee7a142d267c1f36714e4a8f75612f20a79720":{"nonce":0,"balance":"0x21e19e0c9bab2400000","code":"0x","storage":{}},"0xa513e6e4b8f2a923d98304ec87f64353c4d5c853":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122061dc9392cf6ba7869fe7bc6ba05d8409fb69605ae4794b23a59c97020514de6d64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x65":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x66":"0x1e","0x97":"0x0","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xb306bf915c4d645ff596e518faf3f9669b97016","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106102275760003560e01c806394f649dd11610130578063c6656702116100b8578063df5cf7231161007c578063df5cf72314610596578063e7a050aa146105bd578063f2fde38b146105d0578063f698da25146105e3578063fabc1cbc146105eb57600080fd5b8063c665670214610520578063cbc2bd6214610533578063cd293f6f14610546578063cf756fdf14610570578063df5b35471461058357600080fd5b8063b43b514b116100ff578063b43b514b146104b1578063b5d8b5b8146104c4578063c3c6b3a9146104d7578063c4623ea1146104fa578063c608c7f31461050d57600080fd5b806394f649dd14610433578063967fc0d2146104545780639b4da03d14610467578063b13442711461048a57600080fd5b80635c975abb116101b35780637ecebe00116101825780637ecebe00146103b3578063886f1195146103d35780638b8aac3c146103e65780638c80d4e51461040f5780638da5cb5b1461042257600080fd5b80635c975abb14610355578063663c1de41461035d578063715018a6146103805780637a7e0d921461038857600080fd5b80634665bcda116101fa5780634665bcda146102a157806348825e94146102e05780634e5a426314610307578063595c6a671461031a5780635ac86ab71461032257600080fd5b806310d67a2f1461022c578063136439dd1461024157806320606b701461025457806332e89ace1461028e575b600080fd5b61023f61023a366004612b4a565b6105fe565b005b61023f61024f366004612b67565b6106ba565b61027b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b61027b61029c366004612c00565b6107f9565b6102c87f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c85381565b6040516001600160a01b039091168152602001610285565b61027b7f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b61023f610315366004612ced565b610ae7565b61023f610b1f565b610345610330366004612d26565b609854600160ff9092169190911b9081161490565b6040519015158152602001610285565b60985461027b565b61034561036b366004612b4a565b60d16020526000908152604090205460ff1681565b61023f610be6565b61027b610396366004612d49565b60cd60209081526000928352604080842090915290825290205481565b61027b6103c1366004612b4a565b60ca6020526000908152604090205481565b6097546102c8906001600160a01b031681565b61027b6103f4366004612b4a565b6001600160a01b0316600090815260ce602052604090205490565b61023f61041d366004612d77565b610bfa565b6033546001600160a01b03166102c8565b610446610441366004612b4a565b610c53565b604051610285929190612e2c565b60cb546102c8906001600160a01b031681565b610345610475366004612b4a565b60d36020526000908152604090205460ff1681565b6102c87f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b61027b6104bf366004612fd5565b610dd3565b61023f6104d23660046130f0565b610e20565b6103456104e5366004612b67565b60cf6020526000908152604090205460ff1681565b61023f610508366004613132565b610f94565b61023f61051b366004613183565b610fe8565b61023f61052e366004612b4a565b6110a0565b6102c86105413660046131d6565b6110b1565b610559610554366004612fd5565b6110e9565b604080519215158352602083019190915201610285565b61023f61057e366004613132565b61117d565b61023f610591366004613202565b6112b1565b6102c87f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b61027b6105cb366004612d77565b6114da565b61023f6105de366004612b4a565b6115a3565b61027b611619565b61023f6105f9366004612b67565b611657565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610651573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610675919061326e565b6001600160a01b0316336001600160a01b0316146106ae5760405162461bcd60e51b81526004016106a59061328b565b60405180910390fd5b6106b7816117b3565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610702573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072691906132d5565b6107425760405162461bcd60e51b81526004016106a5906132f2565b609854818116146107bb5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016106a5565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6098546000908190600190811614156108505760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016106a5565b600260655414156108a35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106a5565b60026065556001600160a01b038816600090815260d3602052604090205460ff161561094a5760405162461bcd60e51b815260206004820152604a60248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207468697264207472616e736665726064820152691cc8191a5cd8589b195960b21b608482015260a4016106a5565b428410156109cc5760405162461bcd60e51b815260206004820152604360248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207369676e617475726520657870696064820152621c995960ea1b608482015260a4016106a5565b6001600160a01b03858116600081815260ca602090815260408083205481517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922493810193909352908201939093528b84166060820152928a16608084015260a0830189905260c0830182905260e0830187905290916101000160408051601f1981840301815291815281516020928301206001600160a01b038a16600090815260ca9093529082206001850190559150610a84611619565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050610ac78882886118aa565b610ad3888c8c8c611a69565b60016065559b9a5050505050505050505050565b60cb546001600160a01b03163314610b115760405162461bcd60e51b81526004016106a59061333a565b610b1b8282611c38565b5050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610b67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8b91906132d5565b610ba75760405162461bcd60e51b81526004016106a5906132f2565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610bee611ca6565b610bf86000611d00565b565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91614610c425760405162461bcd60e51b81526004016106a5906133a4565b610c4d838383611d52565b50505050565b6001600160a01b038116600090815260ce60205260408120546060918291908167ffffffffffffffff811115610c8b57610c8b612b90565b604051908082528060200260200182016040528015610cb4578160200160208202803683370190505b50905060005b82811015610d45576001600160a01b038616600090815260cd6020908152604080832060ce9092528220805491929184908110610cf957610cf9613402565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610d3257610d32613402565b6020908102919091010152600101610cba565b5060ce6000866001600160a01b03166001600160a01b031681526020019081526020016000208181805480602002602001604051908101604052809291908181526020018280548015610dc157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610da3575b50505050509150935093505050915091565b80516020808301516040808501516060860151608087015160a08801519351600097610e03979096959101613418565b604051602081830303815290604052805190602001209050919050565b60cb546001600160a01b03163314610e4a5760405162461bcd60e51b81526004016106a59061333a565b8060005b81811015610c4d5760d16000858584818110610e6c57610e6c613402565b9050602002016020810190610e819190612b4a565b6001600160a01b0316815260208101919091526040016000205460ff1615610f8c57600060d16000868685818110610ebb57610ebb613402565b9050602002016020810190610ed09190612b4a565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610f2b57610f2b613402565b9050602002016020810190610f409190612b4a565b6040516001600160a01b03909116815260200160405180910390a1610f8c848483818110610f7057610f70613402565b9050602002016020810190610f859190612b4a565b6000611c38565b600101610e4e565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91614610fdc5760405162461bcd60e51b81526004016106a5906133a4565b610c4d84848484611eae565b336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916146110305760405162461bcd60e51b81526004016106a5906133a4565b604051636ce5768960e11b81526001600160a01b03858116600483015282811660248301526044820184905284169063d9caed1290606401600060405180830381600087803b15801561108257600080fd5b505af1158015611096573d6000803e3d6000fd5b5050505050505050565b6110a8611ca6565b6106b78161213b565b60ce60205281600052604060002081815481106110cd57600080fd5b6000918252602090912001546001600160a01b03169150829050565b600080336001600160a01b037f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916146111345760405162461bcd60e51b81526004016106a5906133a4565b600061113f84610dd3565b600081815260cf60205260408120549192509060ff16156111745750600081815260cf60205260409020805460ff1916905560015b92509050915091565b600054610100900460ff161580801561119d5750600054600160ff909116105b806111b75750303b1580156111b7575060005460ff166001145b61121a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106a5565b6000805460ff19166001179055801561123d576000805461ff0019166101001790555b6112456121a4565b60c955611252838361223b565b61125b85611d00565b6112648461213b565b80156112aa576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60cb546001600160a01b031633146112db5760405162461bcd60e51b81526004016106a59061333a565b8281146113645760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794d616e616765722e61646453747261746567696573546f4460448201527f65706f73697457686974656c6973743a206172726179206c656e67746873206460648201526a0de40dcdee840dac2e8c6d60ab1b608482015260a4016106a5565b8260005b818110156114d25760d1600087878481811061138657611386613402565b905060200201602081019061139b9190612b4a565b6001600160a01b0316815260208101919091526040016000205460ff166114ca57600160d160008888858181106113d4576113d4613402565b90506020020160208101906113e99190612b4a565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe86868381811061144457611444613402565b90506020020160208101906114599190612b4a565b6040516001600160a01b03909116815260200160405180910390a16114ca86868381811061148957611489613402565b905060200201602081019061149e9190612b4a565b8585848181106114b0576114b0613402565b90506020020160208101906114c59190613491565b611c38565b600101611368565b505050505050565b6098546000908190600190811614156115315760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016106a5565b600260655414156115845760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106a5565b600260655561159533868686611a69565b600160655595945050505050565b6115ab611ca6565b6001600160a01b0381166116105760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106a5565b6106b781611d00565b60007f0000000000000000000000000000000000000000000000000000000000007a6946141561164a575060c95490565b6116526121a4565b905090565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ce919061326e565b6001600160a01b0316336001600160a01b0316146116fe5760405162461bcd60e51b81526004016106a59061328b565b60985419811960985419161461177c5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016106a5565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016107ee565b6001600160a01b0381166118415760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016106a5565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383163b156119c957604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906118ea9086908690600401613506565b602060405180830381865afa158015611907573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192b919061351f565b6001600160e01b031916146119c45760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a4016106a5565b505050565b826001600160a01b03166119dd8383612321565b6001600160a01b0316146119c45760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a4016106a5565b6001600160a01b038316600090815260d16020526040812054849060ff16611b0f5760405162461bcd60e51b815260206004820152604d60248201527f53747261746567794d616e616765722e6f6e6c7953747261746567696573576860448201527f6974656c6973746564466f724465706f7369743a207374726174656779206e6f60648201526c1d081dda1a5d195b1a5cdd1959609a1b608482015260a4016106a5565b611b246001600160a01b038516338786612345565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303816000875af1158015611b73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b979190613549565b9150611ba586858785611eae565b604051631452b9d760e11b81526001600160a01b0387811660048301528681166024830152604482018490527f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916906328a573ae90606401600060405180830381600087803b158015611c1757600080fd5b505af1158015611c2b573d6000803e3d6000fd5b5050505050949350505050565b604080516001600160a01b038416815282151560208201527f77d930df4937793473a95024d87a98fd2ccb9e92d3c2463b3dacd65d3e6a5786910160405180910390a16001600160a01b0391909116600090815260d360205260409020805460ff1916911515919091179055565b6033546001600160a01b03163314610bf85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106a5565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081611dc75760405162461bcd60e51b815260206004820152603e60248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a207360448201527f68617265416d6f756e742073686f756c64206e6f74206265207a65726f21000060648201526084016106a5565b6001600160a01b03808516600090815260cd602090815260408083209387168352929052205480831115611e595760405162461bcd60e51b815260206004820152603360248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a20736044820152720d0c2e4ca82dadeeadce840e8dede40d0d2ced606b1b60648201526084016106a5565b6001600160a01b03808616600090815260cd602090815260408083209388168352929052208382039081905590831415611ea157611e97858561239f565b6001915050611ea7565b60009150505b9392505050565b6001600160a01b038416611f2a5760405162461bcd60e51b815260206004820152603960248201527f53747261746567794d616e616765722e5f6164645368617265733a207374616b60448201527f65722063616e6e6f74206265207a65726f20616464726573730000000000000060648201526084016106a5565b80611f965760405162461bcd60e51b815260206004820152603660248201527f53747261746567794d616e616765722e5f6164645368617265733a207368617260448201527565732073686f756c64206e6f74206265207a65726f2160501b60648201526084016106a5565b6001600160a01b03808516600090815260cd60209081526040808320938616835292905220546120a7576001600160a01b038416600090815260ce6020908152604090912054106120685760405162461bcd60e51b815260206004820152605060248201527f53747261746567794d616e616765722e5f6164645368617265733a206465706f60448201527f73697420776f756c6420657863656564204d41585f5354414b45525f5354524160648201526f0a88a8eb2be9892a6a8be988a9c8ea8960831b608482015260a4016106a5565b6001600160a01b03848116600090815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169184169190911790555b6001600160a01b03808516600090815260cd60209081526040808320938616835292905290812080548392906120de908490613578565b9091555050604080516001600160a01b03868116825285811660208301528416818301526060810183905290517f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a969181900360800190a150505050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6097546001600160a01b031615801561225c57506001600160a01b03821615155b6122de5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016106a5565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610b1b826117b3565b60008060006123308585612591565b9150915061233d81612601565b509392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610c4d9085906127bc565b6001600160a01b038216600090815260ce6020526040812054905b818110156124ba576001600160a01b03848116600090815260ce60205260409020805491851691839081106123f1576123f1613402565b6000918252602090912001546001600160a01b031614156124b2576001600160a01b038416600090815260ce60205260409020805461243290600190613590565b8154811061244257612442613402565b60009182526020808320909101546001600160a01b03878116845260ce909252604090922080549190921691908390811061247f5761247f613402565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506124ba565b6001016123ba565b818114156125425760405162461bcd60e51b815260206004820152604960248201527f53747261746567794d616e616765722e5f72656d6f766553747261746567794660448201527f726f6d5374616b657253747261746567794c6973743a207374726174656779206064820152681b9bdd08199bdd5b9960ba1b608482015260a4016106a5565b6001600160a01b038416600090815260ce60205260409020805480612569576125696135a7565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000808251604114156125c85760208301516040840151606085015160001a6125bc8782858561288e565b945094505050506125fa565b8251604014156125f257602083015160408401516125e786838361297b565b9350935050506125fa565b506000905060025b9250929050565b6000816004811115612615576126156135bd565b141561261e5750565b6001816004811115612632576126326135bd565b14156126805760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016106a5565b6002816004811115612694576126946135bd565b14156126e25760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016106a5565b60038160048111156126f6576126f66135bd565b141561274f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016106a5565b6004816004811115612763576127636135bd565b14156106b75760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016106a5565b6000612811826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166129b49092919063ffffffff16565b8051909150156119c4578080602001905181019061282f91906132d5565b6119c45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106a5565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156128c55750600090506003612972565b8460ff16601b141580156128dd57508460ff16601c14155b156128ee5750600090506004612972565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612942573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661296b57600060019250925050612972565b9150600090505b94509492505050565b6000806001600160ff1b0383168161299860ff86901c601b613578565b90506129a68782888561288e565b935093505050935093915050565b60606129c384846000856129cb565b949350505050565b606082471015612a2c5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106a5565b6001600160a01b0385163b612a835760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106a5565b600080866001600160a01b03168587604051612a9f91906135d3565b60006040518083038185875af1925050503d8060008114612adc576040519150601f19603f3d011682016040523d82523d6000602084013e612ae1565b606091505b5091509150612af1828286612afc565b979650505050505050565b60608315612b0b575081611ea7565b825115612b1b5782518084602001fd5b8160405162461bcd60e51b81526004016106a591906135ef565b6001600160a01b03811681146106b757600080fd5b600060208284031215612b5c57600080fd5b8135611ea781612b35565b600060208284031215612b7957600080fd5b5035919050565b8035612b8b81612b35565b919050565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715612bc957612bc9612b90565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612bf857612bf8612b90565b604052919050565b60008060008060008060c08789031215612c1957600080fd5b8635612c2481612b35565b9550602087810135612c3581612b35565b9550604088013594506060880135612c4c81612b35565b93506080880135925060a088013567ffffffffffffffff80821115612c7057600080fd5b818a0191508a601f830112612c8457600080fd5b813581811115612c9657612c96612b90565b612ca8601f8201601f19168501612bcf565b91508082528b84828501011115612cbe57600080fd5b80848401858401376000848284010152508093505050509295509295509295565b80151581146106b757600080fd5b60008060408385031215612d0057600080fd5b8235612d0b81612b35565b91506020830135612d1b81612cdf565b809150509250929050565b600060208284031215612d3857600080fd5b813560ff81168114611ea757600080fd5b60008060408385031215612d5c57600080fd5b8235612d6781612b35565b91506020830135612d1b81612b35565b600080600060608486031215612d8c57600080fd5b8335612d9781612b35565b92506020840135612da781612b35565b929592945050506040919091013590565b600081518084526020808501945080840160005b83811015612df15781516001600160a01b031687529582019590820190600101612dcc565b509495945050505050565b600081518084526020808501945080840160005b83811015612df157815187529582019590820190600101612e10565b604081526000612e3f6040830185612db8565b8281036020840152612e518185612dfc565b95945050505050565b600067ffffffffffffffff821115612e7457612e74612b90565b5060051b60200190565b600082601f830112612e8f57600080fd5b81356020612ea4612e9f83612e5a565b612bcf565b82815260059290921b84018101918181019086841115612ec357600080fd5b8286015b84811015612ee7578035612eda81612b35565b8352918301918301612ec7565b509695505050505050565b600082601f830112612f0357600080fd5b81356020612f13612e9f83612e5a565b82815260059290921b84018101918181019086841115612f3257600080fd5b8286015b84811015612ee75780358352918301918301612f36565b600060408284031215612f5f57600080fd5b6040516040810181811067ffffffffffffffff82111715612f8257612f82612b90565b6040529050808235612f9381612b35565b815260208301356bffffffffffffffffffffffff81168114612fb457600080fd5b6020919091015292915050565b803563ffffffff81168114612b8b57600080fd5b600060208284031215612fe757600080fd5b813567ffffffffffffffff80821115612fff57600080fd5b9083019060e0828603121561301357600080fd5b61301b612ba6565b82358281111561302a57600080fd5b61303687828601612e7e565b82525060208301358281111561304b57600080fd5b61305787828601612ef2565b60208301525061306960408401612b80565b604082015261307b8660608501612f4d565b606082015261308c60a08401612fc1565b608082015261309d60c08401612b80565b60a082015295945050505050565b60008083601f8401126130bd57600080fd5b50813567ffffffffffffffff8111156130d557600080fd5b6020830191508360208260051b85010111156125fa57600080fd5b6000806020838503121561310357600080fd5b823567ffffffffffffffff81111561311a57600080fd5b613126858286016130ab565b90969095509350505050565b6000806000806080858703121561314857600080fd5b843561315381612b35565b9350602085013561316381612b35565b9250604085013561317381612b35565b9396929550929360600135925050565b6000806000806080858703121561319957600080fd5b84356131a481612b35565b935060208501356131b481612b35565b92506040850135915060608501356131cb81612b35565b939692955090935050565b600080604083850312156131e957600080fd5b82356131f481612b35565b946020939093013593505050565b6000806000806040858703121561321857600080fd5b843567ffffffffffffffff8082111561323057600080fd5b61323c888389016130ab565b9096509450602087013591508082111561325557600080fd5b50613262878288016130ab565b95989497509550505050565b60006020828403121561328057600080fd5b8151611ea781612b35565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156132e757600080fd5b8151611ea781612cdf565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526044908201527f53747261746567794d616e616765722e6f6e6c7953747261746567795768697460408201527f656c69737465723a206e6f742074686520737472617465677957686974656c6960608201526339ba32b960e11b608082015260a00190565b602080825260409082018190527f53747261746567794d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60e08152600061342b60e0830189612db8565b828103602084015261343d8189612dfc565b6001600160a01b0397881660408501528651881660608501526020909601516bffffffffffffffffffffffff166080840152505063ffffffff9290921660a083015290921660c09092019190915292915050565b6000602082840312156134a357600080fd5b8135611ea781612cdf565b60005b838110156134c95781810151838201526020016134b1565b83811115610c4d5750506000910152565b600081518084526134f28160208601602086016134ae565b601f01601f19169290920160200192915050565b8281526040602082015260006129c360408301846134da565b60006020828403121561353157600080fd5b81516001600160e01b031981168114611ea757600080fd5b60006020828403121561355b57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561358b5761358b613562565b500190565b6000828210156135a2576135a2613562565b500390565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b600082516135e58184602087016134ae565b9190910192915050565b602081526000611ea760208301846134da56fea2646970667358221220a9321ba6a17c119069bd734db22816aec78c1855a712690d703374d58cd4f96764736f6c634300080c0033","storage":{"0x0":"0xff"}},"0xb7f8bc63bbcad18155201308c8f3540b07f84f5e":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b50600436106103785760003560e01c806360d7faed116101d3578063b7f06ebe11610104578063cf80873e116100a2578063f16172b01161007c578063f16172b01461097d578063f2fde38b14610990578063f698da25146109a3578063fabc1cbc146109ab57600080fd5b8063cf80873e14610936578063da8be86414610957578063eea9064b1461096a57600080fd5b8063c488375a116100de578063c488375a14610853578063c5e480db14610873578063c94b511114610919578063ca661c041461092c57600080fd5b8063b7f06ebe146107f9578063bb45fef21461081c578063c448feb81461084a57600080fd5b8063886f1195116101715780639104c3191161014b5780639104c3191461078457806399be81c81461079f578063a1788484146107b2578063b1344271146107d257600080fd5b8063886f1195146107405780638da5cb5b14610753578063900413471461076457600080fd5b80636d70f7ae116101ad5780636d70f7ae146106e7578063715018a6146106fa578063778e55f3146107025780637f5480711461072d57600080fd5b806360d7faed14610698578063635bbd10146106ab57806365da1264146106be57600080fd5b806329c77d4f116102ad5780634fc40b611161024b5780635ac86ab7116102255780635ac86ab71461062e5780635c975abb146106515780635cfe8d2c146106595780635f966f141461066c57600080fd5b80634fc40b6114610609578063595c6a6714610613578063597b36da1461061b57600080fd5b80633cdeb5e0116102875780633cdeb5e0146105695780633e28391d1461059857806343377382146105bb5780634665bcda146105e257600080fd5b806329c77d4f146104f7578063334043961461051757806339b70e381461052a57600080fd5b8063136439dd1161031a5780631bbce091116102f45780631bbce0911461049757806320606b70146104aa57806322bf40e4146104d157806328a573ae146104e457600080fd5b8063136439dd146104385780631522bf021461044b578063169283651461045e57600080fd5b80630dd8dd02116103565780630dd8dd02146103dd5780630f589e59146103fd57806310d67a2f14610412578063132d49671461042557600080fd5b80630449ca391461037d57806304a4f979146103a35780630b9f487a146103ca575b600080fd5b61039061038b366004614adb565b6109be565b6040519081526020015b60405180910390f35b6103907f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b6103906103d8366004614b41565b610a43565b6103f06103eb366004614adb565b610b05565b60405161039a9190614b9c565b61041061040b366004614c39565b610e6e565b005b610410610420366004614c8c565b610fbe565b610410610433366004614cb0565b611071565b610410610446366004614cf1565b611128565b610410610459366004614d0a565b611267565b61039061046c366004614c8c565b6001600160a01b0316600090815260996020526040902060010154600160a01b900463ffffffff1690565b6103906104a5366004614cb0565b61127b565b6103907f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6104106104df366004614d75565b6112a9565b6104106104f2366004614cb0565b6113ed565b610390610505366004614c8c565b609b6020526000908152604090205481565b610410610525366004614e1c565b61149d565b6105517f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b6040516001600160a01b03909116815260200161039a565b610551610577366004614c8c565b6001600160a01b039081166000908152609960205260409020600101541690565b6105ab6105a6366004614c8c565b6115da565b604051901515815260200161039a565b6103907f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b81565b6105517f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c85381565b6103906213c68081565b6104106115fa565b61039061062936600461513b565b6116c1565b6105ab61063c366004615177565b606654600160ff9092169190911b9081161490565b606654610390565b6104106106673660046151ed565b6116f1565b61055161067a366004614c8c565b6001600160a01b039081166000908152609960205260409020541690565b6104106106a636600461534d565b61199c565b6104106106b9366004614cf1565b611a37565b6105516106cc366004614c8c565b609a602052600090815260409020546001600160a01b031681565b6105ab6106f5366004614c8c565b611a48565b610410611a68565b6103906107103660046153dc565b609860209081526000928352604080842090915290825290205481565b61041061073b3660046154bd565b611a7c565b606554610551906001600160a01b031681565b6033546001600160a01b0316610551565b61077761077236600461554d565b611b81565b60405161039a91906155d7565b61055173beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6104106107ad3660046155ea565b611c5b565b6103906107c0366004614c8c565b609f6020526000908152604090205481565b6105517f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b6105ab610807366004614cf1565b609e6020526000908152604090205460ff1681565b6105ab61082a36600461561f565b609c60209081526000928352604080842090915290825290205460ff1681565b610390609d5481565b610390610861366004614c8c565b60a16020526000908152604090205481565b6108e3610881366004614c8c565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03948516815260998352839020835191820184528054851682526001015493841691810191909152600160a01b90920463ffffffff169082015290565b6040805182516001600160a01b039081168252602080850151909116908201529181015163ffffffff169082015260600161039a565b61039061092736600461564b565b611d2d565b61039062034bc081565b610949610944366004614c8c565b611de6565b60405161039a9291906156cc565b6103f0610965366004614c8c565b61219e565b6104106109783660046156f1565b612662565b61041061098b366004615749565b61266e565b61041061099e366004614c8c565b6126ff565b610390612775565b6104106109b9366004614cf1565b6127b3565b609d54600090815b83811015610a3b57600060a160008787858181106109e6576109e6615765565b90506020020160208101906109fb9190614c8c565b6001600160a01b03166001600160a01b0316815260200190815260200160002054905082811115610a2a578092505b50610a3481615791565b90506109c6565b509392505050565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad6020808301919091526001600160a01b038681168385015288811660608401528716608083015260a0820185905260c08083018590528351808403909101815260e0909201909252805191012060009081610ac1612775565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f19018152919052805160209091012098975050505050505050565b60665460609060019060029081161415610b3a5760405162461bcd60e51b8152600401610b31906157ac565b60405180910390fd5b6000836001600160401b03811115610b5457610b54614ebe565b604051908082528060200260200182016040528015610b7d578160200160208202803683370190505b50336000908152609a60205260408120549192506001600160a01b03909116905b85811015610e6357868682818110610bb857610bb8615765565b9050602002810190610bca91906157e3565b610bd8906020810190615803565b9050878783818110610bec57610bec615765565b9050602002810190610bfe91906157e3565b610c089080615803565b905014610c7d5760405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608401610b31565b33878783818110610c9057610c90615765565b9050602002810190610ca291906157e3565b610cb3906060810190604001614c8c565b6001600160a01b031614610d2f5760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a2077697468647261776572206d757374206265207374616b6572000000006064820152608401610b31565b610e343383898985818110610d4657610d46615765565b9050602002810190610d5891906157e3565b610d69906060810190604001614c8c565b8a8a86818110610d7b57610d7b615765565b9050602002810190610d8d91906157e3565b610d979080615803565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508e92508d9150889050818110610ddd57610ddd615765565b9050602002810190610def91906157e3565b610dfd906020810190615803565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061290f92505050565b838281518110610e4657610e46615765565b602090810291909101015280610e5b81615791565b915050610b9e565b509095945050505050565b336000908152609960205260409020546001600160a01b031615610f085760405162461bcd60e51b815260206004820152604560248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a206f70657261746f722068617320616c72656164792072656769736064820152641d195c995960da1b608482015260a401610b31565b610f123384612ecf565b604080518082019091526060815260006020820152610f34338083600061316b565b336001600160a01b03167f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e285604051610f6d919061584c565b60405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610fb092919061589e565b60405180910390a250505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611011573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103591906158cd565b6001600160a01b0316336001600160a01b0316146110655760405162461bcd60e51b8152600401610b31906158ea565b61106e81613510565b50565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91614806110d05750336001600160a01b037f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c85316145b6110ec5760405162461bcd60e51b8152600401610b3190615934565b6110f5836115da565b15611123576001600160a01b038084166000908152609a60205260409020541661112181858585613607565b505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015611170573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111949190615991565b6111b05760405162461bcd60e51b8152600401610b31906159ae565b606654818116146112295760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610b31565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b61126f613682565b611121848484846136dc565b6001600160a01b0383166000908152609b60205260408120546112a085828686611d2d565b95945050505050565b600054610100900460ff16158080156112c95750600054600160ff909116105b806112e35750303b1580156112e3575060005460ff166001145b6113465760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610b31565b6000805460ff191660011790558015611369576000805461ff0019166101001790555b6113738888613902565b61137b6139e8565b60975561138789613a7f565b61139086613ad1565b61139c858585856136dc565b80156113e2576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c916148061144c5750336001600160a01b037f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c85316145b6114685760405162461bcd60e51b8152600401610b3190615934565b611471836115da565b15611123576001600160a01b038084166000908152609a60205260409020541661112181858585613bcb565b606654600290600490811614156114c65760405162461bcd60e51b8152600401610b31906157ac565b600260c95414156115195760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b31565b600260c95560005b888110156115c9576115b98a8a8381811061153e5761153e615765565b905060200281019061155091906159f6565b89898481811061156257611562615765565b90506020028101906115749190615803565b89898681811061158657611586615765565b9050602002013588888781811061159f5761159f615765565b90506020020160208101906115b49190615a0c565b613c46565b6115c281615791565b9050611521565b5050600160c9555050505050505050565b6001600160a01b039081166000908152609a602052604090205416151590565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015611642573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116669190615991565b6116825760405162461bcd60e51b8152600401610b31906159ae565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000816040516020016116d49190615a9d565b604051602081830303815290604052805190602001209050919050565b60005b815181101561199857600082828151811061171157611711615765565b602002602001015190506000807f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663cd293f6f846040518263ffffffff1660e01b815260040161176a9190615ab0565b60408051808303816000875af1158015611788573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ac9190615b5c565b91509150811561198a576040808401516001600160a01b0381166000908152609f602052918220805491928291906117e383615791565b919050555060006040518060e00160405280846001600160a01b031681526020018760a001516001600160a01b031681526020018760600151600001516001600160a01b03168152602001838152602001876080015163ffffffff16815260200187600001518152602001876020015181525090506000611863826116c1565b6000818152609e602052604090205490915060ff16156118f95760405162461bcd60e51b815260206004820152604560248201527f44656c65676174696f6e4d616e616765722e6d6967726174655175657565645760448201527f69746864726177616c733a207769746864726177616c20616c72656164792065606482015264786973747360d81b608482015260a401610b31565b6000818152609e602052604090819020805460ff19166001179055517f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f9906119449083908590615b8a565b60405180910390a160408051868152602081018390527fdc00758b65eef71dc3780c04ebe36cab6bdb266c3a698187e29e0f0dca012630910160405180910390a1505050505b8360010193505050506116f4565b5050565b606654600290600490811614156119c55760405162461bcd60e51b8152600401610b31906157ac565b600260c9541415611a185760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b31565b600260c955611a2a8686868686613c46565b5050600160c95550505050565b611a3f613682565b61106e81613ad1565b6001600160a01b0390811660009081526099602052604090205416151590565b611a70613682565b611a7a6000613a7f565b565b4283602001511015611b005760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a401610b31565b6000609b6000876001600160a01b03166001600160a01b031681526020019081526020016000205490506000611b3c8783888860200151611d2d565b6001600160a01b0388166000908152609b602052604090206001840190558551909150611b6c9088908390614430565b611b788787868661316b565b50505050505050565b6060600082516001600160401b03811115611b9e57611b9e614ebe565b604051908082528060200260200182016040528015611bc7578160200160208202803683370190505b50905060005b8351811015610a3b576001600160a01b03851660009081526098602052604081208551909190869084908110611c0557611c05615765565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110611c4057611c40615765565b6020908102919091010152611c5481615791565b9050611bcd565b611c6433611a48565b611ce65760405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a401610b31565b336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051611d2192919061589e565b60405180910390a25050565b604080517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b6020808301919091526001600160a01b0387811683850152851660608301526080820186905260a08083018590528351808403909101815260c0909201909252805191012060009081611da3612775565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b6040516360f4062b60e01b81526001600160a01b03828116600483015260609182916000917f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c853909116906360f4062b90602401602060405180830381865afa158015611e56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7a9190615ba3565b6040516394f649dd60e01b81526001600160a01b03868116600483015291925060009182917f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9909116906394f649dd90602401600060405180830381865afa158015611eea573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f129190810190615c17565b9150915060008313611f2957909590945092505050565b606080835160001415611fe3576040805160018082528183019092529060208083019080368337505060408051600180825281830190925292945090506020808301908036833701905050905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082600081518110611f9e57611f9e615765565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600081518110611fd257611fd2615765565b602002602001018181525050612191565b8351611ff0906001615cd1565b6001600160401b0381111561200757612007614ebe565b604051908082528060200260200182016040528015612030578160200160208202803683370190505b50915081516001600160401b0381111561204c5761204c614ebe565b604051908082528060200260200182016040528015612075578160200160208202803683370190505b50905060005b845181101561210f5784818151811061209657612096615765565b60200260200101518382815181106120b0576120b0615765565b60200260200101906001600160a01b031690816001600160a01b0316815250508381815181106120e2576120e2615765565b60200260200101518282815181106120fc576120fc615765565b602090810291909101015260010161207b565b5073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082600184516121349190615ce9565b8151811061214457612144615765565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600184516121749190615ce9565b8151811061218457612184615765565b6020026020010181815250505b9097909650945050505050565b606654606090600190600290811614156121ca5760405162461bcd60e51b8152600401610b31906157ac565b6121d3836115da565b6122535760405162461bcd60e51b8152602060048201526044602482018190527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a207374908201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b608482015260a401610b31565b61225c83611a48565b156122cf5760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608401610b31565b6001600160a01b03831661234b5760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608401610b31565b6001600160a01b038084166000818152609a60205260409020549091169033148061237e5750336001600160a01b038216145b806123a557506001600160a01b038181166000908152609960205260409020600101541633145b6124175760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608401610b31565b60008061242386611de6565b9092509050336001600160a01b0387161461247957826001600160a01b0316866001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a35b826001600160a01b0316866001600160a01b03167ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467660405160405180910390a36001600160a01b0386166000908152609a6020526040902080546001600160a01b031916905581516124fb576040805160008152602081019091529450612659565b81516001600160401b0381111561251457612514614ebe565b60405190808252806020026020018201604052801561253d578160200160208202803683370190505b50945060005b8251811015612657576040805160018082528183019092526000916020808301908036833750506040805160018082528183019092529293506000929150602080830190803683370190505090508483815181106125a3576125a3615765565b6020026020010151826000815181106125be576125be615765565b60200260200101906001600160a01b031690816001600160a01b0316815250508383815181106125f0576125f0615765565b60200260200101518160008151811061260b5761260b615765565b60200260200101818152505061262489878b858561290f565b88848151811061263657612636615765565b6020026020010181815250505050808061264f90615791565b915050612543565b505b50505050919050565b6111233384848461316b565b61267733611a48565b6126f55760405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a401610b31565b61106e3382612ecf565b612707613682565b6001600160a01b03811661276c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b31565b61106e81613a7f565b60007f0000000000000000000000000000000000000000000000000000000000007a694614156127a6575060975490565b6127ae6139e8565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612806573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282a91906158cd565b6001600160a01b0316336001600160a01b03161461285a5760405162461bcd60e51b8152600401610b31906158ea565b6066541981196066541916146128d85760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610b31565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161125c565b60006001600160a01b0386166129a65760405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a401610b31565b8251612a305760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374726174656769657320636160648201526c6e6e6f7420626520656d70747960981b608482015260a401610b31565b60005b8351811015612ddd576001600160a01b03861615612a8957612a898688868481518110612a6257612a62615765565b6020026020010151868581518110612a7c57612a7c615765565b6020026020010151613607565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b0316848281518110612ab957612ab9615765565b60200260200101516001600160a01b03161415612b82577f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c8536001600160a01b031663beffbb8988858481518110612b1257612b12615765565b60200260200101516040518363ffffffff1660e01b8152600401612b4b9291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015612b6557600080fd5b505af1158015612b79573d6000803e3d6000fd5b50505050612dd5565b846001600160a01b0316876001600160a01b03161480612c5457507f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639b4da03d858381518110612bde57612bde615765565b60200260200101516040518263ffffffff1660e01b8152600401612c1191906001600160a01b0391909116815260200190565b602060405180830381865afa158015612c2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c529190615991565b155b612d205760405162461bcd60e51b8152602060048201526084602482018190527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448301527f6e6451756575655769746864726177616c3a2077697468647261776572206d7560648301527f73742062652073616d652061646472657373206173207374616b657220696620908201527f746869726450617274795472616e7366657273466f7262696464656e2061726560a482015263081cd95d60e21b60c482015260e401610b31565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316638c80d4e588868481518110612d6257612d62615765565b6020026020010151868581518110612d7c57612d7c615765565b60200260200101516040518463ffffffff1660e01b8152600401612da293929190615d00565b600060405180830381600087803b158015612dbc57600080fd5b505af1158015612dd0573d6000803e3d6000fd5b505050505b600101612a33565b506001600160a01b0386166000908152609f60205260408120805491829190612e0583615791565b919050555060006040518060e00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018381526020014363ffffffff1681526020018681526020018581525090506000612e6d826116c1565b6000818152609e602052604090819020805460ff19166001179055519091507f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f990612ebb9083908590615b8a565b60405180910390a198975050505050505050565b6000612ede6020830183614c8c565b6001600160a01b03161415612f785760405162461bcd60e51b815260206004820152605460248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a2063616e6e6f742073657420606561726e696e677352656365696064820152737665726020746f207a65726f206164647265737360601b608482015260a401610b31565b6213c680612f8c6060830160408401615d24565b63ffffffff1611156130415760405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c401610b31565b6001600160a01b0382166000908152609960205260409081902060010154600160a01b900463ffffffff169061307d9060608401908401615d24565b63ffffffff1610156131135760405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a401610b31565b6001600160a01b038216600090815260996020526040902081906131378282615d61565b505060405133907ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac90611d2190849061584c565b606654600090600190811614156131945760405162461bcd60e51b8152600401610b31906157ac565b61319d856115da565b1561321a5760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2073746160448201527f6b657220697320616c7265616479206163746976656c792064656c65676174656064820152601960fa1b608482015260a401610b31565b61322384611a48565b6132a35760405162461bcd60e51b815260206004820152604560248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a206f706560448201527f7261746f72206973206e6f74207265676973746572656420696e20456967656e6064820152642630bcb2b960d91b608482015260a401610b31565b6001600160a01b038085166000908152609960205260409020600101541680158015906132d95750336001600160a01b03821614155b80156132ee5750336001600160a01b03861614155b1561345b57428460200151101561336d5760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608401610b31565b6001600160a01b0381166000908152609c6020908152604080832086845290915290205460ff16156134075760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608401610b31565b6001600160a01b0381166000908152609c6020908152604080832086845282528220805460ff19166001179055850151613448908890889085908890610a43565b905061345982828760000151614430565b505b6001600160a01b038681166000818152609a602052604080822080546001600160a01b031916948a169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a36000806134ba88611de6565b9150915060005b82518110156113e257613508888a8584815181106134e1576134e1615765565b60200260200101518585815181106134fb576134fb615765565b6020026020010151613bcb565b6001016134c1565b6001600160a01b03811661359e5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610b31565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0380851660009081526098602090815260408083209386168352929052908120805483929061363e908490615ce9565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610fb093929190615d00565b6033546001600160a01b03163314611a7a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b31565b8281146137645760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a20696e707574206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610b31565b8260005b818110156138fa57600086868381811061378457613784615765565b90506020020160208101906137999190614c8c565b6001600160a01b038116600090815260a160205260408120549192508686858181106137c7576137c7615765565b90506020020135905062034bc081111561388b5760405162461bcd60e51b815260206004820152607360248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a205f7769746864726177616c60648201527f44656c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544860848201527244524157414c5f44454c41595f424c4f434b5360681b60a482015260c401610b31565b6001600160a01b038316600081815260a160209081526040918290208490558151928352820184905281018290527f0e7efa738e8b0ce6376a0c1af471655540d2e9a81647d7b09ed823018426576d9060600160405180910390a1505050806138f390615791565b9050613768565b505050505050565b6065546001600160a01b031615801561392357506001600160a01b03821615155b6139a55760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610b31565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261199882613510565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62034bc0811115613b8a5760405162461bcd60e51b815260206004820152607160248201527f44656c65676174696f6e4d616e616765722e5f7365744d696e5769746864726160448201527f77616c44656c6179426c6f636b733a205f6d696e5769746864726177616c446560648201527f6c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544844526084820152704157414c5f44454c41595f424c4f434b5360781b60a482015260c401610b31565b609d5460408051918252602082018390527fafa003cd76f87ff9d62b35beea889920f33c0c42b8d45b74954d61d50f4b6b69910160405180910390a1609d55565b6001600160a01b03808516600090815260986020908152604080832093861683529290529081208054839290613c02908490615cd1565b92505081905550836001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c848484604051610fb093929190615d00565b6000613c5461062987615dc4565b6000818152609e602052604090205490915060ff16613cd55760405162461bcd60e51b81526020600482015260436024820152600080516020615efc83398151915260448201527f645769746864726177616c3a20616374696f6e206973206e6f7420696e20717560648201526265756560e81b608482015260a401610b31565b609d544390613cea60a0890160808a01615d24565b63ffffffff16613cfa9190615cd1565b1115613d825760405162461bcd60e51b815260206004820152605f6024820152600080516020615efc83398151915260448201527f645769746864726177616c3a206d696e5769746864726177616c44656c61794260648201527f6c6f636b7320706572696f6420686173206e6f74207965742070617373656400608482015260a401610b31565b613d926060870160408801614c8c565b6001600160a01b0316336001600160a01b031614613e1f5760405162461bcd60e51b81526020600482015260506024820152600080516020615efc83398151915260448201527f645769746864726177616c3a206f6e6c7920776974686472617765722063616e60648201526f1031b7b6b83632ba329030b1ba34b7b760811b608482015260a401610b31565b8115613ea157613e3260a0870187615803565b85149050613ea15760405162461bcd60e51b81526020600482015260426024820152600080516020615efc83398151915260448201527f645769746864726177616c3a20696e707574206c656e677468206d69736d61746064820152610c6d60f31b608482015260a401610b31565b6000818152609e60205260409020805460ff1916905581156140065760005b613ecd60a0880188615803565b9050811015614000574360a16000613ee860a08b018b615803565b85818110613ef857613ef8615765565b9050602002016020810190613f0d9190614c8c565b6001600160a01b03168152602081019190915260400160002054613f3760a08a0160808b01615d24565b63ffffffff16613f479190615cd1565b1115613f655760405162461bcd60e51b8152600401610b3190615dd6565b613ff8613f756020890189614c8c565b33613f8360a08b018b615803565b85818110613f9357613f93615765565b9050602002016020810190613fa89190614c8c565b613fb560c08c018c615803565b86818110613fc557613fc5615765565b905060200201358a8a87818110613fde57613fde615765565b9050602002016020810190613ff39190614c8c565b6145ea565b600101613ec0565b506143f5565b336000908152609a60205260408120546001600160a01b0316905b61402e60a0890189615803565b90508110156143f2574360a1600061404960a08c018c615803565b8581811061405957614059615765565b905060200201602081019061406e9190614c8c565b6001600160a01b0316815260208101919091526040016000205461409860a08b0160808c01615d24565b63ffffffff166140a89190615cd1565b11156140c65760405162461bcd60e51b8152600401610b3190615dd6565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06140e860a08a018a615803565b838181106140f8576140f8615765565b905060200201602081019061410d9190614c8c565b6001600160a01b0316141561425d57600061412b60208a018a614c8c565b905060006001600160a01b037f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c85316630e81073c8361416c60c08e018e615803565b8781811061417c5761417c615765565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044016020604051808303816000875af11580156141d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141f49190615ba3565b6001600160a01b038084166000908152609a602052604090205491925016801561425557614255818461422a60a08f018f615803565b8881811061423a5761423a615765565b905060200201602081019061424f9190614c8c565b85613bcb565b5050506143ea565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663c4623ea13389898581811061429f5761429f615765565b90506020020160208101906142b49190614c8c565b6142c160a08d018d615803565b868181106142d1576142d1615765565b90506020020160208101906142e69190614c8c565b6142f360c08e018e615803565b8781811061430357614303615765565b60405160e088901b6001600160e01b03191681526001600160a01b03968716600482015294861660248601529290941660448401526020909102013560648201526084019050600060405180830381600087803b15801561436357600080fd5b505af1158015614377573d6000803e3d6000fd5b505050506001600160a01b038216156143ea576143ea823361439c60a08c018c615803565b858181106143ac576143ac615765565b90506020020160208101906143c19190614c8c565b6143ce60c08d018d615803565b868181106143de576143de615765565b90506020020135613bcb565b600101614021565b50505b6040518181527fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d9060200160405180910390a1505050505050565b6001600160a01b0383163b1561454a57604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906144709086908690600401615e5e565b602060405180830381865afa15801561448d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144b19190615ebb565b6001600160e01b031916146111235760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610b31565b826001600160a01b031661455e838361472a565b6001600160a01b0316146111235760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610b31565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014156146955760405162387b1360e81b81526001600160a01b037f000000000000000000000000a513e6e4b8f2a923d98304ec87f64353c4d5c853169063387b13009061465e90889088908790600401615d00565b600060405180830381600087803b15801561467857600080fd5b505af115801561468c573d6000803e3d6000fd5b50505050614723565b60405163c608c7f360e01b81526001600160a01b03858116600483015284811660248301526044820184905282811660648301527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9169063c608c7f390608401600060405180830381600087803b15801561470f57600080fd5b505af11580156113e2573d6000803e3d6000fd5b5050505050565b60008060006147398585614746565b91509150610a3b816147b6565b60008082516041141561477d5760208301516040840151606085015160001a61477187828585614971565b945094505050506147af565b8251604014156147a7576020830151604084015161479c868383614a5e565b9350935050506147af565b506000905060025b9250929050565b60008160048111156147ca576147ca615ee5565b14156147d35750565b60018160048111156147e7576147e7615ee5565b14156148355760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610b31565b600281600481111561484957614849615ee5565b14156148975760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610b31565b60038160048111156148ab576148ab615ee5565b14156149045760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610b31565b600481600481111561491857614918615ee5565b141561106e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610b31565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156149a85750600090506003614a55565b8460ff16601b141580156149c057508460ff16601c14155b156149d15750600090506004614a55565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614a25573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116614a4e57600060019250925050614a55565b9150600090505b94509492505050565b6000806001600160ff1b03831681614a7b60ff86901c601b615cd1565b9050614a8987828885614971565b935093505050935093915050565b60008083601f840112614aa957600080fd5b5081356001600160401b03811115614ac057600080fd5b6020830191508360208260051b85010111156147af57600080fd5b60008060208385031215614aee57600080fd5b82356001600160401b03811115614b0457600080fd5b614b1085828601614a97565b90969095509350505050565b6001600160a01b038116811461106e57600080fd5b8035614b3c81614b1c565b919050565b600080600080600060a08688031215614b5957600080fd5b8535614b6481614b1c565b94506020860135614b7481614b1c565b93506040860135614b8481614b1c565b94979396509394606081013594506080013592915050565b6020808252825182820181905260009190848201906040850190845b81811015614bd457835183529284019291840191600101614bb8565b50909695505050505050565b600060608284031215614bf257600080fd5b50919050565b60008083601f840112614c0a57600080fd5b5081356001600160401b03811115614c2157600080fd5b6020830191508360208285010111156147af57600080fd5b600080600060808486031215614c4e57600080fd5b614c588585614be0565b925060608401356001600160401b03811115614c7357600080fd5b614c7f86828701614bf8565b9497909650939450505050565b600060208284031215614c9e57600080fd5b8135614ca981614b1c565b9392505050565b600080600060608486031215614cc557600080fd5b8335614cd081614b1c565b92506020840135614ce081614b1c565b929592945050506040919091013590565b600060208284031215614d0357600080fd5b5035919050565b60008060008060408587031215614d2057600080fd5b84356001600160401b0380821115614d3757600080fd5b614d4388838901614a97565b90965094506020870135915080821115614d5c57600080fd5b50614d6987828801614a97565b95989497509550505050565b60008060008060008060008060c0898b031215614d9157600080fd5b8835614d9c81614b1c565b97506020890135614dac81614b1c565b9650604089013595506060890135945060808901356001600160401b0380821115614dd657600080fd5b614de28c838d01614a97565b909650945060a08b0135915080821115614dfb57600080fd5b50614e088b828c01614a97565b999c989b5096995094979396929594505050565b6000806000806000806000806080898b031215614e3857600080fd5b88356001600160401b0380821115614e4f57600080fd5b614e5b8c838d01614a97565b909a50985060208b0135915080821115614e7457600080fd5b614e808c838d01614a97565b909850965060408b0135915080821115614e9957600080fd5b614ea58c838d01614a97565b909650945060608b0135915080821115614dfb57600080fd5b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715614ef657614ef6614ebe565b60405290565b604080519081016001600160401b0381118282101715614ef657614ef6614ebe565b60405160c081016001600160401b0381118282101715614ef657614ef6614ebe565b604051601f8201601f191681016001600160401b0381118282101715614f6857614f68614ebe565b604052919050565b63ffffffff8116811461106e57600080fd5b8035614b3c81614f70565b60006001600160401b03821115614fa657614fa6614ebe565b5060051b60200190565b600082601f830112614fc157600080fd5b81356020614fd6614fd183614f8d565b614f40565b82815260059290921b84018101918181019086841115614ff557600080fd5b8286015b8481101561501957803561500c81614b1c565b8352918301918301614ff9565b509695505050505050565b600082601f83011261503557600080fd5b81356020615045614fd183614f8d565b82815260059290921b8401810191818101908684111561506457600080fd5b8286015b848110156150195780358352918301918301615068565b600060e0828403121561509157600080fd5b615099614ed4565b90506150a482614b31565b81526150b260208301614b31565b60208201526150c360408301614b31565b6040820152606082013560608201526150de60808301614f82565b608082015260a08201356001600160401b03808211156150fd57600080fd5b61510985838601614fb0565b60a084015260c084013591508082111561512257600080fd5b5061512f84828501615024565b60c08301525092915050565b60006020828403121561514d57600080fd5b81356001600160401b0381111561516357600080fd5b61516f8482850161507f565b949350505050565b60006020828403121561518957600080fd5b813560ff81168114614ca957600080fd5b6000604082840312156151ac57600080fd5b6151b4614efc565b905081356151c181614b1c565b815260208201356bffffffffffffffffffffffff811681146151e257600080fd5b602082015292915050565b6000602080838503121561520057600080fd5b82356001600160401b038082111561521757600080fd5b818501915085601f83011261522b57600080fd5b8135615239614fd182614f8d565b81815260059190911b8301840190848101908883111561525857600080fd5b8585015b83811015615332578035858111156152745760008081fd5b860160e0818c03601f190181131561528c5760008081fd5b615294614f1e565b89830135888111156152a65760008081fd5b6152b48e8c83870101614fb0565b825250604080840135898111156152cb5760008081fd5b6152d98f8d83880101615024565b8c8401525060606152eb818601614b31565b82840152608091506152ff8f83870161519a565b9083015261530f60c08501614f82565b9082015261531e838301614b31565b60a08201528552505091860191860161525c565b5098975050505050505050565b801515811461106e57600080fd5b60008060008060006080868803121561536557600080fd5b85356001600160401b038082111561537c57600080fd5b9087019060e0828a03121561539057600080fd5b909550602087013590808211156153a657600080fd5b506153b388828901614a97565b9095509350506040860135915060608601356153ce8161533f565b809150509295509295909350565b600080604083850312156153ef57600080fd5b82356153fa81614b1c565b9150602083013561540a81614b1c565b809150509250929050565b60006040828403121561542757600080fd5b61542f614efc565b905081356001600160401b038082111561544857600080fd5b818401915084601f83011261545c57600080fd5b813560208282111561547057615470614ebe565b615482601f8301601f19168201614f40565b9250818352868183860101111561549857600080fd5b8181850182850137600081838501015282855280860135818601525050505092915050565b600080600080600060a086880312156154d557600080fd5b85356154e081614b1c565b945060208601356154f081614b1c565b935060408601356001600160401b038082111561550c57600080fd5b61551889838a01615415565b9450606088013591508082111561552e57600080fd5b5061553b88828901615415565b95989497509295608001359392505050565b6000806040838503121561556057600080fd5b823561556b81614b1c565b915060208301356001600160401b0381111561558657600080fd5b61559285828601614fb0565b9150509250929050565b600081518084526020808501945080840160005b838110156155cc578151875295820195908201906001016155b0565b509495945050505050565b602081526000614ca9602083018461559c565b600080602083850312156155fd57600080fd5b82356001600160401b0381111561561357600080fd5b614b1085828601614bf8565b6000806040838503121561563257600080fd5b823561563d81614b1c565b946020939093013593505050565b6000806000806080858703121561566157600080fd5b843561566c81614b1c565b935060208501359250604085013561568381614b1c565b9396929550929360600135925050565b600081518084526020808501945080840160005b838110156155cc5781516001600160a01b0316875295820195908201906001016156a7565b6040815260006156df6040830185615693565b82810360208401526112a0818561559c565b60008060006060848603121561570657600080fd5b833561571181614b1c565b925060208401356001600160401b0381111561572c57600080fd5b61573886828701615415565b925050604084013590509250925092565b60006060828403121561575b57600080fd5b614ca98383614be0565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156157a5576157a561577b565b5060010190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b60008235605e198336030181126157f957600080fd5b9190910192915050565b6000808335601e1984360301811261581a57600080fd5b8301803591506001600160401b0382111561583457600080fd5b6020019150600581901b36038213156147af57600080fd5b60608101823561585b81614b1c565b6001600160a01b03908116835260208401359061587782614b1c565b166020830152604083013561588b81614f70565b63ffffffff811660408401525092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b6000602082840312156158df57600080fd5b8151614ca981614b1c565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60208082526037908201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60408201527f616e616765724f72456967656e506f644d616e61676572000000000000000000606082015260800190565b6000602082840312156159a357600080fd5b8151614ca98161533f565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000823560de198336030181126157f957600080fd5b600060208284031215615a1e57600080fd5b8135614ca98161533f565b600060018060a01b03808351168452806020840151166020850152806040840151166040850152506060820151606084015263ffffffff608083015116608084015260a082015160e060a0850152615a8460e0850182615693565b905060c083015184820360c08601526112a0828261559c565b602081526000614ca96020830184615a29565b602081526000825160e06020840152615acd610100840182615693565b90506020840151601f19848303016040850152615aea828261559c565b915050604084015160018060a01b03808216606086015260608601519150808251166080860152506bffffffffffffffffffffffff60208201511660a0850152506080840151615b4260c085018263ffffffff169052565b5060a08401516001600160a01b03811660e0850152610a3b565b60008060408385031215615b6f57600080fd5b8251615b7a8161533f565b6020939093015192949293505050565b82815260406020820152600061516f6040830184615a29565b600060208284031215615bb557600080fd5b5051919050565b600082601f830112615bcd57600080fd5b81516020615bdd614fd183614f8d565b82815260059290921b84018101918181019086841115615bfc57600080fd5b8286015b848110156150195780518352918301918301615c00565b60008060408385031215615c2a57600080fd5b82516001600160401b0380821115615c4157600080fd5b818501915085601f830112615c5557600080fd5b81516020615c65614fd183614f8d565b82815260059290921b84018101918181019089841115615c8457600080fd5b948201945b83861015615cab578551615c9c81614b1c565b82529482019490820190615c89565b91880151919650909350505080821115615cc457600080fd5b5061559285828601615bbc565b60008219821115615ce457615ce461577b565b500190565b600082821015615cfb57615cfb61577b565b500390565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060208284031215615d3657600080fd5b8135614ca981614f70565b80546001600160a01b0319166001600160a01b0392909216919091179055565b8135615d6c81614b1c565b615d768183615d41565b50600181016020830135615d8981614b1c565b615d938183615d41565b506040830135615da281614f70565b815463ffffffff60a01b191660a09190911b63ffffffff60a01b161790555050565b6000615dd0368361507f565b92915050565b6020808252606e90820152600080516020615efc83398151915260408201527f645769746864726177616c3a207769746864726177616c44656c6179426c6f6360608201527f6b7320706572696f6420686173206e6f74207965742070617373656420666f7260808201526d207468697320737472617465677960901b60a082015260c00190565b82815260006020604081840152835180604085015260005b81811015615e9257858101830151858201606001528201615e76565b81811115615ea4576000606083870101525b50601f01601f191692909201606001949350505050565b600060208284031215615ecd57600080fd5b81516001600160e01b031981168114614ca957600080fd5b634e487b7160e01b600052602160045260246000fdfe44656c65676174696f6e4d616e616765722e5f636f6d706c6574655175657565a2646970667358221220ffb5e101f50fc5f699cdea78c0c203cfab0ab248c3fc5db98d12b11d1eb9d13464736f6c634300080c0033","storage":{"0x0":"0xff"}},"0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122061dc9392cf6ba7869fe7bc6ba05d8409fb69605ae4794b23a59c97020514de6d64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x65":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x66":"0x0","0x97":"0x831f01b2aeb61d5d8c019704e62c25763057a8806c5c790bc8b4c99ee54ac8a7","0x9d":"0x1","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xb7f8bc63bbcad18155201308c8f3540b07f84f5e","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9":{"nonce":1,"balance":"0x0","code":"0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122061dc9392cf6ba7869fe7bc6ba05d8409fb69605ae4794b23a59c97020514de6d64736f6c634300080c0033","storage":{"0x0":"0x1","0x33":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x97":"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512","0x98":"0x0","0xc9":"0xd65ac9700cec4e530497617d02afdf0d5de3ed18466aca1578edcbce0d40ee16","0xcb":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc":"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0","0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103":"0x5fbdb2315678afecb367f032d93f642f64180aa3"}},"0xe7f1725e7734ce288f8367e1bb143e90bb3f0512":{"nonce":1,"balance":"0x0","code":"0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806346fbf68e146100515780638568520614610089578063ce5484281461009e578063eab66d7a146100b1575b600080fd5b61007461005f366004610313565b60006020819052908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61009c610097366004610335565b6100dc565b005b61009c6100ac366004610313565b61011d565b6001546100c4906001600160a01b031681565b6040516001600160a01b039091168152602001610080565b6001546001600160a01b0316331461010f5760405162461bcd60e51b815260040161010690610371565b60405180910390fd5b6101198282610153565b5050565b6001546001600160a01b031633146101475760405162461bcd60e51b815260040161010690610371565b61015081610220565b50565b6001600160a01b0382166101bf5760405162461bcd60e51b815260206004820152602d60248201527f50617573657252656769737472792e5f7365745061757365723a207a65726f2060448201526c1859191c995cdcc81a5b9c1d5d609a1b6064820152608401610106565b6001600160a01b03821660008181526020818152604091829020805460ff19168515159081179091558251938452908301527f65d3a1fd4c13f05cba164f80d03ce90fb4b5e21946bfc3ab7dbd434c2d0b9152910160405180910390a15050565b6001600160a01b03811661028e5760405162461bcd60e51b815260206004820152602f60248201527f50617573657252656769737472792e5f736574556e7061757365723a207a657260448201526e1bc81859191c995cdcc81a5b9c1d5d608a1b6064820152608401610106565b600154604080516001600160a01b03928316815291831660208301527f06b4167a2528887a1e97a366eefe8549bfbf1ea3e6ac81cb2564a934d20e8892910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b80356001600160a01b038116811461030e57600080fd5b919050565b60006020828403121561032557600080fd5b61032e826102f7565b9392505050565b6000806040838503121561034857600080fd5b610351836102f7565b91506020830135801515811461036657600080fd5b809150509250929050565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b60608201526080019056fea26469706673582212209d16b337e572efd6aa7c9a1f129223998361e2c66fd3f3315454d1a0590f6f0e64736f6c634300080c0033","storage":{"0x1":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","0x723077b8a1b173adc35e5f0e7e3662fd1208212cb629f9c128551ea7168da722":"0x1"}},"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266":{"nonce":26,"balance":"0x21e199a010e91875deb","code":"0x","storage":{}}}} \ No newline at end of file diff --git a/avs/utils/anvil/genesis.json b/avs/utils/anvil/genesis.json deleted file mode 100644 index 18afe5cb..00000000 --- a/avs/utils/anvil/genesis.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "nonce": "0x0", - "timestamp": "0x0", - "extraData": "0x5343", - "gasLimit": "0x1388", - "difficulty": "0x400000000", - "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "coinbase": "0x0000000000000000000000000000000000000000", - "alloc": { - "0xd143C405751162d0F96bEE2eB5eb9C61882a736E": { - "balance": "0x4a47e3c12448f4ad000000" - }, - "0x0165878a594ca255338adfa4d48449f69242eb8f": { - "nonce": 1, - "balance": "0x0", - "code": "0x60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106f1565b610118565b61005b61009336600461070c565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106f1565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b6060610285838360405180606001604052806027815260200161080b6027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb6104f7565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a48361051f565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a16101548161055f565b60606001600160a01b0384163b6104825760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610331565b600080856001600160a01b03168560405161049d91906107bb565b600060405180830381855af49150503d80600081146104d8576040519150601f19603f3d011682016040523d82523d6000602084013e6104dd565b606091505b50915091506104ed828286610608565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b61052881610641565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105c45760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60608315610617575081610285565b8251156106275782518084602001fd5b8160405162461bcd60e51b815260040161033191906107d7565b6001600160a01b0381163b6106ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105e7565b80356001600160a01b03811681146106ec57600080fd5b919050565b60006020828403121561070357600080fd5b610285826106d5565b60008060006040848603121561072157600080fd5b61072a846106d5565b9250602084013567ffffffffffffffff8082111561074757600080fd5b818601915086601f83011261075b57600080fd5b81358181111561076a57600080fd5b87602082850101111561077c57600080fd5b6020830194508093505050509250925092565b60005b838110156107aa578181015183820152602001610792565b838111156103c05750506000910152565b600082516107cd81846020870161078f565b9190910192915050565b60208152600082518060208401526107f681604085016020870161078f565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220bceca38d0e447b38e612e8ea5bb02b1e1fcac6609b19aa0fd3fd43aa4b97bf1b64736f6c634300080c0033", - "storage": { - "0x0": "0x1", - "0x33": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "0x65": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512", - "0x66": "0x1e", - "0x97": "0x0", - "0x9a": "0x0", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0xdcd1bf9a1b36ce34237eeafef220932846bcd82", - "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x5fbdb2315678afecb367f032d93f642f64180aa3" - } - } - }, - "number": "4", - "gasUsed": "0x0", - "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "config": { - "ethash": {}, - "chainId": 31337, - "homesteadBlock": 0, - "eip150Block": 0, - "eip155Block": 0, - "eip158Block": 0, - "byzantiumBlock": 0, - "constantinopleBlock": 0, - "petersburgBlock": 0, - "istanbulBlock": 0, - "berlinBlock": 0, - "londonBlock": 0, - "terminalTotalDifficulty": 0, - "terminalTotalDifficultyPassed": true, - "shanghaiTime": 0 - } -} diff --git a/avs/utils/anvil/start-anvil-chain-with-el-and-avs-deployed.sh b/avs/utils/anvil/start-anvil-chain-with-el-and-avs-deployed.sh index 1f4d7430..40644700 100755 --- a/avs/utils/anvil/start-anvil-chain-with-el-and-avs-deployed.sh +++ b/avs/utils/anvil/start-anvil-chain-with-el-and-avs-deployed.sh @@ -9,10 +9,6 @@ parent_path=$( ) cd "$parent_path" -set -a -source ./utils.sh -set +a - cleanup() { echo "Executing cleanup function..." set +e @@ -24,19 +20,21 @@ cleanup() { } trap 'cleanup $LINENO "$BASH_COMMAND"' EXIT -# start an anvil instance in the background that has eigenlayer contracts deployed -# we start anvil in the background so that we can run the below script -# anvil --load-state avs-and-eigenlayer-deployed-anvil-state.json & -# FIXME: bug in latest foundry version, so we use this pinned version instead of latest -start_anvil_docker $parent_path/avs-and-eigenlayer-deployed-anvil-state.json "" - -cd ../../contracts -# we need to restart the anvil chain at the correct block, otherwise the indexRegistry has a quorumUpdate at the block number -# at which it was deployed (aka quorum was created/updated), but when we start anvil by loading state file it starts at block number 0 -# so calling getOperatorListAtBlockNumber reverts because it thinks there are no quorums registered at block 0 -# advancing chain manually like this is a current hack until https://github.com/foundry-rs/foundry/issues/6679 is merged -cast rpc anvil_mine 100 --rpc-url $RPC_URL -echo "advancing chain... current block-number:" $(cast block-number) +set -e + +docker run --rm -d --name anvil -p 8545:8545 \ + --entrypoint anvil \ + --env ANVIL_IP_ADDR=0.0.0.0 \ + ghcr.io/foundry-rs/foundry:v1.0.0 + +echo "Waiting for Anvil to start..." +sleep 2 + +npm run deploy:eigen-core +echo "Deployed Eigen Core contracts" + +npm run deploy:reclaim-debug +echo "Deployed Reclaim contracts" # Bring Anvil back to the foreground docker attach anvil \ No newline at end of file diff --git a/avs/utils/anvil/utils.sh b/avs/utils/anvil/utils.sh deleted file mode 100644 index e6f1ddc8..00000000 --- a/avs/utils/anvil/utils.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash - -set -e -o nounset - -# pinning at old foundry commit because of https://github.com/foundry-rs/foundry/issues/7502 -FOUNDRY_IMAGE=ghcr.io/foundry-rs/foundry:nightly-5b7e4cb3c882b28f3c32ba580de27ce7381f415a - -parent_path=$( - cd "$(dirname "${BASH_SOURCE[0]}")" - pwd -P -) - -clean_up() { - # Check if the exit status is non-zero - exit_status=$? - if [ $exit_status -ne 0 ]; then - echo "Script exited due to set -e on line $1 with command '$2'. Exit status: $exit_status" - fi -} -# Use trap to call the clean_up function when the script exits -trap 'clean_up $LINENO "$BASH_COMMAND"' ERR - -# start_anvil_docker $LOAD_STATE_FILE $DUMP_STATE_FILE -start_anvil_docker() { - LOAD_STATE_FILE=$1 - DUMP_STATE_FILE=$2 - LOAD_STATE_VOLUME_DOCKER_ARG=$([[ -z $LOAD_STATE_FILE ]] && echo "" || echo "-v $LOAD_STATE_FILE:/load-state.json") - DUMP_STATE_VOLUME_DOCKER_ARG=$([[ -z $DUMP_STATE_FILE ]] && echo "" || echo "-v $DUMP_STATE_FILE:/dump-state.json") - LOAD_STATE_ANVIL_ARG=$([[ -z $LOAD_STATE_FILE ]] && echo "" || echo "--load-state /load-state.json") - DUMP_STATE_ANVIL_ARG=$([[ -z $DUMP_STATE_FILE ]] && echo "" || echo "--dump-state /dump-state.json") - - echo $LOAD_STATE_VOLUME_DOCKER_ARG $DUMP_STATE_VOLUME_DOCKER_ARG - echo $LOAD_STATE_ANVIL_ARG $DUMP_STATE_ANVIL_ARG - trap 'docker stop anvil' EXIT - docker run --rm -d --name anvil -p 8545:8545 $LOAD_STATE_VOLUME_DOCKER_ARG $DUMP_STATE_VOLUME_DOCKER_ARG \ - --entrypoint anvil \ - $FOUNDRY_IMAGE \ - $LOAD_STATE_ANVIL_ARG $DUMP_STATE_ANVIL_ARG --host 0.0.0.0 - sleep 2 -} \ No newline at end of file diff --git a/package.json b/package.json index d55b2277..ca234a50 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "whitelist:operator": "npm run run:tsc -- src/scripts/whitelist-operator.ts", "update:avs-metadata": "npm run run:tsc -- src/scripts/update-avs-metadata.ts", "generate:avs": "typechain -- --target ethers-v5 --out-dir src/avs/contracts avs/contracts/out/ReclaimServiceManager.sol/*.json", - "start:chain": "bash ./avs/utils/anvil/start-anvil-chain-with-el-and-avs-deployed.sh", + "start:chain": "sh ./avs/utils/anvil/start-anvil-chain-with-el-and-avs-deployed.sh", "commitlint": "commitlint --edit", "download:zk-files": "node node_modules/@reclaimprotocol/zk-symmetric-crypto/lib/scripts/download-files", "generate:toprf-keys": "npm run run:tsc -- src/scripts/generate-toprf-keys.ts" diff --git a/src/avs/config.ts b/src/avs/config.ts index cae44bea..1886cd8d 100644 --- a/src/avs/config.ts +++ b/src/avs/config.ts @@ -4,10 +4,10 @@ import { getEnvVariable } from 'src/utils/env' export const CHAIN_CONFIGS: { [key: string]: ChainConfig } = { '31337': { rpcUrl: 'http://localhost:8545', - contractAddress: '0x84eA74d481Ee0A5332c457a4d796187F6Ba67fEB', - delegationManagerAddress: '0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9', - stakeRegistryAddress: '0x9E545E3C0baAB3E08CdfD552C960A1050f373042', - avsDirectoryAddress: '0x5FC8d32690cc91D4c39d9d3abcBD16989F875707' + contractAddress: '0x998abeb3e57409262ae5b751f60747921b33613e', + delegationManagerAddress: '0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0', + stakeRegistryAddress: '0x4826533b4897376654bb4d4ad88b7fafd0c98528', + avsDirectoryAddress: '0xdc64a140aa3e981100a9beca4e685f962f0cf6c9' }, '17000': { rpcUrl: getEnvVariable('RPC_URL') || 'https://rpc.holesky.ethpandaops.io', diff --git a/src/avs/tests/test.operator.ts b/src/avs/tests/test.operator.ts index f1f5a11d..1f396505 100644 --- a/src/avs/tests/test.operator.ts +++ b/src/avs/tests/test.operator.ts @@ -9,6 +9,9 @@ * and the nesting helps save time by not repeating the same setup code. */ +// eslint-disable-next-line simple-import-sort/imports +import 'src/server/utils/config-env' + import { Wallet } from 'ethers' import { arrayify } from 'ethers/lib/utils' import assert from 'node:assert' diff --git a/src/avs/tests/utils.ts b/src/avs/tests/utils.ts index d4c28d79..3e747371 100644 --- a/src/avs/tests/utils.ts +++ b/src/avs/tests/utils.ts @@ -1,11 +1,20 @@ import { spawn } from 'child_process' export async function runFreshChain() { - const task = spawn('npm', ['run', 'start:chain']) + const PRIVATE_KEY = process.env.PRIVATE_KEY + if(!PRIVATE_KEY) { + throw new Error('PRIVATE_KEY environment variable is required') + } + + const task = spawn( + 'npm', + ['run', 'start:chain'], + { env: process.env } + ) task.stderr.pipe(process.stderr) await new Promise((resolve, reject) => { task.stdout.on('data', (data) => { - if(data.toString().includes('advancing chain...')) { + if(data.toString().includes('Deployed Reclaim contracts')) { resolve() } }) From 71f596eb0894645cee2901d309afed468b430b30 Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Wed, 12 Feb 2025 17:36:27 +0530 Subject: [PATCH 05/26] feat: functional avs w new updates --- avs/contracts/deployments/core/31337.json | 2 +- avs/contracts/deployments/reclaim/31337.json | 2 +- avs/contracts/script/ReclaimDeployer.s.sol | 7 +- .../script/utils/ReclaimDeploymentLib.sol | 9 +- avs/contracts/src/ReclaimServiceManager.sol | 14 +- avs/utils/contract-data-gen.sh | 7 + docs/avs.md | 6 +- package.json | 3 +- src/avs/abis/avsDirectoryABI.ts | 340 --- src/avs/abis/delegationABI.ts | 1 - src/avs/abis/registryABI.ts | 725 ------ src/avs/client/create-claim-on-avs.ts | 1 + src/avs/contracts/AVSDirectory.ts | 900 +++++++ src/avs/contracts/DelegationManager.ts | 2303 +++++++++++++++++ src/avs/contracts/ECDSAStakeRegistry.ts | 1183 +++++++++ src/avs/contracts/ReclaimServiceManager.ts | 301 ++- .../factories/AVSDirectory__factory.ts | 560 ++++ .../factories/DelegationManager__factory.ts | 1728 +++++++++++++ .../factories/ECDSAStakeRegistry__factory.ts | 882 +++++++ .../ReclaimServiceManager__factory.ts | 257 +- src/avs/contracts/factories/index.ts | 3 + src/avs/contracts/index.ts | 6 + src/avs/tests/test.operator.ts | 38 +- src/avs/utils/contracts.ts | 17 +- src/avs/utils/register.ts | 22 +- src/scripts/contract-data-gen.sh | 5 - 26 files changed, 8080 insertions(+), 1242 deletions(-) create mode 100644 avs/utils/contract-data-gen.sh delete mode 100644 src/avs/abis/avsDirectoryABI.ts delete mode 100644 src/avs/abis/delegationABI.ts delete mode 100644 src/avs/abis/registryABI.ts create mode 100644 src/avs/contracts/AVSDirectory.ts create mode 100644 src/avs/contracts/DelegationManager.ts create mode 100644 src/avs/contracts/ECDSAStakeRegistry.ts create mode 100644 src/avs/contracts/factories/AVSDirectory__factory.ts create mode 100644 src/avs/contracts/factories/DelegationManager__factory.ts create mode 100644 src/avs/contracts/factories/ECDSAStakeRegistry__factory.ts delete mode 100644 src/scripts/contract-data-gen.sh diff --git a/avs/contracts/deployments/core/31337.json b/avs/contracts/deployments/core/31337.json index b0bfbc45..70c8e1a2 100644 --- a/avs/contracts/deployments/core/31337.json +++ b/avs/contracts/deployments/core/31337.json @@ -1 +1 @@ -{"lastUpdate":{"timestamp":"1739347271","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","avsDirectory":"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9","avsDirectoryImpl":"0x68b1d87f95878fe05b998f19b66f4baba5de1aed","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","eigenPodManagerImpl":"0x59b670e9fa9d0a427751af201d676719a970857b","strategyFactory":"0x959922be3caee4b8cd9a407cc3ac1c251c2007b1","strategyFactoryImpl":"0xc6e7df5e7b4f2a278906862b61205850344d4e7d","strategyBeacon":"0x09635f643e140090a9a8dcd712ed6285858cebef","rewardsCoordinator":"0x610178da211fef7d417bc0e6fed39f05609ad788"}} \ No newline at end of file +{"lastUpdate":{"timestamp":"1739361957","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","avsDirectory":"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9","avsDirectoryImpl":"0x68b1d87f95878fe05b998f19b66f4baba5de1aed","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","eigenPodManagerImpl":"0x59b670e9fa9d0a427751af201d676719a970857b","strategyFactory":"0x959922be3caee4b8cd9a407cc3ac1c251c2007b1","strategyFactoryImpl":"0xc6e7df5e7b4f2a278906862b61205850344d4e7d","strategyBeacon":"0x09635f643e140090a9a8dcd712ed6285858cebef","rewardsCoordinator":"0x610178da211fef7d417bc0e6fed39f05609ad788"}} \ No newline at end of file diff --git a/avs/contracts/deployments/reclaim/31337.json b/avs/contracts/deployments/reclaim/31337.json index 73f02d2f..a4988a86 100644 --- a/avs/contracts/deployments/reclaim/31337.json +++ b/avs/contracts/deployments/reclaim/31337.json @@ -1 +1 @@ -{"lastUpdate":{"timestamp":"1739347273","block_number":"21"},"addresses":{"proxyAdmin":"0xf5059a5d33d5853360d16c683c16e67980206f36","reclaimServiceManager":"0x998abeb3e57409262ae5b751f60747921b33613e","reclaimServiceManagerImpl":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","stakeRegistry":"0x4826533b4897376654bb4d4ad88b7fafd0c98528","stakeRegistryImpl":"0x99bba657f2bbc93c02d617f8ba121cb8fc104acf","strategy":"0x24b3c7704709ed1491473f30393ffc93cfb0fc34","token":"0x1613beb3b2c4f22ee086b2b38c1476a3ce7f78e8"}} \ No newline at end of file +{"lastUpdate":{"timestamp":"1739361960","block_number":"19"},"addresses":{"proxyAdmin":"0xf5059a5d33d5853360d16c683c16e67980206f36","reclaimServiceManager":"0x998abeb3e57409262ae5b751f60747921b33613e","reclaimServiceManagerImpl":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","stakeRegistry":"0x4826533b4897376654bb4d4ad88b7fafd0c98528","stakeRegistryImpl":"0x99bba657f2bbc93c02d617f8ba121cb8fc104acf","strategy":"0x24b3c7704709ed1491473f30393ffc93cfb0fc34","token":"0x1613beb3b2c4f22ee086b2b38c1476a3ce7f78e8"}} \ No newline at end of file diff --git a/avs/contracts/script/ReclaimDeployer.s.sol b/avs/contracts/script/ReclaimDeployer.s.sol index a1621425..da1bbd0c 100644 --- a/avs/contracts/script/ReclaimDeployer.s.sol +++ b/avs/contracts/script/ReclaimDeployer.s.sol @@ -65,8 +65,11 @@ contract ReclaimDeployer is Script, Test { proxyAdmin = UpgradeableProxyLib.deployProxyAdmin(); - reclaimDeployment = - ReclaimDeploymentLib.deployContracts(proxyAdmin, coreDeployment, quorum, rewardsInitiator, rewardsOwner); + reclaimDeployment = ReclaimDeploymentLib.deployContracts( + proxyAdmin, coreDeployment, + quorum, rewardsInitiator, + rewardsOwner, deployer + ); reclaimDeployment.strategy = address(reclaimStrategy); reclaimDeployment.token = address(token); diff --git a/avs/contracts/script/utils/ReclaimDeploymentLib.sol b/avs/contracts/script/utils/ReclaimDeploymentLib.sol index a52d01c1..6c21f0fe 100644 --- a/avs/contracts/script/utils/ReclaimDeploymentLib.sol +++ b/avs/contracts/script/utils/ReclaimDeploymentLib.sol @@ -1,10 +1,6 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; -import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; -import {TransparentUpgradeableProxy} from - "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import {Script} from "forge-std/Script.sol"; import {console2} from "forge-std/Test.sol"; import {Vm} from "forge-std/Vm.sol"; import {stdJson} from "forge-std/StdJson.sol"; @@ -42,7 +38,8 @@ library ReclaimDeploymentLib { CoreDeploymentLib.DeploymentData memory core, Quorum memory quorum, address rewardsInitiator, - address owner + address owner, + address deployer ) internal returns (DeploymentData memory) { DeploymentData memory result; @@ -62,7 +59,7 @@ library ReclaimDeploymentLib { ECDSAStakeRegistry.initialize, (result.reclaimServiceManager, 0, quorum) ); UpgradeableProxyLib.upgradeAndCall(result.stakeRegistry, stakeRegistryImpl, upgradeCall); - upgradeCall = abi.encodeCall(ReclaimServiceManager.initialize, (owner, rewardsInitiator)); + upgradeCall = abi.encodeCall(ReclaimServiceManager.initialize, (owner, rewardsInitiator, deployer)); UpgradeableProxyLib.upgradeAndCall(result.reclaimServiceManager, reclaimServiceManagerImpl, upgradeCall); return result; diff --git a/avs/contracts/src/ReclaimServiceManager.sol b/avs/contracts/src/ReclaimServiceManager.sol index 904a0f2c..52101eea 100644 --- a/avs/contracts/src/ReclaimServiceManager.sol +++ b/avs/contracts/src/ReclaimServiceManager.sol @@ -3,8 +3,9 @@ pragma solidity ^0.8.9; import "@eigenlayer/contracts/libraries/BytesLib.sol"; import "@eigenlayer/contracts/core/DelegationManager.sol"; -import "@eigenlayer-middleware/src/unaudited/ECDSAServiceManagerBase.sol"; -import "@eigenlayer-middleware/src/unaudited/ECDSAStakeRegistry.sol"; +import {ECDSAServiceManagerBase} from + "@eigenlayer-middleware/src/unaudited/ECDSAServiceManagerBase.sol"; +import {ECDSAStakeRegistry} from "@eigenlayer-middleware/src/unaudited/ECDSAStakeRegistry.sol"; import "@openzeppelin-upgrades/contracts/utils/cryptography/ECDSAUpgradeable.sol"; import "@eigenlayer/contracts/permissions/Pausable.sol"; import {IRegistryCoordinator} from "@eigenlayer-middleware/src/interfaces/IRegistryCoordinator.sol"; @@ -75,12 +76,10 @@ contract ReclaimServiceManager is function initialize( address initialOwner, - address _rewardsInitiator + address _rewardsInitiator, + address deployer ) external initializer { __ServiceManagerBase_init(initialOwner, _rewardsInitiator); - } - - function setup(address initialAdmin) external initializer { taskCreationMetadata = TaskCreationMetadata( // 30m 30 * 60, @@ -89,12 +88,11 @@ contract ReclaimServiceManager is // 5m 5 * 60 ); - admins.push(initialAdmin); + admins.push(deployer); } /* FUNCTIONS */ - /// @inheritdoc IServiceManagerUI function updateAVSMetadataURI( string memory _metadataURI ) external override virtual onlyAdmin { diff --git a/avs/utils/contract-data-gen.sh b/avs/utils/contract-data-gen.sh new file mode 100644 index 00000000..62cb2884 --- /dev/null +++ b/avs/utils/contract-data-gen.sh @@ -0,0 +1,7 @@ +rm -rf src/avs/contracts +mkdir -p src/avs/contracts +typechain -- --target ethers-v5 --out-dir src/avs/contracts \ + avs/contracts/out/ReclaimServiceManager.sol/*.json \ + avs/contracts/out/AVSDirectory.sol/*.json \ + avs/contracts/out/DelegationManager.sol/*.json \ + avs/contracts/out/ECDSAStakeRegistry.sol/*.json \ \ No newline at end of file diff --git a/docs/avs.md b/docs/avs.md index e33dc273..a809125f 100644 --- a/docs/avs.md +++ b/docs/avs.md @@ -132,13 +132,13 @@ Regardless, if you're one of the chosen few -- here's how you can register yours 2. Run `npm install` 3. Install the submodules with `git submodule update --init --recursive` - this'll enable you to work on the contracts -4. Run `npm run start:chain` to start the local chain with the contracts already deployed **Building the contracts**: - `npm run build:contracts` + - `npm run generate:avs-types` to generate the types for the AVS contracts (make sure contracts are built first) **Deploying the contracts locally**: - - `npm run deploy:contracts` - - This will deploy the contracts on the local anvil network, and save the state of the contracts. + - `npm run start:chain` + - This will start the local chain, build the contracts & deploy them on the local chain too. **Testing**: - `npm run test` to run all the tests - `npm run test:avs` to run the AVS tests \ No newline at end of file diff --git a/package.json b/package.json index ca234a50..0d1b2f19 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,6 @@ "lint": "eslint ./ --ext .js,.ts,.jsx,.tsx", "lint:fix": "eslint ./ --fix --ext .js,.ts,.jsx,.tsx", "generate:proto": "sh ./src/scripts/generate-proto.sh", - "generate:contracts-data": "sh ./src/scripts/contract-data-gen.sh", "generate:provider-types": "npm run run:tsc -- src/scripts/generate-provider-types.ts", "verify:root-ca": "npm run run:tsc -- src/scripts/verify-root-ca.ts", "create:claim": "npm run run:tsc -- src/scripts/generate-receipt.ts", @@ -28,7 +27,7 @@ "check:avs-registration": "npm run run:tsc -- src/scripts/check-avs-registration.ts", "whitelist:operator": "npm run run:tsc -- src/scripts/whitelist-operator.ts", "update:avs-metadata": "npm run run:tsc -- src/scripts/update-avs-metadata.ts", - "generate:avs": "typechain -- --target ethers-v5 --out-dir src/avs/contracts avs/contracts/out/ReclaimServiceManager.sol/*.json", + "generate:avs-types": "sh ./avs/utils/contract-data-gen.sh", "start:chain": "sh ./avs/utils/anvil/start-anvil-chain-with-el-and-avs-deployed.sh", "commitlint": "commitlint --edit", "download:zk-files": "node node_modules/@reclaimprotocol/zk-symmetric-crypto/lib/scripts/download-files", diff --git a/src/avs/abis/avsDirectoryABI.ts b/src/avs/abis/avsDirectoryABI.ts deleted file mode 100644 index 3c81d506..00000000 --- a/src/avs/abis/avsDirectoryABI.ts +++ /dev/null @@ -1,340 +0,0 @@ -export const avsDirectoryABI = [ - { - type: "constructor", - inputs: [ - { - name: "_delegation", - type: "address", - internalType: "contract IDelegationManager", - }, - ], - 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: "enum IAVSDirectory.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: "contract IDelegationManager", - }, - ], - 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: "contract IPauserRegistry", - }, - { 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: "contract IPauserRegistry" }, - ], - stateMutability: "view", - }, - { - type: "function", - name: "registerOperatorToAVS", - inputs: [ - { name: "operator", type: "address", internalType: "address" }, - { - name: "operatorSignature", - type: "tuple", - internalType: "struct ISignatureUtils.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: "contract IPauserRegistry", - }, - ], - 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: "enum IAVSDirectory.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: "contract IPauserRegistry", - }, - { - name: "newPauserRegistry", - type: "address", - indexed: false, - internalType: "contract IPauserRegistry", - }, - ], - 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, - }, -]; diff --git a/src/avs/abis/delegationABI.ts b/src/avs/abis/delegationABI.ts deleted file mode 100644 index 74c422c9..00000000 --- a/src/avs/abis/delegationABI.ts +++ /dev/null @@ -1 +0,0 @@ -export const delegationABI = [{"type":"function","name":"DELEGATION_APPROVAL_TYPEHASH","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"DOMAIN_TYPEHASH","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"STAKER_DELEGATION_TYPEHASH","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"beaconChainETHStrategy","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IStrategy"}],"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":"struct IDelegationManager.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":"contract IStrategy[]"},{"name":"shares","type":"uint256[]","internalType":"uint256[]"}]}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"pure"},{"type":"function","name":"completeQueuedWithdrawal","inputs":[{"name":"withdrawal","type":"tuple","internalType":"struct IDelegationManager.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":"contract IStrategy[]"},{"name":"shares","type":"uint256[]","internalType":"uint256[]"}]},{"name":"tokens","type":"address[]","internalType":"contract IERC20[]"},{"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":"struct IDelegationManager.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":"contract IStrategy[]"},{"name":"shares","type":"uint256[]","internalType":"uint256[]"}]},{"name":"tokens","type":"address[][]","internalType":"contract IERC20[][]"},{"name":"middlewareTimesIndexes","type":"uint256[]","internalType":"uint256[]"},{"name":"receiveAsTokens","type":"bool[]","internalType":"bool[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"cumulativeWithdrawalsQueued","inputs":[{"name":"staker","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"decreaseDelegatedShares","inputs":[{"name":"staker","type":"address","internalType":"address"},{"name":"strategy","type":"address","internalType":"contract IStrategy"},{"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":"struct ISignatureUtils.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":"struct ISignatureUtils.SignatureWithExpiry","components":[{"name":"signature","type":"bytes","internalType":"bytes"},{"name":"expiry","type":"uint256","internalType":"uint256"}]},{"name":"approverSignatureAndExpiry","type":"tuple","internalType":"struct ISignatureUtils.SignatureWithExpiry","components":[{"name":"signature","type":"bytes","internalType":"bytes"},{"name":"expiry","type":"uint256","internalType":"uint256"}]},{"name":"approverSalt","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"delegatedTo","inputs":[{"name":"staker","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"delegationApprover","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"delegationApproverSaltIsSpent","inputs":[{"name":"_delegationApprover","type":"address","internalType":"address"},{"name":"salt","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"domainSeparator","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"earningsReceiver","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getOperatorShares","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"strategies","type":"address[]","internalType":"contract IStrategy[]"}],"outputs":[{"name":"","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"getWithdrawalDelay","inputs":[{"name":"strategies","type":"address[]","internalType":"contract IStrategy[]"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"increaseDelegatedShares","inputs":[{"name":"staker","type":"address","internalType":"address"},{"name":"strategy","type":"address","internalType":"contract IStrategy"},{"name":"shares","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isDelegated","inputs":[{"name":"staker","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isOperator","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"migrateQueuedWithdrawals","inputs":[{"name":"withdrawalsToQueue","type":"tuple[]","internalType":"struct IStrategyManager.DeprecatedStruct_QueuedWithdrawal[]","components":[{"name":"strategies","type":"address[]","internalType":"contract IStrategy[]"},{"name":"shares","type":"uint256[]","internalType":"uint256[]"},{"name":"staker","type":"address","internalType":"address"},{"name":"withdrawerAndNonce","type":"tuple","internalType":"struct IStrategyManager.DeprecatedStruct_WithdrawerAndNonce","components":[{"name":"withdrawer","type":"address","internalType":"address"},{"name":"nonce","type":"uint96","internalType":"uint96"}]},{"name":"withdrawalStartBlock","type":"uint32","internalType":"uint32"},{"name":"delegatedAddress","type":"address","internalType":"address"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"minWithdrawalDelayBlocks","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"modifyOperatorDetails","inputs":[{"name":"newOperatorDetails","type":"tuple","internalType":"struct IDelegationManager.OperatorDetails","components":[{"name":"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":"struct IDelegationManager.OperatorDetails","components":[{"name":"earningsReceiver","type":"address","internalType":"address"},{"name":"delegationApprover","type":"address","internalType":"address"},{"name":"stakerOptOutWindowBlocks","type":"uint32","internalType":"uint32"}]}],"stateMutability":"view"},{"type":"function","name":"operatorShares","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"strategy","type":"address","internalType":"contract IStrategy"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"queueWithdrawals","inputs":[{"name":"queuedWithdrawalParams","type":"tuple[]","internalType":"struct IDelegationManager.QueuedWithdrawalParams[]","components":[{"name":"strategies","type":"address[]","internalType":"contract IStrategy[]"},{"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":"struct IDelegationManager.OperatorDetails","components":[{"name":"earningsReceiver","type":"address","internalType":"address"},{"name":"delegationApprover","type":"address","internalType":"address"},{"name":"stakerOptOutWindowBlocks","type":"uint32","internalType":"uint32"}]},{"name":"metadataURI","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"stakerNonce","inputs":[{"name":"staker","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"stakerOptOutWindowBlocks","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"strategyWithdrawalDelayBlocks","inputs":[{"name":"strategy","type":"address","internalType":"contract IStrategy"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"undelegate","inputs":[{"name":"staker","type":"address","internalType":"address"}],"outputs":[{"name":"withdrawalRoot","type":"bytes32[]","internalType":"bytes32[]"}],"stateMutability":"nonpayable"},{"type":"function","name":"updateOperatorMetadataURI","inputs":[{"name":"metadataURI","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"MinWithdrawalDelayBlocksSet","inputs":[{"name":"previousValue","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newValue","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"OperatorDetailsModified","inputs":[{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"newOperatorDetails","type":"tuple","indexed":false,"internalType":"struct IDelegationManager.OperatorDetails","components":[{"name":"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":"struct IDelegationManager.OperatorDetails","components":[{"name":"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":"contract IStrategy"},{"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":"contract IStrategy"},{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"StakerDelegated","inputs":[{"name":"staker","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"StakerForceUndelegated","inputs":[{"name":"staker","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"StakerUndelegated","inputs":[{"name":"staker","type":"address","indexed":true,"internalType":"address"},{"name":"operator","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"StrategyWithdrawalDelayBlocksSet","inputs":[{"name":"strategy","type":"address","indexed":false,"internalType":"contract IStrategy"},{"name":"previousValue","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newValue","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"WithdrawalCompleted","inputs":[{"name":"withdrawalRoot","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"WithdrawalMigrated","inputs":[{"name":"oldWithdrawalRoot","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"newWithdrawalRoot","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":"struct IDelegationManager.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":"contract IStrategy[]"},{"name":"shares","type":"uint256[]","internalType":"uint256[]"}]}],"anonymous":false}] \ No newline at end of file diff --git a/src/avs/abis/registryABI.ts b/src/avs/abis/registryABI.ts deleted file mode 100644 index beafd811..00000000 --- a/src/avs/abis/registryABI.ts +++ /dev/null @@ -1,725 +0,0 @@ -export const registryABI = [ - { - "type": "constructor", - "inputs": [ - { - "name": "_delegationManager", - "type": "address", - "internalType": "contract IDelegationManager" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "deregisterOperator", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "getLastCheckpointOperatorWeight", - "inputs": [ - { - "name": "_operator", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getLastCheckpointThresholdWeight", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getLastCheckpointThresholdWeightAtBlock", - "inputs": [ - { - "name": "_blockNumber", - "type": "uint32", - "internalType": "uint32" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getLastCheckpointTotalWeight", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getLastCheckpointTotalWeightAtBlock", - "inputs": [ - { - "name": "_blockNumber", - "type": "uint32", - "internalType": "uint32" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getOperatorWeight", - "inputs": [ - { - "name": "_operator", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getOperatorWeightAtBlock", - "inputs": [ - { - "name": "_operator", - "type": "address", - "internalType": "address" - }, - { - "name": "_blockNumber", - "type": "uint32", - "internalType": "uint32" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "initialize", - "inputs": [ - { - "name": "_serviceManager", - "type": "address", - "internalType": "address" - }, - { - "name": "_thresholdWeight", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "_quorum", - "type": "tuple", - "internalType": "struct Quorum", - "components": [ - { - "name": "strategies", - "type": "tuple[]", - "internalType": "struct StrategyParams[]", - "components": [ - { - "name": "strategy", - "type": "address", - "internalType": "contract IStrategy" - }, - { - "name": "multiplier", - "type": "uint96", - "internalType": "uint96" - } - ] - } - ] - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "isValidSignature", - "inputs": [ - { - "name": "_dataHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_signatureData", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes4", - "internalType": "bytes4" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "minimumWeight", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "operatorRegistered", - "inputs": [ - { - "name": "_operator", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "owner", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "quorum", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct Quorum", - "components": [ - { - "name": "strategies", - "type": "tuple[]", - "internalType": "struct StrategyParams[]", - "components": [ - { - "name": "strategy", - "type": "address", - "internalType": "contract IStrategy" - }, - { - "name": "multiplier", - "type": "uint96", - "internalType": "uint96" - } - ] - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "registerOperatorWithSignature", - "inputs": [ - { - "name": "_operator", - "type": "address", - "internalType": "address" - }, - { - "name": "_operatorSignature", - "type": "tuple", - "internalType": "struct ISignatureUtils.SignatureWithSaltAndExpiry", - "components": [ - { - "name": "signature", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "salt", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "expiry", - "type": "uint256", - "internalType": "uint256" - } - ] - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "renounceOwnership", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "transferOwnership", - "inputs": [ - { - "name": "newOwner", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "updateMinimumWeight", - "inputs": [ - { - "name": "_newMinimumWeight", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "_operators", - "type": "address[]", - "internalType": "address[]" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "updateOperators", - "inputs": [ - { - "name": "_operators", - "type": "address[]", - "internalType": "address[]" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "updateOperatorsForQuorum", - "inputs": [ - { - "name": "operatorsPerQuorum", - "type": "address[][]", - "internalType": "address[][]" - }, - { - "name": "", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "updateQuorumConfig", - "inputs": [ - { - "name": "_quorum", - "type": "tuple", - "internalType": "struct Quorum", - "components": [ - { - "name": "strategies", - "type": "tuple[]", - "internalType": "struct StrategyParams[]", - "components": [ - { - "name": "strategy", - "type": "address", - "internalType": "contract IStrategy" - }, - { - "name": "multiplier", - "type": "uint96", - "internalType": "uint96" - } - ] - } - ] - }, - { - "name": "_operators", - "type": "address[]", - "internalType": "address[]" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "updateStakeThreshold", - "inputs": [ - { - "name": "_thresholdWeight", - "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": "MinimumWeightUpdated", - "inputs": [ - { - "name": "_old", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "_new", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OperatorDeregistered", - "inputs": [ - { - "name": "_operator", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "_avs", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OperatorRegistered", - "inputs": [ - { - "name": "_operator", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "_avs", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "OperatorWeightUpdated", - "inputs": [ - { - "name": "_operator", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "oldWeight", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "newWeight", - "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": "QuorumUpdated", - "inputs": [ - { - "name": "_old", - "type": "tuple", - "indexed": false, - "internalType": "struct Quorum", - "components": [ - { - "name": "strategies", - "type": "tuple[]", - "internalType": "struct StrategyParams[]", - "components": [ - { - "name": "strategy", - "type": "address", - "internalType": "contract IStrategy" - }, - { - "name": "multiplier", - "type": "uint96", - "internalType": "uint96" - } - ] - } - ] - }, - { - "name": "_new", - "type": "tuple", - "indexed": false, - "internalType": "struct Quorum", - "components": [ - { - "name": "strategies", - "type": "tuple[]", - "internalType": "struct StrategyParams[]", - "components": [ - { - "name": "strategy", - "type": "address", - "internalType": "contract IStrategy" - }, - { - "name": "multiplier", - "type": "uint96", - "internalType": "uint96" - } - ] - } - ] - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ThresholdWeightUpdated", - "inputs": [ - { - "name": "_thresholdWeight", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TotalWeightUpdated", - "inputs": [ - { - "name": "oldTotalWeight", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "newTotalWeight", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "UpdateMinimumWeight", - "inputs": [ - { - "name": "oldMinimumWeight", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "newMinimumWeight", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "InsufficientSignedStake", - "inputs": [] - }, - { - "type": "error", - "name": "InsufficientWeight", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidLength", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidQuorum", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidSignature", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidSignedWeight", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidThreshold", - "inputs": [] - }, - { - "type": "error", - "name": "LengthMismatch", - "inputs": [] - }, - { - "type": "error", - "name": "MustUpdateAllOperators", - "inputs": [] - }, - { - "type": "error", - "name": "NotSorted", - "inputs": [] - }, - { - "type": "error", - "name": "OperatorAlreadyRegistered", - "inputs": [] - }, - { - "type": "error", - "name": "OperatorNotRegistered", - "inputs": [] - } -]; \ No newline at end of file diff --git a/src/avs/client/create-claim-on-avs.ts b/src/avs/client/create-claim-on-avs.ts index 77516211..eddf357e 100644 --- a/src/avs/client/create-claim-on-avs.ts +++ b/src/avs/client/create-claim-on-avs.ts @@ -52,6 +52,7 @@ export async function createClaimOnAvs({ const responses: ClaimTunnelResponse[] = [] const timestampS = +arg.task.createdAt.toString() + console.log(arg.task.operators) for(const op of arg.task.operators) { const res = await createClaimOnAttestor({ ...opts, diff --git a/src/avs/contracts/AVSDirectory.ts b/src/avs/contracts/AVSDirectory.ts new file mode 100644 index 00000000..f82c20be --- /dev/null +++ b/src/avs/contracts/AVSDirectory.ts @@ -0,0 +1,900 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +} from "./common"; + +export declare namespace ISignatureUtils { + export type SignatureWithSaltAndExpiryStruct = { + signature: BytesLike; + salt: BytesLike; + expiry: BigNumberish; + }; + + export type SignatureWithSaltAndExpiryStructOutput = [ + string, + string, + BigNumber + ] & { signature: string; salt: string; expiry: BigNumber }; +} + +export interface AVSDirectoryInterface extends utils.Interface { + functions: { + "DOMAIN_TYPEHASH()": FunctionFragment; + "OPERATOR_AVS_REGISTRATION_TYPEHASH()": FunctionFragment; + "avsOperatorStatus(address,address)": FunctionFragment; + "calculateOperatorAVSRegistrationDigestHash(address,address,bytes32,uint256)": FunctionFragment; + "cancelSalt(bytes32)": FunctionFragment; + "delegation()": FunctionFragment; + "deregisterOperatorFromAVS(address)": FunctionFragment; + "domainSeparator()": FunctionFragment; + "initialize(address,address,uint256)": FunctionFragment; + "operatorSaltIsSpent(address,bytes32)": FunctionFragment; + "owner()": FunctionFragment; + "pause(uint256)": FunctionFragment; + "pauseAll()": FunctionFragment; + "paused(uint8)": FunctionFragment; + "paused()": FunctionFragment; + "pauserRegistry()": FunctionFragment; + "registerOperatorToAVS(address,(bytes,bytes32,uint256))": FunctionFragment; + "renounceOwnership()": FunctionFragment; + "setPauserRegistry(address)": FunctionFragment; + "transferOwnership(address)": FunctionFragment; + "unpause(uint256)": FunctionFragment; + "updateAVSMetadataURI(string)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "DOMAIN_TYPEHASH" + | "OPERATOR_AVS_REGISTRATION_TYPEHASH" + | "avsOperatorStatus" + | "calculateOperatorAVSRegistrationDigestHash" + | "cancelSalt" + | "delegation" + | "deregisterOperatorFromAVS" + | "domainSeparator" + | "initialize" + | "operatorSaltIsSpent" + | "owner" + | "pause" + | "pauseAll" + | "paused(uint8)" + | "paused()" + | "pauserRegistry" + | "registerOperatorToAVS" + | "renounceOwnership" + | "setPauserRegistry" + | "transferOwnership" + | "unpause" + | "updateAVSMetadataURI" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "DOMAIN_TYPEHASH", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "OPERATOR_AVS_REGISTRATION_TYPEHASH", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "avsOperatorStatus", + values: [string, string] + ): string; + encodeFunctionData( + functionFragment: "calculateOperatorAVSRegistrationDigestHash", + values: [string, string, BytesLike, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "cancelSalt", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "delegation", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "deregisterOperatorFromAVS", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "domainSeparator", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "initialize", + values: [string, string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "operatorSaltIsSpent", + values: [string, BytesLike] + ): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData(functionFragment: "pause", values: [BigNumberish]): string; + encodeFunctionData(functionFragment: "pauseAll", values?: undefined): string; + encodeFunctionData( + functionFragment: "paused(uint8)", + values: [BigNumberish] + ): string; + encodeFunctionData(functionFragment: "paused()", values?: undefined): string; + encodeFunctionData( + functionFragment: "pauserRegistry", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "registerOperatorToAVS", + values: [string, ISignatureUtils.SignatureWithSaltAndExpiryStruct] + ): string; + encodeFunctionData( + functionFragment: "renounceOwnership", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "setPauserRegistry", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "unpause", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "updateAVSMetadataURI", + values: [string] + ): string; + + decodeFunctionResult( + functionFragment: "DOMAIN_TYPEHASH", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "OPERATOR_AVS_REGISTRATION_TYPEHASH", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "avsOperatorStatus", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "calculateOperatorAVSRegistrationDigestHash", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "cancelSalt", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "delegation", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "deregisterOperatorFromAVS", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "domainSeparator", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "operatorSaltIsSpent", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "pause", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "pauseAll", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "paused(uint8)", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "paused()", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "pauserRegistry", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "registerOperatorToAVS", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "renounceOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setPauserRegistry", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "transferOwnership", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "unpause", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "updateAVSMetadataURI", + data: BytesLike + ): Result; + + events: { + "AVSMetadataURIUpdated(address,string)": EventFragment; + "Initialized(uint8)": EventFragment; + "OperatorAVSRegistrationStatusUpdated(address,address,uint8)": EventFragment; + "OwnershipTransferred(address,address)": EventFragment; + "Paused(address,uint256)": EventFragment; + "PauserRegistrySet(address,address)": EventFragment; + "Unpaused(address,uint256)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "AVSMetadataURIUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; + getEvent( + nameOrSignatureOrTopic: "OperatorAVSRegistrationStatusUpdated" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Paused"): EventFragment; + getEvent(nameOrSignatureOrTopic: "PauserRegistrySet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Unpaused"): EventFragment; +} + +export interface AVSMetadataURIUpdatedEventObject { + avs: string; + metadataURI: string; +} +export type AVSMetadataURIUpdatedEvent = TypedEvent< + [string, string], + AVSMetadataURIUpdatedEventObject +>; + +export type AVSMetadataURIUpdatedEventFilter = + TypedEventFilter; + +export interface InitializedEventObject { + version: number; +} +export type InitializedEvent = TypedEvent<[number], InitializedEventObject>; + +export type InitializedEventFilter = TypedEventFilter; + +export interface OperatorAVSRegistrationStatusUpdatedEventObject { + operator: string; + avs: string; + status: number; +} +export type OperatorAVSRegistrationStatusUpdatedEvent = TypedEvent< + [string, string, number], + OperatorAVSRegistrationStatusUpdatedEventObject +>; + +export type OperatorAVSRegistrationStatusUpdatedEventFilter = + TypedEventFilter; + +export interface OwnershipTransferredEventObject { + previousOwner: string; + newOwner: string; +} +export type OwnershipTransferredEvent = TypedEvent< + [string, string], + OwnershipTransferredEventObject +>; + +export type OwnershipTransferredEventFilter = + TypedEventFilter; + +export interface PausedEventObject { + account: string; + newPausedStatus: BigNumber; +} +export type PausedEvent = TypedEvent<[string, BigNumber], PausedEventObject>; + +export type PausedEventFilter = TypedEventFilter; + +export interface PauserRegistrySetEventObject { + pauserRegistry: string; + newPauserRegistry: string; +} +export type PauserRegistrySetEvent = TypedEvent< + [string, string], + PauserRegistrySetEventObject +>; + +export type PauserRegistrySetEventFilter = + TypedEventFilter; + +export interface UnpausedEventObject { + account: string; + newPausedStatus: BigNumber; +} +export type UnpausedEvent = TypedEvent< + [string, BigNumber], + UnpausedEventObject +>; + +export type UnpausedEventFilter = TypedEventFilter; + +export interface AVSDirectory extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: AVSDirectoryInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + DOMAIN_TYPEHASH(overrides?: CallOverrides): Promise<[string]>; + + OPERATOR_AVS_REGISTRATION_TYPEHASH( + overrides?: CallOverrides + ): Promise<[string]>; + + avsOperatorStatus( + arg0: string, + arg1: string, + overrides?: CallOverrides + ): Promise<[number]>; + + calculateOperatorAVSRegistrationDigestHash( + operator: string, + avs: string, + salt: BytesLike, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + cancelSalt( + salt: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + delegation(overrides?: CallOverrides): Promise<[string]>; + + deregisterOperatorFromAVS( + operator: string, + overrides?: Overrides & { from?: string } + ): Promise; + + domainSeparator(overrides?: CallOverrides): Promise<[string]>; + + initialize( + initialOwner: string, + _pauserRegistry: string, + initialPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + operatorSaltIsSpent( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean]>; + + owner(overrides?: CallOverrides): Promise<[string]>; + + pause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + pauseAll( + overrides?: Overrides & { from?: string } + ): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise<[boolean]>; + + "paused()"(overrides?: CallOverrides): Promise<[BigNumber]>; + + pauserRegistry(overrides?: CallOverrides): Promise<[string]>; + + registerOperatorToAVS( + operator: string, + operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + setPauserRegistry( + newPauserRegistry: string, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + updateAVSMetadataURI( + metadataURI: string, + overrides?: Overrides & { from?: string } + ): Promise; + }; + + DOMAIN_TYPEHASH(overrides?: CallOverrides): Promise; + + OPERATOR_AVS_REGISTRATION_TYPEHASH( + overrides?: CallOverrides + ): Promise; + + avsOperatorStatus( + arg0: string, + arg1: string, + overrides?: CallOverrides + ): Promise; + + calculateOperatorAVSRegistrationDigestHash( + operator: string, + avs: string, + salt: BytesLike, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise; + + cancelSalt( + salt: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + delegation(overrides?: CallOverrides): Promise; + + deregisterOperatorFromAVS( + operator: string, + overrides?: Overrides & { from?: string } + ): Promise; + + domainSeparator(overrides?: CallOverrides): Promise; + + initialize( + initialOwner: string, + _pauserRegistry: string, + initialPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + operatorSaltIsSpent( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + pauseAll( + overrides?: Overrides & { from?: string } + ): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + pauserRegistry(overrides?: CallOverrides): Promise; + + registerOperatorToAVS( + operator: string, + operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + setPauserRegistry( + newPauserRegistry: string, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + updateAVSMetadataURI( + metadataURI: string, + overrides?: Overrides & { from?: string } + ): Promise; + + callStatic: { + DOMAIN_TYPEHASH(overrides?: CallOverrides): Promise; + + OPERATOR_AVS_REGISTRATION_TYPEHASH( + overrides?: CallOverrides + ): Promise; + + avsOperatorStatus( + arg0: string, + arg1: string, + overrides?: CallOverrides + ): Promise; + + calculateOperatorAVSRegistrationDigestHash( + operator: string, + avs: string, + salt: BytesLike, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise; + + cancelSalt(salt: BytesLike, overrides?: CallOverrides): Promise; + + delegation(overrides?: CallOverrides): Promise; + + deregisterOperatorFromAVS( + operator: string, + overrides?: CallOverrides + ): Promise; + + domainSeparator(overrides?: CallOverrides): Promise; + + initialize( + initialOwner: string, + _pauserRegistry: string, + initialPausedStatus: BigNumberish, + overrides?: CallOverrides + ): Promise; + + operatorSaltIsSpent( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pause( + newPausedStatus: BigNumberish, + overrides?: CallOverrides + ): Promise; + + pauseAll(overrides?: CallOverrides): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + pauserRegistry(overrides?: CallOverrides): Promise; + + registerOperatorToAVS( + operator: string, + operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, + overrides?: CallOverrides + ): Promise; + + renounceOwnership(overrides?: CallOverrides): Promise; + + setPauserRegistry( + newPauserRegistry: string, + overrides?: CallOverrides + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: CallOverrides + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: CallOverrides + ): Promise; + + updateAVSMetadataURI( + metadataURI: string, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "AVSMetadataURIUpdated(address,string)"( + avs?: string | null, + metadataURI?: null + ): AVSMetadataURIUpdatedEventFilter; + AVSMetadataURIUpdated( + avs?: string | null, + metadataURI?: null + ): AVSMetadataURIUpdatedEventFilter; + + "Initialized(uint8)"(version?: null): InitializedEventFilter; + Initialized(version?: null): InitializedEventFilter; + + "OperatorAVSRegistrationStatusUpdated(address,address,uint8)"( + operator?: string | null, + avs?: string | null, + status?: null + ): OperatorAVSRegistrationStatusUpdatedEventFilter; + OperatorAVSRegistrationStatusUpdated( + operator?: string | null, + avs?: string | null, + status?: null + ): OperatorAVSRegistrationStatusUpdatedEventFilter; + + "OwnershipTransferred(address,address)"( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + OwnershipTransferred( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + + "Paused(address,uint256)"( + account?: string | null, + newPausedStatus?: null + ): PausedEventFilter; + Paused(account?: string | null, newPausedStatus?: null): PausedEventFilter; + + "PauserRegistrySet(address,address)"( + pauserRegistry?: null, + newPauserRegistry?: null + ): PauserRegistrySetEventFilter; + PauserRegistrySet( + pauserRegistry?: null, + newPauserRegistry?: null + ): PauserRegistrySetEventFilter; + + "Unpaused(address,uint256)"( + account?: string | null, + newPausedStatus?: null + ): UnpausedEventFilter; + Unpaused( + account?: string | null, + newPausedStatus?: null + ): UnpausedEventFilter; + }; + + estimateGas: { + DOMAIN_TYPEHASH(overrides?: CallOverrides): Promise; + + OPERATOR_AVS_REGISTRATION_TYPEHASH( + overrides?: CallOverrides + ): Promise; + + avsOperatorStatus( + arg0: string, + arg1: string, + overrides?: CallOverrides + ): Promise; + + calculateOperatorAVSRegistrationDigestHash( + operator: string, + avs: string, + salt: BytesLike, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise; + + cancelSalt( + salt: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + delegation(overrides?: CallOverrides): Promise; + + deregisterOperatorFromAVS( + operator: string, + overrides?: Overrides & { from?: string } + ): Promise; + + domainSeparator(overrides?: CallOverrides): Promise; + + initialize( + initialOwner: string, + _pauserRegistry: string, + initialPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + operatorSaltIsSpent( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + pauseAll(overrides?: Overrides & { from?: string }): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + pauserRegistry(overrides?: CallOverrides): Promise; + + registerOperatorToAVS( + operator: string, + operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + setPauserRegistry( + newPauserRegistry: string, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + updateAVSMetadataURI( + metadataURI: string, + overrides?: Overrides & { from?: string } + ): Promise; + }; + + populateTransaction: { + DOMAIN_TYPEHASH(overrides?: CallOverrides): Promise; + + OPERATOR_AVS_REGISTRATION_TYPEHASH( + overrides?: CallOverrides + ): Promise; + + avsOperatorStatus( + arg0: string, + arg1: string, + overrides?: CallOverrides + ): Promise; + + calculateOperatorAVSRegistrationDigestHash( + operator: string, + avs: string, + salt: BytesLike, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise; + + cancelSalt( + salt: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + delegation(overrides?: CallOverrides): Promise; + + deregisterOperatorFromAVS( + operator: string, + overrides?: Overrides & { from?: string } + ): Promise; + + domainSeparator(overrides?: CallOverrides): Promise; + + initialize( + initialOwner: string, + _pauserRegistry: string, + initialPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + operatorSaltIsSpent( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + pauseAll( + overrides?: Overrides & { from?: string } + ): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + pauserRegistry(overrides?: CallOverrides): Promise; + + registerOperatorToAVS( + operator: string, + operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + setPauserRegistry( + newPauserRegistry: string, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + updateAVSMetadataURI( + metadataURI: string, + overrides?: Overrides & { from?: string } + ): Promise; + }; +} diff --git a/src/avs/contracts/DelegationManager.ts b/src/avs/contracts/DelegationManager.ts new file mode 100644 index 00000000..591f62d9 --- /dev/null +++ b/src/avs/contracts/DelegationManager.ts @@ -0,0 +1,2303 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +} from "./common"; + +export declare namespace IDelegationManager { + export type WithdrawalStruct = { + staker: string; + delegatedTo: string; + withdrawer: string; + nonce: BigNumberish; + startBlock: BigNumberish; + strategies: string[]; + shares: BigNumberish[]; + }; + + export type WithdrawalStructOutput = [ + string, + string, + string, + BigNumber, + number, + string[], + BigNumber[] + ] & { + staker: string; + delegatedTo: string; + withdrawer: string; + nonce: BigNumber; + startBlock: number; + strategies: string[]; + shares: BigNumber[]; + }; + + export type OperatorDetailsStruct = { + __deprecated_earningsReceiver: string; + delegationApprover: string; + stakerOptOutWindowBlocks: BigNumberish; + }; + + export type OperatorDetailsStructOutput = [string, string, number] & { + __deprecated_earningsReceiver: string; + delegationApprover: string; + stakerOptOutWindowBlocks: number; + }; + + export type QueuedWithdrawalParamsStruct = { + strategies: string[]; + shares: BigNumberish[]; + withdrawer: string; + }; + + export type QueuedWithdrawalParamsStructOutput = [ + string[], + BigNumber[], + string + ] & { strategies: string[]; shares: BigNumber[]; withdrawer: string }; +} + +export declare namespace ISignatureUtils { + export type SignatureWithExpiryStruct = { + signature: BytesLike; + expiry: BigNumberish; + }; + + export type SignatureWithExpiryStructOutput = [string, BigNumber] & { + signature: string; + expiry: BigNumber; + }; +} + +export interface DelegationManagerInterface extends utils.Interface { + functions: { + "DELEGATION_APPROVAL_TYPEHASH()": FunctionFragment; + "DOMAIN_TYPEHASH()": FunctionFragment; + "MAX_STAKER_OPT_OUT_WINDOW_BLOCKS()": FunctionFragment; + "MAX_WITHDRAWAL_DELAY_BLOCKS()": FunctionFragment; + "STAKER_DELEGATION_TYPEHASH()": FunctionFragment; + "beaconChainETHStrategy()": FunctionFragment; + "calculateCurrentStakerDelegationDigestHash(address,address,uint256)": FunctionFragment; + "calculateDelegationApprovalDigestHash(address,address,address,bytes32,uint256)": FunctionFragment; + "calculateStakerDelegationDigestHash(address,uint256,address,uint256)": FunctionFragment; + "calculateWithdrawalRoot((address,address,address,uint256,uint32,address[],uint256[]))": FunctionFragment; + "completeQueuedWithdrawal((address,address,address,uint256,uint32,address[],uint256[]),address[],uint256,bool)": FunctionFragment; + "completeQueuedWithdrawals((address,address,address,uint256,uint32,address[],uint256[])[],address[][],uint256[],bool[])": FunctionFragment; + "cumulativeWithdrawalsQueued(address)": FunctionFragment; + "decreaseDelegatedShares(address,address,uint256)": FunctionFragment; + "delegateTo(address,(bytes,uint256),bytes32)": FunctionFragment; + "delegateToBySignature(address,address,(bytes,uint256),(bytes,uint256),bytes32)": FunctionFragment; + "delegatedTo(address)": FunctionFragment; + "delegationApprover(address)": FunctionFragment; + "delegationApproverSaltIsSpent(address,bytes32)": FunctionFragment; + "domainSeparator()": FunctionFragment; + "eigenPodManager()": FunctionFragment; + "getDelegatableShares(address)": FunctionFragment; + "getOperatorShares(address,address[])": FunctionFragment; + "getWithdrawalDelay(address[])": FunctionFragment; + "increaseDelegatedShares(address,address,uint256)": FunctionFragment; + "initialize(address,address,uint256,uint256,address[],uint256[])": FunctionFragment; + "isDelegated(address)": FunctionFragment; + "isOperator(address)": FunctionFragment; + "minWithdrawalDelayBlocks()": FunctionFragment; + "modifyOperatorDetails((address,address,uint32))": FunctionFragment; + "operatorDetails(address)": FunctionFragment; + "operatorShares(address,address)": FunctionFragment; + "owner()": FunctionFragment; + "pause(uint256)": FunctionFragment; + "pauseAll()": FunctionFragment; + "paused(uint8)": FunctionFragment; + "paused()": FunctionFragment; + "pauserRegistry()": FunctionFragment; + "pendingWithdrawals(bytes32)": FunctionFragment; + "queueWithdrawals((address[],uint256[],address)[])": FunctionFragment; + "registerAsOperator((address,address,uint32),string)": FunctionFragment; + "renounceOwnership()": FunctionFragment; + "setMinWithdrawalDelayBlocks(uint256)": FunctionFragment; + "setPauserRegistry(address)": FunctionFragment; + "setStrategyWithdrawalDelayBlocks(address[],uint256[])": FunctionFragment; + "slasher()": FunctionFragment; + "stakerNonce(address)": FunctionFragment; + "stakerOptOutWindowBlocks(address)": FunctionFragment; + "strategyManager()": FunctionFragment; + "strategyWithdrawalDelayBlocks(address)": FunctionFragment; + "transferOwnership(address)": FunctionFragment; + "undelegate(address)": FunctionFragment; + "unpause(uint256)": FunctionFragment; + "updateOperatorMetadataURI(string)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "DELEGATION_APPROVAL_TYPEHASH" + | "DOMAIN_TYPEHASH" + | "MAX_STAKER_OPT_OUT_WINDOW_BLOCKS" + | "MAX_WITHDRAWAL_DELAY_BLOCKS" + | "STAKER_DELEGATION_TYPEHASH" + | "beaconChainETHStrategy" + | "calculateCurrentStakerDelegationDigestHash" + | "calculateDelegationApprovalDigestHash" + | "calculateStakerDelegationDigestHash" + | "calculateWithdrawalRoot" + | "completeQueuedWithdrawal" + | "completeQueuedWithdrawals" + | "cumulativeWithdrawalsQueued" + | "decreaseDelegatedShares" + | "delegateTo" + | "delegateToBySignature" + | "delegatedTo" + | "delegationApprover" + | "delegationApproverSaltIsSpent" + | "domainSeparator" + | "eigenPodManager" + | "getDelegatableShares" + | "getOperatorShares" + | "getWithdrawalDelay" + | "increaseDelegatedShares" + | "initialize" + | "isDelegated" + | "isOperator" + | "minWithdrawalDelayBlocks" + | "modifyOperatorDetails" + | "operatorDetails" + | "operatorShares" + | "owner" + | "pause" + | "pauseAll" + | "paused(uint8)" + | "paused()" + | "pauserRegistry" + | "pendingWithdrawals" + | "queueWithdrawals" + | "registerAsOperator" + | "renounceOwnership" + | "setMinWithdrawalDelayBlocks" + | "setPauserRegistry" + | "setStrategyWithdrawalDelayBlocks" + | "slasher" + | "stakerNonce" + | "stakerOptOutWindowBlocks" + | "strategyManager" + | "strategyWithdrawalDelayBlocks" + | "transferOwnership" + | "undelegate" + | "unpause" + | "updateOperatorMetadataURI" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "DELEGATION_APPROVAL_TYPEHASH", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "DOMAIN_TYPEHASH", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "MAX_STAKER_OPT_OUT_WINDOW_BLOCKS", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "MAX_WITHDRAWAL_DELAY_BLOCKS", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "STAKER_DELEGATION_TYPEHASH", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "beaconChainETHStrategy", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "calculateCurrentStakerDelegationDigestHash", + values: [string, string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "calculateDelegationApprovalDigestHash", + values: [string, string, string, BytesLike, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "calculateStakerDelegationDigestHash", + values: [string, BigNumberish, string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "calculateWithdrawalRoot", + values: [IDelegationManager.WithdrawalStruct] + ): string; + encodeFunctionData( + functionFragment: "completeQueuedWithdrawal", + values: [ + IDelegationManager.WithdrawalStruct, + string[], + BigNumberish, + boolean + ] + ): string; + encodeFunctionData( + functionFragment: "completeQueuedWithdrawals", + values: [ + IDelegationManager.WithdrawalStruct[], + string[][], + BigNumberish[], + boolean[] + ] + ): string; + encodeFunctionData( + functionFragment: "cumulativeWithdrawalsQueued", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "decreaseDelegatedShares", + values: [string, string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "delegateTo", + values: [string, ISignatureUtils.SignatureWithExpiryStruct, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "delegateToBySignature", + values: [ + string, + string, + ISignatureUtils.SignatureWithExpiryStruct, + ISignatureUtils.SignatureWithExpiryStruct, + BytesLike + ] + ): string; + encodeFunctionData(functionFragment: "delegatedTo", values: [string]): string; + encodeFunctionData( + functionFragment: "delegationApprover", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "delegationApproverSaltIsSpent", + values: [string, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "domainSeparator", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "eigenPodManager", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getDelegatableShares", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "getOperatorShares", + values: [string, string[]] + ): string; + encodeFunctionData( + functionFragment: "getWithdrawalDelay", + values: [string[]] + ): string; + encodeFunctionData( + functionFragment: "increaseDelegatedShares", + values: [string, string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "initialize", + values: [ + string, + string, + BigNumberish, + BigNumberish, + string[], + BigNumberish[] + ] + ): string; + encodeFunctionData(functionFragment: "isDelegated", values: [string]): string; + encodeFunctionData(functionFragment: "isOperator", values: [string]): string; + encodeFunctionData( + functionFragment: "minWithdrawalDelayBlocks", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "modifyOperatorDetails", + values: [IDelegationManager.OperatorDetailsStruct] + ): string; + encodeFunctionData( + functionFragment: "operatorDetails", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "operatorShares", + values: [string, string] + ): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData(functionFragment: "pause", values: [BigNumberish]): string; + encodeFunctionData(functionFragment: "pauseAll", values?: undefined): string; + encodeFunctionData( + functionFragment: "paused(uint8)", + values: [BigNumberish] + ): string; + encodeFunctionData(functionFragment: "paused()", values?: undefined): string; + encodeFunctionData( + functionFragment: "pauserRegistry", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "pendingWithdrawals", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "queueWithdrawals", + values: [IDelegationManager.QueuedWithdrawalParamsStruct[]] + ): string; + encodeFunctionData( + functionFragment: "registerAsOperator", + values: [IDelegationManager.OperatorDetailsStruct, string] + ): string; + encodeFunctionData( + functionFragment: "renounceOwnership", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "setMinWithdrawalDelayBlocks", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "setPauserRegistry", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "setStrategyWithdrawalDelayBlocks", + values: [string[], BigNumberish[]] + ): string; + encodeFunctionData(functionFragment: "slasher", values?: undefined): string; + encodeFunctionData(functionFragment: "stakerNonce", values: [string]): string; + encodeFunctionData( + functionFragment: "stakerOptOutWindowBlocks", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "strategyManager", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "strategyWithdrawalDelayBlocks", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", + values: [string] + ): string; + encodeFunctionData(functionFragment: "undelegate", values: [string]): string; + encodeFunctionData( + functionFragment: "unpause", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "updateOperatorMetadataURI", + values: [string] + ): string; + + decodeFunctionResult( + functionFragment: "DELEGATION_APPROVAL_TYPEHASH", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "DOMAIN_TYPEHASH", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "MAX_STAKER_OPT_OUT_WINDOW_BLOCKS", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "MAX_WITHDRAWAL_DELAY_BLOCKS", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "STAKER_DELEGATION_TYPEHASH", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "beaconChainETHStrategy", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "calculateCurrentStakerDelegationDigestHash", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "calculateDelegationApprovalDigestHash", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "calculateStakerDelegationDigestHash", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "calculateWithdrawalRoot", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "completeQueuedWithdrawal", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "completeQueuedWithdrawals", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "cumulativeWithdrawalsQueued", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "decreaseDelegatedShares", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "delegateTo", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "delegateToBySignature", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "delegatedTo", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "delegationApprover", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "delegationApproverSaltIsSpent", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "domainSeparator", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "eigenPodManager", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getDelegatableShares", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getOperatorShares", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getWithdrawalDelay", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "increaseDelegatedShares", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "isDelegated", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "isOperator", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "minWithdrawalDelayBlocks", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "modifyOperatorDetails", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "operatorDetails", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "operatorShares", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "pause", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "pauseAll", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "paused(uint8)", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "paused()", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "pauserRegistry", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "pendingWithdrawals", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "queueWithdrawals", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "registerAsOperator", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "renounceOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setMinWithdrawalDelayBlocks", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setPauserRegistry", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setStrategyWithdrawalDelayBlocks", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "slasher", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "stakerNonce", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "stakerOptOutWindowBlocks", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "strategyManager", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "strategyWithdrawalDelayBlocks", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "transferOwnership", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "undelegate", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "unpause", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "updateOperatorMetadataURI", + data: BytesLike + ): Result; + + events: { + "Initialized(uint8)": EventFragment; + "MinWithdrawalDelayBlocksSet(uint256,uint256)": EventFragment; + "OperatorDetailsModified(address,(address,address,uint32))": EventFragment; + "OperatorMetadataURIUpdated(address,string)": EventFragment; + "OperatorRegistered(address,(address,address,uint32))": EventFragment; + "OperatorSharesDecreased(address,address,address,uint256)": EventFragment; + "OperatorSharesIncreased(address,address,address,uint256)": EventFragment; + "OwnershipTransferred(address,address)": EventFragment; + "Paused(address,uint256)": EventFragment; + "PauserRegistrySet(address,address)": EventFragment; + "StakerDelegated(address,address)": EventFragment; + "StakerForceUndelegated(address,address)": EventFragment; + "StakerUndelegated(address,address)": EventFragment; + "StrategyWithdrawalDelayBlocksSet(address,uint256,uint256)": EventFragment; + "Unpaused(address,uint256)": EventFragment; + "WithdrawalCompleted(bytes32)": EventFragment; + "WithdrawalQueued(bytes32,(address,address,address,uint256,uint32,address[],uint256[]))": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; + getEvent( + nameOrSignatureOrTopic: "MinWithdrawalDelayBlocksSet" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "OperatorDetailsModified"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OperatorMetadataURIUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OperatorRegistered"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OperatorSharesDecreased"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OperatorSharesIncreased"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Paused"): EventFragment; + getEvent(nameOrSignatureOrTopic: "PauserRegistrySet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "StakerDelegated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "StakerForceUndelegated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "StakerUndelegated"): EventFragment; + getEvent( + nameOrSignatureOrTopic: "StrategyWithdrawalDelayBlocksSet" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "Unpaused"): EventFragment; + getEvent(nameOrSignatureOrTopic: "WithdrawalCompleted"): EventFragment; + getEvent(nameOrSignatureOrTopic: "WithdrawalQueued"): EventFragment; +} + +export interface InitializedEventObject { + version: number; +} +export type InitializedEvent = TypedEvent<[number], InitializedEventObject>; + +export type InitializedEventFilter = TypedEventFilter; + +export interface MinWithdrawalDelayBlocksSetEventObject { + previousValue: BigNumber; + newValue: BigNumber; +} +export type MinWithdrawalDelayBlocksSetEvent = TypedEvent< + [BigNumber, BigNumber], + MinWithdrawalDelayBlocksSetEventObject +>; + +export type MinWithdrawalDelayBlocksSetEventFilter = + TypedEventFilter; + +export interface OperatorDetailsModifiedEventObject { + operator: string; + newOperatorDetails: IDelegationManager.OperatorDetailsStructOutput; +} +export type OperatorDetailsModifiedEvent = TypedEvent< + [string, IDelegationManager.OperatorDetailsStructOutput], + OperatorDetailsModifiedEventObject +>; + +export type OperatorDetailsModifiedEventFilter = + TypedEventFilter; + +export interface OperatorMetadataURIUpdatedEventObject { + operator: string; + metadataURI: string; +} +export type OperatorMetadataURIUpdatedEvent = TypedEvent< + [string, string], + OperatorMetadataURIUpdatedEventObject +>; + +export type OperatorMetadataURIUpdatedEventFilter = + TypedEventFilter; + +export interface OperatorRegisteredEventObject { + operator: string; + operatorDetails: IDelegationManager.OperatorDetailsStructOutput; +} +export type OperatorRegisteredEvent = TypedEvent< + [string, IDelegationManager.OperatorDetailsStructOutput], + OperatorRegisteredEventObject +>; + +export type OperatorRegisteredEventFilter = + TypedEventFilter; + +export interface OperatorSharesDecreasedEventObject { + operator: string; + staker: string; + strategy: string; + shares: BigNumber; +} +export type OperatorSharesDecreasedEvent = TypedEvent< + [string, string, string, BigNumber], + OperatorSharesDecreasedEventObject +>; + +export type OperatorSharesDecreasedEventFilter = + TypedEventFilter; + +export interface OperatorSharesIncreasedEventObject { + operator: string; + staker: string; + strategy: string; + shares: BigNumber; +} +export type OperatorSharesIncreasedEvent = TypedEvent< + [string, string, string, BigNumber], + OperatorSharesIncreasedEventObject +>; + +export type OperatorSharesIncreasedEventFilter = + TypedEventFilter; + +export interface OwnershipTransferredEventObject { + previousOwner: string; + newOwner: string; +} +export type OwnershipTransferredEvent = TypedEvent< + [string, string], + OwnershipTransferredEventObject +>; + +export type OwnershipTransferredEventFilter = + TypedEventFilter; + +export interface PausedEventObject { + account: string; + newPausedStatus: BigNumber; +} +export type PausedEvent = TypedEvent<[string, BigNumber], PausedEventObject>; + +export type PausedEventFilter = TypedEventFilter; + +export interface PauserRegistrySetEventObject { + pauserRegistry: string; + newPauserRegistry: string; +} +export type PauserRegistrySetEvent = TypedEvent< + [string, string], + PauserRegistrySetEventObject +>; + +export type PauserRegistrySetEventFilter = + TypedEventFilter; + +export interface StakerDelegatedEventObject { + staker: string; + operator: string; +} +export type StakerDelegatedEvent = TypedEvent< + [string, string], + StakerDelegatedEventObject +>; + +export type StakerDelegatedEventFilter = TypedEventFilter; + +export interface StakerForceUndelegatedEventObject { + staker: string; + operator: string; +} +export type StakerForceUndelegatedEvent = TypedEvent< + [string, string], + StakerForceUndelegatedEventObject +>; + +export type StakerForceUndelegatedEventFilter = + TypedEventFilter; + +export interface StakerUndelegatedEventObject { + staker: string; + operator: string; +} +export type StakerUndelegatedEvent = TypedEvent< + [string, string], + StakerUndelegatedEventObject +>; + +export type StakerUndelegatedEventFilter = + TypedEventFilter; + +export interface StrategyWithdrawalDelayBlocksSetEventObject { + strategy: string; + previousValue: BigNumber; + newValue: BigNumber; +} +export type StrategyWithdrawalDelayBlocksSetEvent = TypedEvent< + [string, BigNumber, BigNumber], + StrategyWithdrawalDelayBlocksSetEventObject +>; + +export type StrategyWithdrawalDelayBlocksSetEventFilter = + TypedEventFilter; + +export interface UnpausedEventObject { + account: string; + newPausedStatus: BigNumber; +} +export type UnpausedEvent = TypedEvent< + [string, BigNumber], + UnpausedEventObject +>; + +export type UnpausedEventFilter = TypedEventFilter; + +export interface WithdrawalCompletedEventObject { + withdrawalRoot: string; +} +export type WithdrawalCompletedEvent = TypedEvent< + [string], + WithdrawalCompletedEventObject +>; + +export type WithdrawalCompletedEventFilter = + TypedEventFilter; + +export interface WithdrawalQueuedEventObject { + withdrawalRoot: string; + withdrawal: IDelegationManager.WithdrawalStructOutput; +} +export type WithdrawalQueuedEvent = TypedEvent< + [string, IDelegationManager.WithdrawalStructOutput], + WithdrawalQueuedEventObject +>; + +export type WithdrawalQueuedEventFilter = + TypedEventFilter; + +export interface DelegationManager extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: DelegationManagerInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + DELEGATION_APPROVAL_TYPEHASH(overrides?: CallOverrides): Promise<[string]>; + + DOMAIN_TYPEHASH(overrides?: CallOverrides): Promise<[string]>; + + MAX_STAKER_OPT_OUT_WINDOW_BLOCKS( + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + MAX_WITHDRAWAL_DELAY_BLOCKS( + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + STAKER_DELEGATION_TYPEHASH(overrides?: CallOverrides): Promise<[string]>; + + beaconChainETHStrategy(overrides?: CallOverrides): Promise<[string]>; + + calculateCurrentStakerDelegationDigestHash( + staker: string, + operator: string, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + calculateDelegationApprovalDigestHash( + staker: string, + operator: string, + _delegationApprover: string, + approverSalt: BytesLike, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + calculateStakerDelegationDigestHash( + staker: string, + _stakerNonce: BigNumberish, + operator: string, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + calculateWithdrawalRoot( + withdrawal: IDelegationManager.WithdrawalStruct, + overrides?: CallOverrides + ): Promise<[string]>; + + completeQueuedWithdrawal( + withdrawal: IDelegationManager.WithdrawalStruct, + tokens: string[], + middlewareTimesIndex: BigNumberish, + receiveAsTokens: boolean, + overrides?: Overrides & { from?: string } + ): Promise; + + completeQueuedWithdrawals( + withdrawals: IDelegationManager.WithdrawalStruct[], + tokens: string[][], + middlewareTimesIndexes: BigNumberish[], + receiveAsTokens: boolean[], + overrides?: Overrides & { from?: string } + ): Promise; + + cumulativeWithdrawalsQueued( + arg0: string, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + decreaseDelegatedShares( + staker: string, + strategy: string, + shares: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + delegateTo( + operator: string, + approverSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, + approverSalt: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + delegateToBySignature( + staker: string, + operator: string, + stakerSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, + approverSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, + approverSalt: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + delegatedTo(arg0: string, overrides?: CallOverrides): Promise<[string]>; + + delegationApprover( + operator: string, + overrides?: CallOverrides + ): Promise<[string]>; + + delegationApproverSaltIsSpent( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean]>; + + domainSeparator(overrides?: CallOverrides): Promise<[string]>; + + eigenPodManager(overrides?: CallOverrides): Promise<[string]>; + + getDelegatableShares( + staker: string, + overrides?: CallOverrides + ): Promise<[string[], BigNumber[]]>; + + getOperatorShares( + operator: string, + strategies: string[], + overrides?: CallOverrides + ): Promise<[BigNumber[]]>; + + getWithdrawalDelay( + strategies: string[], + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + increaseDelegatedShares( + staker: string, + strategy: string, + shares: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + initialize( + initialOwner: string, + _pauserRegistry: string, + initialPausedStatus: BigNumberish, + _minWithdrawalDelayBlocks: BigNumberish, + _strategies: string[], + _withdrawalDelayBlocks: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + isDelegated(staker: string, overrides?: CallOverrides): Promise<[boolean]>; + + isOperator(operator: string, overrides?: CallOverrides): Promise<[boolean]>; + + minWithdrawalDelayBlocks(overrides?: CallOverrides): Promise<[BigNumber]>; + + modifyOperatorDetails( + newOperatorDetails: IDelegationManager.OperatorDetailsStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + operatorDetails( + operator: string, + overrides?: CallOverrides + ): Promise<[IDelegationManager.OperatorDetailsStructOutput]>; + + operatorShares( + arg0: string, + arg1: string, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + owner(overrides?: CallOverrides): Promise<[string]>; + + pause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + pauseAll( + overrides?: Overrides & { from?: string } + ): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise<[boolean]>; + + "paused()"(overrides?: CallOverrides): Promise<[BigNumber]>; + + pauserRegistry(overrides?: CallOverrides): Promise<[string]>; + + pendingWithdrawals( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean]>; + + queueWithdrawals( + queuedWithdrawalParams: IDelegationManager.QueuedWithdrawalParamsStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + registerAsOperator( + registeringOperatorDetails: IDelegationManager.OperatorDetailsStruct, + metadataURI: string, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + setMinWithdrawalDelayBlocks( + newMinWithdrawalDelayBlocks: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setPauserRegistry( + newPauserRegistry: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setStrategyWithdrawalDelayBlocks( + strategies: string[], + withdrawalDelayBlocks: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + slasher(overrides?: CallOverrides): Promise<[string]>; + + stakerNonce(arg0: string, overrides?: CallOverrides): Promise<[BigNumber]>; + + stakerOptOutWindowBlocks( + operator: string, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + strategyManager(overrides?: CallOverrides): Promise<[string]>; + + strategyWithdrawalDelayBlocks( + arg0: string, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + undelegate( + staker: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + updateOperatorMetadataURI( + metadataURI: string, + overrides?: Overrides & { from?: string } + ): Promise; + }; + + DELEGATION_APPROVAL_TYPEHASH(overrides?: CallOverrides): Promise; + + DOMAIN_TYPEHASH(overrides?: CallOverrides): Promise; + + MAX_STAKER_OPT_OUT_WINDOW_BLOCKS( + overrides?: CallOverrides + ): Promise; + + MAX_WITHDRAWAL_DELAY_BLOCKS(overrides?: CallOverrides): Promise; + + STAKER_DELEGATION_TYPEHASH(overrides?: CallOverrides): Promise; + + beaconChainETHStrategy(overrides?: CallOverrides): Promise; + + calculateCurrentStakerDelegationDigestHash( + staker: string, + operator: string, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise; + + calculateDelegationApprovalDigestHash( + staker: string, + operator: string, + _delegationApprover: string, + approverSalt: BytesLike, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise; + + calculateStakerDelegationDigestHash( + staker: string, + _stakerNonce: BigNumberish, + operator: string, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise; + + calculateWithdrawalRoot( + withdrawal: IDelegationManager.WithdrawalStruct, + overrides?: CallOverrides + ): Promise; + + completeQueuedWithdrawal( + withdrawal: IDelegationManager.WithdrawalStruct, + tokens: string[], + middlewareTimesIndex: BigNumberish, + receiveAsTokens: boolean, + overrides?: Overrides & { from?: string } + ): Promise; + + completeQueuedWithdrawals( + withdrawals: IDelegationManager.WithdrawalStruct[], + tokens: string[][], + middlewareTimesIndexes: BigNumberish[], + receiveAsTokens: boolean[], + overrides?: Overrides & { from?: string } + ): Promise; + + cumulativeWithdrawalsQueued( + arg0: string, + overrides?: CallOverrides + ): Promise; + + decreaseDelegatedShares( + staker: string, + strategy: string, + shares: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + delegateTo( + operator: string, + approverSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, + approverSalt: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + delegateToBySignature( + staker: string, + operator: string, + stakerSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, + approverSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, + approverSalt: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + delegatedTo(arg0: string, overrides?: CallOverrides): Promise; + + delegationApprover( + operator: string, + overrides?: CallOverrides + ): Promise; + + delegationApproverSaltIsSpent( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + domainSeparator(overrides?: CallOverrides): Promise; + + eigenPodManager(overrides?: CallOverrides): Promise; + + getDelegatableShares( + staker: string, + overrides?: CallOverrides + ): Promise<[string[], BigNumber[]]>; + + getOperatorShares( + operator: string, + strategies: string[], + overrides?: CallOverrides + ): Promise; + + getWithdrawalDelay( + strategies: string[], + overrides?: CallOverrides + ): Promise; + + increaseDelegatedShares( + staker: string, + strategy: string, + shares: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + initialize( + initialOwner: string, + _pauserRegistry: string, + initialPausedStatus: BigNumberish, + _minWithdrawalDelayBlocks: BigNumberish, + _strategies: string[], + _withdrawalDelayBlocks: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + isDelegated(staker: string, overrides?: CallOverrides): Promise; + + isOperator(operator: string, overrides?: CallOverrides): Promise; + + minWithdrawalDelayBlocks(overrides?: CallOverrides): Promise; + + modifyOperatorDetails( + newOperatorDetails: IDelegationManager.OperatorDetailsStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + operatorDetails( + operator: string, + overrides?: CallOverrides + ): Promise; + + operatorShares( + arg0: string, + arg1: string, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + pauseAll( + overrides?: Overrides & { from?: string } + ): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + pauserRegistry(overrides?: CallOverrides): Promise; + + pendingWithdrawals( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + queueWithdrawals( + queuedWithdrawalParams: IDelegationManager.QueuedWithdrawalParamsStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + registerAsOperator( + registeringOperatorDetails: IDelegationManager.OperatorDetailsStruct, + metadataURI: string, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + setMinWithdrawalDelayBlocks( + newMinWithdrawalDelayBlocks: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setPauserRegistry( + newPauserRegistry: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setStrategyWithdrawalDelayBlocks( + strategies: string[], + withdrawalDelayBlocks: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + slasher(overrides?: CallOverrides): Promise; + + stakerNonce(arg0: string, overrides?: CallOverrides): Promise; + + stakerOptOutWindowBlocks( + operator: string, + overrides?: CallOverrides + ): Promise; + + strategyManager(overrides?: CallOverrides): Promise; + + strategyWithdrawalDelayBlocks( + arg0: string, + overrides?: CallOverrides + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + undelegate( + staker: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + updateOperatorMetadataURI( + metadataURI: string, + overrides?: Overrides & { from?: string } + ): Promise; + + callStatic: { + DELEGATION_APPROVAL_TYPEHASH(overrides?: CallOverrides): Promise; + + DOMAIN_TYPEHASH(overrides?: CallOverrides): Promise; + + MAX_STAKER_OPT_OUT_WINDOW_BLOCKS( + overrides?: CallOverrides + ): Promise; + + MAX_WITHDRAWAL_DELAY_BLOCKS(overrides?: CallOverrides): Promise; + + STAKER_DELEGATION_TYPEHASH(overrides?: CallOverrides): Promise; + + beaconChainETHStrategy(overrides?: CallOverrides): Promise; + + calculateCurrentStakerDelegationDigestHash( + staker: string, + operator: string, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise; + + calculateDelegationApprovalDigestHash( + staker: string, + operator: string, + _delegationApprover: string, + approverSalt: BytesLike, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise; + + calculateStakerDelegationDigestHash( + staker: string, + _stakerNonce: BigNumberish, + operator: string, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise; + + calculateWithdrawalRoot( + withdrawal: IDelegationManager.WithdrawalStruct, + overrides?: CallOverrides + ): Promise; + + completeQueuedWithdrawal( + withdrawal: IDelegationManager.WithdrawalStruct, + tokens: string[], + middlewareTimesIndex: BigNumberish, + receiveAsTokens: boolean, + overrides?: CallOverrides + ): Promise; + + completeQueuedWithdrawals( + withdrawals: IDelegationManager.WithdrawalStruct[], + tokens: string[][], + middlewareTimesIndexes: BigNumberish[], + receiveAsTokens: boolean[], + overrides?: CallOverrides + ): Promise; + + cumulativeWithdrawalsQueued( + arg0: string, + overrides?: CallOverrides + ): Promise; + + decreaseDelegatedShares( + staker: string, + strategy: string, + shares: BigNumberish, + overrides?: CallOverrides + ): Promise; + + delegateTo( + operator: string, + approverSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, + approverSalt: BytesLike, + overrides?: CallOverrides + ): Promise; + + delegateToBySignature( + staker: string, + operator: string, + stakerSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, + approverSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, + approverSalt: BytesLike, + overrides?: CallOverrides + ): Promise; + + delegatedTo(arg0: string, overrides?: CallOverrides): Promise; + + delegationApprover( + operator: string, + overrides?: CallOverrides + ): Promise; + + delegationApproverSaltIsSpent( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + domainSeparator(overrides?: CallOverrides): Promise; + + eigenPodManager(overrides?: CallOverrides): Promise; + + getDelegatableShares( + staker: string, + overrides?: CallOverrides + ): Promise<[string[], BigNumber[]]>; + + getOperatorShares( + operator: string, + strategies: string[], + overrides?: CallOverrides + ): Promise; + + getWithdrawalDelay( + strategies: string[], + overrides?: CallOverrides + ): Promise; + + increaseDelegatedShares( + staker: string, + strategy: string, + shares: BigNumberish, + overrides?: CallOverrides + ): Promise; + + initialize( + initialOwner: string, + _pauserRegistry: string, + initialPausedStatus: BigNumberish, + _minWithdrawalDelayBlocks: BigNumberish, + _strategies: string[], + _withdrawalDelayBlocks: BigNumberish[], + overrides?: CallOverrides + ): Promise; + + isDelegated(staker: string, overrides?: CallOverrides): Promise; + + isOperator(operator: string, overrides?: CallOverrides): Promise; + + minWithdrawalDelayBlocks(overrides?: CallOverrides): Promise; + + modifyOperatorDetails( + newOperatorDetails: IDelegationManager.OperatorDetailsStruct, + overrides?: CallOverrides + ): Promise; + + operatorDetails( + operator: string, + overrides?: CallOverrides + ): Promise; + + operatorShares( + arg0: string, + arg1: string, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pause( + newPausedStatus: BigNumberish, + overrides?: CallOverrides + ): Promise; + + pauseAll(overrides?: CallOverrides): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + pauserRegistry(overrides?: CallOverrides): Promise; + + pendingWithdrawals( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + queueWithdrawals( + queuedWithdrawalParams: IDelegationManager.QueuedWithdrawalParamsStruct[], + overrides?: CallOverrides + ): Promise; + + registerAsOperator( + registeringOperatorDetails: IDelegationManager.OperatorDetailsStruct, + metadataURI: string, + overrides?: CallOverrides + ): Promise; + + renounceOwnership(overrides?: CallOverrides): Promise; + + setMinWithdrawalDelayBlocks( + newMinWithdrawalDelayBlocks: BigNumberish, + overrides?: CallOverrides + ): Promise; + + setPauserRegistry( + newPauserRegistry: string, + overrides?: CallOverrides + ): Promise; + + setStrategyWithdrawalDelayBlocks( + strategies: string[], + withdrawalDelayBlocks: BigNumberish[], + overrides?: CallOverrides + ): Promise; + + slasher(overrides?: CallOverrides): Promise; + + stakerNonce(arg0: string, overrides?: CallOverrides): Promise; + + stakerOptOutWindowBlocks( + operator: string, + overrides?: CallOverrides + ): Promise; + + strategyManager(overrides?: CallOverrides): Promise; + + strategyWithdrawalDelayBlocks( + arg0: string, + overrides?: CallOverrides + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: CallOverrides + ): Promise; + + undelegate(staker: string, overrides?: CallOverrides): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: CallOverrides + ): Promise; + + updateOperatorMetadataURI( + metadataURI: string, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "Initialized(uint8)"(version?: null): InitializedEventFilter; + Initialized(version?: null): InitializedEventFilter; + + "MinWithdrawalDelayBlocksSet(uint256,uint256)"( + previousValue?: null, + newValue?: null + ): MinWithdrawalDelayBlocksSetEventFilter; + MinWithdrawalDelayBlocksSet( + previousValue?: null, + newValue?: null + ): MinWithdrawalDelayBlocksSetEventFilter; + + "OperatorDetailsModified(address,(address,address,uint32))"( + operator?: string | null, + newOperatorDetails?: null + ): OperatorDetailsModifiedEventFilter; + OperatorDetailsModified( + operator?: string | null, + newOperatorDetails?: null + ): OperatorDetailsModifiedEventFilter; + + "OperatorMetadataURIUpdated(address,string)"( + operator?: string | null, + metadataURI?: null + ): OperatorMetadataURIUpdatedEventFilter; + OperatorMetadataURIUpdated( + operator?: string | null, + metadataURI?: null + ): OperatorMetadataURIUpdatedEventFilter; + + "OperatorRegistered(address,(address,address,uint32))"( + operator?: string | null, + operatorDetails?: null + ): OperatorRegisteredEventFilter; + OperatorRegistered( + operator?: string | null, + operatorDetails?: null + ): OperatorRegisteredEventFilter; + + "OperatorSharesDecreased(address,address,address,uint256)"( + operator?: string | null, + staker?: null, + strategy?: null, + shares?: null + ): OperatorSharesDecreasedEventFilter; + OperatorSharesDecreased( + operator?: string | null, + staker?: null, + strategy?: null, + shares?: null + ): OperatorSharesDecreasedEventFilter; + + "OperatorSharesIncreased(address,address,address,uint256)"( + operator?: string | null, + staker?: null, + strategy?: null, + shares?: null + ): OperatorSharesIncreasedEventFilter; + OperatorSharesIncreased( + operator?: string | null, + staker?: null, + strategy?: null, + shares?: null + ): OperatorSharesIncreasedEventFilter; + + "OwnershipTransferred(address,address)"( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + OwnershipTransferred( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + + "Paused(address,uint256)"( + account?: string | null, + newPausedStatus?: null + ): PausedEventFilter; + Paused(account?: string | null, newPausedStatus?: null): PausedEventFilter; + + "PauserRegistrySet(address,address)"( + pauserRegistry?: null, + newPauserRegistry?: null + ): PauserRegistrySetEventFilter; + PauserRegistrySet( + pauserRegistry?: null, + newPauserRegistry?: null + ): PauserRegistrySetEventFilter; + + "StakerDelegated(address,address)"( + staker?: string | null, + operator?: string | null + ): StakerDelegatedEventFilter; + StakerDelegated( + staker?: string | null, + operator?: string | null + ): StakerDelegatedEventFilter; + + "StakerForceUndelegated(address,address)"( + staker?: string | null, + operator?: string | null + ): StakerForceUndelegatedEventFilter; + StakerForceUndelegated( + staker?: string | null, + operator?: string | null + ): StakerForceUndelegatedEventFilter; + + "StakerUndelegated(address,address)"( + staker?: string | null, + operator?: string | null + ): StakerUndelegatedEventFilter; + StakerUndelegated( + staker?: string | null, + operator?: string | null + ): StakerUndelegatedEventFilter; + + "StrategyWithdrawalDelayBlocksSet(address,uint256,uint256)"( + strategy?: null, + previousValue?: null, + newValue?: null + ): StrategyWithdrawalDelayBlocksSetEventFilter; + StrategyWithdrawalDelayBlocksSet( + strategy?: null, + previousValue?: null, + newValue?: null + ): StrategyWithdrawalDelayBlocksSetEventFilter; + + "Unpaused(address,uint256)"( + account?: string | null, + newPausedStatus?: null + ): UnpausedEventFilter; + Unpaused( + account?: string | null, + newPausedStatus?: null + ): UnpausedEventFilter; + + "WithdrawalCompleted(bytes32)"( + withdrawalRoot?: null + ): WithdrawalCompletedEventFilter; + WithdrawalCompleted(withdrawalRoot?: null): WithdrawalCompletedEventFilter; + + "WithdrawalQueued(bytes32,(address,address,address,uint256,uint32,address[],uint256[]))"( + withdrawalRoot?: null, + withdrawal?: null + ): WithdrawalQueuedEventFilter; + WithdrawalQueued( + withdrawalRoot?: null, + withdrawal?: null + ): WithdrawalQueuedEventFilter; + }; + + estimateGas: { + DELEGATION_APPROVAL_TYPEHASH(overrides?: CallOverrides): Promise; + + DOMAIN_TYPEHASH(overrides?: CallOverrides): Promise; + + MAX_STAKER_OPT_OUT_WINDOW_BLOCKS( + overrides?: CallOverrides + ): Promise; + + MAX_WITHDRAWAL_DELAY_BLOCKS(overrides?: CallOverrides): Promise; + + STAKER_DELEGATION_TYPEHASH(overrides?: CallOverrides): Promise; + + beaconChainETHStrategy(overrides?: CallOverrides): Promise; + + calculateCurrentStakerDelegationDigestHash( + staker: string, + operator: string, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise; + + calculateDelegationApprovalDigestHash( + staker: string, + operator: string, + _delegationApprover: string, + approverSalt: BytesLike, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise; + + calculateStakerDelegationDigestHash( + staker: string, + _stakerNonce: BigNumberish, + operator: string, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise; + + calculateWithdrawalRoot( + withdrawal: IDelegationManager.WithdrawalStruct, + overrides?: CallOverrides + ): Promise; + + completeQueuedWithdrawal( + withdrawal: IDelegationManager.WithdrawalStruct, + tokens: string[], + middlewareTimesIndex: BigNumberish, + receiveAsTokens: boolean, + overrides?: Overrides & { from?: string } + ): Promise; + + completeQueuedWithdrawals( + withdrawals: IDelegationManager.WithdrawalStruct[], + tokens: string[][], + middlewareTimesIndexes: BigNumberish[], + receiveAsTokens: boolean[], + overrides?: Overrides & { from?: string } + ): Promise; + + cumulativeWithdrawalsQueued( + arg0: string, + overrides?: CallOverrides + ): Promise; + + decreaseDelegatedShares( + staker: string, + strategy: string, + shares: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + delegateTo( + operator: string, + approverSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, + approverSalt: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + delegateToBySignature( + staker: string, + operator: string, + stakerSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, + approverSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, + approverSalt: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + delegatedTo(arg0: string, overrides?: CallOverrides): Promise; + + delegationApprover( + operator: string, + overrides?: CallOverrides + ): Promise; + + delegationApproverSaltIsSpent( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + domainSeparator(overrides?: CallOverrides): Promise; + + eigenPodManager(overrides?: CallOverrides): Promise; + + getDelegatableShares( + staker: string, + overrides?: CallOverrides + ): Promise; + + getOperatorShares( + operator: string, + strategies: string[], + overrides?: CallOverrides + ): Promise; + + getWithdrawalDelay( + strategies: string[], + overrides?: CallOverrides + ): Promise; + + increaseDelegatedShares( + staker: string, + strategy: string, + shares: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + initialize( + initialOwner: string, + _pauserRegistry: string, + initialPausedStatus: BigNumberish, + _minWithdrawalDelayBlocks: BigNumberish, + _strategies: string[], + _withdrawalDelayBlocks: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + isDelegated(staker: string, overrides?: CallOverrides): Promise; + + isOperator(operator: string, overrides?: CallOverrides): Promise; + + minWithdrawalDelayBlocks(overrides?: CallOverrides): Promise; + + modifyOperatorDetails( + newOperatorDetails: IDelegationManager.OperatorDetailsStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + operatorDetails( + operator: string, + overrides?: CallOverrides + ): Promise; + + operatorShares( + arg0: string, + arg1: string, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + pauseAll(overrides?: Overrides & { from?: string }): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + pauserRegistry(overrides?: CallOverrides): Promise; + + pendingWithdrawals( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + queueWithdrawals( + queuedWithdrawalParams: IDelegationManager.QueuedWithdrawalParamsStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + registerAsOperator( + registeringOperatorDetails: IDelegationManager.OperatorDetailsStruct, + metadataURI: string, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + setMinWithdrawalDelayBlocks( + newMinWithdrawalDelayBlocks: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setPauserRegistry( + newPauserRegistry: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setStrategyWithdrawalDelayBlocks( + strategies: string[], + withdrawalDelayBlocks: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + slasher(overrides?: CallOverrides): Promise; + + stakerNonce(arg0: string, overrides?: CallOverrides): Promise; + + stakerOptOutWindowBlocks( + operator: string, + overrides?: CallOverrides + ): Promise; + + strategyManager(overrides?: CallOverrides): Promise; + + strategyWithdrawalDelayBlocks( + arg0: string, + overrides?: CallOverrides + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + undelegate( + staker: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + updateOperatorMetadataURI( + metadataURI: string, + overrides?: Overrides & { from?: string } + ): Promise; + }; + + populateTransaction: { + DELEGATION_APPROVAL_TYPEHASH( + overrides?: CallOverrides + ): Promise; + + DOMAIN_TYPEHASH(overrides?: CallOverrides): Promise; + + MAX_STAKER_OPT_OUT_WINDOW_BLOCKS( + overrides?: CallOverrides + ): Promise; + + MAX_WITHDRAWAL_DELAY_BLOCKS( + overrides?: CallOverrides + ): Promise; + + STAKER_DELEGATION_TYPEHASH( + overrides?: CallOverrides + ): Promise; + + beaconChainETHStrategy( + overrides?: CallOverrides + ): Promise; + + calculateCurrentStakerDelegationDigestHash( + staker: string, + operator: string, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise; + + calculateDelegationApprovalDigestHash( + staker: string, + operator: string, + _delegationApprover: string, + approverSalt: BytesLike, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise; + + calculateStakerDelegationDigestHash( + staker: string, + _stakerNonce: BigNumberish, + operator: string, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise; + + calculateWithdrawalRoot( + withdrawal: IDelegationManager.WithdrawalStruct, + overrides?: CallOverrides + ): Promise; + + completeQueuedWithdrawal( + withdrawal: IDelegationManager.WithdrawalStruct, + tokens: string[], + middlewareTimesIndex: BigNumberish, + receiveAsTokens: boolean, + overrides?: Overrides & { from?: string } + ): Promise; + + completeQueuedWithdrawals( + withdrawals: IDelegationManager.WithdrawalStruct[], + tokens: string[][], + middlewareTimesIndexes: BigNumberish[], + receiveAsTokens: boolean[], + overrides?: Overrides & { from?: string } + ): Promise; + + cumulativeWithdrawalsQueued( + arg0: string, + overrides?: CallOverrides + ): Promise; + + decreaseDelegatedShares( + staker: string, + strategy: string, + shares: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + delegateTo( + operator: string, + approverSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, + approverSalt: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + delegateToBySignature( + staker: string, + operator: string, + stakerSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, + approverSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, + approverSalt: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + delegatedTo( + arg0: string, + overrides?: CallOverrides + ): Promise; + + delegationApprover( + operator: string, + overrides?: CallOverrides + ): Promise; + + delegationApproverSaltIsSpent( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + domainSeparator(overrides?: CallOverrides): Promise; + + eigenPodManager(overrides?: CallOverrides): Promise; + + getDelegatableShares( + staker: string, + overrides?: CallOverrides + ): Promise; + + getOperatorShares( + operator: string, + strategies: string[], + overrides?: CallOverrides + ): Promise; + + getWithdrawalDelay( + strategies: string[], + overrides?: CallOverrides + ): Promise; + + increaseDelegatedShares( + staker: string, + strategy: string, + shares: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + initialize( + initialOwner: string, + _pauserRegistry: string, + initialPausedStatus: BigNumberish, + _minWithdrawalDelayBlocks: BigNumberish, + _strategies: string[], + _withdrawalDelayBlocks: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + isDelegated( + staker: string, + overrides?: CallOverrides + ): Promise; + + isOperator( + operator: string, + overrides?: CallOverrides + ): Promise; + + minWithdrawalDelayBlocks( + overrides?: CallOverrides + ): Promise; + + modifyOperatorDetails( + newOperatorDetails: IDelegationManager.OperatorDetailsStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + operatorDetails( + operator: string, + overrides?: CallOverrides + ): Promise; + + operatorShares( + arg0: string, + arg1: string, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + pauseAll( + overrides?: Overrides & { from?: string } + ): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + pauserRegistry(overrides?: CallOverrides): Promise; + + pendingWithdrawals( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + queueWithdrawals( + queuedWithdrawalParams: IDelegationManager.QueuedWithdrawalParamsStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + registerAsOperator( + registeringOperatorDetails: IDelegationManager.OperatorDetailsStruct, + metadataURI: string, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + setMinWithdrawalDelayBlocks( + newMinWithdrawalDelayBlocks: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setPauserRegistry( + newPauserRegistry: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setStrategyWithdrawalDelayBlocks( + strategies: string[], + withdrawalDelayBlocks: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + slasher(overrides?: CallOverrides): Promise; + + stakerNonce( + arg0: string, + overrides?: CallOverrides + ): Promise; + + stakerOptOutWindowBlocks( + operator: string, + overrides?: CallOverrides + ): Promise; + + strategyManager(overrides?: CallOverrides): Promise; + + strategyWithdrawalDelayBlocks( + arg0: string, + overrides?: CallOverrides + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + undelegate( + staker: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + updateOperatorMetadataURI( + metadataURI: string, + overrides?: Overrides & { from?: string } + ): Promise; + }; +} diff --git a/src/avs/contracts/ECDSAStakeRegistry.ts b/src/avs/contracts/ECDSAStakeRegistry.ts new file mode 100644 index 00000000..d2843ca1 --- /dev/null +++ b/src/avs/contracts/ECDSAStakeRegistry.ts @@ -0,0 +1,1183 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +} from "./common"; + +export type StrategyParamsStruct = { + strategy: string; + multiplier: BigNumberish; +}; + +export type StrategyParamsStructOutput = [string, BigNumber] & { + strategy: string; + multiplier: BigNumber; +}; + +export type QuorumStruct = { strategies: StrategyParamsStruct[] }; + +export type QuorumStructOutput = [StrategyParamsStructOutput[]] & { + strategies: StrategyParamsStructOutput[]; +}; + +export declare namespace ISignatureUtils { + export type SignatureWithSaltAndExpiryStruct = { + signature: BytesLike; + salt: BytesLike; + expiry: BigNumberish; + }; + + export type SignatureWithSaltAndExpiryStructOutput = [ + string, + string, + BigNumber + ] & { signature: string; salt: string; expiry: BigNumber }; +} + +export interface ECDSAStakeRegistryInterface extends utils.Interface { + functions: { + "deregisterOperator()": FunctionFragment; + "getLastCheckpointOperatorWeight(address)": FunctionFragment; + "getLastCheckpointThresholdWeight()": FunctionFragment; + "getLastCheckpointThresholdWeightAtBlock(uint32)": FunctionFragment; + "getLastCheckpointTotalWeight()": FunctionFragment; + "getLastCheckpointTotalWeightAtBlock(uint32)": FunctionFragment; + "getLastestOperatorSigningKey(address)": FunctionFragment; + "getOperatorSigningKeyAtBlock(address,uint256)": FunctionFragment; + "getOperatorWeight(address)": FunctionFragment; + "getOperatorWeightAtBlock(address,uint32)": FunctionFragment; + "initialize(address,uint256,((address,uint96)[]))": FunctionFragment; + "isValidSignature(bytes32,bytes)": FunctionFragment; + "minimumWeight()": FunctionFragment; + "operatorRegistered(address)": FunctionFragment; + "owner()": FunctionFragment; + "quorum()": FunctionFragment; + "registerOperatorWithSignature((bytes,bytes32,uint256),address)": FunctionFragment; + "renounceOwnership()": FunctionFragment; + "transferOwnership(address)": FunctionFragment; + "updateMinimumWeight(uint256,address[])": FunctionFragment; + "updateOperatorSigningKey(address)": FunctionFragment; + "updateOperators(address[])": FunctionFragment; + "updateOperatorsForQuorum(address[][],bytes)": FunctionFragment; + "updateQuorumConfig(((address,uint96)[]),address[])": FunctionFragment; + "updateStakeThreshold(uint256)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "deregisterOperator" + | "getLastCheckpointOperatorWeight" + | "getLastCheckpointThresholdWeight" + | "getLastCheckpointThresholdWeightAtBlock" + | "getLastCheckpointTotalWeight" + | "getLastCheckpointTotalWeightAtBlock" + | "getLastestOperatorSigningKey" + | "getOperatorSigningKeyAtBlock" + | "getOperatorWeight" + | "getOperatorWeightAtBlock" + | "initialize" + | "isValidSignature" + | "minimumWeight" + | "operatorRegistered" + | "owner" + | "quorum" + | "registerOperatorWithSignature" + | "renounceOwnership" + | "transferOwnership" + | "updateMinimumWeight" + | "updateOperatorSigningKey" + | "updateOperators" + | "updateOperatorsForQuorum" + | "updateQuorumConfig" + | "updateStakeThreshold" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "deregisterOperator", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getLastCheckpointOperatorWeight", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "getLastCheckpointThresholdWeight", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getLastCheckpointThresholdWeightAtBlock", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getLastCheckpointTotalWeight", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getLastCheckpointTotalWeightAtBlock", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getLastestOperatorSigningKey", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "getOperatorSigningKeyAtBlock", + values: [string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getOperatorWeight", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "getOperatorWeightAtBlock", + values: [string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "initialize", + values: [string, BigNumberish, QuorumStruct] + ): string; + encodeFunctionData( + functionFragment: "isValidSignature", + values: [BytesLike, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "minimumWeight", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "operatorRegistered", + values: [string] + ): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData(functionFragment: "quorum", values?: undefined): string; + encodeFunctionData( + functionFragment: "registerOperatorWithSignature", + values: [ISignatureUtils.SignatureWithSaltAndExpiryStruct, string] + ): string; + encodeFunctionData( + functionFragment: "renounceOwnership", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "updateMinimumWeight", + values: [BigNumberish, string[]] + ): string; + encodeFunctionData( + functionFragment: "updateOperatorSigningKey", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "updateOperators", + values: [string[]] + ): string; + encodeFunctionData( + functionFragment: "updateOperatorsForQuorum", + values: [string[][], BytesLike] + ): string; + encodeFunctionData( + functionFragment: "updateQuorumConfig", + values: [QuorumStruct, string[]] + ): string; + encodeFunctionData( + functionFragment: "updateStakeThreshold", + values: [BigNumberish] + ): string; + + decodeFunctionResult( + functionFragment: "deregisterOperator", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getLastCheckpointOperatorWeight", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getLastCheckpointThresholdWeight", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getLastCheckpointThresholdWeightAtBlock", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getLastCheckpointTotalWeight", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getLastCheckpointTotalWeightAtBlock", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getLastestOperatorSigningKey", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getOperatorSigningKeyAtBlock", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getOperatorWeight", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getOperatorWeightAtBlock", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "isValidSignature", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "minimumWeight", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "operatorRegistered", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "quorum", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "registerOperatorWithSignature", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "renounceOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "transferOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "updateMinimumWeight", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "updateOperatorSigningKey", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "updateOperators", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "updateOperatorsForQuorum", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "updateQuorumConfig", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "updateStakeThreshold", + data: BytesLike + ): Result; + + events: { + "Initialized(uint8)": EventFragment; + "MinimumWeightUpdated(uint256,uint256)": EventFragment; + "OperatorDeregistered(address,address)": EventFragment; + "OperatorRegistered(address,address)": EventFragment; + "OperatorWeightUpdated(address,uint256,uint256)": EventFragment; + "OwnershipTransferred(address,address)": EventFragment; + "QuorumUpdated(((address,uint96)[]),((address,uint96)[]))": EventFragment; + "SigningKeyUpdate(address,uint256,address,address)": EventFragment; + "ThresholdWeightUpdated(uint256)": EventFragment; + "TotalWeightUpdated(uint256,uint256)": EventFragment; + "UpdateMinimumWeight(uint256,uint256)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; + getEvent(nameOrSignatureOrTopic: "MinimumWeightUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OperatorDeregistered"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OperatorRegistered"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OperatorWeightUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; + getEvent(nameOrSignatureOrTopic: "QuorumUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "SigningKeyUpdate"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ThresholdWeightUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "TotalWeightUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "UpdateMinimumWeight"): EventFragment; +} + +export interface InitializedEventObject { + version: number; +} +export type InitializedEvent = TypedEvent<[number], InitializedEventObject>; + +export type InitializedEventFilter = TypedEventFilter; + +export interface MinimumWeightUpdatedEventObject { + _old: BigNumber; + _new: BigNumber; +} +export type MinimumWeightUpdatedEvent = TypedEvent< + [BigNumber, BigNumber], + MinimumWeightUpdatedEventObject +>; + +export type MinimumWeightUpdatedEventFilter = + TypedEventFilter; + +export interface OperatorDeregisteredEventObject { + _operator: string; + _avs: string; +} +export type OperatorDeregisteredEvent = TypedEvent< + [string, string], + OperatorDeregisteredEventObject +>; + +export type OperatorDeregisteredEventFilter = + TypedEventFilter; + +export interface OperatorRegisteredEventObject { + _operator: string; + _avs: string; +} +export type OperatorRegisteredEvent = TypedEvent< + [string, string], + OperatorRegisteredEventObject +>; + +export type OperatorRegisteredEventFilter = + TypedEventFilter; + +export interface OperatorWeightUpdatedEventObject { + _operator: string; + oldWeight: BigNumber; + newWeight: BigNumber; +} +export type OperatorWeightUpdatedEvent = TypedEvent< + [string, BigNumber, BigNumber], + OperatorWeightUpdatedEventObject +>; + +export type OperatorWeightUpdatedEventFilter = + TypedEventFilter; + +export interface OwnershipTransferredEventObject { + previousOwner: string; + newOwner: string; +} +export type OwnershipTransferredEvent = TypedEvent< + [string, string], + OwnershipTransferredEventObject +>; + +export type OwnershipTransferredEventFilter = + TypedEventFilter; + +export interface QuorumUpdatedEventObject { + _old: QuorumStructOutput; + _new: QuorumStructOutput; +} +export type QuorumUpdatedEvent = TypedEvent< + [QuorumStructOutput, QuorumStructOutput], + QuorumUpdatedEventObject +>; + +export type QuorumUpdatedEventFilter = TypedEventFilter; + +export interface SigningKeyUpdateEventObject { + operator: string; + updateBlock: BigNumber; + newSigningKey: string; + oldSigningKey: string; +} +export type SigningKeyUpdateEvent = TypedEvent< + [string, BigNumber, string, string], + SigningKeyUpdateEventObject +>; + +export type SigningKeyUpdateEventFilter = + TypedEventFilter; + +export interface ThresholdWeightUpdatedEventObject { + _thresholdWeight: BigNumber; +} +export type ThresholdWeightUpdatedEvent = TypedEvent< + [BigNumber], + ThresholdWeightUpdatedEventObject +>; + +export type ThresholdWeightUpdatedEventFilter = + TypedEventFilter; + +export interface TotalWeightUpdatedEventObject { + oldTotalWeight: BigNumber; + newTotalWeight: BigNumber; +} +export type TotalWeightUpdatedEvent = TypedEvent< + [BigNumber, BigNumber], + TotalWeightUpdatedEventObject +>; + +export type TotalWeightUpdatedEventFilter = + TypedEventFilter; + +export interface UpdateMinimumWeightEventObject { + oldMinimumWeight: BigNumber; + newMinimumWeight: BigNumber; +} +export type UpdateMinimumWeightEvent = TypedEvent< + [BigNumber, BigNumber], + UpdateMinimumWeightEventObject +>; + +export type UpdateMinimumWeightEventFilter = + TypedEventFilter; + +export interface ECDSAStakeRegistry extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: ECDSAStakeRegistryInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + deregisterOperator( + overrides?: Overrides & { from?: string } + ): Promise; + + getLastCheckpointOperatorWeight( + _operator: string, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getLastCheckpointThresholdWeight( + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getLastCheckpointThresholdWeightAtBlock( + _blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getLastCheckpointTotalWeight( + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getLastCheckpointTotalWeightAtBlock( + _blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getLastestOperatorSigningKey( + _operator: string, + overrides?: CallOverrides + ): Promise<[string]>; + + getOperatorSigningKeyAtBlock( + _operator: string, + _blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + getOperatorWeight( + _operator: string, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getOperatorWeightAtBlock( + _operator: string, + _blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + initialize( + _serviceManager: string, + _thresholdWeight: BigNumberish, + _quorum: QuorumStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + isValidSignature( + _dataHash: BytesLike, + _signatureData: BytesLike, + overrides?: CallOverrides + ): Promise<[string]>; + + minimumWeight(overrides?: CallOverrides): Promise<[BigNumber]>; + + operatorRegistered( + _operator: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + + owner(overrides?: CallOverrides): Promise<[string]>; + + quorum(overrides?: CallOverrides): Promise<[QuorumStructOutput]>; + + registerOperatorWithSignature( + _operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, + _signingKey: string, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + updateMinimumWeight( + _newMinimumWeight: BigNumberish, + _operators: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + updateOperatorSigningKey( + _newSigningKey: string, + overrides?: Overrides & { from?: string } + ): Promise; + + updateOperators( + _operators: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + updateOperatorsForQuorum( + operatorsPerQuorum: string[][], + arg1: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + updateQuorumConfig( + _quorum: QuorumStruct, + _operators: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + updateStakeThreshold( + _thresholdWeight: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + }; + + deregisterOperator( + overrides?: Overrides & { from?: string } + ): Promise; + + getLastCheckpointOperatorWeight( + _operator: string, + overrides?: CallOverrides + ): Promise; + + getLastCheckpointThresholdWeight( + overrides?: CallOverrides + ): Promise; + + getLastCheckpointThresholdWeightAtBlock( + _blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getLastCheckpointTotalWeight(overrides?: CallOverrides): Promise; + + getLastCheckpointTotalWeightAtBlock( + _blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getLastestOperatorSigningKey( + _operator: string, + overrides?: CallOverrides + ): Promise; + + getOperatorSigningKeyAtBlock( + _operator: string, + _blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getOperatorWeight( + _operator: string, + overrides?: CallOverrides + ): Promise; + + getOperatorWeightAtBlock( + _operator: string, + _blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + initialize( + _serviceManager: string, + _thresholdWeight: BigNumberish, + _quorum: QuorumStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + isValidSignature( + _dataHash: BytesLike, + _signatureData: BytesLike, + overrides?: CallOverrides + ): Promise; + + minimumWeight(overrides?: CallOverrides): Promise; + + operatorRegistered( + _operator: string, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + quorum(overrides?: CallOverrides): Promise; + + registerOperatorWithSignature( + _operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, + _signingKey: string, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + updateMinimumWeight( + _newMinimumWeight: BigNumberish, + _operators: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + updateOperatorSigningKey( + _newSigningKey: string, + overrides?: Overrides & { from?: string } + ): Promise; + + updateOperators( + _operators: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + updateOperatorsForQuorum( + operatorsPerQuorum: string[][], + arg1: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + updateQuorumConfig( + _quorum: QuorumStruct, + _operators: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + updateStakeThreshold( + _thresholdWeight: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + callStatic: { + deregisterOperator(overrides?: CallOverrides): Promise; + + getLastCheckpointOperatorWeight( + _operator: string, + overrides?: CallOverrides + ): Promise; + + getLastCheckpointThresholdWeight( + overrides?: CallOverrides + ): Promise; + + getLastCheckpointThresholdWeightAtBlock( + _blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getLastCheckpointTotalWeight(overrides?: CallOverrides): Promise; + + getLastCheckpointTotalWeightAtBlock( + _blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getLastestOperatorSigningKey( + _operator: string, + overrides?: CallOverrides + ): Promise; + + getOperatorSigningKeyAtBlock( + _operator: string, + _blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getOperatorWeight( + _operator: string, + overrides?: CallOverrides + ): Promise; + + getOperatorWeightAtBlock( + _operator: string, + _blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + initialize( + _serviceManager: string, + _thresholdWeight: BigNumberish, + _quorum: QuorumStruct, + overrides?: CallOverrides + ): Promise; + + isValidSignature( + _dataHash: BytesLike, + _signatureData: BytesLike, + overrides?: CallOverrides + ): Promise; + + minimumWeight(overrides?: CallOverrides): Promise; + + operatorRegistered( + _operator: string, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + quorum(overrides?: CallOverrides): Promise; + + registerOperatorWithSignature( + _operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, + _signingKey: string, + overrides?: CallOverrides + ): Promise; + + renounceOwnership(overrides?: CallOverrides): Promise; + + transferOwnership( + newOwner: string, + overrides?: CallOverrides + ): Promise; + + updateMinimumWeight( + _newMinimumWeight: BigNumberish, + _operators: string[], + overrides?: CallOverrides + ): Promise; + + updateOperatorSigningKey( + _newSigningKey: string, + overrides?: CallOverrides + ): Promise; + + updateOperators( + _operators: string[], + overrides?: CallOverrides + ): Promise; + + updateOperatorsForQuorum( + operatorsPerQuorum: string[][], + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + updateQuorumConfig( + _quorum: QuorumStruct, + _operators: string[], + overrides?: CallOverrides + ): Promise; + + updateStakeThreshold( + _thresholdWeight: BigNumberish, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "Initialized(uint8)"(version?: null): InitializedEventFilter; + Initialized(version?: null): InitializedEventFilter; + + "MinimumWeightUpdated(uint256,uint256)"( + _old?: null, + _new?: null + ): MinimumWeightUpdatedEventFilter; + MinimumWeightUpdated( + _old?: null, + _new?: null + ): MinimumWeightUpdatedEventFilter; + + "OperatorDeregistered(address,address)"( + _operator?: string | null, + _avs?: string | null + ): OperatorDeregisteredEventFilter; + OperatorDeregistered( + _operator?: string | null, + _avs?: string | null + ): OperatorDeregisteredEventFilter; + + "OperatorRegistered(address,address)"( + _operator?: string | null, + _avs?: string | null + ): OperatorRegisteredEventFilter; + OperatorRegistered( + _operator?: string | null, + _avs?: string | null + ): OperatorRegisteredEventFilter; + + "OperatorWeightUpdated(address,uint256,uint256)"( + _operator?: string | null, + oldWeight?: null, + newWeight?: null + ): OperatorWeightUpdatedEventFilter; + OperatorWeightUpdated( + _operator?: string | null, + oldWeight?: null, + newWeight?: null + ): OperatorWeightUpdatedEventFilter; + + "OwnershipTransferred(address,address)"( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + OwnershipTransferred( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + + "QuorumUpdated(((address,uint96)[]),((address,uint96)[]))"( + _old?: null, + _new?: null + ): QuorumUpdatedEventFilter; + QuorumUpdated(_old?: null, _new?: null): QuorumUpdatedEventFilter; + + "SigningKeyUpdate(address,uint256,address,address)"( + operator?: string | null, + updateBlock?: BigNumberish | null, + newSigningKey?: string | null, + oldSigningKey?: null + ): SigningKeyUpdateEventFilter; + SigningKeyUpdate( + operator?: string | null, + updateBlock?: BigNumberish | null, + newSigningKey?: string | null, + oldSigningKey?: null + ): SigningKeyUpdateEventFilter; + + "ThresholdWeightUpdated(uint256)"( + _thresholdWeight?: null + ): ThresholdWeightUpdatedEventFilter; + ThresholdWeightUpdated( + _thresholdWeight?: null + ): ThresholdWeightUpdatedEventFilter; + + "TotalWeightUpdated(uint256,uint256)"( + oldTotalWeight?: null, + newTotalWeight?: null + ): TotalWeightUpdatedEventFilter; + TotalWeightUpdated( + oldTotalWeight?: null, + newTotalWeight?: null + ): TotalWeightUpdatedEventFilter; + + "UpdateMinimumWeight(uint256,uint256)"( + oldMinimumWeight?: null, + newMinimumWeight?: null + ): UpdateMinimumWeightEventFilter; + UpdateMinimumWeight( + oldMinimumWeight?: null, + newMinimumWeight?: null + ): UpdateMinimumWeightEventFilter; + }; + + estimateGas: { + deregisterOperator( + overrides?: Overrides & { from?: string } + ): Promise; + + getLastCheckpointOperatorWeight( + _operator: string, + overrides?: CallOverrides + ): Promise; + + getLastCheckpointThresholdWeight( + overrides?: CallOverrides + ): Promise; + + getLastCheckpointThresholdWeightAtBlock( + _blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getLastCheckpointTotalWeight(overrides?: CallOverrides): Promise; + + getLastCheckpointTotalWeightAtBlock( + _blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getLastestOperatorSigningKey( + _operator: string, + overrides?: CallOverrides + ): Promise; + + getOperatorSigningKeyAtBlock( + _operator: string, + _blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getOperatorWeight( + _operator: string, + overrides?: CallOverrides + ): Promise; + + getOperatorWeightAtBlock( + _operator: string, + _blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + initialize( + _serviceManager: string, + _thresholdWeight: BigNumberish, + _quorum: QuorumStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + isValidSignature( + _dataHash: BytesLike, + _signatureData: BytesLike, + overrides?: CallOverrides + ): Promise; + + minimumWeight(overrides?: CallOverrides): Promise; + + operatorRegistered( + _operator: string, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + quorum(overrides?: CallOverrides): Promise; + + registerOperatorWithSignature( + _operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, + _signingKey: string, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + updateMinimumWeight( + _newMinimumWeight: BigNumberish, + _operators: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + updateOperatorSigningKey( + _newSigningKey: string, + overrides?: Overrides & { from?: string } + ): Promise; + + updateOperators( + _operators: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + updateOperatorsForQuorum( + operatorsPerQuorum: string[][], + arg1: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + updateQuorumConfig( + _quorum: QuorumStruct, + _operators: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + updateStakeThreshold( + _thresholdWeight: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + }; + + populateTransaction: { + deregisterOperator( + overrides?: Overrides & { from?: string } + ): Promise; + + getLastCheckpointOperatorWeight( + _operator: string, + overrides?: CallOverrides + ): Promise; + + getLastCheckpointThresholdWeight( + overrides?: CallOverrides + ): Promise; + + getLastCheckpointThresholdWeightAtBlock( + _blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getLastCheckpointTotalWeight( + overrides?: CallOverrides + ): Promise; + + getLastCheckpointTotalWeightAtBlock( + _blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getLastestOperatorSigningKey( + _operator: string, + overrides?: CallOverrides + ): Promise; + + getOperatorSigningKeyAtBlock( + _operator: string, + _blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getOperatorWeight( + _operator: string, + overrides?: CallOverrides + ): Promise; + + getOperatorWeightAtBlock( + _operator: string, + _blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + initialize( + _serviceManager: string, + _thresholdWeight: BigNumberish, + _quorum: QuorumStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + isValidSignature( + _dataHash: BytesLike, + _signatureData: BytesLike, + overrides?: CallOverrides + ): Promise; + + minimumWeight(overrides?: CallOverrides): Promise; + + operatorRegistered( + _operator: string, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + quorum(overrides?: CallOverrides): Promise; + + registerOperatorWithSignature( + _operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, + _signingKey: string, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + updateMinimumWeight( + _newMinimumWeight: BigNumberish, + _operators: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + updateOperatorSigningKey( + _newSigningKey: string, + overrides?: Overrides & { from?: string } + ): Promise; + + updateOperators( + _operators: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + updateOperatorsForQuorum( + operatorsPerQuorum: string[][], + arg1: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + updateQuorumConfig( + _quorum: QuorumStruct, + _operators: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + updateStakeThreshold( + _thresholdWeight: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + }; +} diff --git a/src/avs/contracts/ReclaimServiceManager.ts b/src/avs/contracts/ReclaimServiceManager.ts index 6fad2440..3891c1f0 100644 --- a/src/avs/contracts/ReclaimServiceManager.ts +++ b/src/avs/contracts/ReclaimServiceManager.ts @@ -111,7 +111,7 @@ export declare namespace IReclaimServiceManager { }; } -export declare namespace IPaymentCoordinator { +export declare namespace IRewardsCoordinator { export type StrategyAndMultiplierStruct = { strategy: string; multiplier: BigNumberish; @@ -122,27 +122,59 @@ export declare namespace IPaymentCoordinator { multiplier: BigNumber; }; - export type RangePaymentStruct = { - strategiesAndMultipliers: IPaymentCoordinator.StrategyAndMultiplierStruct[]; + export type RewardsSubmissionStruct = { + strategiesAndMultipliers: IRewardsCoordinator.StrategyAndMultiplierStruct[]; token: string; amount: BigNumberish; startTimestamp: BigNumberish; duration: BigNumberish; }; - export type RangePaymentStructOutput = [ - IPaymentCoordinator.StrategyAndMultiplierStructOutput[], + export type RewardsSubmissionStructOutput = [ + IRewardsCoordinator.StrategyAndMultiplierStructOutput[], string, BigNumber, number, number ] & { - strategiesAndMultipliers: IPaymentCoordinator.StrategyAndMultiplierStructOutput[]; + strategiesAndMultipliers: IRewardsCoordinator.StrategyAndMultiplierStructOutput[]; token: string; amount: BigNumber; startTimestamp: number; duration: number; }; + + export type OperatorRewardStruct = { operator: string; amount: BigNumberish }; + + export type OperatorRewardStructOutput = [string, BigNumber] & { + operator: string; + amount: BigNumber; + }; + + export type OperatorDirectedRewardsSubmissionStruct = { + strategiesAndMultipliers: IRewardsCoordinator.StrategyAndMultiplierStruct[]; + token: string; + operatorRewards: IRewardsCoordinator.OperatorRewardStruct[]; + startTimestamp: BigNumberish; + duration: BigNumberish; + description: string; + }; + + export type OperatorDirectedRewardsSubmissionStructOutput = [ + IRewardsCoordinator.StrategyAndMultiplierStructOutput[], + string, + IRewardsCoordinator.OperatorRewardStructOutput[], + number, + number, + string + ] & { + strategiesAndMultipliers: IRewardsCoordinator.StrategyAndMultiplierStructOutput[]; + token: string; + operatorRewards: IRewardsCoordinator.OperatorRewardStructOutput[]; + startTimestamp: number; + duration: number; + description: string; + }; } export declare namespace ISignatureUtils { @@ -165,12 +197,15 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { "allTaskHashes(uint32)": FunctionFragment; "avsDirectory()": FunctionFragment; "checkSignerAddress((string,bytes32,bytes32,uint32,address),bytes)": FunctionFragment; + "createAVSRewardsSubmission(((address,uint96)[],address,uint256,uint32,uint32)[])": FunctionFragment; "createNewTask((string,bytes32,bytes32,uint32,address),bytes)": FunctionFragment; + "createOperatorDirectedAVSRewardsSubmission(((address,uint96)[],address,(address,uint256)[],uint32,uint32,string)[])": FunctionFragment; "deregisterOperatorFromAVS(address)": FunctionFragment; "encodeClaimRequest((string,bytes32,bytes32,uint32,address))": FunctionFragment; "getMetadataForOperator(address)": FunctionFragment; "getOperatorRestakedStrategies(address)": FunctionFragment; "getRestakeableStrategies()": FunctionFragment; + "initialize(address,address,address)": FunctionFragment; "isAdmin(address)": FunctionFragment; "isOperatorWhitelisted(address)": FunctionFragment; "latestTaskNum()": FunctionFragment; @@ -181,12 +216,13 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { "paused(uint8)": FunctionFragment; "paused()": FunctionFragment; "pauserRegistry()": FunctionFragment; - "payForRange(((address,uint96)[],address,uint256,uint32,uint32)[])": FunctionFragment; "registerOperatorToAVS(address,(bytes,bytes32,uint256))": FunctionFragment; "registeredOperators(uint256)": FunctionFragment; "renounceOwnership()": FunctionFragment; + "rewardsInitiator()": FunctionFragment; + "setClaimerFor(address)": FunctionFragment; "setPauserRegistry(address)": FunctionFragment; - "setup(address)": FunctionFragment; + "setRewardsInitiator(address)": FunctionFragment; "stakeRegistry()": FunctionFragment; "taskCompleted((((string,bytes32,bytes32,uint32,address),uint32,uint32,uint8,(address,string)[],uint256),bytes[]),uint32)": FunctionFragment; "taskCreationMetadata()": FunctionFragment; @@ -205,12 +241,15 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { | "allTaskHashes" | "avsDirectory" | "checkSignerAddress" + | "createAVSRewardsSubmission" | "createNewTask" + | "createOperatorDirectedAVSRewardsSubmission" | "deregisterOperatorFromAVS" | "encodeClaimRequest" | "getMetadataForOperator" | "getOperatorRestakedStrategies" | "getRestakeableStrategies" + | "initialize" | "isAdmin" | "isOperatorWhitelisted" | "latestTaskNum" @@ -221,12 +260,13 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { | "paused(uint8)" | "paused()" | "pauserRegistry" - | "payForRange" | "registerOperatorToAVS" | "registeredOperators" | "renounceOwnership" + | "rewardsInitiator" + | "setClaimerFor" | "setPauserRegistry" - | "setup" + | "setRewardsInitiator" | "stakeRegistry" | "taskCompleted" | "taskCreationMetadata" @@ -255,10 +295,18 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { functionFragment: "checkSignerAddress", values: [IReclaimServiceManager.ClaimRequestStruct, BytesLike] ): string; + encodeFunctionData( + functionFragment: "createAVSRewardsSubmission", + values: [IRewardsCoordinator.RewardsSubmissionStruct[]] + ): string; encodeFunctionData( functionFragment: "createNewTask", values: [IReclaimServiceManager.ClaimRequestStruct, BytesLike] ): string; + encodeFunctionData( + functionFragment: "createOperatorDirectedAVSRewardsSubmission", + values: [IRewardsCoordinator.OperatorDirectedRewardsSubmissionStruct[]] + ): string; encodeFunctionData( functionFragment: "deregisterOperatorFromAVS", values: [string] @@ -279,6 +327,10 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { functionFragment: "getRestakeableStrategies", values?: undefined ): string; + encodeFunctionData( + functionFragment: "initialize", + values: [string, string, string] + ): string; encodeFunctionData(functionFragment: "isAdmin", values: [string]): string; encodeFunctionData( functionFragment: "isOperatorWhitelisted", @@ -304,10 +356,6 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { functionFragment: "pauserRegistry", values?: undefined ): string; - encodeFunctionData( - functionFragment: "payForRange", - values: [IPaymentCoordinator.RangePaymentStruct[]] - ): string; encodeFunctionData( functionFragment: "registerOperatorToAVS", values: [string, ISignatureUtils.SignatureWithSaltAndExpiryStruct] @@ -320,11 +368,22 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { functionFragment: "renounceOwnership", values?: undefined ): string; + encodeFunctionData( + functionFragment: "rewardsInitiator", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "setClaimerFor", + values: [string] + ): string; encodeFunctionData( functionFragment: "setPauserRegistry", values: [string] ): string; - encodeFunctionData(functionFragment: "setup", values: [string]): string; + encodeFunctionData( + functionFragment: "setRewardsInitiator", + values: [string] + ): string; encodeFunctionData( functionFragment: "stakeRegistry", values?: undefined @@ -379,10 +438,18 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { functionFragment: "checkSignerAddress", data: BytesLike ): Result; + decodeFunctionResult( + functionFragment: "createAVSRewardsSubmission", + data: BytesLike + ): Result; decodeFunctionResult( functionFragment: "createNewTask", data: BytesLike ): Result; + decodeFunctionResult( + functionFragment: "createOperatorDirectedAVSRewardsSubmission", + data: BytesLike + ): Result; decodeFunctionResult( functionFragment: "deregisterOperatorFromAVS", data: BytesLike @@ -403,6 +470,7 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { functionFragment: "getRestakeableStrategies", data: BytesLike ): Result; + decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; decodeFunctionResult(functionFragment: "isAdmin", data: BytesLike): Result; decodeFunctionResult( functionFragment: "isOperatorWhitelisted", @@ -428,10 +496,6 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { functionFragment: "pauserRegistry", data: BytesLike ): Result; - decodeFunctionResult( - functionFragment: "payForRange", - data: BytesLike - ): Result; decodeFunctionResult( functionFragment: "registerOperatorToAVS", data: BytesLike @@ -444,11 +508,22 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { functionFragment: "renounceOwnership", data: BytesLike ): Result; + decodeFunctionResult( + functionFragment: "rewardsInitiator", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setClaimerFor", + data: BytesLike + ): Result; decodeFunctionResult( functionFragment: "setPauserRegistry", data: BytesLike ): Result; - decodeFunctionResult(functionFragment: "setup", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "setRewardsInitiator", + data: BytesLike + ): Result; decodeFunctionResult( functionFragment: "stakeRegistry", data: BytesLike @@ -493,6 +568,7 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { "OwnershipTransferred(address,address)": EventFragment; "Paused(address,uint256)": EventFragment; "PauserRegistrySet(address,address)": EventFragment; + "RewardsInitiatorUpdated(address,address)": EventFragment; "TaskCompleted(uint32,(((string,bytes32,bytes32,uint32,address),uint32,uint32,uint8,(address,string)[],uint256),bytes[]))": EventFragment; "Unpaused(address,uint256)": EventFragment; }; @@ -502,6 +578,7 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; getEvent(nameOrSignatureOrTopic: "Paused"): EventFragment; getEvent(nameOrSignatureOrTopic: "PauserRegistrySet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RewardsInitiatorUpdated"): EventFragment; getEvent(nameOrSignatureOrTopic: "TaskCompleted"): EventFragment; getEvent(nameOrSignatureOrTopic: "Unpaused"): EventFragment; } @@ -556,6 +633,18 @@ export type PauserRegistrySetEvent = TypedEvent< export type PauserRegistrySetEventFilter = TypedEventFilter; +export interface RewardsInitiatorUpdatedEventObject { + prevRewardsInitiator: string; + newRewardsInitiator: string; +} +export type RewardsInitiatorUpdatedEvent = TypedEvent< + [string, string], + RewardsInitiatorUpdatedEventObject +>; + +export type RewardsInitiatorUpdatedEventFilter = + TypedEventFilter; + export interface TaskCompletedEventObject { taskIndex: number; task: IReclaimServiceManager.CompletedTaskStructOutput; @@ -620,12 +709,22 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: CallOverrides ): Promise<[string]>; + createAVSRewardsSubmission( + rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + createNewTask( request: IReclaimServiceManager.ClaimRequestStruct, requestSignature: BytesLike, overrides?: Overrides & { from?: string } ): Promise; + createOperatorDirectedAVSRewardsSubmission( + operatorDirectedRewardsSubmissions: IRewardsCoordinator.OperatorDirectedRewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + deregisterOperatorFromAVS( operator: string, overrides?: Overrides & { from?: string } @@ -648,6 +747,13 @@ export interface ReclaimServiceManager extends BaseContract { getRestakeableStrategies(overrides?: CallOverrides): Promise<[string[]]>; + initialize( + initialOwner: string, + _rewardsInitiator: string, + deployer: string, + overrides?: Overrides & { from?: string } + ): Promise; + isAdmin(_admin: string, overrides?: CallOverrides): Promise<[boolean]>; isOperatorWhitelisted( @@ -682,11 +788,6 @@ export interface ReclaimServiceManager extends BaseContract { pauserRegistry(overrides?: CallOverrides): Promise<[string]>; - payForRange( - rangePayments: IPaymentCoordinator.RangePaymentStruct[], - overrides?: Overrides & { from?: string } - ): Promise; - registerOperatorToAVS( operator: string, operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, @@ -702,13 +803,20 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; + rewardsInitiator(overrides?: CallOverrides): Promise<[string]>; + + setClaimerFor( + claimer: string, + overrides?: Overrides & { from?: string } + ): Promise; + setPauserRegistry( newPauserRegistry: string, overrides?: Overrides & { from?: string } ): Promise; - setup( - initialAdmin: string, + setRewardsInitiator( + newRewardsInitiator: string, overrides?: Overrides & { from?: string } ): Promise; @@ -779,12 +887,22 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: CallOverrides ): Promise; + createAVSRewardsSubmission( + rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + createNewTask( request: IReclaimServiceManager.ClaimRequestStruct, requestSignature: BytesLike, overrides?: Overrides & { from?: string } ): Promise; + createOperatorDirectedAVSRewardsSubmission( + operatorDirectedRewardsSubmissions: IRewardsCoordinator.OperatorDirectedRewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + deregisterOperatorFromAVS( operator: string, overrides?: Overrides & { from?: string } @@ -807,6 +925,13 @@ export interface ReclaimServiceManager extends BaseContract { getRestakeableStrategies(overrides?: CallOverrides): Promise; + initialize( + initialOwner: string, + _rewardsInitiator: string, + deployer: string, + overrides?: Overrides & { from?: string } + ): Promise; + isAdmin(_admin: string, overrides?: CallOverrides): Promise; isOperatorWhitelisted( @@ -841,11 +966,6 @@ export interface ReclaimServiceManager extends BaseContract { pauserRegistry(overrides?: CallOverrides): Promise; - payForRange( - rangePayments: IPaymentCoordinator.RangePaymentStruct[], - overrides?: Overrides & { from?: string } - ): Promise; - registerOperatorToAVS( operator: string, operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, @@ -861,13 +981,20 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; + rewardsInitiator(overrides?: CallOverrides): Promise; + + setClaimerFor( + claimer: string, + overrides?: Overrides & { from?: string } + ): Promise; + setPauserRegistry( newPauserRegistry: string, overrides?: Overrides & { from?: string } ): Promise; - setup( - initialAdmin: string, + setRewardsInitiator( + newRewardsInitiator: string, overrides?: Overrides & { from?: string } ): Promise; @@ -941,12 +1068,22 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: CallOverrides ): Promise; + createAVSRewardsSubmission( + rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + overrides?: CallOverrides + ): Promise; + createNewTask( request: IReclaimServiceManager.ClaimRequestStruct, requestSignature: BytesLike, overrides?: CallOverrides ): Promise; + createOperatorDirectedAVSRewardsSubmission( + operatorDirectedRewardsSubmissions: IRewardsCoordinator.OperatorDirectedRewardsSubmissionStruct[], + overrides?: CallOverrides + ): Promise; + deregisterOperatorFromAVS( operator: string, overrides?: CallOverrides @@ -969,6 +1106,13 @@ export interface ReclaimServiceManager extends BaseContract { getRestakeableStrategies(overrides?: CallOverrides): Promise; + initialize( + initialOwner: string, + _rewardsInitiator: string, + deployer: string, + overrides?: CallOverrides + ): Promise; + isAdmin(_admin: string, overrides?: CallOverrides): Promise; isOperatorWhitelisted( @@ -1001,11 +1145,6 @@ export interface ReclaimServiceManager extends BaseContract { pauserRegistry(overrides?: CallOverrides): Promise; - payForRange( - rangePayments: IPaymentCoordinator.RangePaymentStruct[], - overrides?: CallOverrides - ): Promise; - registerOperatorToAVS( operator: string, operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, @@ -1019,12 +1158,19 @@ export interface ReclaimServiceManager extends BaseContract { renounceOwnership(overrides?: CallOverrides): Promise; + rewardsInitiator(overrides?: CallOverrides): Promise; + + setClaimerFor(claimer: string, overrides?: CallOverrides): Promise; + setPauserRegistry( newPauserRegistry: string, overrides?: CallOverrides ): Promise; - setup(initialAdmin: string, overrides?: CallOverrides): Promise; + setRewardsInitiator( + newRewardsInitiator: string, + overrides?: CallOverrides + ): Promise; stakeRegistry(overrides?: CallOverrides): Promise; @@ -1118,6 +1264,15 @@ export interface ReclaimServiceManager extends BaseContract { newPauserRegistry?: null ): PauserRegistrySetEventFilter; + "RewardsInitiatorUpdated(address,address)"( + prevRewardsInitiator?: null, + newRewardsInitiator?: null + ): RewardsInitiatorUpdatedEventFilter; + RewardsInitiatorUpdated( + prevRewardsInitiator?: null, + newRewardsInitiator?: null + ): RewardsInitiatorUpdatedEventFilter; + "TaskCompleted(uint32,(((string,bytes32,bytes32,uint32,address),uint32,uint32,uint8,(address,string)[],uint256),bytes[]))"( taskIndex?: BigNumberish | null, task?: null @@ -1153,12 +1308,22 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: CallOverrides ): Promise; + createAVSRewardsSubmission( + rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + createNewTask( request: IReclaimServiceManager.ClaimRequestStruct, requestSignature: BytesLike, overrides?: Overrides & { from?: string } ): Promise; + createOperatorDirectedAVSRewardsSubmission( + operatorDirectedRewardsSubmissions: IRewardsCoordinator.OperatorDirectedRewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + deregisterOperatorFromAVS( operator: string, overrides?: Overrides & { from?: string } @@ -1181,6 +1346,13 @@ export interface ReclaimServiceManager extends BaseContract { getRestakeableStrategies(overrides?: CallOverrides): Promise; + initialize( + initialOwner: string, + _rewardsInitiator: string, + deployer: string, + overrides?: Overrides & { from?: string } + ): Promise; + isAdmin(_admin: string, overrides?: CallOverrides): Promise; isOperatorWhitelisted( @@ -1213,11 +1385,6 @@ export interface ReclaimServiceManager extends BaseContract { pauserRegistry(overrides?: CallOverrides): Promise; - payForRange( - rangePayments: IPaymentCoordinator.RangePaymentStruct[], - overrides?: Overrides & { from?: string } - ): Promise; - registerOperatorToAVS( operator: string, operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, @@ -1233,13 +1400,20 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; + rewardsInitiator(overrides?: CallOverrides): Promise; + + setClaimerFor( + claimer: string, + overrides?: Overrides & { from?: string } + ): Promise; + setPauserRegistry( newPauserRegistry: string, overrides?: Overrides & { from?: string } ): Promise; - setup( - initialAdmin: string, + setRewardsInitiator( + newRewardsInitiator: string, overrides?: Overrides & { from?: string } ): Promise; @@ -1309,12 +1483,22 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: CallOverrides ): Promise; + createAVSRewardsSubmission( + rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + createNewTask( request: IReclaimServiceManager.ClaimRequestStruct, requestSignature: BytesLike, overrides?: Overrides & { from?: string } ): Promise; + createOperatorDirectedAVSRewardsSubmission( + operatorDirectedRewardsSubmissions: IRewardsCoordinator.OperatorDirectedRewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + deregisterOperatorFromAVS( operator: string, overrides?: Overrides & { from?: string } @@ -1339,6 +1523,13 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: CallOverrides ): Promise; + initialize( + initialOwner: string, + _rewardsInitiator: string, + deployer: string, + overrides?: Overrides & { from?: string } + ): Promise; + isAdmin( _admin: string, overrides?: CallOverrides @@ -1376,11 +1567,6 @@ export interface ReclaimServiceManager extends BaseContract { pauserRegistry(overrides?: CallOverrides): Promise; - payForRange( - rangePayments: IPaymentCoordinator.RangePaymentStruct[], - overrides?: Overrides & { from?: string } - ): Promise; - registerOperatorToAVS( operator: string, operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, @@ -1396,13 +1582,20 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; + rewardsInitiator(overrides?: CallOverrides): Promise; + + setClaimerFor( + claimer: string, + overrides?: Overrides & { from?: string } + ): Promise; + setPauserRegistry( newPauserRegistry: string, overrides?: Overrides & { from?: string } ): Promise; - setup( - initialAdmin: string, + setRewardsInitiator( + newRewardsInitiator: string, overrides?: Overrides & { from?: string } ): Promise; diff --git a/src/avs/contracts/factories/AVSDirectory__factory.ts b/src/avs/contracts/factories/AVSDirectory__factory.ts new file mode 100644 index 00000000..25b0067c --- /dev/null +++ b/src/avs/contracts/factories/AVSDirectory__factory.ts @@ -0,0 +1,560 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { AVSDirectory, AVSDirectoryInterface } from "../AVSDirectory"; + +const _abi = [ + { + type: "constructor", + inputs: [ + { + name: "_delegation", + type: "address", + internalType: "contract IDelegationManager", + }, + ], + 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: "enum IAVSDirectory.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: "contract IDelegationManager", + }, + ], + 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: "contract IPauserRegistry", + }, + { + 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: "contract IPauserRegistry", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "registerOperatorToAVS", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "operatorSignature", + type: "tuple", + internalType: "struct ISignatureUtils.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: "contract IPauserRegistry", + }, + ], + 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: "enum IAVSDirectory.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: "contract IPauserRegistry", + }, + { + name: "newPauserRegistry", + type: "address", + indexed: false, + internalType: "contract IPauserRegistry", + }, + ], + 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, + }, +] as const; + +const _bytecode = + "0x60c0806040523461019957604051601f611fa438819003918201601f19168301916001600160401b038311848410176101835780849260209460405283398101031261013357516001600160a01b038116810361012e5760805260005460ff8160081c166100d95760ff8082161061009e575b4660a052604051611dbd90816101e7823960805181818161044601526108dd015260a051816118b50152f35b60ff90811916176000557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a180610072565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b600080fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b600052604160045260246000fd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fdfe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b60003560e01c806310d67a2f1461145b578063136439dd146113375780631794bb3c1461111d57806320606b70146110e2578063374823b51461109557806349075da314611033578063595c6a6714610f845780635ac86ab714610f515780635c975abb14610f33578063715018a614610ed6578063886f119514610ead5780638da5cb5b14610e845780639926ee7d14610781578063a1060c881461074d578063a364f4da14610611578063a98fb355146104b0578063d79aceab14610475578063df5cf72314610430578063ec76f44214610371578063f2fde38b146102e2578063f698da25146102bf5763fabc1cbc0361000e57346102ba5760203660031901126102b557606554600435906001600160a01b0316803b156102b05760206004916040519283809263755b36bd60e11b82525afa80156102a4576101cb91600091610275575b506001600160a01b031633146116f4565b60665419811981160361020a57806066556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a2005b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b610297915060203d60201161029d575b61028f8183611607565b8101906116d5565b386101ba565b503d610285565b6040513d6000823e3d90fd5b611682565b61153b565b6114eb565b346102ba5760003660031901126102b55760206102da6118b2565b604051908152f35b346102ba5760203660031901126102b5576102fb6115db565b610303611a7d565b6001600160a01b0381161561031d5761031b90611a34565b005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346102ba5760203660031901126102b55760043533600052609960205260406000208160005260205260ff604060002054166103d1573360005260996020526040600020906000526020526040600020600160ff19825416179055600080f35b60405162461bcd60e51b815260206004820152603160248201527f4156534469726563746f72792e63616e63656c53616c743a2063616e6e6f742060448201527018d85b98d95b081cdc195b9d081cd85b1d607a1b6064820152608490fd5b346102ba5760003660031901126102b5576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346102ba5760003660031901126102b55760206040517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd8152f35b346102ba5760203660031901126102b55760043567ffffffffffffffff811161060c57366023820112156106075780600401359067ffffffffffffffff82116105ae573660248383010111610555577fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437139082602460405192602084528260208501520160408301376000604084830101526040813394601f80199101168101030190a2005b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b611629565b61158b565b346102ba5760203660031901126102b55761062a6115db565b61063b6001806066541614156117c8565b336000526098602052604060002060018060a01b03821660005260205260ff604060002054166002811015610737576001036106cc573360008181526098602090815260408083206001600160a01b0395909516808452948252808320805460ff19169055519182529192917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191a3005b60405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f742072656769737465726564006064820152608490fd5b634e487b7160e01b600052602160045260246000fd5b346102ba5760803660031901126102b55760206102da61076b6115db565b6107736115f1565b906064359160443591611814565b346102ba5760403660031901126102b55761079a6115db565b6024359067ffffffffffffffff821161060c5760606003198336030112610e33576040516060810181811067ffffffffffffffff821117610dcc57604052826004013567ffffffffffffffff8111610de25783013660238201121561060757600481013567ffffffffffffffff8111610dcc5760405191610825601f8301601f191660200184611607565b8183523660248284010111610d7757816000926024602093018386013783010152815260208101916024840135835260446040830194013584526108706001806066541614156117c8565b83514211610d1e57336000526098602052604060002060018060a01b03821660005260205260ff60406000205416600281101561073757600114610cc55760018060a01b038116938460005260996020526040600020845160005260205260ff60406000205416610c73577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156102b0576020602491604051928380926336b87bd760e11b82528a60048301525afa9081156102a457600091610c44575b5015610bd557610950859185519051903385611814565b9251913b15610b36573b156102b05760405191630b135d3f60e11b83526004830152604060248301528181519182604483015260005b838110610b1e5750506064818360008360209684010152601f80199101168101030181865afa9081156102a457600091610ad6575b506001600160e01b0319166374eca2c160e11b01610a4f575b3360005260986020526040600020826000526020526040600020600160ff19825416179055816000526099602052604060002090516000526020526040600020600160ff1982541617905560405190600182527ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4160203393a3005b60405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a490fd5b90506020813d602011610b16575b81610af160209383611607565b810103126102b557516001600160e01b031981168103610b1157836109bb565b600080fd5b3d9150610ae4565b60208282018101516064878401015285935001610986565b91610b4c91610b4491611ad5565b919091611b5b565b6001600160a01b0316146109d45760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a490fd5b60405162461bcd60e51b815260206004820152604d6024820152600080516020611d6883398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a490fd5b610c66915060203d602011610c6c575b610c5e8183611607565b810190611753565b86610939565b503d610c54565b60405162461bcd60e51b81526020600482015260366024820152600080516020611d688339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b6064820152608490fd5b60405162461bcd60e51b815260206004820152603f6024820152600080516020611d6883398151915260448201527f56533a206f70657261746f7220616c72656164792072656769737465726564006064820152608490fd5b60405162461bcd60e51b815260206004820152603e6024820152600080516020611d6883398151915260448201527f56533a206f70657261746f72207369676e6174757265206578706972656400006064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b634e487b7160e01b600052604160045260246000fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b346102ba5760003660031901126102b5576033546040516001600160a01b039091168152602090f35b346102ba5760003660031901126102b5576065546040516001600160a01b039091168152602090f35b346102ba5760003660031901126102b557610eef611a7d565b603380546001600160a01b031981169091556000906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346102ba5760003660031901126102b5576020606654604051908152f35b346102ba5760203660031901126102b55760043560ff8116809103610b115760016020911b806066541614604051908152f35b346102ba5760003660031901126102b5576065546001600160a01b0316803b156102b05760206024916040519283809263237dfb4760e11b82523360048301525afa80156102a457610fde91600091611014575b5061176b565b60001960665560405160001981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2005b61102d915060203d602011610c6c57610c5e8183611607565b82610fd8565b346102ba5760403660031901126102b55761104c6115db565b6110546115f1565b9060018060a01b0316600052609860205260406000209060018060a01b031660005260205260ff604060002054166040516002821015610737576020918152f35b346102ba5760403660031901126102b5576001600160a01b036110b66115db565b1660005260996020526040600020602435600052602052602060ff604060002054166040519015158152f35b346102ba5760003660031901126102b55760206040517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8668152f35b346102ba5760603660031901126102b5576111366115db565b61113e6115f1565b604435916000549260ff8460081c16159384809561132a575b8015611313575b156112b75760ff198116600117600055846112a5575b506065546001600160a01b03161580611293575b15611218576111da92816111ca926066556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a26118ea565b6111d26119c4565b609755611a34565b6111e057005b61ff0019600054166000557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a1005b60405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a490fd5b506001600160a01b0383161515611188565b61ffff19166101011760005584611174565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b15801561115e5750600160ff82161461115e565b50600160ff821610611157565b346102ba5760203660031901126102b557606554600435906001600160a01b0316803b156102b05760206024916040519283809263237dfb4760e11b82523360048301525afa80156102a4576113949160009161143c575061176b565b606654818116036113d157806066556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2005b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b611455915060203d602011610c6c57610c5e8183611607565b83610fd8565b346114eb5760203660031901126102b5576114746115db565b6065546001600160a01b031690813b156102b05760206004926040519384809263755b36bd60e11b82525afa9182156102a45761031b926114c7916000916114cc57506001600160a01b031633146116f4565b6118ea565b6114e5915060203d60201161029d5761028f8183611607565b846101ba565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b600435906001600160a01b0382168203610b1157565b602435906001600160a01b0382168203610b1157565b90601f8019910116810190811067ffffffffffffffff821117610dcc57604052565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b908160209103126102b557516001600160a01b0381168103610b115790565b156116fb57565b60405162461bcd60e51b815260206004820152602a60248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526939903ab73830bab9b2b960b11b6064820152608490fd5b908160209103126102b557518015158103610b115790565b1561177257565b60405162461bcd60e51b815260206004820152602860248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526739903830bab9b2b960c11b6064820152608490fd5b156117cf57565b60405162461bcd60e51b815260206004820152601960248201527f5061757361626c653a20696e64657820697320706175736564000000000000006044820152606490fd5b9290916040519260208401947fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd865260018060a01b0316604085015260018060a01b03166060840152608083015260a082015260a0815261187660c082611607565b5190206118816118b2565b9060405190602082019261190160f01b845260228301526042820152604281526118ac606282611607565b51902090565b467f0000000000000000000000000000000000000000000000000000000000000000036118df5760975490565b6118e76119c4565b90565b6001600160a01b0316801561194757606554604080516001600160a01b0383168152602081018490527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb69190a16001600160a01b03191617606555565b60405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a490fd5b6040600a602082516119d68482611607565b828152016922b4b3b2b72630bcb2b960b11b81522081519060208201927f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8668452820152466060820152306080820152608081526118ac60a082611607565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b6033546001600160a01b03163303611a9157565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b815160418103611b02575090611afe916020820151906060604084015193015160001a90611cbf565b9091565b604003611b515760406020830151920151918260ff1c91601b8301809311611b3b57611afe936001600160ff1b03169260ff1690611cbf565b634e487b7160e01b600052601160045260246000fd5b5050600090600290565b60058110156107375780611b6c5750565b600060018203611bbb5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b5060028103611c095760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b60009060038103611c645760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b6004915014611c6f57565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608490fd5b907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411611d5b5760ff1690601b82141580611d50575b611d4457602093600093608093604051938452868401526040830152606082015282805260015afa156102a4576000516001600160a01b03811615611d3b5790600090565b50600090600190565b50505050600090600490565b50601c821415611cf6565b5050505060009060039056fe4156534469726563746f72792e72656769737465724f70657261746f72546f41a26469706673582212201166ecd85e5acb204dc9a449f7b7e998e6758ea9c7abb9e58daa5248508cca6464736f6c634300081a0033"; + +type AVSDirectoryConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: AVSDirectoryConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class AVSDirectory__factory extends ContractFactory { + constructor(...args: AVSDirectoryConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + _delegation: string, + overrides?: Overrides & { from?: string } + ): Promise { + return super.deploy(_delegation, overrides || {}) as Promise; + } + override getDeployTransaction( + _delegation: string, + overrides?: Overrides & { from?: string } + ): TransactionRequest { + return super.getDeployTransaction(_delegation, overrides || {}); + } + override attach(address: string): AVSDirectory { + return super.attach(address) as AVSDirectory; + } + override connect(signer: Signer): AVSDirectory__factory { + return super.connect(signer) as AVSDirectory__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): AVSDirectoryInterface { + return new utils.Interface(_abi) as AVSDirectoryInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): AVSDirectory { + return new Contract(address, _abi, signerOrProvider) as AVSDirectory; + } +} diff --git a/src/avs/contracts/factories/DelegationManager__factory.ts b/src/avs/contracts/factories/DelegationManager__factory.ts new file mode 100644 index 00000000..b4655d92 --- /dev/null +++ b/src/avs/contracts/factories/DelegationManager__factory.ts @@ -0,0 +1,1728 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { + DelegationManager, + DelegationManagerInterface, +} from "../DelegationManager"; + +const _abi = [ + { + type: "constructor", + inputs: [ + { + name: "_strategyManager", + type: "address", + internalType: "contract IStrategyManager", + }, + { + name: "_slasher", + type: "address", + internalType: "contract ISlasher", + }, + { + name: "_eigenPodManager", + type: "address", + internalType: "contract IEigenPodManager", + }, + ], + 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: "contract IStrategy", + }, + ], + 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: "struct IDelegationManager.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: "contract IStrategy[]", + }, + { + name: "shares", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + }, + ], + outputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "pure", + }, + { + type: "function", + name: "completeQueuedWithdrawal", + inputs: [ + { + name: "withdrawal", + type: "tuple", + internalType: "struct IDelegationManager.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: "contract IStrategy[]", + }, + { + name: "shares", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + }, + { + name: "tokens", + type: "address[]", + internalType: "contract IERC20[]", + }, + { + 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: "struct IDelegationManager.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: "contract IStrategy[]", + }, + { + name: "shares", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + }, + { + name: "tokens", + type: "address[][]", + internalType: "contract IERC20[][]", + }, + { + 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: "contract IStrategy", + }, + { + 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: "struct ISignatureUtils.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: "struct ISignatureUtils.SignatureWithExpiry", + components: [ + { + name: "signature", + type: "bytes", + internalType: "bytes", + }, + { + name: "expiry", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "approverSignatureAndExpiry", + type: "tuple", + internalType: "struct ISignatureUtils.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: "contract IEigenPodManager", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getDelegatableShares", + inputs: [ + { + name: "staker", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "address[]", + internalType: "contract IStrategy[]", + }, + { + name: "", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getOperatorShares", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "strategies", + type: "address[]", + internalType: "contract IStrategy[]", + }, + ], + outputs: [ + { + name: "", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getWithdrawalDelay", + inputs: [ + { + name: "strategies", + type: "address[]", + internalType: "contract IStrategy[]", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "increaseDelegatedShares", + inputs: [ + { + name: "staker", + type: "address", + internalType: "address", + }, + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + { + 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: "contract IPauserRegistry", + }, + { + name: "initialPausedStatus", + type: "uint256", + internalType: "uint256", + }, + { + name: "_minWithdrawalDelayBlocks", + type: "uint256", + internalType: "uint256", + }, + { + name: "_strategies", + type: "address[]", + internalType: "contract IStrategy[]", + }, + { + 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: "struct IDelegationManager.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: "struct IDelegationManager.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: "contract IStrategy", + }, + ], + 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: "contract IPauserRegistry", + }, + ], + 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: "struct IDelegationManager.QueuedWithdrawalParams[]", + components: [ + { + name: "strategies", + type: "address[]", + internalType: "contract IStrategy[]", + }, + { + 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: "struct IDelegationManager.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: "contract IPauserRegistry", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setStrategyWithdrawalDelayBlocks", + inputs: [ + { + name: "strategies", + type: "address[]", + internalType: "contract IStrategy[]", + }, + { + name: "withdrawalDelayBlocks", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "slasher", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract ISlasher", + }, + ], + 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: "contract IStrategyManager", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "strategyWithdrawalDelayBlocks", + inputs: [ + { + name: "", + type: "address", + internalType: "contract IStrategy", + }, + ], + 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: "struct IDelegationManager.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: "struct IDelegationManager.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: "contract IStrategy", + }, + { + 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: "contract IStrategy", + }, + { + 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: "contract IPauserRegistry", + }, + { + name: "newPauserRegistry", + type: "address", + indexed: false, + internalType: "contract IPauserRegistry", + }, + ], + 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: "contract IStrategy", + }, + { + 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: "struct IDelegationManager.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: "contract IStrategy[]", + }, + { + name: "shares", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + }, + ], + anonymous: false, + }, +] as const; + +const _bytecode = + "0x610100806040523461024e57604051601f615e2e38819003918201601f19168301916001600160401b03831184841017610238578084926060946040528339810103126101e85780516001600160a01b03811681036101e3576020820151916001600160a01b03831683036101e35760400151906001600160a01b03821682036101e35760805260c05260a05260005460ff8160081c1661018e5760ff80821610610153575b4660e052604051615b92908161029c823960805181818161195201528181611bec0152818161215b0152818161250e015281816127c7015281816129f901528181612f770152818161458a015281816149d40152614b43015260a05181610f40015260c0518181816118bd01528181611ab2015281816120580152818161246a0152818161269601528181612a7c01528181612ffa0152818161451d015261491c015260e051816148820152f35b60ff90811916176000557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a1806100a5565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b600080fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b600052604160045260246000fd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fdfe6101206040526004361015610072575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b60003560e01c80630449ca39146136cb57806304a4f979146136905780630b9f487a146136545780630dd8dd02146134415780630f589e59146130b857806310d67a2f14613028578063132d496714612f65578063136439dd14612e415780631522bf0214612de35780631692836514612d9d5780631bbce09114612d5657806320606b7014612d1b57806322bf40e414612aaa57806328a573ae146129e757806329c77d4f146129ad578063334043961461218a57806339b70e38146121455780633cdeb5e0146121005780633e28391d146120c257806343377382146120875780634665bcda146120425780634fc40b6114612024578063595c6a6714611f65578063597b36da14611f305780635ac86ab714611efd5780635c975abb14611edf57806360d7faed146116c7578063635bbd10146116a357806365da1264146116615780636d70f7ae14611634578063715018a6146115d7578063778e55f3146115865780637f548071146111d4578063886f1195146111ab5780638da5cb5b1461118257806390041347146110c95780639104c3191461109a57806399be81c814610fa9578063a178848414610f6f578063b134427114610f2a578063b7f06ebe14610ef9578063bb45fef214610eac578063c448feb814610e8e578063c488375a14610e54578063c5e480db14610dae578063c94b511114610d7b578063ca661c0414610d5d578063cf80873e14610ce5578063da8be8641461090b578063eea9064b14610571578063f16172b0146104d2578063f2fde38b14610443578063f698da25146104205763fabc1cbc0361000f573461041b57602036600319011261041657606554600435906001600160a01b0316803b156104115760206004916040519283809263755b36bd60e11b82525afa80156104055761032c916000916103d6575b506001600160a01b031633146141e4565b60665419811981160361036b57806066556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a2005b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b6103f8915060203d6020116103fe575b6103f08183613b91565b8101906141c5565b3861031b565b503d6103e6565b6040513d6000823e3d90fd5b614172565b6137a3565b613753565b3461041b57600036600319011261041657602061043b61487f565b604051908152f35b3461041b5760203660031901126104165761045c61398d565b610464615199565b6001600160a01b0381161561047e5761047c90615434565b005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b3461041b576060366003190112610416576104ec33614463565b156104fa5761047c33614ddc565b60405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a490fd5b3461041b5760603660031901126104165761058a61398d565b6024356001600160401b038111610906576105a9903690600401613db1565b336000908152609a6020526040902054604435906001600160a01b0316610890576105d383614463565b15610816576105e9600180606654161415613f85565b6001600160a01b0383811660008181526099602052604090206001015490939116908115158061080c575b80610802575b6106b7575b50505033600052609a6020526040600020816bffffffffffffffffffffffff60a01b825416179055337fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d8743304600080a36106763361451b565b919060005b815181101561047c576001906106b16001600160a01b0361069c8386614136565b51166106a88388614136565b51903387615569565b0161067b565b60208101805142116107975782600052609c60205260406000208460005260205260ff6040600020541661072c576107249361071c9184600052609c6020526040600020826000526020526040600020600160ff198254161790555190848833613f00565b90519161568f565b82808061061f565b60405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608490fd5b60405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608490fd5b508333141561061a565b5081331415610614565b60405162461bcd60e51b815260206004820152604660248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a206f7060448201527f657261746f72206973206e6f74207265676973746572656420696e2045696765606482015265372630bcb2b960d11b608482015260a490fd5b60405162461bcd60e51b815260206004820152604260248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a20737460448201527f616b657220697320616c7265616479206163746976656c792064656c65676174606482015261195960f21b608482015260a490fd5b6137f3565b3461041b5760203660031901126104165761092461398d565b610935600280606654161415613f85565b6001600160a01b038082166000908152609a602052604081205490911615610c6e5761096082614463565b610c03576001600160a01b0382168015610b9857808252609a60205260408220546001600160a01b0316913382148015919082610b8f575b8015610b6e575b15610b03576040906109b08661451b565b949093610ad8575b85817ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af446768480a38152609a6020522080546001600160a01b0319169055805180610a2b575050505050610a27604051610a11602082613b91565b6000815260003681375b604051918291826139e3565b0390f35b610a3790939193613fd1565b936040926020929060005b8651811015610ac857600190610ab78751610a5d8982613b91565b83815287366020830137885190610a748a83613b91565b84825288366020840137848060a01b03610a8e858d614136565b5116610a9982614129565b52610aa48487614136565b51610aae83614129565b528787816148b4565b610ac1828b614136565b5201610a42565b50505050505050610a2790610a1b565b85817ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a8480a36109b8565b60405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608490fd5b50838152609960205260408120600101546001600160a01b0316331461099f565b50833314610998565b60405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608490fd5b60405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608490fd5b60a460405162461bcd60e51b815260206004820152604460248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20737460448201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b6084820152fd5b3461041b57602036600319011261041657610d06610d0161398d565b61451b565b604051906040820160408352835180915260206060840194019060005b818110610d3e578480610a2788878382036020850152613e92565b82516001600160a01b0316865260209586019590920191600101610d23565b3461041b57600036600319011261041657602060405162034bc08152f35b3461041b57608036600319011261041657602061043b610d9961398d565b610da16139b9565b6064359160243590614497565b3461041b57602036600319011261041657610dc761398d565b600060408051610dd681613b5b565b828152826020820152015260018060a01b031660005260996020526060604060002063ffffffff604051610e0981613b5b565b6001808060a01b0384541693848352015490826040602083019260018060a01b0385168452019260a01c16825260405193845260018060a01b03905116602084015251166040820152f35b3461041b576020366003190112610416576001600160a01b03610e7561398d565b1660005260a16020526020604060002054604051908152f35b3461041b576000366003190112610416576020609d54604051908152f35b3461041b576040366003190112610416576001600160a01b03610ecd61398d565b16600052609c6020526040600020602435600052602052602060ff604060002054166040519015158152f35b3461041b57602036600319011261041657600435600052609e602052602060ff604060002054166040519015158152f35b3461041b576000366003190112610416576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461041b576020366003190112610416576001600160a01b03610f9061398d565b16600052609f6020526020604060002054604051908152f35b3461041b576020366003190112610416576004356001600160401b03811161090657610fd9903690600401613a72565b610fe233614463565b1561101f5761101a7f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080909160405191829133958361414a565b0390a2005b60405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a490fd5b3461041b57600036600319011261041657602060405173beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08152f35b3461041b576040366003190112610416576110e261398d565b6024356001600160401b03811161090657611101903690600401613c7f565b9061110c8251613fd1565b916001600160a01b039091169060005b815181101561116c57600190836000526098602052604080600020838060a01b036111478487614136565b511690600091858060a01b0316825260205220546111658287614136565b520161111c565b60405160208082528190610a2790820187613e92565b3461041b576000366003190112610416576033546040516001600160a01b039091168152602090f35b3461041b576000366003190112610416576065546040516001600160a01b039091168152602090f35b3461041b5760a0366003190112610416576111ed61398d565b6111f56139a3565b6044356001600160401b03811161090657611214903690600401613db1565b6064356001600160401b03811161090657611233903690600401613db1565b906084356020820180514211611511576001600160a01b038087166000908152609a6020526040902054166114905761126b85614463565b1561140b576112b59060018060a01b0387169384600052609b602052600161129c604060002054935189858c614497565b9286600052609b6020520160406000205551908761568f565b6112c6600180606654161415613f85565b6001600160a01b03848116600081815260996020526040902060010154909491169081151580611401575b806113f7575b61138a575b5050506000818152609a6020526040812080546001600160a01b031916841790557fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049080a361134a8261451b565b9160005b825181101561047c576001906113846001600160a01b0361136f8387614136565b511661137b8388614136565b51908886615569565b0161134e565b60208101428151106107975782600052609c60205260406000208460005260205260ff6040600020541661072c576113ef9361071c9184600052609c6020526040600020826000526020526040600020600160ff19825416179055519084898b613f00565b8480806112fc565b50843314156112f7565b50813314156112f1565b60405162461bcd60e51b815260206004820152605160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a206f70657261746f72206973206e6f7420726567697374656064820152703932b21034b71022b4b3b2b72630bcb2b960791b608482015260a490fd5b60405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b657220697320616c726561647920616374697660648201526c195b1e4819195b1959d85d1959609a1b608482015260a490fd5b60405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a490fd5b3461041b5760403660031901126104165761159f61398d565b6115a76139a3565b6001600160a01b039182166000908152609860209081526040808320949093168252928352819020549051908152f35b3461041b576000366003190112610416576115f0615199565b603380546001600160a01b031981169091556000906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461041b57602036600319011261041657602061165761165261398d565b614463565b6040519015158152f35b3461041b576020366003190112610416576001600160a01b0361168261398d565b16600052609a602052602060018060a01b0360406000205416604051908152f35b3461041b576020366003190112610416576116bc615199565b61047c60043561547d565b3461041b576080366003190112610416576004356001600160401b03811161090657806004019060e06003198236030112611eda576024356001600160401b0381116109065761171b90369060040161394e565b919092606435928315158403611ed55761173c600480606654161415613f85565b61174b600260c954141561432a565b600260c95561176261175d3684613ce9565b614446565b80600052609e60205260ff6040600020541615611e7057608484019461179961178a87614dcb565b63ffffffff609d5491166144f8565b4310611df1576001600160a01b036117b360448701613eec565b163303611d7f5780611d06575b6000828152609e60205260409020805460ff1916905515611a1a579360a484019360c4019060005b6117f2868661406a565b90508110156119df57879061185561180984614dcb565b8261182e61182961181a8c8c61406a565b6001600160a01b039491613ec6565b613eec565b1660005260a160205261184e439163ffffffff60406000205491166144f8565b11156155f2565b8686611894611829848961188d826118818c6118876118298461188161187a8d613eec565b9d8d61406a565b90613ec6565b9861406a565b3597613ec6565b906001600160a01b031673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0810361194b5750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692833b156104115760405162387b1360e81b81526001600160a01b0390921660048301523360248301526044820152916000908390606490829084905af19182156104055760019261193a575b505b016117e8565b600061194591613b91565b89611932565b90939091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156104115760009283608492604051978895869463c608c7f360e01b86523360048701526024860152604485015260018060a01b031660648401525af1918215610405576001926119ce575b50611934565b60006119d991613b91565b896119c8565b5050505050507fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d91506020905b604051908152a1600160c955005b9391949033600052609a60205260018060a01b03604060002054169060009360a48601945b611a49868a61406a565b9050811015611cd4578890611a71611a6084614dcb565b8261182e61182961181a8c8861406a565b8587898673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac085611a9b61182961181a878b61406a565b1603611bc8575050505090611aaf90613eec565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611aeb8261188160c48c018e61406a565b3590803b15610411576040516303a041cf60e21b81526001600160a01b03851660048201526024810192909252602090829060449082906000905af190811561040557600091611b96575b506001600160a01b038084166000908152609a602052604090205460019484939291909116908d8b83611b71575b5050505050505b01611a3f565b611b8b9561188161182992611b859461406a565b91615569565b808b80808d8b611b64565b90506020813d8211611bc0575b81611bb060209383613b91565b8101031261041657516001611b36565b3d9150611ba3565b8461188160c4611c1961182984611881611c1261182983611c229a60018060a01b037f0000000000000000000000000000000000000000000000000000000000000000169e613ec6565b998d61406a565b9401809861406a565b3592803b156104115760405163c4623ea160e01b81523360048201526001600160a01b03938416602482015291909216604482015260648101929092526000908290608490829084905af180156104055760019389928d92611cc3575b508388611c90575b50505050611b6b565b611881611cb192611cab61182984611881611cba998961406a565b9461406a565b35903388615569565b868a8c83611c87565b6000611cce91613b91565b8d611c7f565b505050505050507fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d9150602090611a0c565b611d1360a486018561406a565b841490506117c05760405162461bcd60e51b81526020600482015260426024820152600080516020615b3d83398151915260448201527f645769746864726177616c3a20696e707574206c656e677468206d69736d61746064820152610c6d60f31b608482015260a490fd5b60405162461bcd60e51b81526020600482015260506024820152600080516020615b3d83398151915260448201527f645769746864726177616c3a206f6e6c7920776974686472617765722063616e60648201526f1031b7b6b83632ba329030b1ba34b7b760811b608482015260a490fd5b60405162461bcd60e51b815260206004820152605f6024820152600080516020615b3d83398151915260448201527f645769746864726177616c3a206d696e5769746864726177616c44656c61794260648201527f6c6f636b7320706572696f6420686173206e6f74207965742070617373656400608482015260a490fd5b60405162461bcd60e51b81526020600482015260436024820152600080516020615b3d83398151915260448201527f645769746864726177616c3a20616374696f6e206973206e6f7420696e20717560648201526265756560e81b608482015260a490fd5b600080fd5b613a1d565b3461041b576000366003190112610416576020606654604051908152f35b3461041b5760203660031901126104165760043560ff8116809103611ed55760016020911b806066541614604051908152f35b3461041b576020366003190112610416576004356001600160401b0381116109065761043b61175d6020923690600401613ce9565b3461041b576000366003190112610416576065546001600160a01b0316803b156104115760206024916040519283809263237dfb4760e11b82523360048301525afa801561040557611fbf91600091611ff5575b506142cd565b60001960665560405160001981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2005b612017915060203d60201161201d575b61200f8183613b91565b8101906142b5565b82611fb9565b503d612005565b3461041b5760003660031901126104165760206040516213c6808152f35b3461041b576000366003190112610416576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461041b5760003660031901126104165760206040517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b8152f35b3461041b5760203660031901126104165760206116576120e061398d565b6001600160a01b039081166000908152609a602052604090205416151590565b3461041b576020366003190112610416576001600160a01b0361212161398d565b166000526099602052602060018060a01b0360016040600020015416604051908152f35b3461041b576000366003190112610416576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461041b576080366003190112610416576004356001600160401b038111610906576121ba90369060040161394e565b9060a0526024356001600160401b038111610906576121dd90369060040161394e565b91906044356001600160401b038111610906576121fe90369060040161394e565b9390916064356001600160401b038111610906579285612224869395369060040161394e565b939092612238600480606654161415613f85565b612247600260c954141561432a565b600260c9556000955b8287101561010052610100516129a6576000610100528660051b8060a051013560e05260de1960a05136030160e05112156129a15781881015612987576122999089018961406a565b9890966122a7898786613ec6565b506122b3898289613ec6565b358015158103612980576122d061175d3660e05160a05101613ce9565b60c05260c0516101005152609e60205260ff60406101005120541615611e7057612302608060e05160a0510101614dcb565b612316439163ffffffff609d5491166144f8565b11611df15760e05160a0516001600160a01b03916123379101604001613eec565b163303611d7f57806128ff575b60c0516101005152609e6020526040610100512060ff1981541690556000146125ed57610100515b60e05160a0805161238192019081019061406a565b90508110156125a4576123e261239f608060e05160a0510101614dcb565b826123be61182961181a60a060e0518151010160e05160a0510161406a565b16610100515260a160205261184e439163ffffffff604061010051205491166144f8565b6123f160e05160a05101613eec565b90898c61243f6118298461241a6118298261188160a060e0518151010160e05160a0510161406a565b936124388261188160c060e05160a051010160e05160a0510161406a565b3595613ec6565b6001600160a01b039091169073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082036125095750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156104115760405162387b1360e81b81526001600160a01b039094166004850152336024850152604484015261010051908390606490829084905af19182156124fb576001926124e8575b505b0161236c565b610100516124f591613b91565b8c6124e0565b6040513d61010051823e3d90fd5b9093507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691823b156104115760405163c608c7f360e01b8152336004820152602481019590955260448501526001600160a01b0316606484015261010051908390608490829084905af19182156124fb57600192612591575b506124e2565b6101005161259e91613b91565b8c61258b565b50939790949850600191959296505b7fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d602060405160c0518152a1019591949093969296612250565b6101008051339052609a6020525160408120546001600160a01b03166080529799975b60e05160a0805161262592019081019061406a565b90508110156128ec5761264361239f608060e05160a0510101614dcb565b8a73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08261267861182961181a60a060e0518151010160e05160a0510161406a565b16036127b5575061268e60e05160a05101613eec565b60e05160a0517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169392916126d6918491611881910160c081019061406a565b3592803b15610411576040516303a041cf60e21b81526001600160a01b038316600482015260248101949094526101005160209185916044918391905af180156124fb576101005190612783575b61010080516001600160a01b03848116909152609a60205290516040902054600195501680612758575b5050505b01612610565b61277b92611b856118298661188160a060e0518151010160e05160a0510161406a565b8c808061274e565b506020833d82116127ad575b8161279c60209383613b91565b810103126104165760019251612724565b3d915061278f565b906127ed611829828c60018060a01b037f00000000000000000000000000000000000000000000000000000000000000001695613ec6565b9161280d6118298361188160a060e0518151010160e05160a0510161406a565b61282a8361188160c060e05160a051010160e05160a0510161406a565b3590823b156104115760405163c4623ea160e01b81523360048201526001600160a01b03958616602482015294166044850152606484015261010051908390608490829084905af19182156124fb576001926128d9575b5060805115612752576128d46128ac6118298361188160a060e0518151010160e05160a0510161406a565b6128c98361188160c060e05160a051010160e05160a0510161406a565b359033608051615569565b612752565b610100516128e691613b91565b8c612881565b50939790949850600191959296506125b3565b60e05160a0805161291492019081019061406a565b8c1490506123445760405162461bcd60e51b81526020600482015260426024820152600080516020615b3d83398151915260448201527f645769746864726177616c3a20696e707574206c656e677468206d69736d61746064820152610c6d60f31b608482015260a490fd5b6101005180fd5b634e487b7160e01b61010051526032600452602461010051fd5b614003565b600160c955005b3461041b576020366003190112610416576001600160a01b036129ce61398d565b16600052609b6020526020604060002054604051908152f35b3461041b576129f536613a9f565b90337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316148015612a78575b612a3290614243565b6001600160a01b038084166000908152609a602052604090205416612a5357005b6001600160a01b038084166000908152609a602052604090205461047c949116615569565b50337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614612a29565b3461041b5760c036600319011261041657612ac361398d565b612acb6139a3565b604435906084356001600160401b03811161090657612aee90369060040161394e565b60a4929192356001600160401b03811161090657612b1090369060040161394e565b9390926000549660ff8860081c161597888099612d0e575b8015612cf7575b15612c9b5760ff19811660011760005588612c89575b506065546001600160a01b03161580612c77575b15612bfc57612b9e612bae9288612bbe996066556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2615037565b612ba66153c4565b609755615434565b612bb960643561547d565b6151f1565b612bc457005b61ff0019600054166000557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a1005b60405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a490fd5b506001600160a01b0382161515612b59565b61ffff19166101011760005588612b45565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b158015612b2f5750600160ff821614612b2f565b50600160ff821610612b28565b3461041b5760003660031901126104165760206040517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8668152f35b3461041b57606036600319011261041657602061043b612d7461398d565b612d7c6139a3565b6001600160a01b0382166000908152609b8552604090205460443592614497565b3461041b576020366003190112610416576001600160a01b03612dbe61398d565b166000526099602052602063ffffffff60016040600020015460a01c16604051908152f35b3461041b576040366003190112610416576004356001600160401b03811161090657612e1390369060040161394e565b602435916001600160401b03831161090657612e3661047c93369060040161394e565b929091612bb9615199565b3461041b57602036600319011261041657606554600435906001600160a01b0316803b156104115760206024916040519283809263237dfb4760e11b82523360048301525afa801561040557612e9e91600091612f4657506142cd565b60665481811603612edb57806066556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2005b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b612f5f915060203d60201161201d5761200f8183613b91565b83611fb9565b3461041b57612f7336613a9f565b90337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316148015612ff6575b612fb090614243565b6001600160a01b038084166000908152609a602052604090205416612fd157005b6001600160a01b038084166000908152609a602052604090205461047c949116615111565b50337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614612fa7565b3461041b5760203660031901126104165761304161398d565b6065546001600160a01b031690813b156104115760206004926040519384809263755b36bd60e11b82525afa9182156104055761047c926130949160009161309957506001600160a01b031633146141e4565b615037565b6130b2915060203d6020116103fe576103f08183613b91565b8461031b565b3461041b5736600319016080811261041657606013611eda576064356001600160401b038111610906576130f0903690600401613a72565b336000908152609a60205260409020546001600160a01b03166133c35761311633614ddc565b60405161312281613b2a565b60608152602081019060008252613140600180606654161415613f85565b336000908152609960205260409020600101546001600160a01b031690811515806133b9575b806133b1575b6132ab575b5050336000818152609a6020526040812080546001600160a01b0319168317905590915081907fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049080a36131c43361451b565b9260005b8251811015613204576001906131fe6001600160a01b036131e98387614136565b51166131f58389614136565b51903333615569565b016131c8565b50604051836004356001600160a01b03811690819003611ed55782526024356001600160a01b03811690819003611ed55760208301526044359063ffffffff8216809203611ed5578261101a9260407f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080909501527f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e260603392a260405191829133958361414a565b825142116107975781600052609c60205260406000206000805260205260ff6040600020541661072c576133a99282600052609c6020526040600020600080526020526040600020600160ff198254161790555160405160208101917f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad8352846040830152336060830152336080830152600060a083015260c082015260c0815261335760e082613b91565b51902061339061339e61336861487f565b92604051928391602083019586909160429261190160f01b8352600283015260228201520190565b03601f198101835282613b91565b51902090519161568f565b828080613171565b50600061316c565b5081331415613166565b60405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a2063616c6c657220697320616c7265616479206163746976656c796064820152690819195b1959d85d195960b21b608482015260a490fd5b3461041b576020366003190112610416576004356001600160401b0381116109065761347190369060040161394e565b90613483600280606654161415613f85565b61348c82613fd1565b9033600052609a60205260018060a01b036040600020541660005b8481106134bc5760405180610a2786826139e3565b6134d06134ca828786614048565b8061406a565b90506134ea6134e0838887614048565b602081019061406a565b919050036135e957336001600160a01b03613511604061350b858a89614048565b01613eec565b160361357e5760019061356d84876135658461355d6135536134e061354a6134ca8588613544604061350b84848f614048565b9a614048565b9490968d614048565b9490923691613c2b565b923691613c9d565b9186336148b4565b6135778287614136565b52016134a7565b60405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a2077697468647261776572206d757374206265207374616b6572000000006064820152608490fd5b60405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608490fd5b3461041b5760a036600319011261041657602061043b61367261398d565b61367a6139a3565b906136836139b9565b6084359260643592613f00565b3461041b5760003660031901126104165760206040517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad8152f35b34613753576020366003190112610416576004356001600160401b038111610906576136fb90369060040161394e565b609d549160005b82811061371457602084604051908152f35b6001600160a01b0361372a611829838686613ec6565b1660005260a160205260406000205484811161374a575b50600101613702565b93506001613741565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b9181601f84011215613988578235916001600160401b038311613983576020808501948460051b01011161397e57565b6138f5565b61389c565b613843565b600435906001600160a01b0382168203611ed557565b602435906001600160a01b0382168203611ed557565b604435906001600160a01b0382168203611ed557565b35906001600160a01b0382168203611ed557565b602060408183019282815284518094520192019060005b818110613a075750505090565b82518452602093840193909201916001016139fa565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a207374727563742063616c6c6461746120746f6044820152661bc81cda1bdc9d60ca1b6064820152608490fd5b9181601f84011215613988578235916001600160401b038311613983576020838186019501011161397e57565b6060906003190112610416576004356001600160a01b0381168103611ed557906024356001600160a01b0381168103611ed5579060443590565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b604081019081106001600160401b03821117613b4557604052565b634e487b7160e01b600052604160045260246000fd5b606081019081106001600160401b03821117613b4557604052565b60e081019081106001600160401b03821117613b4557604052565b90601f801991011681019081106001600160401b03821117613b4557604052565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b359063ffffffff82168203611ed557565b6001600160401b038111613b455760051b60200190565b929190613c3781613c14565b93613c456040519586613b91565b602085838152019160051b810192831161397e57905b828210613c6757505050565b60208091613c74846139cf565b815201910190613c5b565b9080601f8301121561398857816020613c9a93359101613c2b565b90565b929190613ca981613c14565b93613cb76040519586613b91565b602085838152019160051b810192831161397e57905b828210613cd957505050565b8135815260209182019101613ccd565b919060e083820312613dac5760405190613d0282613b76565b8193613d0d816139cf565b8352613d1b602082016139cf565b6020840152613d2c604082016139cf565b604084015260608101356060840152613d4760808201613c03565b608084015260a08101356001600160401b038111613da75782613d6b918301613c7f565b60a084015260c0810135906001600160401b038211613da7570181601f820112156139885760c091816020613da293359101613c9d565b910152565b613bb2565b613ad9565b9190604083820312613dac5760405190613dca82613b2a565b819380356001600160401b038111613da75781019082601f83011215613988578135926001600160401b038411613b455760405190613e13601f8601601f191660200183613b91565b84825260208585010111613e3d576000602085819682809701838601378301015284520135910152565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b906020808351928381520192019060005b818110613eb05750505090565b8251845260209384019390920191600101613ea3565b9190811015613ed65760051b0190565b634e487b7160e01b600052603260045260246000fd5b356001600160a01b0381168103611ed55790565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad602082019081526001600160a01b0395861692820192909252918416606083015292909116608082015260a081019290925260c080830193909352918152613f6e60e082613b91565b519020613390613f7f61336861487f565b51902090565b15613f8c57565b60405162461bcd60e51b815260206004820152601960248201527f5061757361626c653a20696e64657820697320706175736564000000000000006044820152606490fd5b90613fdb82613c14565b613fe86040519182613b91565b8281528092613ff9601f1991613c14565b0190602036910137565b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206f6666736574000000006044820152606490fd5b9190811015613ed65760051b81013590605e19813603018212156129a1570190565b903590601e19813603018212156129a157018035906001600160401b0382116140e457602001918160051b3603831361409f57565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c64617461207461696c20746f6f2073686f72740000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206c656e677468000000006044820152606490fd5b805115613ed65760200190565b8051821015613ed65760209160051b010190565b90918060409360208452816020850152848401376000828201840152601f01601f1916010190565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b9081602091031261041657516001600160a01b0381168103611ed55790565b156141eb57565b60405162461bcd60e51b815260206004820152602a60248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526939903ab73830bab9b2b960b11b6064820152608490fd5b1561424a57565b60405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60448201527f616e616765724f72456967656e506f644d616e616765720000000000000000006064820152608490fd5b9081602091031261041657518015158103611ed55790565b156142d457565b60405162461bcd60e51b815260206004820152602860248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526739903830bab9b2b960c11b6064820152608490fd5b1561433157565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b80516001600160a01b039081168352602080830151821681850152604080840151909216918401919091526060808301519084015260808083015163ffffffff169084015260a08083015160e0918501829052805191850182905261010085019392019060005b8181106144275750505060c001519160c08183039101526020808351928381520192019060005b8181106144115750505090565b8251845260209384019390920191600101614404565b82516001600160a01b03168552602094850194909201916001016143dd565b604051613f7f816133906020820194602086526040830190614376565b6001600160a01b03168015159081614479575090565b6000818152609a60205260409020546001600160a01b031614919050565b92906040519260208401947f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b865260018060a01b0316604085015260018060a01b03166060840152608083015260a082015260a08152613f6e60c082613b91565b9190820180921161450557565b634e487b7160e01b600052601160045260246000fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610411576040516360f4062b60e01b81526001600160a01b039092166004830181905290602090839060249082905afa9182156104055760009261484b575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b15610411576000906024604051809481936394f649dd60e01b835260048301525afa908115610405576000908192614736575b506000831315614730578051600081614665575050505090604080519261460f8285613b91565b60018452614660601f1983019283366020880137859361463182519283613b91565b6001825236602083013773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac061465a8297614129565b52614129565b529190565b6001820180921161471c575061467a90613fd1565b906146858251613fd1565b9460005b82518110156146d0576001906001600160a01b036146a78286614136565b51166146b38287614136565b526146be8187614136565b516146c9828a614136565b5201614689565b509391925050815160001981019081116145055761470373beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac09184614136565b5281516000198101908111614505576146609085614136565b634e487b7160e01b81526011600452602490fd5b92909150565b91503d8082843e6147478184613b91565b8201916040818403126104165780516001600160401b03811161090657810183601f820112156139885780519061477d82613c14565b9361478b6040519586613b91565b82855260208086019360051b8301019186831161397e57602001925b82841061482757505050506020810151906001600160401b03821161090657019180601f840112156139885782516147de81613c14565b936147ec6040519586613b91565b81855260208086019260051b82010192831161397e57602001905b82821061481757505050386145e8565b8151815260209182019101614807565b83516001600160a01b0381168103614847578152602093840193016147a7565b8280fd5b9091506020813d602011614877575b8161486760209383613b91565b8101031261041657519038614587565b3d915061485a565b467f0000000000000000000000000000000000000000000000000000000000000000036148ac5760975490565b613c9a6153c4565b93949392916001600160a01b038416918215614d4757835115614cc65760005b8451811015614bf8576001600160a01b038216614bc9575b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b036149138388614136565b5116036149b2577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169061494f818a614136565b5191803b156104115760405163beffbb8960e01b81526001600160a01b038916600482015260248101939093526000908390604490829084905af1918215610405576001926149a1575b505b016148d4565b60006149ac91613b91565b38614999565b6001600160a01b03831684148015614b38575b15614a75576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169190614a018288614136565b5116614a0d828b614136565b51833b1561041157604051638c80d4e560e01b81526001600160a01b038a811660048301529290921660248301526044820152916000908390606490829084905af191821561040557600192614a64575b5061499b565b6000614a6f91613b91565b38614a5e565b60e460405162461bcd60e51b815260206004820152608460248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a2077697468647261776572206d7560648201527f73742062652073616d652061646472657373206173207374616b65722069662060848201527f746869726450617274795472616e7366657273466f7262696464656e2061726560a482015263081cd95d60e21b60c4820152fd5b506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811690614b6f8388614136565b5116813b1561041157602090602460405180948193639b4da03d60e01b835260048301525afa90811561040557600091614bab575b50156149c5565b614bc3915060203d811161201d5761200f8183613b91565b38614ba4565b614bf36001600160a01b03614bde8388614136565b5116614bea838b614136565b51908885615111565b6148ec565b506000838152609f6020526040902080549697939693955083600019811461450557600101905560405195614c2c87613b76565b86526001600160a01b03908116602087015216604085015260608401524363ffffffff16608084015260a083015260c08201527f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f9614cc0614c8c83614446565b9283600052609e6020526040600020600160ff19825416179055604051918291858352604060208401526040830190614376565b0390a190565b60405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374726174656769657320636160648201526c6e6e6f7420626520656d70747960981b608482015260a490fd5b60405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a490fd5b3563ffffffff81168103611ed55790565b6044359063ffffffff821690818303611ed5576213c6808211614f915760018060a01b03169081600052609960205263ffffffff60016040600020015460a01c1611614f0a576000908152609960205260409020600435906001600160a01b0382168203611ed55780546001600160a01b0319166001600160a01b0392831617815560010191906024359081168103611ed55782546001600160c01b0319166001600160a01b039182161760a09290921b63ffffffff60a01b169190911790915560405160608101917ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac9190614ed260046139cf565b1681526001600160a01b03614ee760246139cf565b16602082015263ffffffff614efc6044613c03565b1660408201528033930390a2565b60405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a490fd5b60405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c490fd5b6001600160a01b0316801561509457606554604080516001600160a01b0383168152602081018490527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb69190a16001600160a01b03191617606555565b60405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a490fd5b6001600160a01b03908116600081815260986020908152604080832094871683529390529190912080549194808303949392851161450557939055604080516001600160a01b0392831681529290911660208301528101919091527f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd9080606081015b0390a2565b6033546001600160a01b031633036151ad57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b9190918383036153465760005b83811061520c575050505050565b6001600160a01b03615222611829838786613ec6565b16908160005260a160205260406000205461523e828887613ec6565b359062034bc0821161529957837f0e7efa738e8b0ce6376a0c1af471655540d2e9a81647d7b09ed823018426576d9260609260019660005260a16020528160406000205560405192835260208301526040820152a1016151fe565b60405162461bcd60e51b815260206004820152607360248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a205f7769746864726177616c60648201527f44656c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544860848201527244524157414c5f44454c41595f424c4f434b5360681b60a482015260c490fd5b60405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a20696e707574206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a490fd5b6040600a602082516153d68482613b91565b828152016922b4b3b2b72630bcb2b960b11b81522081519060208201927f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866845282015246606082015230608082015260808152613f7f60a082613b91565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b62034bc081116154be577fafa003cd76f87ff9d62b35beea889920f33c0c42b8d45b74954d61d50f4b6b696040609d548151908152836020820152a1609d55565b60405162461bcd60e51b815260206004820152607160248201527f44656c65676174696f6e4d616e616765722e5f7365744d696e5769746864726160448201527f77616c44656c6179426c6f636b733a205f6d696e5769746864726177616c446560648201527f6c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544844526084820152704157414c5f44454c41595f424c4f434b5360781b60a482015260c490fd5b906151947f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c939260018060a01b031694856000526098602052604060002060018060a01b03851660005260205260406000206155c68282546144f8565b9055604080516001600160a01b0394851681529490931660208501529183019190915281906060820190565b156155f957565b60405162461bcd60e51b815260206004820152606e6024820152600080516020615b3d83398151915260448201527f645769746864726177616c3a207769746864726177616c44656c6179426c6f6360648201527f6b7320706572696f6420686173206e6f74207965742070617373656420666f7260848201526d207468697320737472617465677960901b60a482015260c490fd5b909190803b15615805576001600160a01b031690813b156104115760408051630b135d3f60e11b815260048101949094526024840152805160448401819052839160005b8281106157ed57505091816064818560008360209884010152601f801991011681010301915afa908115610405576000916157aa575b506001600160e01b0319166374eca2c160e11b0161572357565b60405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a490fd5b90506020813d6020116157e5575b816157c560209383613b91565b8101031261041657516001600160e01b031981168103611ed55738615709565b3d91506157b8565b602082820181015160648884010152869450016156d3565b906158139061581b936158aa565b92909261591a565b6001600160a01b0390811691160361582f57565b60405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a490fd5b8151604181036158d75750906158d3916020820151906060604084015193015160001a90615a94565b9091565b6040036159105760406020830151920151918260ff1c91601b8301809311614505576158d3936001600160ff1b03169260ff1690615a94565b5050600090600290565b6005811015615a7e578061592b5750565b60006001820361597a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b50600281036159c85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b60009060038103615a235760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b6004915014615a2e57565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608490fd5b634e487b7160e01b600052602160045260246000fd5b907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615b305760ff1690601b82141580615b25575b615b1957602093600093608093604051938452868401526040830152606082015282805260015afa15610405576000516001600160a01b03811615615b105790600090565b50600090600190565b50505050600090600490565b50601c821415615acb565b5050505060009060039056fe44656c65676174696f6e4d616e616765722e5f636f6d706c6574655175657565a2646970667358221220c1e5ba5a0ff9a3f5aa6639ea96acebc0095aad0753c5aadae823932723ee179b64736f6c634300081a0033"; + +type DelegationManagerConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: DelegationManagerConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class DelegationManager__factory extends ContractFactory { + constructor(...args: DelegationManagerConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + _strategyManager: string, + _slasher: string, + _eigenPodManager: string, + overrides?: Overrides & { from?: string } + ): Promise { + return super.deploy( + _strategyManager, + _slasher, + _eigenPodManager, + overrides || {} + ) as Promise; + } + override getDeployTransaction( + _strategyManager: string, + _slasher: string, + _eigenPodManager: string, + overrides?: Overrides & { from?: string } + ): TransactionRequest { + return super.getDeployTransaction( + _strategyManager, + _slasher, + _eigenPodManager, + overrides || {} + ); + } + override attach(address: string): DelegationManager { + return super.attach(address) as DelegationManager; + } + override connect(signer: Signer): DelegationManager__factory { + return super.connect(signer) as DelegationManager__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): DelegationManagerInterface { + return new utils.Interface(_abi) as DelegationManagerInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): DelegationManager { + return new Contract(address, _abi, signerOrProvider) as DelegationManager; + } +} diff --git a/src/avs/contracts/factories/ECDSAStakeRegistry__factory.ts b/src/avs/contracts/factories/ECDSAStakeRegistry__factory.ts new file mode 100644 index 00000000..57f4b494 --- /dev/null +++ b/src/avs/contracts/factories/ECDSAStakeRegistry__factory.ts @@ -0,0 +1,882 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { + ECDSAStakeRegistry, + ECDSAStakeRegistryInterface, +} from "../ECDSAStakeRegistry"; + +const _abi = [ + { + type: "constructor", + inputs: [ + { + name: "_delegationManager", + type: "address", + internalType: "contract IDelegationManager", + }, + ], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "deregisterOperator", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "getLastCheckpointOperatorWeight", + inputs: [ + { + name: "_operator", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getLastCheckpointThresholdWeight", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getLastCheckpointThresholdWeightAtBlock", + inputs: [ + { + name: "_blockNumber", + type: "uint32", + internalType: "uint32", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getLastCheckpointTotalWeight", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getLastCheckpointTotalWeightAtBlock", + inputs: [ + { + name: "_blockNumber", + type: "uint32", + internalType: "uint32", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getLastestOperatorSigningKey", + inputs: [ + { + name: "_operator", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getOperatorSigningKeyAtBlock", + inputs: [ + { + name: "_operator", + type: "address", + internalType: "address", + }, + { + name: "_blockNumber", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getOperatorWeight", + inputs: [ + { + name: "_operator", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getOperatorWeightAtBlock", + inputs: [ + { + name: "_operator", + type: "address", + internalType: "address", + }, + { + name: "_blockNumber", + type: "uint32", + internalType: "uint32", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "initialize", + inputs: [ + { + name: "_serviceManager", + type: "address", + internalType: "address", + }, + { + name: "_thresholdWeight", + type: "uint256", + internalType: "uint256", + }, + { + name: "_quorum", + type: "tuple", + internalType: "struct Quorum", + components: [ + { + name: "strategies", + type: "tuple[]", + internalType: "struct StrategyParams[]", + components: [ + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + { + name: "multiplier", + type: "uint96", + internalType: "uint96", + }, + ], + }, + ], + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "isValidSignature", + inputs: [ + { + name: "_dataHash", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "_signatureData", + type: "bytes", + internalType: "bytes", + }, + ], + outputs: [ + { + name: "", + type: "bytes4", + internalType: "bytes4", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "minimumWeight", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "operatorRegistered", + inputs: [ + { + name: "_operator", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "owner", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "quorum", + inputs: [], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct Quorum", + components: [ + { + name: "strategies", + type: "tuple[]", + internalType: "struct StrategyParams[]", + components: [ + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + { + name: "multiplier", + type: "uint96", + internalType: "uint96", + }, + ], + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "registerOperatorWithSignature", + inputs: [ + { + name: "_operatorSignature", + type: "tuple", + internalType: "struct ISignatureUtils.SignatureWithSaltAndExpiry", + components: [ + { + name: "signature", + type: "bytes", + internalType: "bytes", + }, + { + name: "salt", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "expiry", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "_signingKey", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "renounceOwnership", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "transferOwnership", + inputs: [ + { + name: "newOwner", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "updateMinimumWeight", + inputs: [ + { + name: "_newMinimumWeight", + type: "uint256", + internalType: "uint256", + }, + { + name: "_operators", + type: "address[]", + internalType: "address[]", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "updateOperatorSigningKey", + inputs: [ + { + name: "_newSigningKey", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "updateOperators", + inputs: [ + { + name: "_operators", + type: "address[]", + internalType: "address[]", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "updateOperatorsForQuorum", + inputs: [ + { + name: "operatorsPerQuorum", + type: "address[][]", + internalType: "address[][]", + }, + { + name: "", + type: "bytes", + internalType: "bytes", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "updateQuorumConfig", + inputs: [ + { + name: "_quorum", + type: "tuple", + internalType: "struct Quorum", + components: [ + { + name: "strategies", + type: "tuple[]", + internalType: "struct StrategyParams[]", + components: [ + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + { + name: "multiplier", + type: "uint96", + internalType: "uint96", + }, + ], + }, + ], + }, + { + name: "_operators", + type: "address[]", + internalType: "address[]", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "updateStakeThreshold", + inputs: [ + { + name: "_thresholdWeight", + 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: "MinimumWeightUpdated", + inputs: [ + { + name: "_old", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "_new", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OperatorDeregistered", + inputs: [ + { + name: "_operator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "_avs", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OperatorRegistered", + inputs: [ + { + name: "_operator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "_avs", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OperatorWeightUpdated", + inputs: [ + { + name: "_operator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "oldWeight", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "newWeight", + 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: "QuorumUpdated", + inputs: [ + { + name: "_old", + type: "tuple", + indexed: false, + internalType: "struct Quorum", + components: [ + { + name: "strategies", + type: "tuple[]", + internalType: "struct StrategyParams[]", + components: [ + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + { + name: "multiplier", + type: "uint96", + internalType: "uint96", + }, + ], + }, + ], + }, + { + name: "_new", + type: "tuple", + indexed: false, + internalType: "struct Quorum", + components: [ + { + name: "strategies", + type: "tuple[]", + internalType: "struct StrategyParams[]", + components: [ + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + { + name: "multiplier", + type: "uint96", + internalType: "uint96", + }, + ], + }, + ], + }, + ], + anonymous: false, + }, + { + type: "event", + name: "SigningKeyUpdate", + inputs: [ + { + name: "operator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "updateBlock", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + { + name: "newSigningKey", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "oldSigningKey", + type: "address", + indexed: false, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ThresholdWeightUpdated", + inputs: [ + { + name: "_thresholdWeight", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "TotalWeightUpdated", + inputs: [ + { + name: "oldTotalWeight", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "newTotalWeight", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "UpdateMinimumWeight", + inputs: [ + { + name: "oldMinimumWeight", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "newMinimumWeight", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "InsufficientSignedStake", + inputs: [], + }, + { + type: "error", + name: "InsufficientWeight", + inputs: [], + }, + { + type: "error", + name: "InvalidLength", + inputs: [], + }, + { + type: "error", + name: "InvalidQuorum", + inputs: [], + }, + { + type: "error", + name: "InvalidReferenceBlock", + inputs: [], + }, + { + type: "error", + name: "InvalidSignature", + inputs: [], + }, + { + type: "error", + name: "InvalidSignedWeight", + inputs: [], + }, + { + type: "error", + name: "InvalidThreshold", + inputs: [], + }, + { + type: "error", + name: "LengthMismatch", + inputs: [], + }, + { + type: "error", + name: "MustUpdateAllOperators", + inputs: [], + }, + { + type: "error", + name: "NotSorted", + inputs: [], + }, + { + type: "error", + name: "OperatorAlreadyRegistered", + inputs: [], + }, + { + type: "error", + name: "OperatorNotRegistered", + inputs: [], + }, +] as const; + +const _bytecode = + "0x60a080604052346100dc57604051601f61297e38819003918201601f19168301916001600160401b038311848410176100c65780849260209460405283398101031261007657516001600160a01b038116810361007157608052604051612854908161012a8239608051816116e40152f35b600080fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b600052604160045260246000fd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fdfe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b6000803560e01c8062cf2ab514610fb45780630dba339414610f8b5780631626ba7e14610c4e5780631703a01814610bfe5780631e4cd85e14610bd5578063314f3a4914610bbb5780633b242e4a14610b825780633d5611f61461098f57806340bf2fb7146109725780635140a548146108665780635e1042e8146108205780635ef53329146107fb578063696255be14610780578063715018a614610723578063743c31f4146106db578063857dc190146105c45780638da5cb5b1461059c578063955f2d901461054b57806398ec1ac914610520578063ab1189951461038b578063b933fa7414610322578063cdcd3581146102d7578063dec5d1f614610268578063ec7fbb31146102295763f2fde38b1461018f575061000e565b3461022457602036600319011261021f576101a861120e565b6101b0611b83565b6001600160a01b038116156101cb576101c890611db2565b80f35b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b611038565b610fe8565b503461022457602036600319011261021f5760209060ff906040906001600160a01b0361025461120e565b168152606e84522054166040519015158152f35b503461022457604036600319011261021f576004356001600160401b0381116102d25761029990369060040161145d565b602435906001600160401b0382116102d2576102cd6102bf6101c8933690600401611229565b916102c8611b83565b611ee3565b6118c0565b611088565b503461022457602036600319011261021f576020906001600160a01b036102fc61120e565b168152606a8252604090206001600160a01b039061031990611b4f565b16604051908152f35b5034610224578060031936011261021f57606c54908161035457602091505b6040516001600160e01b03919091168152f35b6000198201918211610377575061036e602091606c611910565b5054811c610341565b634e487b7160e01b81526011600452602490fd5b503461022457606036600319011261021f576103a561120e565b6044356001600160401b0381116102d2576103c490369060040161145d565b82549060ff8260081c161592838094610513575b80156104fc575b156104a05760ff198316600117855561042f928461048f575b5061040960ff865460081c16611e83565b60018060a01b03166001600160601b0360a01b60685416176068556102c8602435611bdb565b61044860ff835460081c1661044381611e83565b611e83565b61045133611db2565b6104585780f35b61ff001981541681557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a180f35b61ffff1916610101178555386103f8565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b1580156103df5750600160ff8416146103df565b50600160ff8416106103d8565b3461022457602036600319011261021f57602061054361053e61120e565b61166a565b604051908152f35b503461022457604036600319011261021f5761056561120e565b6024359063ffffffff8216809203610598576001600160a01b03168252606d602090815260409092206105439190611aac565b8280fd5b50346102245736600319011261021f576033546040516001600160a01b039091168152602090f35b5034610224578060031936011261021f57338152606e60205260ff604082205416156106cc5760655480156106b85760001901606555338152606e6020526040812060ff19815416905561061f61061a33612065565b612299565b50506068546001600160a01b0316803b156106b357818080926024604051809481936351b27a6d60e11b83523360048401525af180156106a857610693575b506068546001600160a01b0316337f31e0adfec71bccee37b6e83a90c2fedb17d8f1693fee863c4771e7bfe2aed5808380a380f35b8161069d9161117d565b61021f57803861065e565b6040513d84823e3d90fd5b6115f4565b634e487b7160e01b82526011600452602482fd5b6325ec6c1f60e01b8152600490fd5b503461022457602036600319011261021f576106f561120e565b338252606e60205260ff60408320541615610714576101c89033611dfb565b6325ec6c1f60e01b8252600482fd5b5034610224578060031936011261021f5761073c611b83565b603380546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461022457604036600319011261021f576024356004356001600160401b0382116102d2577f713ca53b88d6eb63f5b1854cb8cbdd736ec51eda225e46791aa9298b0160648f60406107da6101c8943690600401611229565b926107e3611b83565b606754908060675582519182526020820152a16118c0565b503461022457602036600319011261021f57610815611b83565b6101c8600435611bdb565b503461022457604036600319011261021f576020906001600160a01b0361084561120e565b168152606a8252604090206001600160a01b03906103199060243590611aac565b503461022457604036600319011261021f576004356001600160401b0381116102d25736602382011215610968578060040135906108a38261119e565b906108b1604051928361117d565b82825260208201906024829460051b8201019036821161096d5760248101925b82841061093957505050506024356001600160401b0381116102d2576108fb90369060040161131a565b5051156109255751805160655403610916576101c8906118c0565b63169efb5b60e11b8252600482fd5b634e487b7160e01b82526032600452602482fd5b83356001600160401b0381116109685760209161095d839260243691870101611229565b8152019301926108d1565b6110d8565b6111b5565b50346102245736600319011261021f576020606754604051908152f35b503461022457604036600319011261021f576004356001600160401b0381116102d25760606003198236030112610b7d5760405190606082018281106001600160401b03821117610b695760405280600401356001600160401b038111610b6457610a00906004369184010161131a565b8252602082019160248201358352604460408201920135825260243560018060a01b0381168103610b6057338552606e60205260ff604086205416610b51576065546000198114610b3d57906001610a819201606555338652606e60205260408620600160ff19825416179055610a7961061a33612065565b505033611dfb565b6068546001600160a01b031691823b156106b3578492610ad084809460405197889586948593639926ee7d60e01b855233600486015260406024860152516060604486015260a4850190611b5e565b9151606484015251608483015203925af18015610b3057610b20575b6068546001600160a01b0316337fa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c18380a380f35b610b299161117d565b3881610aec565b50604051903d90823e3d90fd5b634e487b7160e01b86526011600452602486fd5b6342ee68b560e01b8552600485fd5b8480fd5b61140c565b634e487b7160e01b84526041600452602484fd5b6113bb565b503461022457602036600319011261021f57602090610543906040906001600160a01b03610bae61120e565b168152606d845220611b4f565b50346102245736600319011261021f576020610543611b41565b3461022457602036600319011261021f57602061054363ffffffff610bf8611297565b16611a16565b50346102245736600319011261021f576060604051610c1c81611131565b52610c4a604051610c2c81611131565b610c34611551565b8152604051918291602083526020830190611361565b0390f35b503461022457604036600319011261021f576004356024356001600160401b0381116102d257610c8290369060040161131a565b9081518201906060836020840193031261021f5760208301516001600160401b0381116102d25783019282603f85011215610968576020840151610cc58161119e565b94610cd3604051968761117d565b8186526020808088019360051b830101019085821161096d57604001915b818310610f675750505060408101516001600160401b0381116102d257810183603f8201121561096857602081015190610d2a8261119e565b94610d38604051968761117d565b8286526020808088019460051b840101019181831161096d5760408101935b838510610ef5575050505050606001519063ffffffff8216809203610b60578351908590869480518403610ee3578315610ed45794959394438610159488935b858510610e0457505050505050610df557610db181611928565b8211610de657610dc090611a16565b11610dd757604051630b135d3f60e11b8152602090f35b63e121632f60e01b8152600490fd5b634b05a0f760e11b8352600483fd5b63e64f180f60e01b8352600483fd5b60018060a09a939495969998979a1b03610e1e89856115ca565b511695610ec557858a52606a60205260408a2086906001600160a01b0390610e47908a90611aac565b16916001600160a01b03161015610eb657610e6e9085610e678a876115ca565b519161255b565b15610ea757906001610e9a8a959493610e948960408a99809b8152606d60205220611aac565b90611647565b9701939794959697610d97565b638baa579f60e01b8952600489fd5b63ba50f91160e01b8a5260048afd5b63e64f180f60e01b8a5260048afd5b63251f56a160e21b8852600488fd5b6001621398b960e31b03198852600488fd5b84516001600160401b038111610968576020908301019083603f8301121561096857602082015190610f26826112ff565b610f33604051918261117d565b8281526040848401018610610f6257610f576020949385946040868501910161152e565b815201940193610d57565b6112aa565b82516001600160a01b0381168103610f8757815260209283019201610cf1565b8880fd5b3461022457602036600319011261021f57602061054363ffffffff610fae611297565b16611928565b5034610fe857602036600319011261021f576004356001600160401b0381116102d2576102cd6101c8913690600401611229565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b602081019081106001600160401b0382111761114c57604052565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761114c57604052565b90601f801991011681019081106001600160401b0382111761114c57604052565b6001600160401b03811161114c5760051b60200190565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b600435906001600160a01b038216820361122457565b600080fd5b9080601f83011215610968578135906112418261119e565b9261124f604051948561117d565b82845260208085019360051b82010191821161096d57602001915b8183106112775750505090565b82356001600160a01b03811681036112245781526020928301920161126a565b6004359063ffffffff8216820361122457565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b6001600160401b03811161114c57601f01601f191660200190565b81601f8201121561096857803590611331826112ff565b9261133f604051948561117d565b82845260208383010111610f6257816000926020809301838601378301015290565b6020604081840192519382815284518094520192019060005b8181106113875750505090565b825180516001600160a01b031685526020908101516001600160601b0316818601526040909401939092019160010161137a565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b9190602083820312610b7d5760405161147581611131565b80938035906001600160401b038211610b64570182601f82011215610968578035906114a08261119e565b936114ae604051958661117d565b82855260208086019360061b8301019181831161096d57602001925b8284106114d8575050505052565b604084830312610b7d57604051906114ef82611162565b84356001600160a01b03811681036112245782526020850135906001600160601b038216820361122457826020928360409501528152019301926114ca565b60005b8381106115415750506000910152565b8181015183820152602001611531565b6066549061155e8261119e565b9161156c604051938461117d565b808352606660009081526000805160206127ff833981519152602085015b8383106115975750505050565b6001602081926040516115a981611162565b8554848060a01b038116825260a01c8382015281520192019201919061158a565b80518210156115de5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b9190820180921161165457565b634e487b7160e01b600052601160045260246000fd5b611672611551565b80519092600061169a6116848461119e565b93611692604051958661117d565b80855261119e565b602084019490601f190136863760005b86518110156116dc576001906001600160a01b036116c8828a6115ca565b5151166116d582886115ca565b52016116aa565b5091939092917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169190823b156106b35760408051639004134760e01b81526001600160a01b03909216600483015260248201529251604484018190528391606483019160005b8181106118825750505091818060009403915afa908115611876576000916117e5575b506000915b84518310156117c55761178683836115ca565b51906001600160601b03602061179c86896115ca565b5101511691828102928184041490151715611654576001916117bd91611647565b920191611773565b915050612710919250046067548110156000146117df5790565b50600090565b90503d806000833e6117f7818361117d565b81019060208183031261021f578051906001600160401b0382116102d257019080601f8301121561096857815161182d8161119e565b9261183b604051948561117d565b81845260208085019260051b82010192831161096d57602001905b828210611866575050503861176e565b8151815260209182019101611856565b6040513d6000823e3d90fd5b82516001600160a01b031684528694506020938401939092019160010161174b565b9190916000838201938412911290801582169115161761165457565b906000805b83518210156118ff576001906118f7906118f16001600160a01b036118ea86896115ca565b5116612065565b906118a4565b9101906118c5565b905061190c919250612299565b5050565b80548210156115de5760005260206000200190600090565b438110156119d257606b54906000905b82821061197757505080611956575060005b6001600160e01b031690565b60001981019081116116545761196d90606b611910565b505460201c61194a565b909161198a81841860011c828516611647565b908263ffffffff61199c84606b611910565b50541611156119ae5750915b90611938565b925060018101809111156119a857634e487b7160e01b600052601160045260246000fd5b606460405162461bcd60e51b815260206004820152602060248201527f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e65646044820152fd5b438110156119d257606c54906000905b828210611a5157505080611a3a5750600090565b60001981019081116116545761196d90606c611910565b9091611a6481841860011c828516611647565b908263ffffffff611a7684606c611910565b5054161115611a885750915b90611a26565b92506001810180911115611a8257634e487b7160e01b600052601160045260246000fd5b90438110156119d2578154906000905b828210611ae757505080611ad257506000919050565b60001981019081116116545761196d91611910565b9091611afa81841860011c828516611647565b908263ffffffff611b0b8488611910565b5054161115611b1d5750915b90611abc565b92506001810180911115611b1757634e487b7160e01b600052601160045260246000fd5b606b54806119565750600090565b805480611ad257506000919050565b90602091611b778151809281855285808601910161152e565b601f01601f1916010190565b6033546001600160a01b03163303611b9757565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b6000606c5490611beb606c611b4f565b9180151580611d77575b15611c6757611c0384612677565b916000198201918211610377575091611c5d7f9324f7e5a7c0288808a634ccde44b8e979676474b22e29ee9dd569b55e791a4b9492611c45602095606c611910565b509063ffffffff82549181199060201b169116179055565b50604051908152a1565b63ffffffff4311611d2357611c7b84612677565b9060405190611c8982611162565b4363ffffffff1682526001600160e01b039092166020820190815291600160401b811015610b6957806001611cc39201606c55606c611910565b939093611d0f575051905163ffffffff90911663ffffffff19602092831b16179091557f9324f7e5a7c0288808a634ccde44b8e979676474b22e29ee9dd569b55e791a4b929091611c5d565b634e487b7160e01b81526004819052602490fd5b60405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608490fd5b506000198101818111611d9e57611d9463ffffffff91606c611910565b5054164314611bf5565b634e487b7160e01b83526011600452602483fd5b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b6001600160a01b039081166000818152606a6020526040902090929190611e2190611b4f565b6001600160a01b0390921692911690828214611e7e5780600052606a602052611e4e8360406000206123cd565b50506040519182527fd061168252f441733658f09e4d8f5b2d998ed4ef24a2bbfd6ceca52ea131500260204393a4565b505050565b15611e8a57565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b611eec816124ce565b1561203b5760405191611efe83611131565b611f06611551565b8352606654600060665580611ffd575b5060005b82518051821015611faa5781611f2f916115ca565b51606654600160401b81101561114c57600181016066556000606654821015611f965760669052815160209092015160a01b6001600160a01b0319166001600160a01b0392909216919091176000805160206127ff83398151915290910155600101611f1a565b634e487b7160e01b81526032600452602490fd5b505091611fea90611ff87f23aad4e61744ece164130aa415c1616e80136b0f0770e56589438b90b269265e93604051938493604085526040850190611361565b908382036020850152611361565b0390a1565b60666000526000805160206127ff833981519152016000805160206127ff8339815191525b81811061202f5750611f16565b60008155600101612022565b63d173577960e01b60005260046000fd5b8181039291600013801582851316918412161761165457565b6001600160a01b0381166000818152606d60205260408120909290839061208b90611b4f565b9183600052606e60205260ff60406000205416156000146122385750816120b19161204c565b9283156122325782600052606d6020526040600020600081546120d383611b4f565b92811515806121f8575b1561213d576120eb83612677565b926000198301928311610377575060409492611c457f88770dc862e47a7ed586907857eb1b75e4c5ffc8b707c7ee10eb74d6885fe59497959361212d93611910565b505b82519182526020820152a290565b63ffffffff4311611d235761215183612677565b916040519161215f83611162565b4363ffffffff1683526001600160e01b039093166020830190815292600160401b8210156121e4579061219791600182018155611910565b939093611d0f575051905160201b63ffffffff191663ffffffff919091161790557f88770dc862e47a7ed586907857eb1b75e4c5ffc8b707c7ee10eb74d6885fe59492604092909161212d565b634e487b7160e01b85526041600452602485fd5b50600019820182811161221e5761221463ffffffff9183611910565b50541643146120dd565b634e487b7160e01b84526011600452602484fd5b50505090565b905061224591935061166a565b91612250818461204c565b928315612232577f88770dc862e47a7ed586907857eb1b75e4c5ffc8b707c7ee10eb74d6885fe5949160409184600052606d60205261229281846000206123cd565b505061212f565b906122ac6122a5611b41565b92836118a4565b906000606b54906122bd606b611b4f565b91801515806123a6575b15612324576122d585612677565b916000198201918211610377575090611c456122f292606b611910565b507f86dcf86b12dfeedea74ae9300dbdaa193bcce5809369c8177ea2f4eaaa65729b60408051858152846020820152a1565b63ffffffff4311611d235761233885612677565b906040519061234682611162565b4363ffffffff1682526001600160e01b039092166020820190815291600160401b811015610b69578060016123809201606b55606b611910565b939093611d0f575051905160201b63ffffffff191663ffffffff919091161790556122f2565b506000198101818111611d9e576123c363ffffffff91606b611910565b50541643146122c7565b91909180546123db82611b4f565b91811515806124a8575b15612411576123f385612677565b9060001983019283116116545761240d92611c4591611910565b9190565b63ffffffff4311611d235761242585612677565b906040519261243384611162565b4363ffffffff1684526001600160e01b039092166020840190815291600160401b81101561114c5761246a91600182018155611910565b919091612492579151915160201b63ffffffff191663ffffffff929092169190911790559190565b634e487b7160e01b600052600060045260246000fd5b506000198201828111611654576124c463ffffffff9183611910565b50541643146123e5565b5190600080805b8451821015612543576001600160a01b036124f083876115ca565b515116906001600160a01b031681111561253257612529600191936001600160601b03602061251f868a6115ca565b5101511690611647565b910190916124d5565b63ba50f91160e01b60005260046000fd5b5091925061271014905061255657600090565b600190565b91909161256882846126e6565b60058110156126615715908161264b575b50612643576000926125b46125c285946040519283916020830195630b135d3f60e11b87526024840152604060448401526064830190611b5e565b03601f19810183528261117d565b51915afa3d1561263c573d6125d6816112ff565b906125e4604051928361117d565b81523d6000602083013e5b81612630575b816125fe575090565b905060208180518101031261021f57602001516001600160e01b031981169081900361122457630b135d3f60e11b1490565b805160201491506125f5565b60606125ef565b505050600190565b6001600160a01b03838116911614905038612579565b634e487b7160e01b600052602160045260246000fd5b6001600160e01b038111612691576001600160e01b031690565b60405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608490fd5b81516041810361271357509061270f916020820151906060604084015193015160001a90612756565b9091565b60400361274c5760406020830151920151918260ff1c91601b83018093116116545761270f936001600160ff1b03169260ff1690612756565b5050600090600290565b907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116127f25760ff1690601b821415806127e7575b6127db57602093600093608093604051938452868401526040830152606082015282805260015afa15611876576000516001600160a01b038116156127d25790600090565b50600090600190565b50505050600090600490565b50601c82141561278d565b5050505060009060039056fe46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e94354a2646970667358221220bf9b771c1ed8ae1b372153e924d4124619e09577f9575822be560dad4886565f64736f6c634300081a0033"; + +type ECDSAStakeRegistryConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: ECDSAStakeRegistryConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class ECDSAStakeRegistry__factory extends ContractFactory { + constructor(...args: ECDSAStakeRegistryConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + _delegationManager: string, + overrides?: Overrides & { from?: string } + ): Promise { + return super.deploy( + _delegationManager, + overrides || {} + ) as Promise; + } + override getDeployTransaction( + _delegationManager: string, + overrides?: Overrides & { from?: string } + ): TransactionRequest { + return super.getDeployTransaction(_delegationManager, overrides || {}); + } + override attach(address: string): ECDSAStakeRegistry { + return super.attach(address) as ECDSAStakeRegistry; + } + override connect(signer: Signer): ECDSAStakeRegistry__factory { + return super.connect(signer) as ECDSAStakeRegistry__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): ECDSAStakeRegistryInterface { + return new utils.Interface(_abi) as ECDSAStakeRegistryInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): ECDSAStakeRegistry { + return new Contract(address, _abi, signerOrProvider) as ECDSAStakeRegistry; + } +} diff --git a/src/avs/contracts/factories/ReclaimServiceManager__factory.ts b/src/avs/contracts/factories/ReclaimServiceManager__factory.ts index 5eae44a0..1e861d7a 100644 --- a/src/avs/contracts/factories/ReclaimServiceManager__factory.ts +++ b/src/avs/contracts/factories/ReclaimServiceManager__factory.ts @@ -22,6 +22,11 @@ const _abi = [ type: "address", internalType: "address", }, + { + name: "_rewardsCoordinator", + type: "address", + internalType: "address", + }, { name: "_delegationManager", type: "address", @@ -132,6 +137,58 @@ const _abi = [ ], stateMutability: "pure", }, + { + type: "function", + name: "createAVSRewardsSubmission", + inputs: [ + { + name: "rewardsSubmissions", + type: "tuple[]", + internalType: "struct IRewardsCoordinator.RewardsSubmission[]", + components: [ + { + name: "strategiesAndMultipliers", + type: "tuple[]", + internalType: "struct IRewardsCoordinator.StrategyAndMultiplier[]", + components: [ + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + { + name: "multiplier", + type: "uint96", + internalType: "uint96", + }, + ], + }, + { + name: "token", + type: "address", + internalType: "contract IERC20", + }, + { + name: "amount", + type: "uint256", + internalType: "uint256", + }, + { + name: "startTimestamp", + type: "uint32", + internalType: "uint32", + }, + { + name: "duration", + type: "uint32", + internalType: "uint32", + }, + ], + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, { type: "function", name: "createNewTask", @@ -177,6 +234,76 @@ const _abi = [ outputs: [], stateMutability: "nonpayable", }, + { + type: "function", + name: "createOperatorDirectedAVSRewardsSubmission", + inputs: [ + { + name: "operatorDirectedRewardsSubmissions", + type: "tuple[]", + internalType: + "struct IRewardsCoordinator.OperatorDirectedRewardsSubmission[]", + components: [ + { + name: "strategiesAndMultipliers", + type: "tuple[]", + internalType: "struct IRewardsCoordinator.StrategyAndMultiplier[]", + components: [ + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + { + name: "multiplier", + type: "uint96", + internalType: "uint96", + }, + ], + }, + { + name: "token", + type: "address", + internalType: "contract IERC20", + }, + { + name: "operatorRewards", + type: "tuple[]", + internalType: "struct IRewardsCoordinator.OperatorReward[]", + components: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "startTimestamp", + type: "uint32", + internalType: "uint32", + }, + { + name: "duration", + type: "uint32", + internalType: "uint32", + }, + { + name: "description", + type: "string", + internalType: "string", + }, + ], + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, { type: "function", name: "deregisterOperatorFromAVS", @@ -299,6 +426,29 @@ const _abi = [ ], stateMutability: "view", }, + { + type: "function", + name: "initialize", + inputs: [ + { + name: "initialOwner", + type: "address", + internalType: "address", + }, + { + name: "_rewardsInitiator", + type: "address", + internalType: "address", + }, + { + name: "deployer", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, { type: "function", name: "isAdmin", @@ -447,58 +597,6 @@ const _abi = [ ], stateMutability: "view", }, - { - type: "function", - name: "payForRange", - inputs: [ - { - name: "rangePayments", - type: "tuple[]", - internalType: "struct IPaymentCoordinator.RangePayment[]", - components: [ - { - name: "strategiesAndMultipliers", - type: "tuple[]", - internalType: "struct IPaymentCoordinator.StrategyAndMultiplier[]", - components: [ - { - name: "strategy", - type: "address", - internalType: "contract IStrategy", - }, - { - name: "multiplier", - type: "uint96", - internalType: "uint96", - }, - ], - }, - { - name: "token", - type: "address", - internalType: "contract IERC20", - }, - { - name: "amount", - type: "uint256", - internalType: "uint256", - }, - { - name: "startTimestamp", - type: "uint32", - internalType: "uint32", - }, - { - name: "duration", - type: "uint32", - internalType: "uint32", - }, - ], - }, - ], - outputs: [], - stateMutability: "nonpayable", - }, { type: "function", name: "registerOperatorToAVS", @@ -565,6 +663,32 @@ const _abi = [ outputs: [], stateMutability: "nonpayable", }, + { + type: "function", + name: "rewardsInitiator", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "setClaimerFor", + inputs: [ + { + name: "claimer", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, { type: "function", name: "setPauserRegistry", @@ -580,10 +704,10 @@ const _abi = [ }, { type: "function", - name: "setup", + name: "setRewardsInitiator", inputs: [ { - name: "initialAdmin", + name: "newRewardsInitiator", type: "address", internalType: "address", }, @@ -1019,6 +1143,25 @@ const _abi = [ ], anonymous: false, }, + { + type: "event", + name: "RewardsInitiatorUpdated", + inputs: [ + { + name: "prevRewardsInitiator", + type: "address", + indexed: false, + internalType: "address", + }, + { + name: "newRewardsInitiator", + type: "address", + indexed: false, + internalType: "address", + }, + ], + anonymous: false, + }, { type: "event", name: "TaskCompleted", @@ -1143,7 +1286,7 @@ const _abi = [ ] as const; const _bytecode = - "0x61010060405234801561001157600080fd5b50604051614c04380380614c0483398101604081905261003091610146565b6001600160a01b0380841660a052808316608052600060c081905290821660e052839083908361005e61006a565b50505050505050610189565b600054610100900460ff16156100d65760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015610128576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b80516001600160a01b038116811461014157600080fd5b919050565b60008060006060848603121561015b57600080fd5b6101648461012a565b92506101726020850161012a565b91506101806040850161012a565b90509250925092565b60805160a05160c05160e0516149f561020f600039600061214c015260008181611ec30152611f990152600081816103ce015281816123930152818161250d015261257d0152600081816103a7015281816107e2015281816111cd015281816114dd01528181611960015281816119d10152818161200401526129d901526149f56000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c8063715018a611610125578063a98fb355116100ad578063d5dba76d1161007c578063d5dba76d14610514578063e481af9d14610527578063f289a7fb1461052f578063f2fde38b14610582578063fabc1cbc1461059557600080fd5b8063a98fb355146104bb578063aa5b9cad146104ce578063abd3b6bd146104e1578063b224b9791461050157600080fd5b806394bb371b116100f457806394bb371b146104415780639926ee7d14610461578063a3524f9514610474578063a364f4da14610487578063a551c1b81461049a57600080fd5b8063715018a6146103f0578063886f1195146103f85780638b00ce7c1461040b5780638da5cb5b1461043057600080fd5b80632e8da829116101a85780635c975abb116101775780635c975abb14610374578063630868dc1461037c57806366d382031461038f57806368304835146103a25780636b3aa72e146103c957600080fd5b80632e8da8291461031657806333cfb7b714610329578063595c6a67146103495780635ac86ab71461035157600080fd5b80631b445516116101ef5780631b4455161461028c5780631be785ac1461029f5780631ee3ca10146102b257806324d7806c146102c55780632d89f6fc146102e857600080fd5b806310d67a2f14610221578063136439dd1461023657806314bfd6d01461024957806316bd83c314610279575b600080fd5b61023461022f36600461349a565b6105a8565b005b6102346102443660046134b7565b610664565b61025c6102573660046134b7565b6107a3565b6040516001600160a01b0390911681526020015b60405180910390f35b610234610287366004613674565b6107cd565b61023461029a3660046136a8565b610b35565b6102346102ad36600461372b565b610b4b565b6102346102c0366004613789565b610c44565b6102d86102d336600461349a565b610d03565b6040519015158152602001610270565b6103086102f63660046137d9565b60cb6020526000908152604090205481565b604051908152602001610270565b6102d861032436600461349a565b610d8c565b61033c61033736600461349a565b610df9565b60405161027091906137f4565b610234610e0a565b6102d861035f366004613840565b609854600160ff9092169190911b9081161490565b609854610308565b61025c61038a3660046134b7565b610ed1565b61023461039d36600461349a565b610ee1565b61025c7f000000000000000000000000000000000000000000000000000000000000000081565b61025c7f000000000000000000000000000000000000000000000000000000000000000081565b61023461106c565b60975461025c906001600160a01b031681565b60c95461041b9063ffffffff1681565b60405163ffffffff9091168152602001610270565b6033546001600160a01b031661025c565b61045461044f36600461349a565b611080565b60405161027091906138d2565b61023461046f3660046138e5565b6111c2565b610234610482366004613b4a565b611269565b61023461049536600461349a565b6114d2565b6104ad6104a83660046134b7565b611523565b604051610270929190613c94565b6102346104c9366004613cb8565b6115e5565b61025c6104dc366004613cec565b611613565b6104f46104ef366004613d53565b61164a565b6040516102709190613d87565b61023461050f366004613cec565b611673565b6102d861052236600461349a565b61193c565b61033c611a5c565b60ca546105599063ffffffff8082169160ff64010000000082041691650100000000009091041683565b6040805163ffffffff948516815260ff9093166020840152921691810191909152606001610270565b61023461059036600461349a565b611a6b565b6102346105a33660046134b7565b611ae1565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061061f9190613d9a565b6001600160a01b0316336001600160a01b0316146106585760405162461bcd60e51b815260040161064f90613db7565b60405180910390fd5b61066181611c3d565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d09190613e01565b6106ec5760405162461bcd60e51b815260040161064f90613e1e565b609854818116146107655760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161064f565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b60cd81815481106107b357600080fd5b6000918252602090912001546001600160a01b0316905081565b60405163ec7fbb3160e01b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ec7fbb3190602401602060405180830381865afa158015610831573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108559190613e01565b15156001146108a65760405162461bcd60e51b815260206004820152601b60248201527f4f70657261746f72206d757374206265207468652063616c6c65720000000000604482015260640161064f565b80516001600160a01b0316331461090e5760405162461bcd60e51b815260206004820152602660248201527f4d657461646174612061646472657373206d757374206d61746368207468652060448201526531b0b63632b960d11b606482015260840161064f565b6020810151511580156109f35760005b60ce548110156109b55782600001516001600160a01b031660ce828154811061094957610949613e66565b60009182526020909120600290910201546001600160a01b0316036109ad5760ce818154811061097b5761097b613e66565b60009182526020822060029091020180546001600160a01b0319168155906109a66001830182613437565b5050505050565b60010161091e565b5060405162461bcd60e51b815260206004820152601260248201527113dc195c985d1bdc881b9bdd08199bdd5b9960721b604482015260640161064f565b60005b60ce54811015610aa85782600001516001600160a01b031660ce8281548110610a2157610a21613e66565b60009182526020909120600290910201546001600160a01b031603610aa0578260ce8281548110610a5457610a54613e66565b600091825260209182902083516002929092020180546001600160a01b0319166001600160a01b03909216919091178155908201516001820190610a989082613f02565b505050505050565b6001016109f6565b5060ce805460018101825560009190915282517fd36cd1c74ef8d7326d8021b776c18fb5a5724b7f7bc93c2f42e43e10ef27d12a600290920291820180546001600160a01b0319166001600160a01b03909216919091178155602084015184927fd36cd1c74ef8d7326d8021b776c18fb5a5724b7f7bc93c2f42e43e10ef27d12b01906109a69082613f02565b610b3d611d34565b610b478282611d8e565b5050565b610b5433610d03565b610b705760405162461bcd60e51b815260040161064f90613fc0565b8015610bc75760cc80546001810182556000919091527f47197230e1e4b29fc0bd84d7d78966c0925452aff72a2a121538b102457e9ebe0180546001600160a01b0384166001600160a01b03199091161790555050565b60005b60cc548110156109b557826001600160a01b031660cc8281548110610bf157610bf1613e66565b6000918252602090912001546001600160a01b031603610c3c5760cc8181548110610c1e57610c1e613e66565b600091825260209091200180546001600160a01b0319169055505050565b600101610bca565b610c4d33610d03565b610c695760405162461bcd60e51b815260040161064f90613fc0565b805163ffffffff1615610c9257805160ca805463ffffffff191663ffffffff9092169190911790555b602081015160ff1615610cc557602081015160ca805460ff9092166401000000000264ff00000000199092169190911790555b604081015163ffffffff1615610661576040015160ca805463ffffffff909216650100000000000268ffffffff000000000019909216919091179055565b6000610d176033546001600160a01b031690565b6001600160a01b03163303610d2e57506001919050565b60005b60cd54811015610d8357826001600160a01b031660cd8281548110610d5857610d58613e66565b6000918252602090912001546001600160a01b031603610d7b5750600192915050565b600101610d31565b50600092915050565b6000610d9782610d03565b15610da457506001919050565b60005b60cc54811015610d8357826001600160a01b031660cc8281548110610dce57610dce613e66565b6000918252602090912001546001600160a01b031603610df15750600192915050565b600101610da7565b6060610e0482611ffe565b92915050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610e52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e769190613e01565b610e925760405162461bcd60e51b815260040161064f90613e1e565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60cc81815481106107b357600080fd5b600054610100900460ff1615808015610f015750600054600160ff909116105b80610f1b5750303b158015610f1b575060005460ff166001145b610f7e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161064f565b6000805460ff191660011790558015610fa1576000805461ff0019166101001790555b60408051606081018252610708815260016020820181905261012c919092015260ca805468ffffffffffffffffff191666012c010000070817905560cd805491820181556000527f83978b4c69c48dd978ab43fe30f077615294f938fb7f936d9eb340e51ea7db2e0180546001600160a01b0319166001600160a01b0384161790558015610b47576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b611074611d34565b61107e600061232a565b565b60408051808201909152600081526060602082015260005b60ce548110156109b557826001600160a01b031660ce82815481106110bf576110bf613e66565b60009182526020909120600290910201546001600160a01b0316036111ba5760ce81815481106110f1576110f1613e66565b60009182526020918290206040805180820190915260029092020180546001600160a01b03168252600181018054929391929184019161113090613e7c565b80601f016020809104026020016040519081016040528092919081815260200182805461115c90613e7c565b80156111a95780601f1061117e576101008083540402835291602001916111a9565b820191906000526020600020905b81548152906001019060200180831161118c57829003601f168201915b505050505081525050915050919050565b600101611098565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461120a5760405162461bcd60e51b815260040161064f90613fed565b61121382610d8c565b61125f5760405162461bcd60e51b815260206004820152601860248201527f4f70657261746f72206e6f742077686974656c69737465640000000000000000604482015260640161064f565b610b47828261237c565b63ffffffff8116600090815260cb6020908152604091829020548451925190926112959290910161416d565b604051602081830303815290604052805190602001201461131e5760405162461bcd60e51b815260206004820152603d60248201527f737570706c696564207461736b20646f6573206e6f74206d617463682074686560448201527f206f6e65207265636f7264656420696e2074686520636f6e7472616374000000606482015260840161064f565b81516040015163ffffffff42811691161161136e5760405162461bcd60e51b815260206004820152601060248201526f15185cdac81a185cc8195e1c1a5c995960821b604482015260640161064f565b6040805160c0810182528351518201519181019182528351516080908101516001600160a01b03166060830152845160209081015163ffffffff1682840152600160a08401529282528285015192820192909252835190910151516000906001600160401b038111156113e3576113e36134d0565b60405190808252806020026020018201604052801561140c578160200160208202803683370190505b50905060005b81518110156114715784516080015180518290811061143357611433613e66565b60200260200101516000015182828151811061145157611451613e66565b6001600160a01b0390921660209283029190910190910152600101611412565b5061147c82826123ca565b63ffffffff8316600081815260cb602052604080822091909155517fa5be567caa88ff11b6da2cf017f9cefffcafa24111a9ecbf0b0bc476944f0f09906114c4908790614180565b60405180910390a250505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461151a5760405162461bcd60e51b815260040161064f90613fed565b610661816124ee565b60ce818154811061153357600080fd5b6000918252602090912060029091020180546001820180546001600160a01b0390921693509061156290613e7c565b80601f016020809104026020016040519081016040528092919081815260200182805461158e90613e7c565b80156115db5780601f106115b0576101008083540402835291602001916115db565b820191906000526020600020905b8154815290600101906020018083116115be57829003601f168201915b5050505050905082565b6115ee33610d03565b61160a5760405162461bcd60e51b815260040161064f90613fc0565b61066181612566565b600080836040516020016116279190614205565b604051602081830303815290604052905061164281846125b2565b949350505050565b60608160405160200161165d9190614205565b6040516020818303038152906040529050919050565b60808201516001600160a01b031633146117395760008260405160200161169a9190614205565b604051602081830303815290604052905060006116b782846125b2565b905083608001516001600160a01b0316816001600160a01b0316146117365760405162461bcd60e51b815260206004820152602f60248201527f5369676e6572206f6620726571756573745369676e6174757265206973206e6f60448201526e3a103932b8bab2b9ba1737bbb732b960891b606482015260840161064f565b50505b60006117498360600151426125f3565b60ca5490915063ffffffff65010000000000909104811690821611156117b15760405162461bcd60e51b815260206004820152601e60248201527f526571756573742074696d657374616d7020746f6f2066617220617761790000604482015260640161064f565b6040805161016081018252606060c08201819052600060e08301819052610100830181905261012083018190526101408301819052928201839052808201839052608082015260a081019190915283815263ffffffff4281166020830181905260ca5461181f92169061422e565b63ffffffff1660408281019190915260ca54640100000000900460ff1660608301525160009061185390839060200161416d565b60408051808303601f19018152919052805160209091012060ca5490915061188690640100000000900460ff1682612628565b608083015260405161189c90839060200161416d565b60408051601f19818403018152828252805160209182012060c9805463ffffffff908116600090815260cb90945293909220555416907f7738d1b30deac7824a0580de02efde3bb766c7b7b5ea79da34869ebd887cebf3906118ff90859061416d565b60405180910390a260c95461191b9063ffffffff16600161422e565b60c9805463ffffffff191663ffffffff929092169190911790555050505050565b6040516398ec1ac960e01b81526001600160a01b03828116600483015260009182917f000000000000000000000000000000000000000000000000000000000000000016906398ec1ac990602401602060405180830381865afa1580156119a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119cb919061424a565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166340bf2fb76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a51919061424a565b909110159392505050565b6060611a666129d3565b905090565b611a73611d34565b6001600160a01b038116611ad85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161064f565b6106618161232a565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b589190613d9a565b6001600160a01b0316336001600160a01b031614611b885760405162461bcd60e51b815260040161064f90613db7565b609854198119609854191614611c065760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161064f565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610798565b6001600160a01b038116611ccb5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161064f565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b0316331461107e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161064f565b60005b81811015611f8157828282818110611dab57611dab613e66565b9050602002810190611dbd9190614263565b611dce90604081019060200161349a565b6001600160a01b03166323b872dd3330868686818110611df057611df0613e66565b9050602002810190611e029190614263565b604080516001600160e01b031960e087901b1681526001600160a01b039485166004820152939092166024840152013560448201526064016020604051808303816000875af1158015611e59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7d9190613e01565b50828282818110611e9057611e90613e66565b9050602002810190611ea29190614263565b611eb390604081019060200161349a565b6001600160a01b031663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000858585818110611ef457611ef4613e66565b9050602002810190611f069190614263565b604080516001600160e01b031960e086901b1681526001600160a01b039093166004840152013560248201526044016020604051808303816000875af1158015611f54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f789190613e01565b50600101611d91565b50604051630da22a8b60e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631b44551690611fd09085908590600401614313565b600060405180830381600087803b158015611fea57600080fd5b505af1158015610a98573d6000803e3d6000fd5b606060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631703a0186040518163ffffffff1660e01b8152600401600060405180830381865afa158015612060573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612088919081019061442d565b8051519091506000816001600160401b038111156120a8576120a86134d0565b6040519080825280602002602001820160405280156120d1578160200160208202803683370190505b50905060005b828110156121315783518051829081106120f3576120f3613e66565b60200260200101516000015182828151811061211157612111613e66565b6001600160a01b03909216602092830291909101909101526001016120d7565b50604051639004134760e01b81526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906390041347906121839089908690600401614535565b600060405180830381865afa1580156121a0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526121c89190810190614594565b90506000836001600160401b038111156121e4576121e46134d0565b60405190808252806020026020018201604052801561220d578160200160208202803683370190505b5090506000805b8581101561225457600084828151811061223057612230613e66565b6020026020010151111561224c578161224881614629565b9250505b600101612214565b506000816001600160401b0381111561226f5761226f6134d0565b604051908082528060200260200182016040528015612298578160200160208202803683370190505b50905060005b8681101561231d5760008582815181106122ba576122ba613e66565b60200260200101511115612315578381815181106122da576122da613e66565b60200260200101518282815181106122f4576122f4613e66565b60200260200101906001600160a01b031690816001600160a01b0316815250505b60010161229e565b5098975050505050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051639926ee7d60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639926ee7d90611fd09085908590600401614642565b60008260200151511161240f5760405162461bcd60e51b815260206004820152600d60248201526c4e6f207369676e61747572657360981b604482015260640161064f565b600061241a83612b10565b905060005b82518110156124e8576000805b83518110156124915784838151811061244757612447613e66565b60200260200101516001600160a01b031684828151811061246a5761246a613e66565b60200260200101516001600160a01b0316036124895760019150612491565b60010161242c565b50806124df5760405162461bcd60e51b815260206004820152601960248201527f4d697373696e67207769746e657373207369676e617475726500000000000000604482015260640161064f565b5060010161241f565b50505050565b6040516351b27a6d60e11b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063a364f4da906024015b600060405180830381600087803b15801561255257600080fd5b505af11580156109a6573d6000803e3d6000fd5b60405163a98fb35560e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a98fb35590612538908490600401613d87565b6000806125bf8451612bdf565b846040516020016125d192919061468d565b6040516020818303038152906040528051906020012090506116428184612d0a565b60008163ffffffff168363ffffffff16116126175761261283836146e8565b612621565b61262182846146e8565b9392505050565b60ce5460609060ff841611156126805760405162461bcd60e51b815260206004820152601e60248201527f496e7465726e616c3a204e6f7420656e6f756768206f70657261746f72730000604482015260640161064f565b600060ce805480602002602001604051908101604052809291908181526020016000905b8282101561277d576000848152602090819020604080518082019091526002850290910180546001600160a01b0316825260018101805492939192918401916126ec90613e7c565b80601f016020809104026020016040519081016040528092919081815260200182805461271890613e7c565b80156127655780601f1061273a57610100808354040283529160200191612765565b820191906000526020600020905b81548152906001019060200180831161274857829003601f168201915b505050505081525050815260200190600101906126a4565b50508251929350600091505060ff86166001600160401b038111156127a4576127a46134d0565b6040519080825280602002602001820160405280156127ea57816020015b6040805180820190915260008152606060208201528152602001906001900390816127c25790505b50905060005b81518160ff1610156129c957600083116128725760405162461bcd60e51b815260206004820152603760248201527f496e7465726e616c3a204665657320746f6f206c6f772e204e6f206f7065726160448201527f746f7273206c65667420746f207069636b2066726f6d2e000000000000000000606482015260840161064f565b6000836128bb61288560ff85168a614704565b60408051446020808301919091524282840152606080830194909452825180830390940184526080909101909152815191012090565b6128c5919061472d565b905060008582815181106128db576128db613e66565b60200260200101519050856001866128f39190614741565b8151811061290357612903613e66565b602002602001015186838151811061291d5761291d613e66565b6020908102919091010152612933600186614741565b9450612942816000015161193c565b61294d5750506127f0565b8060000151848460ff168151811061296757612967613e66565b6020026020010151600001906001600160a01b031690816001600160a01b0316815250508060200151848460ff16815181106129a5576129a5613e66565b60200260200101516020018190525082806129bf90614754565b93505050506127f0565b5095945050505050565b606060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631703a0186040518163ffffffff1660e01b8152600401600060405180830381865afa158015612a35573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a5d919081019061442d565b905060008160000151516001600160401b03811115612a7e57612a7e6134d0565b604051908082528060200260200182016040528015612aa7578160200160208202803683370190505b50905060005b825151811015612b09578251805182908110612acb57612acb613e66565b602002602001015160000151828281518110612ae957612ae9613e66565b6001600160a01b0390921660209283029190910190910152600101612aad565b5092915050565b60606000612b218360000151612d26565b905060008360200151516001600160401b03811115612b4257612b426134d0565b604051908082528060200260200182016040528015612b6b578160200160208202803683370190505b50905060005b846020015151811015612bd757612ba58386602001518381518110612b9857612b98613e66565b60200260200101516125b2565b828281518110612bb757612bb7613e66565b6001600160a01b0390921660209283029190910190910152600101612b71565b509392505050565b606081600003612c065750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612c305780612c1a81614629565b9150612c299050600a83614773565b9150612c0a565b6000816001600160401b03811115612c4a57612c4a6134d0565b6040519080825280601f01601f191660200182016040528015612c74576020820181803683370190505b509050815b8515612d0157612c8a600182614741565b90506000612c99600a88614773565b612ca490600a614787565b612cae9088614741565b612cb990603061479e565b905060008160f81b905080848481518110612cd657612cd6613e66565b60200101906001600160f81b031916908160001a905350612cf8600a89614773565b97505050612c79565b50949350505050565b6000806000612d198585612d96565b91509150612bd781612e04565b6060612d568260000151604051602001612d4291815260200190565b604051602081830303815290604052612fba565b612d638360200151613173565b612d76846040015163ffffffff16612bdf565b612d838560600151612bdf565b60405160200161165d94939291906147b7565b6000808251604103612dcc5760208301516040840151606085015160001a612dc0878285856132d5565b94509450505050612dfd565b8251604003612df55760208301516040840151612dea8683836133c2565b935093505050612dfd565b506000905060025b9250929050565b6000816004811115612e1857612e1861483d565b03612e205750565b6001816004811115612e3457612e3461483d565b03612e815760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161064f565b6002816004811115612e9557612e9561483d565b03612ee25760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161064f565b6003816004811115612ef657612ef661483d565b03612f4e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161064f565b6004816004811115612f6257612f6261483d565b036106615760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161064f565b6060600082516002612fcc9190614787565b6001600160401b03811115612fe357612fe36134d0565b6040519080825280601f01601f19166020018201604052801561300d576020820181803683370190505b5060408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b602082015290915060005b84518110156131495781825186838151811061305957613059613e66565b016020015161306b919060f81c614773565b8151811061307b5761307b613e66565b01602001516001600160f81b03191683613096836002614787565b815181106130a6576130a6613e66565b60200101906001600160f81b031916908160001a9053508182518683815181106130d2576130d2613e66565b01602001516130e4919060f81c61472d565b815181106130f4576130f4613e66565b01602001516001600160f81b0319168361310f836002614787565b61311a906001614704565b8151811061312a5761312a613e66565b60200101906001600160f81b031916908160001a90535060010161303b565b508160405160200161315b9190614853565b60405160208183030381529060405292505050919050565b60408051602880825260608281019093526000919060208201818036833701905050905060005b60148110156132ac5760006131b0826013614741565b6131bb906008614787565b6131c690600261495c565b6131d9906001600160a01b038716614773565b60f81b9050600060108260f81c6131f09190614968565b60f81b905060008160f81c6010613207919061498a565b8360f81c61321591906149a6565b60f81b9050613223826133fc565b8561322f866002614787565b8151811061323f5761323f613e66565b60200101906001600160f81b031916908160001a90535061325f816133fc565b8561326b866002614787565b613276906001614704565b8151811061328657613286613e66565b60200101906001600160f81b031916908160001a905350506001909201915061319a9050565b50806040516020016132be9190614853565b604051602081830303815290604052915050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561330c57506000905060036133b9565b8460ff16601b1415801561332457508460ff16601c14155b1561333557506000905060046133b9565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613389573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166133b2576000600192509250506133b9565b9150600090505b94509492505050565b6000806001600160ff1b038316816133df60ff86901c601b614704565b90506133ed878288856132d5565b9350935050505b935093915050565b6000600a60f883901c10156134235761341a60f883901c603061479e565b60f81b92915050565b61341a60f883901c605761479e565b919050565b50805461344390613e7c565b6000825580601f10613453575050565b601f01602090049060005260206000209081019061066191905b80821115613481576000815560010161346d565b5090565b6001600160a01b038116811461066157600080fd5b6000602082840312156134ac57600080fd5b813561262181613485565b6000602082840312156134c957600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715613508576135086134d0565b60405290565b604051606081016001600160401b0381118282101715613508576135086134d0565b60405160c081016001600160401b0381118282101715613508576135086134d0565b604051602081016001600160401b0381118282101715613508576135086134d0565b604051601f8201601f191681016001600160401b038111828210171561359c5761359c6134d0565b604052919050565b600082601f8301126135b557600080fd5b8135602083016000806001600160401b038411156135d5576135d56134d0565b50601f8301601f19166020016135ea81613574565b9150508281528583830111156135ff57600080fd5b82826020830137600092810160200192909252509392505050565b60006040828403121561362c57600080fd5b6136346134e6565b9050813561364181613485565b815260208201356001600160401b0381111561365c57600080fd5b613668848285016135a4565b60208301525092915050565b60006020828403121561368657600080fd5b81356001600160401b0381111561369c57600080fd5b6116428482850161361a565b600080602083850312156136bb57600080fd5b82356001600160401b038111156136d157600080fd5b8301601f810185136136e257600080fd5b80356001600160401b038111156136f857600080fd5b8560208260051b840101111561370d57600080fd5b6020919091019590945092505050565b801515811461066157600080fd5b6000806040838503121561373e57600080fd5b823561374981613485565b915060208301356137598161371d565b809150509250929050565b803563ffffffff8116811461343257600080fd5b803560ff8116811461343257600080fd5b6000606082840312801561379c57600080fd5b506137a561350e565b6137ae83613764565b81526137bc60208401613778565b60208201526137cd60408401613764565b60408201529392505050565b6000602082840312156137eb57600080fd5b61262182613764565b602080825282518282018190526000918401906040840190835b818110156138355783516001600160a01b031683526020938401939092019160010161380e565b509095945050505050565b60006020828403121561385257600080fd5b61262182613778565b60005b8381101561387657818101518382015260200161385e565b50506000910152565b6000815180845261389781602086016020860161385b565b601f01601f19169290920160200192915050565b60018060a01b0381511682526000602082015160406020850152611642604085018261387f565b60208152600061262160208301846138ab565b600080604083850312156138f857600080fd5b823561390381613485565b915060208301356001600160401b0381111561391e57600080fd5b83016060818603121561393057600080fd5b61393861350e565b81356001600160401b0381111561394e57600080fd5b61395a878285016135a4565b8252506020828101359082015260409182013591810191909152919491935090915050565b600060a0828403121561399157600080fd5b60405160a081016001600160401b03811182821017156139b3576139b36134d0565b60405290508082356001600160401b038111156139cf57600080fd5b6139db858286016135a4565b82525060208381013590820152604080840135908201526139fe60608401613764565b60608201526080830135613a1181613485565b6080919091015292915050565b60006001600160401b03821115613a3757613a376134d0565b5060051b60200190565b600082601f830112613a5257600080fd5b8135613a65613a6082613a1e565b613574565b8082825260208201915060208360051b860101925085831115613a8757600080fd5b602085015b838110156129c95780356001600160401b03811115613aaa57600080fd5b613ab9886020838a010161361a565b84525060209283019201613a8c565b600082601f830112613ad957600080fd5b8135613ae7613a6082613a1e565b8082825260208201915060208360051b860101925085831115613b0957600080fd5b602085015b838110156129c95780356001600160401b03811115613b2c57600080fd5b613b3b886020838a01016135a4565b84525060209283019201613b0e565b60008060408385031215613b5d57600080fd5b82356001600160401b03811115613b7357600080fd5b830160408186031215613b8557600080fd5b613b8d6134e6565b81356001600160401b03811115613ba357600080fd5b820160c08188031215613bb557600080fd5b613bbd613530565b81356001600160401b03811115613bd357600080fd5b613bdf8982850161397f565b825250613bee60208301613764565b6020820152613bff60408301613764565b6040820152613c1060608301613778565b606082015260808201356001600160401b03811115613c2e57600080fd5b613c3a89828501613a41565b60808301525060a09182013591810191909152815260208201356001600160401b03811115613c6857600080fd5b613c7487828501613ac8565b6020830152508093505050613c8b60208401613764565b90509250929050565b6001600160a01b03831681526040602082018190526000906116429083018461387f565b600060208284031215613cca57600080fd5b81356001600160401b03811115613ce057600080fd5b611642848285016135a4565b60008060408385031215613cff57600080fd5b82356001600160401b03811115613d1557600080fd5b613d218582860161397f565b92505060208301356001600160401b03811115613d3d57600080fd5b613d49858286016135a4565b9150509250929050565b600060208284031215613d6557600080fd5b81356001600160401b03811115613d7b57600080fd5b6116428482850161397f565b602081526000612621602083018461387f565b600060208284031215613dac57600080fd5b815161262181613485565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215613e1357600080fd5b81516126218161371d565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680613e9057607f821691505b602082108103613eb057634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115613efd57806000526020600020601f840160051c81016020851015613edd5750805b601f840160051c820191505b818110156109a65760008155600101613ee9565b505050565b81516001600160401b03811115613f1b57613f1b6134d0565b613f2f81613f298454613e7c565b84613eb6565b6020601f821160018114613f635760008315613f4b5750848201515b600019600385901b1c1916600184901b1784556109a6565b600084815260208120601f198516915b82811015613f935787850151825560209485019460019092019101613f73565b5084821015613fb15786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60208082526013908201527221b0b63632b91034b9903737ba1030b236b4b760691b604082015260600190565b6020808252604a908201527f4543445341536572766963654d616e61676572426173652e6f6e6c795374616b60408201527f6552656769737472793a2063616c6c6572206973206e6f7420746865207374616060820152696b65526567697374727960b01b608082015260a00190565b6000815160a0845261407260a085018261387f565b602084810151908601526040808501519086015260608085015163ffffffff16908601526080938401516001600160a01b031693909401929092525090919050565b6000815160c084526140c960c085018261405d565b905063ffffffff602084015116602085015263ffffffff604084015116604085015260ff60608401511660608501526080830151848203608086015281815180845260208401915060208160051b85010160208401935060005b8281101561415457601f1986830301845261413f8286516138ab565b60209586019594909401939150600101614123565b5060a087015160a0890152809550505050505092915050565b60208152600061262160208301846140b4565b60208152600082516040602084015261419c60608401826140b4565b602085810151858303601f19016040870152805180845292935081019181840191600582901b85010160005b828110156141f957601f198683030184526141e482865161387f565b602095860195949094019391506001016141c8565b50979650505050505050565b602081526000612621602083018461405d565b634e487b7160e01b600052601160045260246000fd5b63ffffffff8181168382160190811115610e0457610e04614218565b60006020828403121561425c57600080fd5b5051919050565b60008235609e1983360301811261427957600080fd5b9190910192915050565b803561343281613485565b6bffffffffffffffffffffffff8116811461066157600080fd5b81835260208301925060008160005b848110156143095781356142ca81613485565b6001600160a01b0316865260208201356142e38161428e565b6bffffffffffffffffffffffff16602087015260409586019591909101906001016142b7565b5093949350505050565b6020808252810182905260006040600584901b830181019083018583609e1936839003015b8782101561442057868503603f19018452823581811261435757600080fd5b8901803536829003601e1901811261436e57600080fd5b81016020810190356001600160401b0381111561438a57600080fd5b8060061b360382131561439c57600080fd5b60a088526143ae60a0890182846142a8565b9150506143bd60208301614283565b6001600160a01b03166020880152604082810135908801526143e160608301613764565b63ffffffff1660608801526143f860808301613764565b63ffffffff811660808901529150955050602093840193929092019160019190910190614338565b5092979650505050505050565b60006020828403121561443f57600080fd5b81516001600160401b0381111561445557600080fd5b82016020818503121561446757600080fd5b61446f613552565b81516001600160401b0381111561448557600080fd5b80830192505084601f83011261449a57600080fd5b81516144a8613a6082613a1e565b8082825260208201915060208360061b8601019250878311156144ca57600080fd5b6020850194505b8285101561452857604085890312156144e957600080fd5b6144f16134e6565b85516144fc81613485565b8152602086015161450c8161428e565b80602083015250808352506020820191506040850194506144d1565b8352509095945050505050565b6001600160a01b0383168152604060208083018290528351918301829052600091908401906060840190835b818110156145885783516001600160a01b0316835260209384019390920191600101614561565b50909695505050505050565b6000602082840312156145a657600080fd5b81516001600160401b038111156145bc57600080fd5b8201601f810184136145cd57600080fd5b80516145db613a6082613a1e565b8082825260208201915060208360051b8501019250868311156145fd57600080fd5b6020840193505b8284101561461f578351825260209384019390910190614604565b9695505050505050565b60006001820161463b5761463b614218565b5060010190565b60018060a01b038316815260406020820152600082516060604084015261466c60a084018261387f565b90506020840151606084015260408401516080840152809150509392505050565b7f19457468657265756d205369676e6564204d6573736167653a0a0000000000008152600083516146c581601a85016020880161385b565b8351908301906146dc81601a84016020880161385b565b01601a01949350505050565b63ffffffff8281168282160390811115610e0457610e04614218565b80820180821115610e0457610e04614218565b634e487b7160e01b600052601260045260246000fd5b60008261473c5761473c614717565b500690565b81810381811115610e0457610e04614218565b600060ff821660ff810361476a5761476a614218565b60010192915050565b60008261478257614782614717565b500490565b8082028115828204841417610e0457610e04614218565b60ff8181168382160190811115610e0457610e04614218565b600085516147c9818460208a0161385b565b600560f91b90830190815285516147e7816001840160208a0161385b565b600560f91b60019290910191820152845161480981600284016020890161385b565b600181830101915050600560f91b6001820152835161482f81600284016020880161385b565b016002019695505050505050565b634e487b7160e01b600052602160045260246000fd5b61060f60f31b81526000825161487081600285016020870161385b565b9190910160020192915050565b6001815b60018411156133f45780850481111561489c5761489c614218565b60018416156148aa57908102905b60019390931c928002614881565b6000826148c757506001610e04565b816148d457506000610e04565b81600181146148ea57600281146148f457614910565b6001915050610e04565b60ff84111561490557614905614218565b50506001821b610e04565b5060208310610133831016604e8410600b8410161715614933575081810a610e04565b614940600019848461487d565b806000190482111561495457614954614218565b029392505050565b600061262183836148b8565b600060ff83168061497b5761497b614717565b8060ff84160491505092915050565b60ff8181168382160290811690818114612b0957612b09614218565b60ff8281168282160390811115610e0457610e0461421856fea26469706673582212205b54d39db01ec87955542a63c3a53e876a29b21585e12d554ae6989e796dedf764736f6c634300081a0033"; + "0x610100806040523461021057604051601f614b9238819003918201601f19168301916001600160401b038311848410176101fa578084926080946040528339810103126101aa5761004f8161025d565b9061005c6020820161025d565b610074606061006d6040850161025d565b930161025d565b9260a05260805260c05260e05260005460ff8160081c166101555760ff8082161061011a575b60405161491b908161027782396080518181816106820152818161111201528181611f41015281816121760152818161233c015281816127c70152613b13015260a0518181816110230152818161114201528181611f6a0152612132015260c05181818161027101528181611b880152611e49015260e051816123d20152f35b60ff90811916176000557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a18061009a565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b600052604160045260246000fd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b51906001600160a01b038216820361027157565b600080fdfe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b6000803560e01c806310d67a2f146129ca578063136439dd146128c457806314bfd6d01461289957806316bd83c3146127945780631be785ac146127595780631ee3ca101461267457806324d7806c146126515780632d89f6fc1461261c5780632e8da829146125f957806333cfb7b71461231f5780633bc28c8c146122fa578063595c6a671461223b5780635ac86ab7146122065780635c975abb146121e9578063630868dc146121a557806368304835146121615780636b3aa72e1461211d578063715018a6146120c0578063886f1195146120985780638b00ce7c146120755780638da5cb5b1461204d57806394bb371b146120155780639926ee7d14611eb2578063a0169ddd14611e25578063a20b99bf14611b4a578063a3524f95146111ab578063a364f4da146110f2578063a551c1b814611090578063a98fb35514610fdf578063aa5b9cad14610f9d578063abd3b6bd14610f3a578063b224b979146109d3578063c0c53b8b1461077c578063d5dba76d1461074f578063e481af9d1461066f578063f289a7fb14610635578063f2fde38b146105a4578063fabc1cbc1461045c578063fc299dee146104345763fce36c7d14610235575061000e565b3461042f576020366003190112610314576004356001600160401b03811161042a5761026590369060040161305d565b919061026f613e40565b7f0000000000000000000000000000000000000000000000000000000000000000825b8481106103c657506001600160a01b031690813b156103c1576040519363fce36c7d60e01b855280602486016020600488015252604485019060448160051b8701019280928690609e1983360301905b8483106103245788808b8181808c0381838f5af18015610319576103035750f35b8161030d91612d32565b6103145780f35b612b5b565b6040513d84823e3d90fd5b9091929394956043198a8203018252863590838212156103bc5760208091876001940190608063ffffffff6103a88261036e61036087806140f4565b60a0885260a0880191614128565b95898060a01b03610380898301612dbf565b1688870152604081013560408701528361039c60608301612f40565b16606087015201612f40565b1691015298019201930191909493926102e2565b6140af565b6132b2565b806103fb6103e260206103dc6001958a89614250565b01614011565b60406103ef848a89614250565b01359030903390614272565b61042461040e60206103dc848a89614250565b84604061041c858b8a614250565b0135916142bb565b01610292565b612bab565b612b0b565b503461042f57366003190112610314576065546040516001600160a01b039091168152602090f35b503461042f57602036600319011261031457609754600435906001600160a01b0316803b156103c15760206004916040519283809263755b36bd60e11b82525afa8015610599576104bf91849161056a575b506001600160a01b03163314613324565b6098541981198116036104ff57806098556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a280f35b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b61058c915060203d602011610592575b6105848183612d32565b810190613305565b386104ae565b503d61057a565b6040513d85823e3d90fd5b503461042f576020366003190112610314576105be612da4565b6105c6613d41565b6001600160a01b038116156105e1576105de90613df7565b80f35b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b503461042f5736600319011261031457606060ca5463ffffffff60405191818116835260ff8160201c16602084015260281c166040820152f35b503461042f5780600319360112610314577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103c15781600491604051928380926302e0740360e31b82525afa90811561031957829161072d575b506106e2815151613acb565b915b8151805182101561071b57600191906001600160a01b0390610707908390613afd565b5151166107148286613afd565b52016106e4565b604051806107298682612f51565b0390f35b61074991503d8084833e6107418183612d32565b810190613c1f565b386106d6565b3461042f57602036600319011261031457602061077261076d612da4565b613b11565b6040519015158152f35b503461042f57606036600319011261031457610796612da4565b602435906001600160a01b03821682036109cf57604435906001600160a01b03821682036109cb5783549260ff8460081c1615938480956109be575b80156109a7575b1561094b5760ff19811660011786558461093a575b5060ff855460081c16156108e15761080861080d92613df7565b613d99565b61012c6040805161081d81612cb0565b610708815260016020820152015260ca805468ffffffffffffffffff191666012c010000070817905560cd54600160401b8110156108cd579061086b82600161088f940160cd5560cd612c47565b81546001600160a01b0393841660039290921b91821b9390911b1916919091179055565b6108965780f35b61ff001981541681557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a180f35b634e487b7160e01b84526041600452602484fd5b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b61ffff1916610101178555386107ee565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b1580156107d95750600160ff8216146107d9565b50600160ff8216106107d2565b8380fd5b8280fd5b503461042f576109e236613268565b6080820180519293929091906001600160a01b03163303610e9f575b505063ffffffff60608301511663ffffffff42169081808211600014610e9057610a2791614216565b60ca549063ffffffff808360281c16911611610e4b5760405190610a4a82612cfc565b836080604051610a5981612d17565b6060815282602082015282604082015282606082015201526040820184815260608301938585526080840196606088528660a0860152845280602085015263ffffffff83160163ffffffff8111610e37579063ffffffff60ff939216905260201c16809252604051602081019060208252610ae981610adb6040820186613a1b565b03601f198101835282612d32565b5190209060ce5491828411610df257610b0183613154565b92610b0f6040519485612d32565b80845260ce8652857fd36cd1c74ef8d7326d8021b776c18fb5a5724b7f7bc93c2f42e43e10ef27d12a602086015b838310610dd45750505050825191610b5485613154565b94610b626040519687612d32565b808652610b71601f1991613154565b01865b818110610dbd57505085925b85519060ff851691821015610d03578015610c9857610bd081610ba38487614004565b6040516020810191448352426040830152606082015260608152610bc8608082612d32565b519020614230565b90610bdb8288613afd565b51916000198201918211610c8457610c0990610bf7838a613afd565b51610c02828b613afd565b5288613afd565b508151909590610c21906001600160a01b0316613b11565b15610c7b57508051602091906001600160a01b0316610c40848a613afd565b515201516020610c508389613afd565b51015260ff8114610c6757600101965b9692610b80565b634e487b7160e01b87526011600452602487fd5b98915050610c60565b634e487b7160e01b8a52601160045260248afd5b60405162461bcd60e51b815260206004820152603760248201527f496e7465726e616c3a204665657320746f6f206c6f772e204e6f206f7065726160448201527f746f7273206c65667420746f207069636b2066726f6d2e0000000000000000006064820152608490fd5b8783888b52604051602081019060208252610d2581610adb6040820186613a1b565b51902063ffffffff60c95416835260cb60205260408320556001610d8560c954927f7738d1b30deac7824a0580de02efde3bb766c7b7b5ea79da34869ebd887cebf363ffffffff8516928392604051918291602083526020830190613a1b565b0390a20163ffffffff8111610da95763ffffffff169063ffffffff19161760c95580f35b634e487b7160e01b83526011600452602483fd5b602090610dc8613878565b82828a01015201610b74565b60026020600192610de485613892565b815201920192019190610b3d565b60405162461bcd60e51b815260206004820152601e60248201527f496e7465726e616c3a204e6f7420656e6f756768206f70657261746f727300006044820152606490fd5b634e487b7160e01b86526011600452602486fd5b60405162461bcd60e51b815260206004820152601e60248201527f526571756573742074696d657374616d7020746f6f20666172206177617900006044820152606490fd5b90610e9a91614216565b610a27565b610ec290604051602080820152610ebd81610adb60408201896139ce565b614188565b90516001600160a01b03908116911603610edd5738806109fe565b60405162461bcd60e51b815260206004820152602f60248201527f5369676e6572206f6620726571756573745369676e6174757265206973206e6f60448201526e3a103932b8bab2b9ba1737bbb732b960891b6064820152608490fd5b3461042f576020366003190112610314576004356001600160401b03811161042a57610adb610f89610f736107299336906004016130e6565b60405192839160208084015260408301906139ce565b604051918291602083526020830190612fb7565b3461042f576020610fcd610ebd610adb610fb636613268565b9290604051928391878084015260408301906139ce565b6040516001600160a01b039091168152f35b503461042f576020366003190112610314576004356001600160401b03811161042a57611010903690600401612e47565b61102161101c336137c5565b613700565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103c1578261107f8193829360405194858094819363a98fb35560e01b8352602060048401526024830190612fb7565b03925af18015610319576103035750f35b503461042f5760203660031901126103145760043560ce548110156110ee576110b89061316b565b5080546001600160a01b0316906110d1906001016131c4565b906107296040519283928352604060208401526040830190612fb7565b5080fd5b503461042f5760203660031901126103145761110c612da4565b611140337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614613949565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103c1576040516351b27a6d60e11b81526001600160a01b03909216600483015282919082908290602490829084905af18015610319576103035750f35b503461042f57604036600319011261031457600435906001600160401b03821161042a5760406003198336030112611b4557604051916111ea83612ce1565b80600401356001600160401b038111611b0e57810160c06003198236030112611b45576040519061121a82612cfc565b60048101356001600160401b038111611b0e5761123d90600436918401016130e6565b825261124b60248201612f40565b602083015261125c60448201612f40565b6040830152606481013560ff81168103611b4157606083015260848101356001600160401b038111611b0e5760049082010136601f82011215611b045780356112a481613154565b916112b26040519384612d32565b81835260208084019260051b82010190368211611b095760208101925b828410611b135750505050608083015260a4013560a082015283526024810135906001600160401b038211611b0e57019136602384011215611b0457600483013561131981613154565b936113276040519586612d32565b818552602060048187019360051b8301010190368211611b095760248101925b828410611ad35750505050602081019283526024359163ffffffff8316809303611ad057815160405161138a81610adb6020820194602086526040830190613a1b565b51902083825260cb602052604082205403611a655763ffffffff6040835101511663ffffffff42161015611a2d5781519283519363ffffffff6020604087015196608060018060a01b0391015116920151169060405195608087018781106001600160401b03821117611a1957604052865260208601526040850152600160608501528451946040519461141d86612ce1565b85526020850195865261143560808551015151613acb565b95835b875181101561146d57600190818060a01b036114598260808a510151613afd565b515116611466828b613afd565b5201611438565b509092959194815151156119e457519384519360405194602086015260208552611498604086612d32565b84518060011b90808204600214901517156119d0576114b69061438c565b9560408051956114c68288612d32565b601087526f181899199a1a9b1b9c1cb0b131b232b360811b60208801528a5b88518110156115a3576114f8818a6143b4565b5188516001600160f81b03199161151b916115159160f81c614382565b8a6143b4565b51168160011b908282046002148315171561158f578d1a61153c828d6143b4565b53611547828b6143b4565b5189516001600160f81b03199161156a916115649160f81c614230565b8b6143b4565b51166001820180921161158f5790611588600193928f1a918d6143b4565b53016114e5565b634e487b7160e01b8e52601160045260248efd5b5061060f60f31b9650908a918a8a6115e5602285518093602082019d8e526115d48151809260208686019101612f94565b81010301601f198101835282612d32565b60018060a01b0360208701511660609685516116018982612d32565b602881526020810192601f198a01368537885b601481106118ca57505086518093602082019261060f60f31b84525190816022840161163f92612f94565b810103602201601f19810184526116569084612d32565b888783015163ffffffff1661166a906143c5565b920151611676906143c5565b9287519d8e955190816020880161168c92612f94565b850190600560f91b6020830152519182602183016116a992612f94565b01602001600560f91b6001820152815191826002830191602001916116cd92612f94565b01600101600560f91b6001820152815191826002830191602001916116f192612f94565b0160010103600101601f1981018a5261170a908a612d32565b87515161171690613acb565b96845b89518051821015611755579061173b61173482600194613afd565b518d614188565b611745828c613afd565b90838060a01b0316905201611719565b505093879195879180975b8551891015611818578197825b865181101561180c576001600160a01b036117888289613afd565b51166001600160a01b0361179c8d8b613afd565b5116146117ab5760010161176d565b509298909391975060015b156117c8576001019791969092611760565b865162461bcd60e51b815260206004820152601a60248201527f4d697373696e67206174746573746f72207369676e61747572650000000000006044820152606490fd5b509298909391976117b6565b8787856118438685875260cb6020528684812055835194602086525190846020870152850190613a1b565b905191601f198483030190840152815180825260208201916020808360051b83010194019287915b83831061189d5788887fa5be567caa88ff11b6da2cf017f9cefffcafa24111a9ecbf0b0bc476944f0f098989038aa280f35b90919293946020806118bb600193601f198682030187528951612fb7565b9701930193019193929061186b565b80601303601381116119bc57600381901b906001600160fd1b038116036119bc5760ff81116119bc5760ff611903600182931b85614382565b161660f481901b600f60f81b169060f081169060ff16039060ff821161199457611936906001600160f81b031916614863565b600183901b91906001600160ff1b03841684036119a85790611971918d1a61195e84886143b4565b5360f81b6001600160f81b031916614863565b60018201809211611994579061198d600193928d1a91866143b4565b5301611614565b634e487b7160e01b8c52601160045260248cfd5b634e487b7160e01b8d52601160045260248dfd5b634e487b7160e01b8b52601160045260248bfd5b634e487b7160e01b89526011600452602489fd5b60405162461bcd60e51b815260206004820152600d60248201526c4e6f207369676e61747572657360981b6044820152606490fd5b634e487b7160e01b86526041600452602486fd5b60405162461bcd60e51b815260206004820152601060248201526f15185cdac81a185cc8195e1c1a5c995960821b6044820152606490fd5b60405162461bcd60e51b815260206004820152603d60248201527f737570706c696564207461736b20646f6573206e6f74206d617463682074686560448201527f206f6e65207265636f7264656420696e2074686520636f6e74726163740000006064820152608490fd5b80fd5b83356001600160401b038111611b0457602091611af98392836004369288010101612e47565b815201930192611347565b612dd3565b613004565b612d53565b83356001600160401b038111611b0457602091611b368392833691870101612ee1565b8152019301926112cf565b8480fd5b612c5f565b503461042f576020366003190112610314576004356001600160401b03811161042a57611b7b90369060040161305d565b611b86929192613e40565b7f0000000000000000000000000000000000000000000000000000000000000000825b828110611d7057506001600160a01b0316803b156103c15760405191634e5cd2fd60e11b835280604484013060048601526040602486015252606483019460648260051b8501019181869060be19813603015b838310611c1d578880898181808b0381838e5af18015610319576103035750f35b9091929394606319888203018a528535828112156103bc57830190611c53611c4583806140f4565b60c0845260c0840191614128565b916001600160a01b03611c6860208301612dbf565b1660208301526020611c7d60408301836140f4565b848603604086015280865294909101938c905b808210611d405750505063ffffffff611cab60608301612f40565b16606083015263ffffffff611cc260808301612f40565b16608083015260a0810135601e19823603018112156103bc5701906020823592016001600160401b038311611d3b578236038113611d365783836020948594938460a0879660019a03910152818452848401378d838284010152601f8019910116010197019a019301919098939298611bfc565b61406a565b614025565b909194604080600192838060a01b03611d588a612dbf565b16815260208901356020820152019601920190611c90565b909291829483955b611d90611d86858585613f1e565b6040810190613f45565b9050871015611de057611da7611d86858585613f1e565b881015611dcc576001916020611dc4928a60061b01013590614004565b960195611d78565b634e487b7160e01b86526032600452602486fd5b600192949593919650611e1f90611e0981308a611e0460206103dc898d3395613f1e565b614272565b84611e1a60206103dc868a8d613f1e565b6142bb565b01611ba9565b503461042f57602036600319011261031457611e3f612da4565b611e47613d41565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103c15760405163a0169ddd60e01b81526001600160a01b03909216600483015282919082908290602490829084905af18015610319576103035750f35b503461042f57604036600319011261031457611ecc612da4565b602435906001600160401b03821161042a5760606003198336030112611b455760405190611ef982612cb0565b82600401356001600160401b038111611b0e57611f1c9060043691860101612e47565b82526020820190602484013582526044604084019401358452611f6860018060a01b037f0000000000000000000000000000000000000000000000000000000000000000163314613949565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103c157859384611fdc93819560405198899687958694639926ee7d60e01b865260018060a01b0316600486015260406024860152516060604486015260a4850190612fb7565b9151606484015251608483015203925af1801561200857611ffa5780f35b61200391612d32565b388180f35b50604051903d90823e3d90fd5b3461042f57602036600319011261031457610729612039612034612da4565b6138be565b604051918291602083526020830190612fdc565b503461042f57366003190112610314576033546040516001600160a01b039091168152602090f35b503461042f5736600319011261031457602063ffffffff60c95416604051908152f35b503461042f57366003190112610314576097546040516001600160a01b039091168152602090f35b503461042f5780600319360112610314576120d9613d41565b603380546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461042f57366003190112610314576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461042f57366003190112610314576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461042f576020366003190112610314576004359060cc54821015611ad05760206121d083612c2c565b905460405160039290921b1c6001600160a01b03168152f35b503461042f57366003190112610314576020609854604051908152f35b503461042f576020366003190112610314576004359060ff8216809203611ad05760206001831b806098541614604051908152f35b503461042f5780600319360112610314576097546001600160a01b0316803b156103c15760206024916040519283809263237dfb4760e11b82523360048301525afa8015610319576122949183916122cb575b5061339b565b60001960985560405160001981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a280f35b6122ed915060203d6020116122f3575b6122e58183612d32565b810190613383565b3861228e565b503d6122db565b503461042f576020366003190112610314576105de612317612da4565b610808613d41565b503461042f57602036600319011261031457612339612da4565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103c15781600491604051928380926302e0740360e31b82525afa9081156103195782916125df575b508051519161239e83613154565b916123ac6040519384612d32565b8383526123b884613154565b602084019190601f1901368337825b8581106125b75750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103c15760408051639004134760e01b81526001600160a01b0390971660048801526024870152835160448701819052839287929091606484019190855b8181106125925750505082809103915afa938415612008578194612500575b5080815b8481106124d4575061247090613acb565b93815b84811061248857604051806107298882612f51565b6124928183613afd565b516124a0575b600101612473565b916001906124cc906001600160a01b036124ba8688613afd565b51166124c6828a613afd565b52613d1c565b929050612498565b6124de8187613afd565b516124ec575b60010161245f565b906124f8600191613d1c565b9190506124e4565b9093503d8085833e6125128183612d32565b810190602081830312610314578051906001600160401b03821161042a57019080601f83011215611b0457815161254881613154565b926125566040519485612d32565b81845260208085019260051b820101928311611b0957602001905b82821061258257505050923861245b565b8151815260209182019101612571565b82516001600160a01b031684528796508a95506020938401939092019160010161243c565b600190818060a01b036125cb828551613afd565b5151166125d88288613afd565b52016123c7565b6125f391503d8084833e6107418183612d32565b38612390565b3461042f576020366003190112610314576020610772612617612da4565b613828565b503461042f57602036600319011261031457604060209163ffffffff612640612f2d565b16815260cb83522054604051908152f35b3461042f57602036600319011261031457602061077261266f612da4565b6137c5565b503461042f5760603660031901126103145760405161269281612cb0565b61269a612f2d565b815260243560ff811681036109cf57602082019081526044359163ffffffff831683036109cb5780604063ffffffff92019384526126da61101c336137c5565b511680612745575b505160ff8116612724575b505163ffffffff81166126fe575080f35b68ffffffff000000000060ca549160281b169068ffffffff000000000019161760ca5580f35b64ff0000000060ca549160201b169064ff0000000019161760ca55386126ed565b63ffffffff1960ca54161760ca55386126e2565b503461042f57604036600319011261031457612773612da4565b60243580151581036109cf576105de9161278f61101c336137c5565b613742565b503461042f576020366003190112610314576004356001600160401b03811161042a576127c5903690600401612ee1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103c15760206024916040519283809263ec7fbb3160e01b82523360048301525afa801561059957600191849161287a575b50151503612835576105de9061354e565b60405162461bcd60e51b815260206004820152601b60248201527f4f70657261746f72206d757374206265207468652063616c6c657200000000006044820152606490fd5b612893915060203d6020116122f3576122e58183612d32565b38612824565b503461042f576020366003190112610314576004359060cd54821015611ad05760206121d083612bfb565b503461042f57602036600319011261031457609754600435906001600160a01b0316803b156103c15760206024916040519283809263237dfb4760e11b82523360048301525afa8015610599576129219184916122cb575061339b565b6098548181160361295f57806098556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a280f35b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b5034612b0b576020366003190112610314576004356001600160a01b038116908190036110ee576097546001600160a01b038116803b156103c15760405163755b36bd60e11b8152602081600481855afa8015612b0057612a3c91869161056a57506001600160a01b03163314613324565b8215612a835760407f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6918151908152846020820152a16001600160a01b0319161760975580f35b60405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a490fd5b6040513d87823e3d90fd5b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b60cd54811015612c165760cd60005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b60cc54811015612c165760cc60005260206000200190600090565b8054821015612c165760005260206000200190600090565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b606081019081106001600160401b03821117612ccb57604052565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b03821117612ccb57604052565b60c081019081106001600160401b03821117612ccb57604052565b60a081019081106001600160401b03821117612ccb57604052565b90601f801991011681019081106001600160401b03821117612ccb57604052565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b600435906001600160a01b0382168203612dba57565b600080fd5b35906001600160a01b0382168203612dba57565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b6001600160401b038111612ccb57601f01601f191660200190565b81601f82011215611b0457602081359101612e6182612e2c565b92612e6f6040519485612d32565b82845282820111612e8c5781600092602092838601378301015290565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b9190604083820312611b455760405190612efa82612ce1565b8193612f0581612dbf565b83526020810135916001600160401b038311611b0e57602092612f289201612e47565b910152565b6004359063ffffffff82168203612dba57565b359063ffffffff82168203612dba57565b602060408183019282815284518094520192019060005b818110612f755750505090565b82516001600160a01b0316845260209384019390920191600101612f68565b60005b838110612fa75750506000910152565b8181015183820152602001612f97565b90602091612fd081518092818552858086019101612f94565b601f01601f1916010190565b90604060206130019360018060a01b0381511684520151918160208201520190612fb7565b90565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b9181601f84011215611b04578235916001600160401b03831161308d576020808501948460051b010111611b0957565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b91909160a081840312611b45576040519061310082612d17565b81938135906001600160401b038211611b0e578261312760809492612f2894869401612e47565b8552602081013560208601526040810135604086015261314960608201612f40565b606086015201612dbf565b6001600160401b038111612ccb5760051b60200190565b60ce54811015612c165760ce60005260206000209060011b0190600090565b90600182811c921680156131ba575b60208310146131a457565b634e487b7160e01b600052602260045260246000fd5b91607f1691613199565b90604051918260008254926131d88461318a565b808452936001811690811561324657506001146131ff575b506131fd92500383612d32565b565b90506000929192526020600020906000915b81831061322a5750509060206131fd92820101386131f0565b6020919350806001915483858901015201910190918492613211565b9050602092506131fd94915060ff191682840152151560051b820101386131f0565b906040600319830112610314576004356001600160401b03811161042a5782613293916004016130e6565b91602435906001600160401b03821161042a5761300191600401612e47565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b9081602091031261031457516001600160a01b0381168103612dba5790565b1561332b57565b60405162461bcd60e51b815260206004820152602a60248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526939903ab73830bab9b2b960b11b6064820152608490fd5b9081602091031261031457518015158103612dba5790565b156133a257565b60405162461bcd60e51b815260206004820152602860248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526739903830bab9b2b960c11b6064820152608490fd5b818110613403575050565b600081556001016133f8565b90929192613538576001602091818060a01b038551166001600160601b0360a01b825416178155019201519182516001600160401b038111612ccb57613455825461318a565b601f81116134fb575b506020601f8211600114613499578192939460009261348e575b50508160011b916000199060031b1c1916179055565b015190503880613478565b601f1982169083600052806000209160005b8181106134e3575095836001959697106134ca575b505050811b019055565b015160001960f88460031b161c191690553880806134c0565b9192602060018192868b0151815501940192016134ab565b61352890836000526020600020601f840160051c8101916020851061352e575b601f0160051c01906133f8565b3861345e565b909150819061351b565b634e487b7160e01b600052600060045260246000fd5b80516001600160a01b031633036136ac57602081015151156135d55760005b60ce548110156135b1576135808161316b565b505482516001600160a01b0390811691161461359e5760010161356d565b906135ab6131fd9261316b565b9061340f565b5060ce5490600160401b821015612ccb576135ab8260016131fd940160ce5561316b565b60005b60ce5481101561366e576135eb8161316b565b505482516001600160a01b03908116911614613609576001016135d8565b613613915061316b565b613538578060006001925501613629815461318a565b9081613633575050565b81601f60009311600114613645575055565b8183526020832061366191601f0160051c8101906001016133f8565b8082528160208120915555565b60405162461bcd60e51b815260206004820152601260248201527113dc195c985d1bdc881b9bdd08199bdd5b9960721b6044820152606490fd5b0390fd5b60405162461bcd60e51b815260206004820152602660248201527f4d657461646174612061646472657373206d757374206d61746368207468652060448201526531b0b63632b960d11b6064820152608490fd5b1561370757565b60405162461bcd60e51b815260206004820152601360248201527221b0b63632b91034b9903737ba1030b236b4b760691b6044820152606490fd5b906137a05760005b60cc5481101561366e5761375d81612c2c565b905460039190911b1c6001600160a01b03908116908316146137815760010161374a565b61378b9150612c2c565b81549060018060a01b039060031b1b19169055565b60cc5490600160401b821015612ccb5761086b8260016131fd940160cc5560cc612c47565b6033546001600160a01b031633146138225760cd549060005b8281106137ed57505050600090565b6137f681612bfb565b905460039190911b1c6001600160a01b039081169083161461381a576001016137de565b505050600190565b50600190565b613831816137c5565b6138225760cc549060005b82811061384b57505050600090565b61385481612c2c565b905460039190911b1c6001600160a01b039081169083161461381a5760010161383c565b6040519061388582612ce1565b6060602083600081520152565b9060405161389f81612ce1565b82546001600160a01b03168152918290602090612f28906001016131c4565b6138c6613878565b5060ce549060005b82811061390f5760405162461bcd60e51b815260206004820152601260248201527113dc195c985d1bdc881b9bdd08199bdd5b9960721b6044820152606490fd5b6139188161316b565b50546001600160a01b03838116911614613934576001016138ce565b6130019250613943915061316b565b50613892565b1561395057565b60405162461bcd60e51b815260206004820152604a60248201527f4543445341536572766963654d616e61676572426173652e6f6e6c795374616b60448201527f6552656769737472793a2063616c6c6572206973206e6f7420746865207374616064820152696b65526567697374727960b01b608482015260a490fd5b9060806139e4835160a0845260a0840190612fb7565b602080850151908401526040808501519084015260608085015163ffffffff1690840152928101516001600160a01b031691015290565b90613a2f825160c0835260c08301906139ce565b9163ffffffff602082015116602083015263ffffffff604082015116604083015260ff60608201511660608301526080810151928281036080840152835180825260208201916020808360051b8301019601926000915b838310613a9e57505050505060a08091015191015290565b9091929396602080613abc600193601f198682030187528b51612fdc565b99019301930191939290613a86565b90613ad582613154565b613ae26040519182612d32565b8281528092613af3601f1991613154565b0190602036910137565b8051821015612c165760209160051b010190565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103c1576040516398ec1ac960e01b81526001600160a01b039091166004820152602081602481855afa908115613be157600091613bed575b50813b156103c1576020600492604051938480926340bf2fb760e01b82525afa918215613be157600092613bad575b50101590565b9091506020813d602011613bd9575b81613bc960209383612d32565b8101031261031457519038613ba7565b3d9150613bbc565b6040513d6000823e3d90fd5b90506020813d602011613c17575b81613c0860209383612d32565b81010312610314575138613b78565b3d9150613bfb565b602081830312610314578051906001600160401b03821161042a570190602082820312611b455760405191602083018381106001600160401b03821117612ccb576040528051906001600160401b038211611b0e570181601f82011215611b0457805190613c8c82613154565b92613c9a6040519485612d32565b82845260208085019360061b83010191818311611b0957602001925b828410613cc65750505050815290565b604084830312611b455760405190613cdd82612ce1565b84516001600160a01b0381168103612dba5782526020850151906001600160601b0382168203612dba5782602092836040950152815201930192613cb6565b6000198114613d2b5760010190565b634e487b7160e01b600052601160045260246000fd5b6033546001600160a01b03163303613d5557565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b606554604080516001600160a01b038084168252841660208201529192917fe11cddf1816a43318ca175bbc52cd0185436e9cbead7c83acc54a73e461717e39190a16001600160a01b03166001600160a01b03199190911617606555565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b6065546001600160a01b03163303613e5457565b60405162461bcd60e51b815260206004820152605160248201527f4543445341536572766963654d616e61676572426173652e6f6e6c795265776160448201527f726473496e69746961746f723a2063616c6c6572206973206e6f7420746865206064820152703932bbb0b932399034b734ba34b0ba37b960791b608482015260a490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206f6666736574000000006044820152606490fd5b9190811015612c165760051b8101359060be1981360301821215613f40570190565b613ed9565b903590601e1981360301821215613f4057018035906001600160401b038211613fbf57602001918160061b36038313613f7a57565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c64617461207461696c20746f6f2073686f72740000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206c656e677468000000006044820152606490fd5b91908201809211613d2b57565b356001600160a01b0381168103612dba5790565b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206c656e67746800006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c64617461206163636573732073747269646500006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206f666673657400006044820152606490fd5b9035601e19823603018112156103bc5701602081359101916001600160401b038211611d3b578160061b36038313611d3657565b916020908281520191906000905b8082106141435750505090565b909192833560018060a01b038116809103612dba5781526020840135906001600160601b038216809203612dba57604081600193602083940152019401920190614136565b6130019161420e91603a61420661419f83516143c5565b9260405192839160208301957f19457468657265756d205369676e6564204d6573736167653a0a00000000000087526141e18151809260208688019101612f94565b83016141f68251809360208685019101612f94565b010103601f198101835282612d32565b5190206145d1565b919091614641565b9063ffffffff8091169116039063ffffffff8211613d2b57565b811561423a570690565b634e487b7160e01b600052601260045260246000fd5b9190811015612c165760051b81013590609e1981360301821215613f40570190565b6040516323b872dd60e01b60208201526001600160a01b0392831660248201529290911660448301526064808301939093529181526131fd916142b6608483612d32565b61447d565b6001600160a01b038116803b156103c157604051636eb1769f60e11b81523060048201526001600160a01b038416602482015290602090829060449082905afa908115613be15760009161434e575b506131fd9361431891614004565b60405163095ea7b360e01b60208201526001600160a01b03909316602484015260448084019190915282526142b6606483612d32565b90506020813d60201161437a575b8161436960209383612d32565b8101031261031457516131fd61430a565b3d915061435c565b811561423a570490565b9061439682612e2c565b6143a36040519182612d32565b8281528092613af3601f1991612e2c565b908151811015612c16570160200190565b801561445d5780816000925b6144495750806143e08361438c565b92915b6143ec57505090565b6000198201918211613d2b5781600a820491600a8302838104600a1484151715613d2b578103908111613d2b5760ff1660300160ff8111613d2b5760f81b6001600160f81b03191660001a9061444290856143b4565b53806143e3565b91614455600a91613d1c565b9204806143d1565b5060405161446c604082612d32565b60018152600360fc1b602082015290565b60408051909290916001600160a01b03166144988484612d32565b602083527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020840152803b1561458d5760008281928260206145099796519301915af13d15614585573d906144ed82612e2c565b916144fa86519384612d32565b82523d6000602084013e6148a5565b8051908161451657505050565b602080614527938301019101613383565b1561452f5750565b5162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b6060906148a5565b835162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b8151604181036145fe5750906145fa916020820151906060604084015193015160001a906147bb565b9091565b6040036146375760406020830151920151918260ff1c91601b8301809311613d2b576145fa936001600160ff1b03169260ff16906147bb565b5050600090600290565b60058110156147a557806146525750565b6000600182036146a15760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b50600281036146ef5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b6000906003810361474a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b600491501461475557565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608490fd5b634e487b7160e01b600052602160045260246000fd5b907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116148575760ff1690601b8214158061484c575b61484057602093600093608093604051938452868401526040830152606082015282805260015afa15613be1576000516001600160a01b038116156148375790600090565b50600090600190565b50505050600090600490565b50601c8214156147f2565b50505050600090600390565b60f81c600a81101561488a5760300160ff8111613d2b5760f81b6001600160f81b03191690565b60570160ff8111613d2b5760f81b6001600160f81b03191690565b909190156148b1575090565b8151156148c15750805190602001fd5b60405162461bcd60e51b8152602060048201529081906136a8906024830190612fb756fea26469706673582212206d91c438b9b23fa88940cff9c59d5a51fb904c8d3f34eb034ed4fb0b3da4cd0164736f6c634300081a0033"; type ReclaimServiceManagerConstructorParams = | [signer?: Signer] @@ -1165,12 +1308,14 @@ export class ReclaimServiceManager__factory extends ContractFactory { override deploy( _avsDirectory: string, _stakeRegistry: string, + _rewardsCoordinator: string, _delegationManager: string, overrides?: Overrides & { from?: string } ): Promise { return super.deploy( _avsDirectory, _stakeRegistry, + _rewardsCoordinator, _delegationManager, overrides || {} ) as Promise; @@ -1178,12 +1323,14 @@ export class ReclaimServiceManager__factory extends ContractFactory { override getDeployTransaction( _avsDirectory: string, _stakeRegistry: string, + _rewardsCoordinator: string, _delegationManager: string, overrides?: Overrides & { from?: string } ): TransactionRequest { return super.getDeployTransaction( _avsDirectory, _stakeRegistry, + _rewardsCoordinator, _delegationManager, overrides || {} ); diff --git a/src/avs/contracts/factories/index.ts b/src/avs/contracts/factories/index.ts index f45cbc5d..02498673 100644 --- a/src/avs/contracts/factories/index.ts +++ b/src/avs/contracts/factories/index.ts @@ -1,4 +1,7 @@ /* Autogenerated file. Do not edit manually. */ /* tslint:disable */ /* eslint-disable */ +export { AVSDirectory__factory } from "./AVSDirectory__factory"; +export { DelegationManager__factory } from "./DelegationManager__factory"; +export { ECDSAStakeRegistry__factory } from "./ECDSAStakeRegistry__factory"; export { ReclaimServiceManager__factory } from "./ReclaimServiceManager__factory"; diff --git a/src/avs/contracts/index.ts b/src/avs/contracts/index.ts index b8866053..b1ce7cfb 100644 --- a/src/avs/contracts/index.ts +++ b/src/avs/contracts/index.ts @@ -1,6 +1,12 @@ /* Autogenerated file. Do not edit manually. */ /* tslint:disable */ /* eslint-disable */ +export type { AVSDirectory } from "./AVSDirectory"; +export type { DelegationManager } from "./DelegationManager"; +export type { ECDSAStakeRegistry } from "./ECDSAStakeRegistry"; export type { ReclaimServiceManager } from "./ReclaimServiceManager"; export * as factories from "./factories"; export { ReclaimServiceManager__factory } from "./factories/ReclaimServiceManager__factory"; +export { AVSDirectory__factory } from "./factories/AVSDirectory__factory"; +export { DelegationManager__factory } from "./factories/DelegationManager__factory"; +export { ECDSAStakeRegistry__factory } from "./factories/ECDSAStakeRegistry__factory"; diff --git a/src/avs/tests/test.operator.ts b/src/avs/tests/test.operator.ts index 1f396505..41af507c 100644 --- a/src/avs/tests/test.operator.ts +++ b/src/avs/tests/test.operator.ts @@ -23,8 +23,8 @@ import { registerOperator } from 'src/avs/utils/register' import { createNewClaimRequestOnChain } from 'src/avs/utils/tasks' import type { createClaimOnAttestor } from 'src/client' import { describeWithServer } from 'src/tests/describe-with-server' -import { ClaimInfo } from 'src/types' -import { canonicalStringify, createSignDataForClaim, getIdentifierFromClaimInfo, unixTimestampSeconds } from 'src/utils' +import { ClaimInfo, CompleteClaimData } from 'src/types' +import { canonicalStringify, createSignDataForClaim, getIdentifierFromClaimInfo, logger, unixTimestampSeconds } from 'src/utils' const contracts = getContracts() @@ -65,8 +65,7 @@ describe('Operators', () => { } const userWallet = new Wallet(ownerPrivateKey, contracts.provider) - - const data = createSignDataForClaim({ + const data: CompleteClaimData = { provider: name, parameters: canonicalStringify(params), context: context @@ -75,12 +74,15 @@ describe('Operators', () => { timestampS: timestampS!, owner: userWallet.address, epoch: 1 - }) + } + const signStr = createSignDataForClaim(data) - const signData = await op.wallet.signMessage(data) + const signData = await op.wallet.signMessage(signStr) const signArray = arrayify(signData) return { + claim: data, + request: { data }, signatures: { claimSignature: signArray } } as any }) @@ -146,7 +148,10 @@ describe('Operators', () => { it('should not throw an error on repeated registration', async() => { await registerFirstOperator() - await registerOperator() + await registerOperator({ + wallet: operators[0].wallet, + reclaimRpcUrl: operators[0].url, + }) }) it('should register multiple operators', async() => { @@ -238,7 +243,8 @@ describe('Operators', () => { await registerOperator({ wallet: operators[0].wallet, - reclaimRpcUrl: operators[0].url + reclaimRpcUrl: operators[0].url, + logger: logger.child({ op: operatorAddress }) }) assert.strictEqual( @@ -259,22 +265,18 @@ describe('Operators', () => { } const wallet2 = randomWallet() + const newAddr = wallet2.address const url = 'ws://abcd.com/ws' - await sendGasToAddress(wallet2.address) - - await contracts.contract.whitelistAddressAsOperator( - wallet2.address, - true - ) - + await sendGasToAddress(newAddr) + await contracts.contract + .whitelistAddressAsOperator(newAddr, true) await registerOperator({ wallet: wallet2, - reclaimRpcUrl: url + reclaimRpcUrl: url, + logger: logger.child({ op: newAddr }) }) - const newAddr = wallet2.address - assert.strictEqual( await contracts.registryContract.operatorRegistered(newAddr), true diff --git a/src/avs/utils/contracts.ts b/src/avs/utils/contracts.ts index 5adf4482..7977306e 100644 --- a/src/avs/utils/contracts.ts +++ b/src/avs/utils/contracts.ts @@ -1,9 +1,6 @@ import { ethers } from 'ethers' -import { avsDirectoryABI } from 'src/avs/abis/avsDirectoryABI' -import { delegationABI } from 'src/avs/abis/delegationABI' -import { registryABI } from 'src/avs/abis/registryABI' import { CHAIN_CONFIGS, PRIVATE_KEY, SELECTED_CHAIN_ID } from 'src/avs/config' -import { ReclaimServiceManager__factory } from 'src/avs/contracts' +import { AVSDirectory__factory, DelegationManager__factory, ECDSAStakeRegistry__factory, ReclaimServiceManager__factory } from 'src/avs/contracts' import { ChainConfig } from 'src/avs/types' type Contracts = ReturnType @@ -41,9 +38,9 @@ export function initialiseContracts( return { provider, wallet, - delegationManager: new ethers.Contract( + // eslint-disable-next-line camelcase + delegationManager: DelegationManager__factory.connect( delegationManagerAddress, - delegationABI, wallet || provider ), // eslint-disable-next-line camelcase @@ -51,14 +48,14 @@ export function initialiseContracts( contractAddress, wallet || provider ), - registryContract: new ethers.Contract( + // eslint-disable-next-line camelcase + registryContract: ECDSAStakeRegistry__factory.connect( stakeRegistryAddress, - registryABI, wallet || provider ), - avsDirectory: new ethers.Contract( + // eslint-disable-next-line camelcase + avsDirectory: AVSDirectory__factory.connect( avsDirectoryAddress, - avsDirectoryABI, wallet || provider ), } diff --git a/src/avs/utils/register.ts b/src/avs/utils/register.ts index 9c8f36af..612e8f28 100644 --- a/src/avs/utils/register.ts +++ b/src/avs/utils/register.ts @@ -47,7 +47,7 @@ export async function registerOperator({ try { const tx1 = await delegationManager .registerAsOperator({ - earningsReceiver: addr, + '__deprecated_earningsReceiver': addr, delegationApprover: '0x0000000000000000000000000000000000000000', stakerOptOutWindowBlocks: 0 @@ -55,7 +55,10 @@ export async function registerOperator({ await tx1.wait() logger.info('operator registered on DM successfully') } catch(err) { - if(!err.message.includes('operator has already registered')) { + if( + !err.message.includes('operator has already registered') + && !err.message.includes('caller is already actively delegated') + ) { throw err } @@ -66,12 +69,7 @@ export async function registerOperator({ // Example expiry, 1 hour from now const expiry = Math.floor(Date.now() / 1000) + 3600 // Define the output structure - const operatorSignature = { - expiry: expiry, - salt: salt, - signature: '' - } - + const operatorSignature = { expiry, salt, signature: '' } // Calculate the digest hash using the avsDirectory's method const digestHash = await avsDirectory .calculateOperatorAVSRegistrationDigestHash( @@ -92,13 +90,15 @@ export async function registerOperator({ logger.info('operator signature generated successfully') - if(!(await registryContract.operatorRegistered(addr))) { + const isRegistered = await registryContract.operatorRegistered(addr) + if(!isRegistered) { + logger.info('registering operator on AVS...') const tx2 = await registryContract - .registerOperatorWithSignature(addr, operatorSignature) + .registerOperatorWithSignature(operatorSignature, addr) await tx2.wait() logger.info('operator registered on AVS successfully') } else { - logger.info('Operator already registered on AVS') + logger.info('operator already registered on AVS') } const existingMetadata = await contract.getMetadataForOperator(addr) diff --git a/src/scripts/contract-data-gen.sh b/src/scripts/contract-data-gen.sh deleted file mode 100644 index 627ddefb..00000000 --- a/src/scripts/contract-data-gen.sh +++ /dev/null @@ -1,5 +0,0 @@ -rm -rf src/contracts -rm -rf src/types/contracts -mkdir -p src/contracts -cp -r ../resources/contracts/config.json ./src/contracts/ -yarn typechain --target=ethers-v5 --out-dir src/types/contracts '../resources/contracts/abi/*.json' \ No newline at end of file From ebb34d8f3e4a32bf7230398d47c1fc40a0fb0e9d Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Thu, 13 Feb 2025 17:24:41 +0530 Subject: [PATCH 06/26] feat: take fee for claim creation --- avs/contracts/deployments/core/31337.json | 2 +- avs/contracts/deployments/reclaim/31337.json | 2 +- avs/contracts/script/Deployer.s.sol | 300 ----------- avs/contracts/script/HoleskyDeployer.s.sol | 276 ---------- avs/contracts/script/ReclaimDeployer.s.sol | 6 +- .../script/utils/ReclaimDeploymentLib.sol | 5 +- avs/contracts/src/IReclaimServiceManager.sol | 8 + avs/contracts/src/ReclaimServiceManager.sol | 46 +- avs/utils/contract-data-gen.sh | 3 +- docs/avs.md | 3 +- package.json | 2 +- src/avs/client/create-claim-on-avs.ts | 10 +- src/avs/contracts/ERC20Mock.ts | 481 ++++++++++++++++++ src/avs/contracts/ReclaimServiceManager.ts | 252 ++++----- .../contracts/factories/ERC20Mock__factory.ts | 352 +++++++++++++ .../ReclaimServiceManager__factory.ts | 119 +++-- src/avs/contracts/factories/index.ts | 1 + src/avs/contracts/index.ts | 2 + src/avs/tests/test.operator.ts | 36 +- src/avs/types/index.ts | 9 + src/avs/utils/contracts.ts | 22 +- src/avs/utils/tasks.ts | 14 +- 22 files changed, 1162 insertions(+), 789 deletions(-) delete mode 100644 avs/contracts/script/Deployer.s.sol delete mode 100644 avs/contracts/script/HoleskyDeployer.s.sol create mode 100644 src/avs/contracts/ERC20Mock.ts create mode 100644 src/avs/contracts/factories/ERC20Mock__factory.ts diff --git a/avs/contracts/deployments/core/31337.json b/avs/contracts/deployments/core/31337.json index 70c8e1a2..984b3516 100644 --- a/avs/contracts/deployments/core/31337.json +++ b/avs/contracts/deployments/core/31337.json @@ -1 +1 @@ -{"lastUpdate":{"timestamp":"1739361957","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","avsDirectory":"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9","avsDirectoryImpl":"0x68b1d87f95878fe05b998f19b66f4baba5de1aed","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","eigenPodManagerImpl":"0x59b670e9fa9d0a427751af201d676719a970857b","strategyFactory":"0x959922be3caee4b8cd9a407cc3ac1c251c2007b1","strategyFactoryImpl":"0xc6e7df5e7b4f2a278906862b61205850344d4e7d","strategyBeacon":"0x09635f643e140090a9a8dcd712ed6285858cebef","rewardsCoordinator":"0x610178da211fef7d417bc0e6fed39f05609ad788"}} \ No newline at end of file +{"lastUpdate":{"timestamp":"1739447610","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","avsDirectory":"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9","avsDirectoryImpl":"0x68b1d87f95878fe05b998f19b66f4baba5de1aed","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","eigenPodManagerImpl":"0x59b670e9fa9d0a427751af201d676719a970857b","strategyFactory":"0x959922be3caee4b8cd9a407cc3ac1c251c2007b1","strategyFactoryImpl":"0xc6e7df5e7b4f2a278906862b61205850344d4e7d","strategyBeacon":"0x09635f643e140090a9a8dcd712ed6285858cebef","rewardsCoordinator":"0x610178da211fef7d417bc0e6fed39f05609ad788"}} \ No newline at end of file diff --git a/avs/contracts/deployments/reclaim/31337.json b/avs/contracts/deployments/reclaim/31337.json index a4988a86..abf69141 100644 --- a/avs/contracts/deployments/reclaim/31337.json +++ b/avs/contracts/deployments/reclaim/31337.json @@ -1 +1 @@ -{"lastUpdate":{"timestamp":"1739361960","block_number":"19"},"addresses":{"proxyAdmin":"0xf5059a5d33d5853360d16c683c16e67980206f36","reclaimServiceManager":"0x998abeb3e57409262ae5b751f60747921b33613e","reclaimServiceManagerImpl":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","stakeRegistry":"0x4826533b4897376654bb4d4ad88b7fafd0c98528","stakeRegistryImpl":"0x99bba657f2bbc93c02d617f8ba121cb8fc104acf","strategy":"0x24b3c7704709ed1491473f30393ffc93cfb0fc34","token":"0x1613beb3b2c4f22ee086b2b38c1476a3ce7f78e8"}} \ No newline at end of file +{"lastUpdate":{"timestamp":"1739447614","block_number":"15"},"addresses":{"proxyAdmin":"0xf5059a5d33d5853360d16c683c16e67980206f36","reclaimServiceManager":"0x998abeb3e57409262ae5b751f60747921b33613e","reclaimServiceManagerImpl":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","stakeRegistry":"0x4826533b4897376654bb4d4ad88b7fafd0c98528","stakeRegistryImpl":"0x99bba657f2bbc93c02d617f8ba121cb8fc104acf","strategy":"0x24b3c7704709ed1491473f30393ffc93cfb0fc34","token":"0x1613beb3b2c4f22ee086b2b38c1476a3ce7f78e8"}} \ No newline at end of file diff --git a/avs/contracts/script/Deployer.s.sol b/avs/contracts/script/Deployer.s.sol deleted file mode 100644 index f12e4752..00000000 --- a/avs/contracts/script/Deployer.s.sol +++ /dev/null @@ -1,300 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.9; - -import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; - -import "@eigenlayer/contracts/permissions/PauserRegistry.sol"; -import {IDelegationManager} from "@eigenlayer/contracts/interfaces/IDelegationManager.sol"; -import {IAVSDirectory} from "@eigenlayer/contracts/interfaces/IAVSDirectory.sol"; -import {IStrategyManager, IStrategy} from "@eigenlayer/contracts/interfaces/IStrategyManager.sol"; -import {ISlasher} from "@eigenlayer/contracts/interfaces/ISlasher.sol"; -import {StrategyBaseTVLLimits} from "@eigenlayer/contracts/strategies/StrategyBaseTVLLimits.sol"; -import "@eigenlayer/test/mocks/EmptyContract.sol"; - -import {ECDSAStakeRegistry} from "@eigenlayer-middleware/src/unaudited/ECDSAStakeRegistry.sol"; -import {Quorum, StrategyParams} from "@eigenlayer-middleware/src/interfaces/IECDSAStakeRegistryEventsAndErrors.sol"; -import "@eigenlayer-middleware/src/OperatorStateRetriever.sol"; - -import {ReclaimServiceManager, IServiceManager} from "../src/ReclaimServiceManager.sol"; -import "../src/ERC20Mock.sol"; - -import {Utils} from "./utils/Utils.sol"; - -import "forge-std/Test.sol"; -import "forge-std/Script.sol"; -import "forge-std/StdJson.sol"; -import "forge-std/console.sol"; - -// # To deploy and verify our contract -// forge script script/ReclaimDeployer.s.sol:ReclaimDeployer --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast -vvvv -contract ReclaimDeployer is Script, Utils { - // ERC20 and Strategy: we need to deploy this erc20, create a strategy for it, and whitelist this strategy in the strategymanager - - ERC20Mock public erc20Mock; - StrategyBaseTVLLimits public erc20MockStrategy; - - // Hello World contracts - ProxyAdmin public proxyAdmin; - PauserRegistry public pauserReg; - - ECDSAStakeRegistry public stakeRegistryProxy; - ECDSAStakeRegistry public stakeRegistryImplementation; - - ReclaimServiceManager public serviceManagerProxy; - ReclaimServiceManager public serviceManagerImplementation; - - function run() external { - // Eigenlayer contracts - string memory eigenlayerDeployedContracts = readOutput( - "eigenlayer_deployment_output" - ); - IStrategyManager strategyManager = IStrategyManager( - stdJson.readAddress( - eigenlayerDeployedContracts, - ".addresses.strategyManager" - ) - ); - IDelegationManager delegationManager = IDelegationManager( - stdJson.readAddress( - eigenlayerDeployedContracts, - ".addresses.delegation" - ) - ); - IAVSDirectory avsDirectory = IAVSDirectory( - stdJson.readAddress( - eigenlayerDeployedContracts, - ".addresses.avsDirectory" - ) - ); - ProxyAdmin eigenLayerProxyAdmin = ProxyAdmin( - stdJson.readAddress( - eigenlayerDeployedContracts, - ".addresses.eigenLayerProxyAdmin" - ) - ); - PauserRegistry eigenLayerPauserReg = PauserRegistry( - stdJson.readAddress( - eigenlayerDeployedContracts, - ".addresses.eigenLayerPauserReg" - ) - ); - StrategyBaseTVLLimits baseStrategyImplementation = StrategyBaseTVLLimits( - stdJson.readAddress( - eigenlayerDeployedContracts, - ".addresses.baseStrategyImplementation" - ) - ); - - address communityMultisig = msg.sender; - address pauser = msg.sender; - - vm.startBroadcast(); - _deployErc20AndStrategyAndWhitelistStrategy( - eigenLayerProxyAdmin, - eigenLayerPauserReg, - baseStrategyImplementation, - strategyManager - ); - _deployContracts( - delegationManager, - avsDirectory, - erc20MockStrategy, - communityMultisig, - pauser - ); - vm.stopBroadcast(); - } - - function _deployErc20AndStrategyAndWhitelistStrategy( - ProxyAdmin eigenLayerProxyAdmin, - PauserRegistry eigenLayerPauserReg, - StrategyBaseTVLLimits baseStrategyImplementation, - IStrategyManager strategyManager - ) internal { - erc20Mock = new ERC20Mock(); - // TODO(samlaf): any reason why we are using the strategybase with tvl limits instead of just using strategybase? - // the maxPerDeposit and maxDeposits below are just arbitrary values. - erc20MockStrategy = StrategyBaseTVLLimits( - address( - new TransparentUpgradeableProxy( - address(baseStrategyImplementation), - address(eigenLayerProxyAdmin), - abi.encodeWithSelector( - StrategyBaseTVLLimits.initialize.selector, - 1 ether, // maxPerDeposit - 100 ether, // maxDeposits - IERC20(erc20Mock), - eigenLayerPauserReg - ) - ) - ) - ); - IStrategy[] memory strats = new IStrategy[](1); - strats[0] = erc20MockStrategy; - bool[] memory thirdPartyTransfersForbiddenValues = new bool[](1); - thirdPartyTransfersForbiddenValues[0] = false; - strategyManager.addStrategiesToDepositWhitelist( - strats, - thirdPartyTransfersForbiddenValues - ); - } - - function _deployContracts( - IDelegationManager delegationManager, - IAVSDirectory avsDirectory, - IStrategy strat, - address communityMultisig, - address pauser - ) internal { - // Adding this as a temporary fix to make the rest of the script work with a single strategy - // since it was originally written to work with an array of strategies - IStrategy[1] memory deployedStrategyArray = [strat]; - uint numStrategies = deployedStrategyArray.length; - - // deploy proxy admin for ability to upgrade proxy contracts - proxyAdmin = new ProxyAdmin(); - - // deploy pauser registry - { - address[] memory pausers = new address[](2); - pausers[0] = pauser; - pausers[1] = communityMultisig; - pauserReg = new PauserRegistry( - pausers, - communityMultisig - ); - } - - EmptyContract emptyContract = new EmptyContract(); - - // hard-coded inputs - - /** - * 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. - */ - serviceManagerProxy = ReclaimServiceManager( - address( - new TransparentUpgradeableProxy( - address(emptyContract), - address(proxyAdmin), - "" - ) - ) - ); - stakeRegistryProxy = ECDSAStakeRegistry( - address( - new TransparentUpgradeableProxy( - address(emptyContract), - address(proxyAdmin), - "" - ) - ) - ); - - // Second, deploy the *implementation* contracts, using the *proxy contracts* as inputs - { - stakeRegistryImplementation = new ECDSAStakeRegistry( - delegationManager - ); - - proxyAdmin.upgrade( - TransparentUpgradeableProxy(payable(address(stakeRegistryProxy))), - address(stakeRegistryImplementation) - ); - } - - { - StrategyParams[] - memory quorumsStrategyParams = new StrategyParams[]( - numStrategies - ); - - for (uint j = 0; j < numStrategies; j++) { - quorumsStrategyParams[j] = StrategyParams({ - strategy: deployedStrategyArray[j], - multiplier: 10_000 - }); - } - - Quorum memory quorum = Quorum( - quorumsStrategyParams - ); - - proxyAdmin.upgradeAndCall( - TransparentUpgradeableProxy( - payable(address(stakeRegistryProxy)) - ), - address(stakeRegistryImplementation), - abi.encodeWithSelector( - ECDSAStakeRegistry.initialize.selector, - address(serviceManagerProxy), - 1, - quorum - ) - ); - } - - serviceManagerImplementation = new ReclaimServiceManager( - address(avsDirectory), - address(stakeRegistryProxy), - address(delegationManager) - ); - // Third, upgrade the proxy contracts to use the correct implementation contracts and initialize them. - proxyAdmin.upgradeAndCall( - TransparentUpgradeableProxy( - payable(address(serviceManagerProxy)) - ), - address(serviceManagerImplementation), - abi.encodeWithSelector( - ReclaimServiceManager.setup.selector, - msg.sender - ) - ); - - // WRITE JSON DATA - string memory parent_object = "parent object"; - - string memory deployed_addresses = "addresses"; - vm.serializeAddress( - deployed_addresses, - "erc20Mock", - address(erc20Mock) - ); - vm.serializeAddress( - deployed_addresses, - "erc20MockStrategy", - address(erc20MockStrategy) - ); - vm.serializeAddress( - deployed_addresses, - "ServiceManagerProxy", - address(serviceManagerProxy) - ); - vm.serializeAddress( - deployed_addresses, - "ServiceManagerImplementation", - address(serviceManagerImplementation) - ); - vm.serializeAddress( - deployed_addresses, - "ECDSAStakeRegistry", - address(stakeRegistryProxy) - ); - - string memory deployed_addresses_output = vm.serializeAddress( - deployed_addresses, - "ECDSAStakeRegistryImplementation", - address(stakeRegistryImplementation) - ); - - // serialize all the data - string memory finalJson = vm.serializeString( - parent_object, - deployed_addresses, - deployed_addresses_output - ); - - writeOutput(finalJson, "hello_world_avs_deployment_output"); - } -} diff --git a/avs/contracts/script/HoleskyDeployer.s.sol b/avs/contracts/script/HoleskyDeployer.s.sol deleted file mode 100644 index e1eec87a..00000000 --- a/avs/contracts/script/HoleskyDeployer.s.sol +++ /dev/null @@ -1,276 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.9; - -import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; -import "@eigenlayer/contracts/permissions/PauserRegistry.sol"; -import {IDelegationManager} from "@eigenlayer/contracts/interfaces/IDelegationManager.sol"; -import {IAVSDirectory} from "@eigenlayer/contracts/interfaces/IAVSDirectory.sol"; -import {IStrategyManager, IStrategy} from "@eigenlayer/contracts/interfaces/IStrategyManager.sol"; -import {StrategyBase} from "@eigenlayer/contracts/strategies/StrategyBase.sol"; -import {ECDSAStakeRegistry} from "@eigenlayer-middleware/src/unaudited/ECDSAStakeRegistry.sol"; -import {Quorum, StrategyParams} from "@eigenlayer-middleware/src/interfaces/IECDSAStakeRegistryEventsAndErrors.sol"; -import {ReclaimServiceManager} from "../src/ReclaimServiceManager.sol"; -import "@eigenlayer/test/mocks/EmptyContract.sol"; -import "../src/ERC20Mock.sol"; -import "forge-std/Script.sol"; -import "forge-std/StdJson.sol"; -import "forge-std/console.sol"; -import {Utils} from "./utils/Utils.sol"; - -contract HoleskyDeployer is Script, Utils { - // ERC20 and Strategy: we need to deploy this erc20, create a strategy for it, and whitelist this strategy in the strategy manager - - ERC20Mock public erc20Mock; - StrategyBase public erc20MockStrategy; - - // Hello World contracts - ProxyAdmin public proxyAdmin; - PauserRegistry public pauserReg; - - ECDSAStakeRegistry public stakeRegistryProxy; - ECDSAStakeRegistry public stakeRegistryImplementation; - - ReclaimServiceManager public serviceManagerProxy; - ReclaimServiceManager public serviceManagerImplementation; - - string public constant METADATA_URI = "https://raw.githubusercontent.com/reclaimprotocol/attestor-core/main/avs/metadata.json"; - - function run() external { - // Manually pasted addresses of Eigenlayer contracts - address strategyManagerAddr = 0xdfB5f6CE42aAA7830E94ECFCcAd411beF4d4D5b6; - address delegationManagerAddr = 0xA44151489861Fe9e3055d95adC98FbD462B948e7; - address avsDirectoryAddr = 0x055733000064333CaDDbC92763c58BF0192fFeBf; - address eigenLayerProxyAdminAddr = 0xDB023566064246399b4AE851197a97729C93A6cf; - address eigenLayerPauserRegAddr = 0x85Ef7299F8311B25642679edBF02B62FA2212F06; - address baseStrategyImplementationAddr = 0x80528D6e9A2BAbFc766965E0E26d5aB08D9CFaF9; - - IStrategyManager strategyManager = IStrategyManager(strategyManagerAddr); - IDelegationManager delegationManager = IDelegationManager(delegationManagerAddr); - IAVSDirectory avsDirectory = IAVSDirectory(avsDirectoryAddr); - ProxyAdmin eigenLayerProxyAdmin = ProxyAdmin(eigenLayerProxyAdminAddr); - PauserRegistry eigenLayerPauserReg = PauserRegistry(eigenLayerPauserRegAddr); - StrategyBase baseStrategyImplementation = StrategyBase(baseStrategyImplementationAddr); - - // Read the "hello_world_avs_holesky_deployment_output" file - string memory jsonContent = readOutput("hello_world_avs_holesky_deployment_output"); - if(bytes(jsonContent).length > 0) { - console.log("Upgrading contracts..."); - _upgrade(jsonContent, avsDirectory, delegationManager); - return; - } - - address communityMultisig = msg.sender; - address pauser = msg.sender; - - vm.startBroadcast(); - _deployContracts( - delegationManager, - avsDirectory, - baseStrategyImplementation, - communityMultisig, - pauser - ); - vm.stopBroadcast(); - } - - function _deployContracts( - IDelegationManager delegationManager, - IAVSDirectory avsDirectory, - IStrategy baseStrategyImplementation, - address communityMultisig, - address pauser - ) internal { - // Deploy proxy admin for ability to upgrade proxy contracts - proxyAdmin = new ProxyAdmin(); - - // Deploy pauser registry - { - address[] memory pausers = new address[](2); - pausers[0] = pauser; - pausers[1] = communityMultisig; - pauserReg = new PauserRegistry( - pausers, - communityMultisig - ); - } - - EmptyContract emptyContract = new EmptyContract(); - - // First, deploy upgradeable proxy contracts that will point to - // the implementations. - serviceManagerProxy = ReclaimServiceManager( - address( - new TransparentUpgradeableProxy( - address(emptyContract), - address(proxyAdmin), - "" - ) - ) - ); - stakeRegistryProxy = ECDSAStakeRegistry( - address( - new TransparentUpgradeableProxy( - address(emptyContract), - address(proxyAdmin), - "" - ) - ) - ); - - // Second, deploy the implementation contracts, using the - // proxy contracts as inputs - { - stakeRegistryImplementation = new ECDSAStakeRegistry( - delegationManager - ); - - proxyAdmin.upgrade( - TransparentUpgradeableProxy(payable(address(stakeRegistryProxy))), - address(stakeRegistryImplementation) - ); - } - - { - // Create an array with one StrategyParams element - StrategyParams memory strategyParams = StrategyParams({ - strategy: baseStrategyImplementation, - multiplier: 10_000 - }); - - StrategyParams[] memory quorumsStrategyParams = new StrategyParams[](1); - quorumsStrategyParams[0] = strategyParams; - - Quorum memory quorum = Quorum( - quorumsStrategyParams - ); - - // Sort the array (though it has only one element, - // it's trivially sorted). If the array had more elements, - // you would need to ensure it is sorted by strategy address - - proxyAdmin.upgradeAndCall( - TransparentUpgradeableProxy( - payable(address(stakeRegistryProxy)) - ), - address(stakeRegistryImplementation), - abi.encodeWithSelector( - ECDSAStakeRegistry.initialize.selector, - address(serviceManagerProxy), - 1, - quorum - ) - ); - } - - serviceManagerImplementation = new ReclaimServiceManager( - address(avsDirectory), - address(stakeRegistryProxy), - address(delegationManager) - ); - // Upgrade the proxy contracts to use the correct implementation - // contracts and initialize them. - proxyAdmin.upgradeAndCall( - TransparentUpgradeableProxy( - payable(address(serviceManagerProxy)) - ), - address(serviceManagerImplementation), - abi.encodeWithSelector( - ReclaimServiceManager.setup.selector, - msg.sender - ) - ); - serviceManagerProxy.updateAVSMetadataURI(METADATA_URI); - - // WRITE JSON DATA - string memory parent_object = "parent object"; - - string memory deployed_addresses = "addresses"; - vm.serializeAddress( - deployed_addresses, - "HelloWorldServiceManagerProxy", - address(serviceManagerProxy) - ); - vm.serializeAddress( - deployed_addresses, - "HelloWorldServiceManagerImplementation", - address(serviceManagerImplementation) - ); - vm.serializeAddress( - deployed_addresses, - "ECDSAStakeRegistry", - address(stakeRegistryProxy) - ); - vm.serializeAddress( - deployed_addresses, - "ProxyAdmin", - address(proxyAdmin) - ); - - string memory deployed_addresses_output = vm.serializeAddress( - deployed_addresses, - "ECDSAStakeRegistryImplementation", - address(stakeRegistryImplementation) - ); - - // Serialize all the data - string memory finalJson = vm.serializeString( - parent_object, - deployed_addresses, - deployed_addresses_output - ); - - writeOutput(finalJson, "hello_world_avs_holesky_deployment_output"); - } - - function _upgrade( - string memory jsonContent, - IAVSDirectory avsDirectory, - IDelegationManager delegationManager - ) internal { - // Parse JSON content to extract contract addresses - address serviceManagerProxyAddr = vm.parseJsonAddress(jsonContent, "$.addresses.HelloWorldServiceManagerProxy"); - address stakeRegistryProxyAddr = vm.parseJsonAddress(jsonContent, "$.addresses.ECDSAStakeRegistry"); - address proxyAdminAddr = vm.parseJsonAddress(jsonContent, "$.addresses.ProxyAdmin"); - - // Admin for upgrading the proxies - ProxyAdmin proxyAdmin = ProxyAdmin(proxyAdminAddr); - - console.log("Proxy Admin Address: ", proxyAdminAddr); - console.log("Service Manager Proxy Address: ", serviceManagerProxyAddr); - console.log("Stake Registry Proxy Address: ", stakeRegistryProxyAddr); - - // Upgrade the proxies - vm.startBroadcast(); - - // New implementation addresses (assuming these are the new ones to be upgraded to) - address newServiceManagerImpl = address(new ReclaimServiceManager( - address(avsDirectory), // AVS Directory address - stakeRegistryProxyAddr, - address(delegationManager) // Delegation Manager address - )); - - address newStakeRegistryImpl = address(new ECDSAStakeRegistry( - // Delegation Manager address - delegationManager - )); - - console.log("New Service Manager Implementation Address: ", newServiceManagerImpl); - console.log("New Stake Registry Implementation Address: ", newStakeRegistryImpl); - - // Upgrade the Service Manager proxy - proxyAdmin.upgrade( - TransparentUpgradeableProxy(payable(serviceManagerProxyAddr)), - newServiceManagerImpl - ); - - // Upgrade the Stake Registry proxy - proxyAdmin.upgrade( - TransparentUpgradeableProxy(payable(stakeRegistryProxyAddr)), - newStakeRegistryImpl - ); - - console.log("Contracts successfully upgraded!"); - - vm.stopBroadcast(); - } -} diff --git a/avs/contracts/script/ReclaimDeployer.s.sol b/avs/contracts/script/ReclaimDeployer.s.sol index da1bbd0c..172e27c2 100644 --- a/avs/contracts/script/ReclaimDeployer.s.sol +++ b/avs/contracts/script/ReclaimDeployer.s.sol @@ -56,19 +56,17 @@ contract ReclaimDeployer is Script, Test { token = new ERC20Mock(); reclaimStrategy = IStrategy(StrategyFactory(coreDeployment.strategyFactory).deployNewStrategy(token)); - quorum.strategies.push( StrategyParams({strategy: reclaimStrategy, multiplier: 10_000}) ); - proxyAdmin = UpgradeableProxyLib.deployProxyAdmin(); - reclaimDeployment = ReclaimDeploymentLib.deployContracts( proxyAdmin, coreDeployment, quorum, rewardsInitiator, - rewardsOwner, deployer + rewardsOwner, deployer, + address(reclaimStrategy) ); reclaimDeployment.strategy = address(reclaimStrategy); diff --git a/avs/contracts/script/utils/ReclaimDeploymentLib.sol b/avs/contracts/script/utils/ReclaimDeploymentLib.sol index 6c21f0fe..e6a3a84d 100644 --- a/avs/contracts/script/utils/ReclaimDeploymentLib.sol +++ b/avs/contracts/script/utils/ReclaimDeploymentLib.sol @@ -39,7 +39,8 @@ library ReclaimDeploymentLib { Quorum memory quorum, address rewardsInitiator, address owner, - address deployer + address deployer, + address strategy ) internal returns (DeploymentData memory) { DeploymentData memory result; @@ -59,7 +60,7 @@ library ReclaimDeploymentLib { ECDSAStakeRegistry.initialize, (result.reclaimServiceManager, 0, quorum) ); UpgradeableProxyLib.upgradeAndCall(result.stakeRegistry, stakeRegistryImpl, upgradeCall); - upgradeCall = abi.encodeCall(ReclaimServiceManager.initialize, (owner, rewardsInitiator, deployer)); + upgradeCall = abi.encodeCall(ReclaimServiceManager.initialize, (owner, rewardsInitiator, deployer, strategy)); UpgradeableProxyLib.upgradeAndCall(result.reclaimServiceManager, reclaimServiceManagerImpl, upgradeCall); return result; diff --git a/avs/contracts/src/IReclaimServiceManager.sol b/avs/contracts/src/IReclaimServiceManager.sol index 9a29b41c..59c55547 100644 --- a/avs/contracts/src/IReclaimServiceManager.sol +++ b/avs/contracts/src/IReclaimServiceManager.sol @@ -32,6 +32,10 @@ interface IReclaimServiceManager { * Address of the requester. */ address owner; + /** + * Fee to pay for the claim. + */ + uint256 fee; } struct Operator { @@ -92,6 +96,10 @@ interface IReclaimServiceManager { * Max time between the submission of the task and requestedAt */ uint32 maxTaskCreationDelayS; + /** + * Minimum fee required to create a task + */ + uint256 minFee; } // FUNCTIONS diff --git a/avs/contracts/src/ReclaimServiceManager.sol b/avs/contracts/src/ReclaimServiceManager.sol index 52101eea..d0dfa0e1 100644 --- a/avs/contracts/src/ReclaimServiceManager.sol +++ b/avs/contracts/src/ReclaimServiceManager.sol @@ -9,6 +9,8 @@ import {ECDSAStakeRegistry} from "@eigenlayer-middleware/src/unaudited/ECDSAStak import "@openzeppelin-upgrades/contracts/utils/cryptography/ECDSAUpgradeable.sol"; import "@eigenlayer/contracts/permissions/Pausable.sol"; import {IRegistryCoordinator} from "@eigenlayer-middleware/src/interfaces/IRegistryCoordinator.sol"; +import {IStrategy} from "@eigenlayer/contracts/interfaces/IStrategy.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "./IReclaimServiceManager.sol"; import "./utils/Random.sol"; import "./utils/Claims.sol"; @@ -23,6 +25,8 @@ contract ReclaimServiceManager is using BytesLib for bytes; using ECDSAUpgradeable for bytes32; + address public defaultStrategy; + /* STORAGE */ // The latest task index uint32 public latestTaskNum; @@ -77,7 +81,8 @@ contract ReclaimServiceManager is function initialize( address initialOwner, address _rewardsInitiator, - address deployer + address deployer, + address strategy ) external initializer { __ServiceManagerBase_init(initialOwner, _rewardsInitiator); taskCreationMetadata = TaskCreationMetadata( @@ -86,9 +91,12 @@ contract ReclaimServiceManager is // 1m 1, // 5m - 5 * 60 + 5 * 60, + // spend a little bit + 1 ); admins.push(deployer); + defaultStrategy = strategy; } /* FUNCTIONS */ @@ -193,15 +201,20 @@ contract ReclaimServiceManager is ClaimRequest memory request, bytes memory requestSignature ) external { + require(taskCreationMetadata.minFee <= request.fee, "Fee too low"); + if(request.owner != msg.sender) { bytes memory encodedReq = abi.encode(request); address signer = Claims.verifySignature(encodedReq, requestSignature); require(signer == request.owner, "Signer of requestSignature is not request.owner"); } - uint32 diff = absDiff(request.requestedAt, uint32(block.timestamp)); + uint32 diff = _absDiff(request.requestedAt, uint32(block.timestamp)); require(diff <= taskCreationMetadata.maxTaskCreationDelayS, "Request timestamp too far away"); + IERC20 token = getToken(); + require(token.transferFrom(msg.sender, address(this), request.fee), "Failed to transfer fee"); + // create a new task struct Task memory newTask; newTask.request = request; @@ -210,11 +223,12 @@ contract ReclaimServiceManager is newTask.createdAt + taskCreationMetadata.maxTaskLifetimeS ); newTask.minimumSignatures = taskCreationMetadata.minSignaturesPerTask; + newTask.feePaid = request.fee; // hash before picking operators -- we'll use this // as the seed for randomness bytes32 preOpHash = keccak256(abi.encode(newTask)); - newTask.operators = pickRandomOperators( + newTask.operators = _pickRandomOperators( taskCreationMetadata.minSignaturesPerTask, uint256(preOpHash) ); @@ -224,18 +238,6 @@ contract ReclaimServiceManager is latestTaskNum = latestTaskNum + 1; } - function encodeClaimRequest(ClaimRequest memory request) public pure returns (bytes memory) { - return abi.encode(request); - } - - function checkSignerAddress( - ClaimRequest memory request, - bytes memory requestSignature - ) public pure returns (address) { - bytes memory encodedReq = abi.encode(request); - return Claims.verifySignature(encodedReq, requestSignature); - } - function taskCompleted( CompletedTask memory completedTask, uint32 referenceTaskIndex @@ -282,6 +284,14 @@ contract ReclaimServiceManager is // HELPER + function encodeClaimRequest(ClaimRequest memory request) public pure returns (bytes memory) { + return abi.encode(request); + } + + function getToken() public view returns (IERC20) { + return IStrategy(defaultStrategy).underlyingToken(); + } + // for a whitelist to count -- operator must either be whitelisted // or be an admin function isOperatorWhitelisted(address operator) public view returns (bool) { @@ -311,7 +321,7 @@ contract ReclaimServiceManager is * @param seed Seed to use for randomness * @return Array of the selected operators */ - function pickRandomOperators( + function _pickRandomOperators( uint8 count, uint256 seed ) internal view returns (Operator[] memory) { @@ -351,7 +361,7 @@ contract ReclaimServiceManager is return output; } - function absDiff(uint32 a, uint32 b) internal pure returns (uint32) { + function _absDiff(uint32 a, uint32 b) internal pure returns (uint32) { return a > b ? a - b : b - a; } diff --git a/avs/utils/contract-data-gen.sh b/avs/utils/contract-data-gen.sh index 62cb2884..a62edb3c 100644 --- a/avs/utils/contract-data-gen.sh +++ b/avs/utils/contract-data-gen.sh @@ -4,4 +4,5 @@ typechain -- --target ethers-v5 --out-dir src/avs/contracts \ avs/contracts/out/ReclaimServiceManager.sol/*.json \ avs/contracts/out/AVSDirectory.sol/*.json \ avs/contracts/out/DelegationManager.sol/*.json \ - avs/contracts/out/ECDSAStakeRegistry.sol/*.json \ \ No newline at end of file + avs/contracts/out/ECDSAStakeRegistry.sol/*.json \ + avs/contracts/out/ERC20Mock.sol/*.json \ No newline at end of file diff --git a/docs/avs.md b/docs/avs.md index a809125f..ab4da3ce 100644 --- a/docs/avs.md +++ b/docs/avs.md @@ -135,7 +135,8 @@ Regardless, if you're one of the chosen few -- here's how you can register yours **Building the contracts**: - `npm run build:contracts` - - `npm run generate:avs-types` to generate the types for the AVS contracts (make sure contracts are built first) + - `npm run generate:avs-types` to generate the types for the AVS contracts + - before generating types, make sure contracts are built first **Deploying the contracts locally**: - `npm run start:chain` - This will start the local chain, build the contracts & deploy them on the local chain too. diff --git a/package.json b/package.json index 0d1b2f19..c14a86b2 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "generate:provider-types": "npm run run:tsc -- src/scripts/generate-provider-types.ts", "verify:root-ca": "npm run run:tsc -- src/scripts/verify-root-ca.ts", "create:claim": "npm run run:tsc -- src/scripts/generate-receipt.ts", - "build-contracts": "cd avs/contracts && forge build", + "build:contracts": "cd avs/contracts && forge build --via-ir", "deploy:eigen-core": "cd avs/contracts && forge script script/DeployEigenLayerCore.s.sol --rpc-url http://localhost:8545 --broadcast --via-ir --revert-strings debug", "deploy:reclaim-debug": "cd avs/contracts && forge script script/ReclaimDeployer.s.sol --rpc-url http://localhost:8545 --broadcast --via-ir --revert-strings debug", "deploy:contracts": "sh avs/utils/anvil/deploy-all-to-anvil-and-save-state.sh", diff --git a/src/avs/client/create-claim-on-avs.ts b/src/avs/client/create-claim-on-avs.ts index eddf357e..1685782e 100644 --- a/src/avs/client/create-claim-on-avs.ts +++ b/src/avs/client/create-claim-on-avs.ts @@ -19,6 +19,7 @@ export async function createClaimOnAvs({ createClaimOnAttestor = _createClaimOnAttestor, chainId = SELECTED_CHAIN_ID, payer, + fee, ...opts }: CreateClaimOnAvsOpts) { const { @@ -52,7 +53,6 @@ export async function createClaimOnAvs({ const responses: ClaimTunnelResponse[] = [] const timestampS = +arg.task.createdAt.toString() - console.log(arg.task.operators) for(const op of arg.task.operators) { const res = await createClaimOnAttestor({ ...opts, @@ -110,6 +110,11 @@ export async function createClaimOnAvs({ return { ...rslt, claimData: responses[0].claim! } async function requestClaimCreation() { + if(!fee) { + const { minFee } = await contract.taskCreationMetadata() + fee = minFee + } + const request: IReclaimServiceManager.ClaimRequestStruct = { provider: name, // blank for now -- till we figure out the right @@ -123,7 +128,8 @@ export async function createClaimOnAvs({ : '', }), owner: wallet!.address, - requestedAt: unixTimestampSeconds() + requestedAt: unixTimestampSeconds(), + fee: fee } if(!payer) { diff --git a/src/avs/contracts/ERC20Mock.ts b/src/avs/contracts/ERC20Mock.ts new file mode 100644 index 00000000..d2075ca8 --- /dev/null +++ b/src/avs/contracts/ERC20Mock.ts @@ -0,0 +1,481 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +} from "./common"; + +export interface ERC20MockInterface extends utils.Interface { + functions: { + "allowance(address,address)": FunctionFragment; + "approve(address,uint256)": FunctionFragment; + "balanceOf(address)": FunctionFragment; + "decimals()": FunctionFragment; + "decreaseAllowance(address,uint256)": FunctionFragment; + "increaseAllowance(address,uint256)": FunctionFragment; + "mint(address,uint256)": FunctionFragment; + "name()": FunctionFragment; + "symbol()": FunctionFragment; + "totalSupply()": FunctionFragment; + "transfer(address,uint256)": FunctionFragment; + "transferFrom(address,address,uint256)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "allowance" + | "approve" + | "balanceOf" + | "decimals" + | "decreaseAllowance" + | "increaseAllowance" + | "mint" + | "name" + | "symbol" + | "totalSupply" + | "transfer" + | "transferFrom" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "allowance", + values: [string, string] + ): string; + encodeFunctionData( + functionFragment: "approve", + values: [string, BigNumberish] + ): string; + encodeFunctionData(functionFragment: "balanceOf", values: [string]): string; + encodeFunctionData(functionFragment: "decimals", values?: undefined): string; + encodeFunctionData( + functionFragment: "decreaseAllowance", + values: [string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "increaseAllowance", + values: [string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "mint", + values: [string, BigNumberish] + ): string; + encodeFunctionData(functionFragment: "name", values?: undefined): string; + encodeFunctionData(functionFragment: "symbol", values?: undefined): string; + encodeFunctionData( + functionFragment: "totalSupply", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "transfer", + values: [string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "transferFrom", + values: [string, string, BigNumberish] + ): string; + + decodeFunctionResult(functionFragment: "allowance", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "approve", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "balanceOf", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "decimals", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "decreaseAllowance", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "increaseAllowance", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "mint", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "name", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "symbol", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "totalSupply", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "transfer", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "transferFrom", + data: BytesLike + ): Result; + + events: { + "Approval(address,address,uint256)": EventFragment; + "Transfer(address,address,uint256)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Approval"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Transfer"): EventFragment; +} + +export interface ApprovalEventObject { + owner: string; + spender: string; + value: BigNumber; +} +export type ApprovalEvent = TypedEvent< + [string, string, BigNumber], + ApprovalEventObject +>; + +export type ApprovalEventFilter = TypedEventFilter; + +export interface TransferEventObject { + from: string; + to: string; + value: BigNumber; +} +export type TransferEvent = TypedEvent< + [string, string, BigNumber], + TransferEventObject +>; + +export type TransferEventFilter = TypedEventFilter; + +export interface ERC20Mock extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: ERC20MockInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + allowance( + owner: string, + spender: string, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + approve( + spender: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + balanceOf(account: string, overrides?: CallOverrides): Promise<[BigNumber]>; + + decimals(overrides?: CallOverrides): Promise<[number]>; + + decreaseAllowance( + spender: string, + subtractedValue: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + increaseAllowance( + spender: string, + addedValue: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + mint( + account: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + name(overrides?: CallOverrides): Promise<[string]>; + + symbol(overrides?: CallOverrides): Promise<[string]>; + + totalSupply(overrides?: CallOverrides): Promise<[BigNumber]>; + + transfer( + to: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + transferFrom( + from: string, + to: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + }; + + allowance( + owner: string, + spender: string, + overrides?: CallOverrides + ): Promise; + + approve( + spender: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + balanceOf(account: string, overrides?: CallOverrides): Promise; + + decimals(overrides?: CallOverrides): Promise; + + decreaseAllowance( + spender: string, + subtractedValue: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + increaseAllowance( + spender: string, + addedValue: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + mint( + account: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + symbol(overrides?: CallOverrides): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transfer( + to: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + transferFrom( + from: string, + to: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + callStatic: { + allowance( + owner: string, + spender: string, + overrides?: CallOverrides + ): Promise; + + approve( + spender: string, + amount: BigNumberish, + overrides?: CallOverrides + ): Promise; + + balanceOf(account: string, overrides?: CallOverrides): Promise; + + decimals(overrides?: CallOverrides): Promise; + + decreaseAllowance( + spender: string, + subtractedValue: BigNumberish, + overrides?: CallOverrides + ): Promise; + + increaseAllowance( + spender: string, + addedValue: BigNumberish, + overrides?: CallOverrides + ): Promise; + + mint( + account: string, + amount: BigNumberish, + overrides?: CallOverrides + ): Promise; + + name(overrides?: CallOverrides): Promise; + + symbol(overrides?: CallOverrides): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transfer( + to: string, + amount: BigNumberish, + overrides?: CallOverrides + ): Promise; + + transferFrom( + from: string, + to: string, + amount: BigNumberish, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "Approval(address,address,uint256)"( + owner?: string | null, + spender?: string | null, + value?: null + ): ApprovalEventFilter; + Approval( + owner?: string | null, + spender?: string | null, + value?: null + ): ApprovalEventFilter; + + "Transfer(address,address,uint256)"( + from?: string | null, + to?: string | null, + value?: null + ): TransferEventFilter; + Transfer( + from?: string | null, + to?: string | null, + value?: null + ): TransferEventFilter; + }; + + estimateGas: { + allowance( + owner: string, + spender: string, + overrides?: CallOverrides + ): Promise; + + approve( + spender: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + balanceOf(account: string, overrides?: CallOverrides): Promise; + + decimals(overrides?: CallOverrides): Promise; + + decreaseAllowance( + spender: string, + subtractedValue: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + increaseAllowance( + spender: string, + addedValue: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + mint( + account: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + symbol(overrides?: CallOverrides): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transfer( + to: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + transferFrom( + from: string, + to: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + }; + + populateTransaction: { + allowance( + owner: string, + spender: string, + overrides?: CallOverrides + ): Promise; + + approve( + spender: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + balanceOf( + account: string, + overrides?: CallOverrides + ): Promise; + + decimals(overrides?: CallOverrides): Promise; + + decreaseAllowance( + spender: string, + subtractedValue: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + increaseAllowance( + spender: string, + addedValue: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + mint( + account: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + name(overrides?: CallOverrides): Promise; + + symbol(overrides?: CallOverrides): Promise; + + totalSupply(overrides?: CallOverrides): Promise; + + transfer( + to: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + transferFrom( + from: string, + to: string, + amount: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + }; +} diff --git a/src/avs/contracts/ReclaimServiceManager.ts b/src/avs/contracts/ReclaimServiceManager.ts index 3891c1f0..15dbac7f 100644 --- a/src/avs/contracts/ReclaimServiceManager.ts +++ b/src/avs/contracts/ReclaimServiceManager.ts @@ -26,6 +26,72 @@ import type { OnEvent, } from "./common"; +export declare namespace IRewardsCoordinator { + export type StrategyAndMultiplierStruct = { + strategy: string; + multiplier: BigNumberish; + }; + + export type StrategyAndMultiplierStructOutput = [string, BigNumber] & { + strategy: string; + multiplier: BigNumber; + }; + + export type RewardsSubmissionStruct = { + strategiesAndMultipliers: IRewardsCoordinator.StrategyAndMultiplierStruct[]; + token: string; + amount: BigNumberish; + startTimestamp: BigNumberish; + duration: BigNumberish; + }; + + export type RewardsSubmissionStructOutput = [ + IRewardsCoordinator.StrategyAndMultiplierStructOutput[], + string, + BigNumber, + number, + number + ] & { + strategiesAndMultipliers: IRewardsCoordinator.StrategyAndMultiplierStructOutput[]; + token: string; + amount: BigNumber; + startTimestamp: number; + duration: number; + }; + + export type OperatorRewardStruct = { operator: string; amount: BigNumberish }; + + export type OperatorRewardStructOutput = [string, BigNumber] & { + operator: string; + amount: BigNumber; + }; + + export type OperatorDirectedRewardsSubmissionStruct = { + strategiesAndMultipliers: IRewardsCoordinator.StrategyAndMultiplierStruct[]; + token: string; + operatorRewards: IRewardsCoordinator.OperatorRewardStruct[]; + startTimestamp: BigNumberish; + duration: BigNumberish; + description: string; + }; + + export type OperatorDirectedRewardsSubmissionStructOutput = [ + IRewardsCoordinator.StrategyAndMultiplierStructOutput[], + string, + IRewardsCoordinator.OperatorRewardStructOutput[], + number, + number, + string + ] & { + strategiesAndMultipliers: IRewardsCoordinator.StrategyAndMultiplierStructOutput[]; + token: string; + operatorRewards: IRewardsCoordinator.OperatorRewardStructOutput[]; + startTimestamp: number; + duration: number; + description: string; + }; +} + export declare namespace IReclaimServiceManager { export type ClaimRequestStruct = { provider: string; @@ -33,6 +99,7 @@ export declare namespace IReclaimServiceManager { claimHash: BytesLike; requestedAt: BigNumberish; owner: string; + fee: BigNumberish; }; export type ClaimRequestStructOutput = [ @@ -40,13 +107,15 @@ export declare namespace IReclaimServiceManager { string, string, number, - string + string, + BigNumber ] & { provider: string; claimUserId: string; claimHash: string; requestedAt: number; owner: string; + fee: BigNumber; }; export type OperatorMetadataStruct = { addr: string; url: string }; @@ -102,78 +171,19 @@ export declare namespace IReclaimServiceManager { maxTaskLifetimeS: BigNumberish; minSignaturesPerTask: BigNumberish; maxTaskCreationDelayS: BigNumberish; + minFee: BigNumberish; }; - export type TaskCreationMetadataStructOutput = [number, number, number] & { - maxTaskLifetimeS: number; - minSignaturesPerTask: number; - maxTaskCreationDelayS: number; - }; -} - -export declare namespace IRewardsCoordinator { - export type StrategyAndMultiplierStruct = { - strategy: string; - multiplier: BigNumberish; - }; - - export type StrategyAndMultiplierStructOutput = [string, BigNumber] & { - strategy: string; - multiplier: BigNumber; - }; - - export type RewardsSubmissionStruct = { - strategiesAndMultipliers: IRewardsCoordinator.StrategyAndMultiplierStruct[]; - token: string; - amount: BigNumberish; - startTimestamp: BigNumberish; - duration: BigNumberish; - }; - - export type RewardsSubmissionStructOutput = [ - IRewardsCoordinator.StrategyAndMultiplierStructOutput[], - string, - BigNumber, + export type TaskCreationMetadataStructOutput = [ number, - number - ] & { - strategiesAndMultipliers: IRewardsCoordinator.StrategyAndMultiplierStructOutput[]; - token: string; - amount: BigNumber; - startTimestamp: number; - duration: number; - }; - - export type OperatorRewardStruct = { operator: string; amount: BigNumberish }; - - export type OperatorRewardStructOutput = [string, BigNumber] & { - operator: string; - amount: BigNumber; - }; - - export type OperatorDirectedRewardsSubmissionStruct = { - strategiesAndMultipliers: IRewardsCoordinator.StrategyAndMultiplierStruct[]; - token: string; - operatorRewards: IRewardsCoordinator.OperatorRewardStruct[]; - startTimestamp: BigNumberish; - duration: BigNumberish; - description: string; - }; - - export type OperatorDirectedRewardsSubmissionStructOutput = [ - IRewardsCoordinator.StrategyAndMultiplierStructOutput[], - string, - IRewardsCoordinator.OperatorRewardStructOutput[], number, number, - string + BigNumber ] & { - strategiesAndMultipliers: IRewardsCoordinator.StrategyAndMultiplierStructOutput[]; - token: string; - operatorRewards: IRewardsCoordinator.OperatorRewardStructOutput[]; - startTimestamp: number; - duration: number; - description: string; + maxTaskLifetimeS: number; + minSignaturesPerTask: number; + maxTaskCreationDelayS: number; + minFee: BigNumber; }; } @@ -196,16 +206,17 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { "admins(uint256)": FunctionFragment; "allTaskHashes(uint32)": FunctionFragment; "avsDirectory()": FunctionFragment; - "checkSignerAddress((string,bytes32,bytes32,uint32,address),bytes)": FunctionFragment; "createAVSRewardsSubmission(((address,uint96)[],address,uint256,uint32,uint32)[])": FunctionFragment; - "createNewTask((string,bytes32,bytes32,uint32,address),bytes)": FunctionFragment; + "createNewTask((string,bytes32,bytes32,uint32,address,uint256),bytes)": FunctionFragment; "createOperatorDirectedAVSRewardsSubmission(((address,uint96)[],address,(address,uint256)[],uint32,uint32,string)[])": FunctionFragment; + "defaultStrategy()": FunctionFragment; "deregisterOperatorFromAVS(address)": FunctionFragment; - "encodeClaimRequest((string,bytes32,bytes32,uint32,address))": FunctionFragment; + "encodeClaimRequest((string,bytes32,bytes32,uint32,address,uint256))": FunctionFragment; "getMetadataForOperator(address)": FunctionFragment; "getOperatorRestakedStrategies(address)": FunctionFragment; "getRestakeableStrategies()": FunctionFragment; - "initialize(address,address,address)": FunctionFragment; + "getToken()": FunctionFragment; + "initialize(address,address,address,address)": FunctionFragment; "isAdmin(address)": FunctionFragment; "isOperatorWhitelisted(address)": FunctionFragment; "latestTaskNum()": FunctionFragment; @@ -224,13 +235,13 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { "setPauserRegistry(address)": FunctionFragment; "setRewardsInitiator(address)": FunctionFragment; "stakeRegistry()": FunctionFragment; - "taskCompleted((((string,bytes32,bytes32,uint32,address),uint32,uint32,uint8,(address,string)[],uint256),bytes[]),uint32)": FunctionFragment; + "taskCompleted((((string,bytes32,bytes32,uint32,address,uint256),uint32,uint32,uint8,(address,string)[],uint256),bytes[]),uint32)": FunctionFragment; "taskCreationMetadata()": FunctionFragment; "transferOwnership(address)": FunctionFragment; "unpause(uint256)": FunctionFragment; "updateAVSMetadataURI(string)": FunctionFragment; "updateOperatorMetadata((address,string))": FunctionFragment; - "updateTaskCreationMetadata((uint32,uint8,uint32))": FunctionFragment; + "updateTaskCreationMetadata((uint32,uint8,uint32,uint256))": FunctionFragment; "whitelistAddressAsOperator(address,bool)": FunctionFragment; "whitelistedOperators(uint256)": FunctionFragment; }; @@ -240,15 +251,16 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { | "admins" | "allTaskHashes" | "avsDirectory" - | "checkSignerAddress" | "createAVSRewardsSubmission" | "createNewTask" | "createOperatorDirectedAVSRewardsSubmission" + | "defaultStrategy" | "deregisterOperatorFromAVS" | "encodeClaimRequest" | "getMetadataForOperator" | "getOperatorRestakedStrategies" | "getRestakeableStrategies" + | "getToken" | "initialize" | "isAdmin" | "isOperatorWhitelisted" @@ -291,10 +303,6 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { functionFragment: "avsDirectory", values?: undefined ): string; - encodeFunctionData( - functionFragment: "checkSignerAddress", - values: [IReclaimServiceManager.ClaimRequestStruct, BytesLike] - ): string; encodeFunctionData( functionFragment: "createAVSRewardsSubmission", values: [IRewardsCoordinator.RewardsSubmissionStruct[]] @@ -307,6 +315,10 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { functionFragment: "createOperatorDirectedAVSRewardsSubmission", values: [IRewardsCoordinator.OperatorDirectedRewardsSubmissionStruct[]] ): string; + encodeFunctionData( + functionFragment: "defaultStrategy", + values?: undefined + ): string; encodeFunctionData( functionFragment: "deregisterOperatorFromAVS", values: [string] @@ -327,9 +339,10 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { functionFragment: "getRestakeableStrategies", values?: undefined ): string; + encodeFunctionData(functionFragment: "getToken", values?: undefined): string; encodeFunctionData( functionFragment: "initialize", - values: [string, string, string] + values: [string, string, string, string] ): string; encodeFunctionData(functionFragment: "isAdmin", values: [string]): string; encodeFunctionData( @@ -434,10 +447,6 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { functionFragment: "avsDirectory", data: BytesLike ): Result; - decodeFunctionResult( - functionFragment: "checkSignerAddress", - data: BytesLike - ): Result; decodeFunctionResult( functionFragment: "createAVSRewardsSubmission", data: BytesLike @@ -450,6 +459,10 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { functionFragment: "createOperatorDirectedAVSRewardsSubmission", data: BytesLike ): Result; + decodeFunctionResult( + functionFragment: "defaultStrategy", + data: BytesLike + ): Result; decodeFunctionResult( functionFragment: "deregisterOperatorFromAVS", data: BytesLike @@ -470,6 +483,7 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { functionFragment: "getRestakeableStrategies", data: BytesLike ): Result; + decodeFunctionResult(functionFragment: "getToken", data: BytesLike): Result; decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; decodeFunctionResult(functionFragment: "isAdmin", data: BytesLike): Result; decodeFunctionResult( @@ -564,12 +578,12 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { events: { "Initialized(uint8)": EventFragment; - "NewTaskCreated(uint32,((string,bytes32,bytes32,uint32,address),uint32,uint32,uint8,(address,string)[],uint256))": EventFragment; + "NewTaskCreated(uint32,((string,bytes32,bytes32,uint32,address,uint256),uint32,uint32,uint8,(address,string)[],uint256))": EventFragment; "OwnershipTransferred(address,address)": EventFragment; "Paused(address,uint256)": EventFragment; "PauserRegistrySet(address,address)": EventFragment; "RewardsInitiatorUpdated(address,address)": EventFragment; - "TaskCompleted(uint32,(((string,bytes32,bytes32,uint32,address),uint32,uint32,uint8,(address,string)[],uint256),bytes[]))": EventFragment; + "TaskCompleted(uint32,(((string,bytes32,bytes32,uint32,address,uint256),uint32,uint32,uint8,(address,string)[],uint256),bytes[]))": EventFragment; "Unpaused(address,uint256)": EventFragment; }; @@ -703,12 +717,6 @@ export interface ReclaimServiceManager extends BaseContract { avsDirectory(overrides?: CallOverrides): Promise<[string]>; - checkSignerAddress( - request: IReclaimServiceManager.ClaimRequestStruct, - requestSignature: BytesLike, - overrides?: CallOverrides - ): Promise<[string]>; - createAVSRewardsSubmission( rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], overrides?: Overrides & { from?: string } @@ -725,6 +733,8 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; + defaultStrategy(overrides?: CallOverrides): Promise<[string]>; + deregisterOperatorFromAVS( operator: string, overrides?: Overrides & { from?: string } @@ -747,10 +757,13 @@ export interface ReclaimServiceManager extends BaseContract { getRestakeableStrategies(overrides?: CallOverrides): Promise<[string[]]>; + getToken(overrides?: CallOverrides): Promise<[string]>; + initialize( initialOwner: string, _rewardsInitiator: string, deployer: string, + strategy: string, overrides?: Overrides & { from?: string } ): Promise; @@ -831,10 +844,11 @@ export interface ReclaimServiceManager extends BaseContract { taskCreationMetadata( overrides?: CallOverrides ): Promise< - [number, number, number] & { + [number, number, number, BigNumber] & { maxTaskLifetimeS: number; minSignaturesPerTask: number; maxTaskCreationDelayS: number; + minFee: BigNumber; } >; @@ -881,12 +895,6 @@ export interface ReclaimServiceManager extends BaseContract { avsDirectory(overrides?: CallOverrides): Promise; - checkSignerAddress( - request: IReclaimServiceManager.ClaimRequestStruct, - requestSignature: BytesLike, - overrides?: CallOverrides - ): Promise; - createAVSRewardsSubmission( rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], overrides?: Overrides & { from?: string } @@ -903,6 +911,8 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; + defaultStrategy(overrides?: CallOverrides): Promise; + deregisterOperatorFromAVS( operator: string, overrides?: Overrides & { from?: string } @@ -925,10 +935,13 @@ export interface ReclaimServiceManager extends BaseContract { getRestakeableStrategies(overrides?: CallOverrides): Promise; + getToken(overrides?: CallOverrides): Promise; + initialize( initialOwner: string, _rewardsInitiator: string, deployer: string, + strategy: string, overrides?: Overrides & { from?: string } ): Promise; @@ -1009,10 +1022,11 @@ export interface ReclaimServiceManager extends BaseContract { taskCreationMetadata( overrides?: CallOverrides ): Promise< - [number, number, number] & { + [number, number, number, BigNumber] & { maxTaskLifetimeS: number; minSignaturesPerTask: number; maxTaskCreationDelayS: number; + minFee: BigNumber; } >; @@ -1062,12 +1076,6 @@ export interface ReclaimServiceManager extends BaseContract { avsDirectory(overrides?: CallOverrides): Promise; - checkSignerAddress( - request: IReclaimServiceManager.ClaimRequestStruct, - requestSignature: BytesLike, - overrides?: CallOverrides - ): Promise; - createAVSRewardsSubmission( rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], overrides?: CallOverrides @@ -1084,6 +1092,8 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: CallOverrides ): Promise; + defaultStrategy(overrides?: CallOverrides): Promise; + deregisterOperatorFromAVS( operator: string, overrides?: CallOverrides @@ -1106,10 +1116,13 @@ export interface ReclaimServiceManager extends BaseContract { getRestakeableStrategies(overrides?: CallOverrides): Promise; + getToken(overrides?: CallOverrides): Promise; + initialize( initialOwner: string, _rewardsInitiator: string, deployer: string, + strategy: string, overrides?: CallOverrides ): Promise; @@ -1183,10 +1196,11 @@ export interface ReclaimServiceManager extends BaseContract { taskCreationMetadata( overrides?: CallOverrides ): Promise< - [number, number, number] & { + [number, number, number, BigNumber] & { maxTaskLifetimeS: number; minSignaturesPerTask: number; maxTaskCreationDelayS: number; + minFee: BigNumber; } >; @@ -1231,7 +1245,7 @@ export interface ReclaimServiceManager extends BaseContract { "Initialized(uint8)"(version?: null): InitializedEventFilter; Initialized(version?: null): InitializedEventFilter; - "NewTaskCreated(uint32,((string,bytes32,bytes32,uint32,address),uint32,uint32,uint8,(address,string)[],uint256))"( + "NewTaskCreated(uint32,((string,bytes32,bytes32,uint32,address,uint256),uint32,uint32,uint8,(address,string)[],uint256))"( taskIndex?: BigNumberish | null, task?: null ): NewTaskCreatedEventFilter; @@ -1273,7 +1287,7 @@ export interface ReclaimServiceManager extends BaseContract { newRewardsInitiator?: null ): RewardsInitiatorUpdatedEventFilter; - "TaskCompleted(uint32,(((string,bytes32,bytes32,uint32,address),uint32,uint32,uint8,(address,string)[],uint256),bytes[]))"( + "TaskCompleted(uint32,(((string,bytes32,bytes32,uint32,address,uint256),uint32,uint32,uint8,(address,string)[],uint256),bytes[]))"( taskIndex?: BigNumberish | null, task?: null ): TaskCompletedEventFilter; @@ -1302,12 +1316,6 @@ export interface ReclaimServiceManager extends BaseContract { avsDirectory(overrides?: CallOverrides): Promise; - checkSignerAddress( - request: IReclaimServiceManager.ClaimRequestStruct, - requestSignature: BytesLike, - overrides?: CallOverrides - ): Promise; - createAVSRewardsSubmission( rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], overrides?: Overrides & { from?: string } @@ -1324,6 +1332,8 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; + defaultStrategy(overrides?: CallOverrides): Promise; + deregisterOperatorFromAVS( operator: string, overrides?: Overrides & { from?: string } @@ -1346,10 +1356,13 @@ export interface ReclaimServiceManager extends BaseContract { getRestakeableStrategies(overrides?: CallOverrides): Promise; + getToken(overrides?: CallOverrides): Promise; + initialize( initialOwner: string, _rewardsInitiator: string, deployer: string, + strategy: string, overrides?: Overrides & { from?: string } ): Promise; @@ -1477,12 +1490,6 @@ export interface ReclaimServiceManager extends BaseContract { avsDirectory(overrides?: CallOverrides): Promise; - checkSignerAddress( - request: IReclaimServiceManager.ClaimRequestStruct, - requestSignature: BytesLike, - overrides?: CallOverrides - ): Promise; - createAVSRewardsSubmission( rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], overrides?: Overrides & { from?: string } @@ -1499,6 +1506,8 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; + defaultStrategy(overrides?: CallOverrides): Promise; + deregisterOperatorFromAVS( operator: string, overrides?: Overrides & { from?: string } @@ -1523,10 +1532,13 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: CallOverrides ): Promise; + getToken(overrides?: CallOverrides): Promise; + initialize( initialOwner: string, _rewardsInitiator: string, deployer: string, + strategy: string, overrides?: Overrides & { from?: string } ): Promise; diff --git a/src/avs/contracts/factories/ERC20Mock__factory.ts b/src/avs/contracts/factories/ERC20Mock__factory.ts new file mode 100644 index 00000000..0b075a7b --- /dev/null +++ b/src/avs/contracts/factories/ERC20Mock__factory.ts @@ -0,0 +1,352 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { ERC20Mock, ERC20MockInterface } from "../ERC20Mock"; + +const _abi = [ + { + type: "constructor", + inputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "allowance", + inputs: [ + { + name: "owner", + type: "address", + internalType: "address", + }, + { + name: "spender", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "approve", + inputs: [ + { + name: "spender", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "balanceOf", + inputs: [ + { + name: "account", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "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: "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: "mint", + inputs: [ + { + name: "account", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "name", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "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: "event", + name: "Approval", + inputs: [ + { + name: "owner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "spender", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "value", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Transfer", + inputs: [ + { + name: "from", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "to", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "value", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, +] as const; + +const _bytecode = + "0x608080604052346102d957610012610326565b61001a610326565b81516001600160401b0381116101e457600354600181811c911680156102cf575b60208210146101c457601f811161026a575b50602092601f821160011461020557928192936000926101fa575b50508160011b916000199060031b1c1916176003555b80516001600160401b0381116101e457600454600181811c911680156101da575b60208210146101c457601f811161015f575b50602091601f82116001146100fb579181926000926100f0575b50508160011b916000199060031b1c1916176004555b604051610a94908161034a8239f35b0151905082806100cb565b601f198216926004600052806000209160005b8581106101475750836001951061012e575b505050811b016004556100e1565b015160001960f88460031b161c19169055828080610120565b9192602060018192868501518155019401920161010e565b60046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f830160051c810191602084106101ba575b601f0160051c01905b8181106101ae57506100b1565b600081556001016101a1565b9091508190610198565b634e487b7160e01b600052602260045260246000fd5b90607f169061009f565b634e487b7160e01b600052604160045260246000fd5b015190508380610068565b601f198216936003600052806000209160005b8681106102525750836001959610610239575b505050811b0160035561007e565b015160001960f88460031b161c1916905583808061022b565b91926020600181928685015181550194019201610218565b60036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f830160051c810191602084106102c5575b601f0160051c01905b8181106102b9575061004d565b600081556001016102ac565b90915081906102a3565b90607f169061003b565b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405190602082016001600160401b038111838210176101e4576040526000825256fe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b60003560e01c806306fdde03146105bd578063095ea7b31461059757806318160ddd1461057957806323b872dd146104bb578063313ce5671461049f578063395093511461044d57806340c10f191461038857806370a082311461034e57806395d89b411461022d578063a457c2d714610186578063a9059cbb146101555763dd62ed3e0361000e573461015057604036600319011261014b5761011361077c565b61011b610797565b6001600160a01b039182166000908152600160209081526040808320949093168252928352819020549051908152f35b6106e3565b610693565b3461015057604036600319011261014b5761017b61017161077c565b60243590336108d8565b602060405160018152f35b3461015057604036600319011261014b5761019f61077c565b60243590336000526001602052604060002060018060a01b038216600052602052604060002054918083106101da5761017b920390336107d0565b60405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608490fd5b3461015057600036600319011261014b5760405160006004548060011c90600181168015610344575b6020831081146103305782855290811561031457506001146102bd575b50819003601f01601f191681019067ffffffffffffffff8211818310176102a7576102a382918260405282610733565b0390f35b634e487b7160e01b600052604160045260246000fd5b905060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b6000905b8282106102fe57506020915082010182610273565b60018160209254838588010152019101906102e9565b90506020925060ff191682840152151560051b82010182610273565b634e487b7160e01b84526022600452602484fd5b91607f1691610256565b3461015057602036600319011261014b576001600160a01b0361036f61077c565b1660005260006020526020604060002054604051908152f35b3461015057604036600319011261014b576103a161077c565b6001600160a01b03166024358115610408577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020826103e56000946002546107ad565b600255848452838252604084206103fd8282546107ad565b9055604051908152a3005b60405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606490fd5b3461015057604036600319011261014b5761017b61046961077c565b336000526001602052604060002060018060a01b038216600052602052610498604060002060243590546107ad565b90336107d0565b3461015057600036600319011261014b57602060405160128152f35b3461015057606036600319011261014b576104d461077c565b6104dc610797565b6001600160a01b0382166000908152600160208181526040808420338552909152909120549260443592918401610518575b61017b93506108d8565b8284106105345761052f8361017b950333836107d0565b61050e565b60405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b3461015057600036600319011261014b576020600254604051908152f35b3461015057604036600319011261014b5761017b6105b361077c565b60243590336107d0565b3461069357600036600319011261014b5760405160006003548060011c90600181168015610689575b6020831081146103305782855290811561031457506001146106325750819003601f01601f191681019067ffffffffffffffff8211818310176102a7576102a382918260405282610733565b905060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b6000905b82821061067357506020915082010182610273565b600181602092548385880101520191019061065e565b91607f16916105e6565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b91909160208152825180602083015260005b818110610766575060409293506000838284010152601f8019910116010190565b8060208092870101516040828601015201610745565b600435906001600160a01b038216820361079257565b600080fd5b602435906001600160a01b038216820361079257565b919082018092116107ba57565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0316908115610887576001600160a01b03169182156108375760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260018252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b6001600160a01b0316908115610a0b576001600160a01b03169182156109ba5781600052600060205260406000205481811061096657817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926020928560005260008452036040600020558460005260008252604060002061095b8282546107ad565b9055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fdfea26469706673582212204b9dc8c4844f3c63f80dcf12a7c641db17d55b4acf9e114aa986fc5b893460ee64736f6c634300081a0033"; + +type ERC20MockConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: ERC20MockConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class ERC20Mock__factory extends ContractFactory { + constructor(...args: ERC20MockConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + overrides?: Overrides & { from?: string } + ): Promise { + return super.deploy(overrides || {}) as Promise; + } + override getDeployTransaction( + overrides?: Overrides & { from?: string } + ): TransactionRequest { + return super.getDeployTransaction(overrides || {}); + } + override attach(address: string): ERC20Mock { + return super.attach(address) as ERC20Mock; + } + override connect(signer: Signer): ERC20Mock__factory { + return super.connect(signer) as ERC20Mock__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): ERC20MockInterface { + return new utils.Interface(_abi) as ERC20MockInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): ERC20Mock { + return new Contract(address, _abi, signerOrProvider) as ERC20Mock; + } +} diff --git a/src/avs/contracts/factories/ReclaimServiceManager__factory.ts b/src/avs/contracts/factories/ReclaimServiceManager__factory.ts index 1e861d7a..11137b8b 100644 --- a/src/avs/contracts/factories/ReclaimServiceManager__factory.ts +++ b/src/avs/contracts/factories/ReclaimServiceManager__factory.ts @@ -86,57 +86,6 @@ const _abi = [ ], stateMutability: "view", }, - { - type: "function", - name: "checkSignerAddress", - inputs: [ - { - name: "request", - type: "tuple", - internalType: "struct IReclaimServiceManager.ClaimRequest", - components: [ - { - name: "provider", - type: "string", - internalType: "string", - }, - { - name: "claimUserId", - type: "bytes32", - internalType: "bytes32", - }, - { - name: "claimHash", - type: "bytes32", - internalType: "bytes32", - }, - { - name: "requestedAt", - type: "uint32", - internalType: "uint32", - }, - { - name: "owner", - type: "address", - internalType: "address", - }, - ], - }, - { - name: "requestSignature", - type: "bytes", - internalType: "bytes", - }, - ], - outputs: [ - { - name: "", - type: "address", - internalType: "address", - }, - ], - stateMutability: "pure", - }, { type: "function", name: "createAVSRewardsSubmission", @@ -223,6 +172,11 @@ const _abi = [ type: "address", internalType: "address", }, + { + name: "fee", + type: "uint256", + internalType: "uint256", + }, ], }, { @@ -304,6 +258,19 @@ const _abi = [ outputs: [], stateMutability: "nonpayable", }, + { + type: "function", + name: "defaultStrategy", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, { type: "function", name: "deregisterOperatorFromAVS", @@ -351,6 +318,11 @@ const _abi = [ type: "address", internalType: "address", }, + { + name: "fee", + type: "uint256", + internalType: "uint256", + }, ], }, ], @@ -426,6 +398,19 @@ const _abi = [ ], stateMutability: "view", }, + { + type: "function", + name: "getToken", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IERC20", + }, + ], + stateMutability: "view", + }, { type: "function", name: "initialize", @@ -445,6 +430,11 @@ const _abi = [ type: "address", internalType: "address", }, + { + name: "strategy", + type: "address", + internalType: "address", + }, ], outputs: [], stateMutability: "nonpayable", @@ -772,6 +762,11 @@ const _abi = [ type: "address", internalType: "address", }, + { + name: "fee", + type: "uint256", + internalType: "uint256", + }, ], }, { @@ -849,6 +844,11 @@ const _abi = [ type: "uint32", internalType: "uint32", }, + { + name: "minFee", + type: "uint256", + internalType: "uint256", + }, ], stateMutability: "view", }, @@ -940,6 +940,11 @@ const _abi = [ type: "uint32", internalType: "uint32", }, + { + name: "minFee", + type: "uint256", + internalType: "uint256", + }, ], }, ], @@ -1042,6 +1047,11 @@ const _abi = [ type: "address", internalType: "address", }, + { + name: "fee", + type: "uint256", + internalType: "uint256", + }, ], }, { @@ -1213,6 +1223,11 @@ const _abi = [ type: "address", internalType: "address", }, + { + name: "fee", + type: "uint256", + internalType: "uint256", + }, ], }, { @@ -1286,7 +1301,7 @@ const _abi = [ ] as const; const _bytecode = - "0x610100806040523461021057604051601f614b9238819003918201601f19168301916001600160401b038311848410176101fa578084926080946040528339810103126101aa5761004f8161025d565b9061005c6020820161025d565b610074606061006d6040850161025d565b930161025d565b9260a05260805260c05260e05260005460ff8160081c166101555760ff8082161061011a575b60405161491b908161027782396080518181816106820152818161111201528181611f41015281816121760152818161233c015281816127c70152613b13015260a0518181816110230152818161114201528181611f6a0152612132015260c05181818161027101528181611b880152611e49015260e051816123d20152f35b60ff90811916176000557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a18061009a565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b600052604160045260246000fd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b51906001600160a01b038216820361027157565b600080fdfe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b6000803560e01c806310d67a2f146129ca578063136439dd146128c457806314bfd6d01461289957806316bd83c3146127945780631be785ac146127595780631ee3ca101461267457806324d7806c146126515780632d89f6fc1461261c5780632e8da829146125f957806333cfb7b71461231f5780633bc28c8c146122fa578063595c6a671461223b5780635ac86ab7146122065780635c975abb146121e9578063630868dc146121a557806368304835146121615780636b3aa72e1461211d578063715018a6146120c0578063886f1195146120985780638b00ce7c146120755780638da5cb5b1461204d57806394bb371b146120155780639926ee7d14611eb2578063a0169ddd14611e25578063a20b99bf14611b4a578063a3524f95146111ab578063a364f4da146110f2578063a551c1b814611090578063a98fb35514610fdf578063aa5b9cad14610f9d578063abd3b6bd14610f3a578063b224b979146109d3578063c0c53b8b1461077c578063d5dba76d1461074f578063e481af9d1461066f578063f289a7fb14610635578063f2fde38b146105a4578063fabc1cbc1461045c578063fc299dee146104345763fce36c7d14610235575061000e565b3461042f576020366003190112610314576004356001600160401b03811161042a5761026590369060040161305d565b919061026f613e40565b7f0000000000000000000000000000000000000000000000000000000000000000825b8481106103c657506001600160a01b031690813b156103c1576040519363fce36c7d60e01b855280602486016020600488015252604485019060448160051b8701019280928690609e1983360301905b8483106103245788808b8181808c0381838f5af18015610319576103035750f35b8161030d91612d32565b6103145780f35b612b5b565b6040513d84823e3d90fd5b9091929394956043198a8203018252863590838212156103bc5760208091876001940190608063ffffffff6103a88261036e61036087806140f4565b60a0885260a0880191614128565b95898060a01b03610380898301612dbf565b1688870152604081013560408701528361039c60608301612f40565b16606087015201612f40565b1691015298019201930191909493926102e2565b6140af565b6132b2565b806103fb6103e260206103dc6001958a89614250565b01614011565b60406103ef848a89614250565b01359030903390614272565b61042461040e60206103dc848a89614250565b84604061041c858b8a614250565b0135916142bb565b01610292565b612bab565b612b0b565b503461042f57366003190112610314576065546040516001600160a01b039091168152602090f35b503461042f57602036600319011261031457609754600435906001600160a01b0316803b156103c15760206004916040519283809263755b36bd60e11b82525afa8015610599576104bf91849161056a575b506001600160a01b03163314613324565b6098541981198116036104ff57806098556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a280f35b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b61058c915060203d602011610592575b6105848183612d32565b810190613305565b386104ae565b503d61057a565b6040513d85823e3d90fd5b503461042f576020366003190112610314576105be612da4565b6105c6613d41565b6001600160a01b038116156105e1576105de90613df7565b80f35b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b503461042f5736600319011261031457606060ca5463ffffffff60405191818116835260ff8160201c16602084015260281c166040820152f35b503461042f5780600319360112610314577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103c15781600491604051928380926302e0740360e31b82525afa90811561031957829161072d575b506106e2815151613acb565b915b8151805182101561071b57600191906001600160a01b0390610707908390613afd565b5151166107148286613afd565b52016106e4565b604051806107298682612f51565b0390f35b61074991503d8084833e6107418183612d32565b810190613c1f565b386106d6565b3461042f57602036600319011261031457602061077261076d612da4565b613b11565b6040519015158152f35b503461042f57606036600319011261031457610796612da4565b602435906001600160a01b03821682036109cf57604435906001600160a01b03821682036109cb5783549260ff8460081c1615938480956109be575b80156109a7575b1561094b5760ff19811660011786558461093a575b5060ff855460081c16156108e15761080861080d92613df7565b613d99565b61012c6040805161081d81612cb0565b610708815260016020820152015260ca805468ffffffffffffffffff191666012c010000070817905560cd54600160401b8110156108cd579061086b82600161088f940160cd5560cd612c47565b81546001600160a01b0393841660039290921b91821b9390911b1916919091179055565b6108965780f35b61ff001981541681557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a180f35b634e487b7160e01b84526041600452602484fd5b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b61ffff1916610101178555386107ee565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b1580156107d95750600160ff8216146107d9565b50600160ff8216106107d2565b8380fd5b8280fd5b503461042f576109e236613268565b6080820180519293929091906001600160a01b03163303610e9f575b505063ffffffff60608301511663ffffffff42169081808211600014610e9057610a2791614216565b60ca549063ffffffff808360281c16911611610e4b5760405190610a4a82612cfc565b836080604051610a5981612d17565b6060815282602082015282604082015282606082015201526040820184815260608301938585526080840196606088528660a0860152845280602085015263ffffffff83160163ffffffff8111610e37579063ffffffff60ff939216905260201c16809252604051602081019060208252610ae981610adb6040820186613a1b565b03601f198101835282612d32565b5190209060ce5491828411610df257610b0183613154565b92610b0f6040519485612d32565b80845260ce8652857fd36cd1c74ef8d7326d8021b776c18fb5a5724b7f7bc93c2f42e43e10ef27d12a602086015b838310610dd45750505050825191610b5485613154565b94610b626040519687612d32565b808652610b71601f1991613154565b01865b818110610dbd57505085925b85519060ff851691821015610d03578015610c9857610bd081610ba38487614004565b6040516020810191448352426040830152606082015260608152610bc8608082612d32565b519020614230565b90610bdb8288613afd565b51916000198201918211610c8457610c0990610bf7838a613afd565b51610c02828b613afd565b5288613afd565b508151909590610c21906001600160a01b0316613b11565b15610c7b57508051602091906001600160a01b0316610c40848a613afd565b515201516020610c508389613afd565b51015260ff8114610c6757600101965b9692610b80565b634e487b7160e01b87526011600452602487fd5b98915050610c60565b634e487b7160e01b8a52601160045260248afd5b60405162461bcd60e51b815260206004820152603760248201527f496e7465726e616c3a204665657320746f6f206c6f772e204e6f206f7065726160448201527f746f7273206c65667420746f207069636b2066726f6d2e0000000000000000006064820152608490fd5b8783888b52604051602081019060208252610d2581610adb6040820186613a1b565b51902063ffffffff60c95416835260cb60205260408320556001610d8560c954927f7738d1b30deac7824a0580de02efde3bb766c7b7b5ea79da34869ebd887cebf363ffffffff8516928392604051918291602083526020830190613a1b565b0390a20163ffffffff8111610da95763ffffffff169063ffffffff19161760c95580f35b634e487b7160e01b83526011600452602483fd5b602090610dc8613878565b82828a01015201610b74565b60026020600192610de485613892565b815201920192019190610b3d565b60405162461bcd60e51b815260206004820152601e60248201527f496e7465726e616c3a204e6f7420656e6f756768206f70657261746f727300006044820152606490fd5b634e487b7160e01b86526011600452602486fd5b60405162461bcd60e51b815260206004820152601e60248201527f526571756573742074696d657374616d7020746f6f20666172206177617900006044820152606490fd5b90610e9a91614216565b610a27565b610ec290604051602080820152610ebd81610adb60408201896139ce565b614188565b90516001600160a01b03908116911603610edd5738806109fe565b60405162461bcd60e51b815260206004820152602f60248201527f5369676e6572206f6620726571756573745369676e6174757265206973206e6f60448201526e3a103932b8bab2b9ba1737bbb732b960891b6064820152608490fd5b3461042f576020366003190112610314576004356001600160401b03811161042a57610adb610f89610f736107299336906004016130e6565b60405192839160208084015260408301906139ce565b604051918291602083526020830190612fb7565b3461042f576020610fcd610ebd610adb610fb636613268565b9290604051928391878084015260408301906139ce565b6040516001600160a01b039091168152f35b503461042f576020366003190112610314576004356001600160401b03811161042a57611010903690600401612e47565b61102161101c336137c5565b613700565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103c1578261107f8193829360405194858094819363a98fb35560e01b8352602060048401526024830190612fb7565b03925af18015610319576103035750f35b503461042f5760203660031901126103145760043560ce548110156110ee576110b89061316b565b5080546001600160a01b0316906110d1906001016131c4565b906107296040519283928352604060208401526040830190612fb7565b5080fd5b503461042f5760203660031901126103145761110c612da4565b611140337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614613949565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103c1576040516351b27a6d60e11b81526001600160a01b03909216600483015282919082908290602490829084905af18015610319576103035750f35b503461042f57604036600319011261031457600435906001600160401b03821161042a5760406003198336030112611b4557604051916111ea83612ce1565b80600401356001600160401b038111611b0e57810160c06003198236030112611b45576040519061121a82612cfc565b60048101356001600160401b038111611b0e5761123d90600436918401016130e6565b825261124b60248201612f40565b602083015261125c60448201612f40565b6040830152606481013560ff81168103611b4157606083015260848101356001600160401b038111611b0e5760049082010136601f82011215611b045780356112a481613154565b916112b26040519384612d32565b81835260208084019260051b82010190368211611b095760208101925b828410611b135750505050608083015260a4013560a082015283526024810135906001600160401b038211611b0e57019136602384011215611b0457600483013561131981613154565b936113276040519586612d32565b818552602060048187019360051b8301010190368211611b095760248101925b828410611ad35750505050602081019283526024359163ffffffff8316809303611ad057815160405161138a81610adb6020820194602086526040830190613a1b565b51902083825260cb602052604082205403611a655763ffffffff6040835101511663ffffffff42161015611a2d5781519283519363ffffffff6020604087015196608060018060a01b0391015116920151169060405195608087018781106001600160401b03821117611a1957604052865260208601526040850152600160608501528451946040519461141d86612ce1565b85526020850195865261143560808551015151613acb565b95835b875181101561146d57600190818060a01b036114598260808a510151613afd565b515116611466828b613afd565b5201611438565b509092959194815151156119e457519384519360405194602086015260208552611498604086612d32565b84518060011b90808204600214901517156119d0576114b69061438c565b9560408051956114c68288612d32565b601087526f181899199a1a9b1b9c1cb0b131b232b360811b60208801528a5b88518110156115a3576114f8818a6143b4565b5188516001600160f81b03199161151b916115159160f81c614382565b8a6143b4565b51168160011b908282046002148315171561158f578d1a61153c828d6143b4565b53611547828b6143b4565b5189516001600160f81b03199161156a916115649160f81c614230565b8b6143b4565b51166001820180921161158f5790611588600193928f1a918d6143b4565b53016114e5565b634e487b7160e01b8e52601160045260248efd5b5061060f60f31b9650908a918a8a6115e5602285518093602082019d8e526115d48151809260208686019101612f94565b81010301601f198101835282612d32565b60018060a01b0360208701511660609685516116018982612d32565b602881526020810192601f198a01368537885b601481106118ca57505086518093602082019261060f60f31b84525190816022840161163f92612f94565b810103602201601f19810184526116569084612d32565b888783015163ffffffff1661166a906143c5565b920151611676906143c5565b9287519d8e955190816020880161168c92612f94565b850190600560f91b6020830152519182602183016116a992612f94565b01602001600560f91b6001820152815191826002830191602001916116cd92612f94565b01600101600560f91b6001820152815191826002830191602001916116f192612f94565b0160010103600101601f1981018a5261170a908a612d32565b87515161171690613acb565b96845b89518051821015611755579061173b61173482600194613afd565b518d614188565b611745828c613afd565b90838060a01b0316905201611719565b505093879195879180975b8551891015611818578197825b865181101561180c576001600160a01b036117888289613afd565b51166001600160a01b0361179c8d8b613afd565b5116146117ab5760010161176d565b509298909391975060015b156117c8576001019791969092611760565b865162461bcd60e51b815260206004820152601a60248201527f4d697373696e67206174746573746f72207369676e61747572650000000000006044820152606490fd5b509298909391976117b6565b8787856118438685875260cb6020528684812055835194602086525190846020870152850190613a1b565b905191601f198483030190840152815180825260208201916020808360051b83010194019287915b83831061189d5788887fa5be567caa88ff11b6da2cf017f9cefffcafa24111a9ecbf0b0bc476944f0f098989038aa280f35b90919293946020806118bb600193601f198682030187528951612fb7565b9701930193019193929061186b565b80601303601381116119bc57600381901b906001600160fd1b038116036119bc5760ff81116119bc5760ff611903600182931b85614382565b161660f481901b600f60f81b169060f081169060ff16039060ff821161199457611936906001600160f81b031916614863565b600183901b91906001600160ff1b03841684036119a85790611971918d1a61195e84886143b4565b5360f81b6001600160f81b031916614863565b60018201809211611994579061198d600193928d1a91866143b4565b5301611614565b634e487b7160e01b8c52601160045260248cfd5b634e487b7160e01b8d52601160045260248dfd5b634e487b7160e01b8b52601160045260248bfd5b634e487b7160e01b89526011600452602489fd5b60405162461bcd60e51b815260206004820152600d60248201526c4e6f207369676e61747572657360981b6044820152606490fd5b634e487b7160e01b86526041600452602486fd5b60405162461bcd60e51b815260206004820152601060248201526f15185cdac81a185cc8195e1c1a5c995960821b6044820152606490fd5b60405162461bcd60e51b815260206004820152603d60248201527f737570706c696564207461736b20646f6573206e6f74206d617463682074686560448201527f206f6e65207265636f7264656420696e2074686520636f6e74726163740000006064820152608490fd5b80fd5b83356001600160401b038111611b0457602091611af98392836004369288010101612e47565b815201930192611347565b612dd3565b613004565b612d53565b83356001600160401b038111611b0457602091611b368392833691870101612ee1565b8152019301926112cf565b8480fd5b612c5f565b503461042f576020366003190112610314576004356001600160401b03811161042a57611b7b90369060040161305d565b611b86929192613e40565b7f0000000000000000000000000000000000000000000000000000000000000000825b828110611d7057506001600160a01b0316803b156103c15760405191634e5cd2fd60e11b835280604484013060048601526040602486015252606483019460648260051b8501019181869060be19813603015b838310611c1d578880898181808b0381838e5af18015610319576103035750f35b9091929394606319888203018a528535828112156103bc57830190611c53611c4583806140f4565b60c0845260c0840191614128565b916001600160a01b03611c6860208301612dbf565b1660208301526020611c7d60408301836140f4565b848603604086015280865294909101938c905b808210611d405750505063ffffffff611cab60608301612f40565b16606083015263ffffffff611cc260808301612f40565b16608083015260a0810135601e19823603018112156103bc5701906020823592016001600160401b038311611d3b578236038113611d365783836020948594938460a0879660019a03910152818452848401378d838284010152601f8019910116010197019a019301919098939298611bfc565b61406a565b614025565b909194604080600192838060a01b03611d588a612dbf565b16815260208901356020820152019601920190611c90565b909291829483955b611d90611d86858585613f1e565b6040810190613f45565b9050871015611de057611da7611d86858585613f1e565b881015611dcc576001916020611dc4928a60061b01013590614004565b960195611d78565b634e487b7160e01b86526032600452602486fd5b600192949593919650611e1f90611e0981308a611e0460206103dc898d3395613f1e565b614272565b84611e1a60206103dc868a8d613f1e565b6142bb565b01611ba9565b503461042f57602036600319011261031457611e3f612da4565b611e47613d41565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103c15760405163a0169ddd60e01b81526001600160a01b03909216600483015282919082908290602490829084905af18015610319576103035750f35b503461042f57604036600319011261031457611ecc612da4565b602435906001600160401b03821161042a5760606003198336030112611b455760405190611ef982612cb0565b82600401356001600160401b038111611b0e57611f1c9060043691860101612e47565b82526020820190602484013582526044604084019401358452611f6860018060a01b037f0000000000000000000000000000000000000000000000000000000000000000163314613949565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103c157859384611fdc93819560405198899687958694639926ee7d60e01b865260018060a01b0316600486015260406024860152516060604486015260a4850190612fb7565b9151606484015251608483015203925af1801561200857611ffa5780f35b61200391612d32565b388180f35b50604051903d90823e3d90fd5b3461042f57602036600319011261031457610729612039612034612da4565b6138be565b604051918291602083526020830190612fdc565b503461042f57366003190112610314576033546040516001600160a01b039091168152602090f35b503461042f5736600319011261031457602063ffffffff60c95416604051908152f35b503461042f57366003190112610314576097546040516001600160a01b039091168152602090f35b503461042f5780600319360112610314576120d9613d41565b603380546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461042f57366003190112610314576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461042f57366003190112610314576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461042f576020366003190112610314576004359060cc54821015611ad05760206121d083612c2c565b905460405160039290921b1c6001600160a01b03168152f35b503461042f57366003190112610314576020609854604051908152f35b503461042f576020366003190112610314576004359060ff8216809203611ad05760206001831b806098541614604051908152f35b503461042f5780600319360112610314576097546001600160a01b0316803b156103c15760206024916040519283809263237dfb4760e11b82523360048301525afa8015610319576122949183916122cb575b5061339b565b60001960985560405160001981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a280f35b6122ed915060203d6020116122f3575b6122e58183612d32565b810190613383565b3861228e565b503d6122db565b503461042f576020366003190112610314576105de612317612da4565b610808613d41565b503461042f57602036600319011261031457612339612da4565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103c15781600491604051928380926302e0740360e31b82525afa9081156103195782916125df575b508051519161239e83613154565b916123ac6040519384612d32565b8383526123b884613154565b602084019190601f1901368337825b8581106125b75750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103c15760408051639004134760e01b81526001600160a01b0390971660048801526024870152835160448701819052839287929091606484019190855b8181106125925750505082809103915afa938415612008578194612500575b5080815b8481106124d4575061247090613acb565b93815b84811061248857604051806107298882612f51565b6124928183613afd565b516124a0575b600101612473565b916001906124cc906001600160a01b036124ba8688613afd565b51166124c6828a613afd565b52613d1c565b929050612498565b6124de8187613afd565b516124ec575b60010161245f565b906124f8600191613d1c565b9190506124e4565b9093503d8085833e6125128183612d32565b810190602081830312610314578051906001600160401b03821161042a57019080601f83011215611b0457815161254881613154565b926125566040519485612d32565b81845260208085019260051b820101928311611b0957602001905b82821061258257505050923861245b565b8151815260209182019101612571565b82516001600160a01b031684528796508a95506020938401939092019160010161243c565b600190818060a01b036125cb828551613afd565b5151166125d88288613afd565b52016123c7565b6125f391503d8084833e6107418183612d32565b38612390565b3461042f576020366003190112610314576020610772612617612da4565b613828565b503461042f57602036600319011261031457604060209163ffffffff612640612f2d565b16815260cb83522054604051908152f35b3461042f57602036600319011261031457602061077261266f612da4565b6137c5565b503461042f5760603660031901126103145760405161269281612cb0565b61269a612f2d565b815260243560ff811681036109cf57602082019081526044359163ffffffff831683036109cb5780604063ffffffff92019384526126da61101c336137c5565b511680612745575b505160ff8116612724575b505163ffffffff81166126fe575080f35b68ffffffff000000000060ca549160281b169068ffffffff000000000019161760ca5580f35b64ff0000000060ca549160201b169064ff0000000019161760ca55386126ed565b63ffffffff1960ca54161760ca55386126e2565b503461042f57604036600319011261031457612773612da4565b60243580151581036109cf576105de9161278f61101c336137c5565b613742565b503461042f576020366003190112610314576004356001600160401b03811161042a576127c5903690600401612ee1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103c15760206024916040519283809263ec7fbb3160e01b82523360048301525afa801561059957600191849161287a575b50151503612835576105de9061354e565b60405162461bcd60e51b815260206004820152601b60248201527f4f70657261746f72206d757374206265207468652063616c6c657200000000006044820152606490fd5b612893915060203d6020116122f3576122e58183612d32565b38612824565b503461042f576020366003190112610314576004359060cd54821015611ad05760206121d083612bfb565b503461042f57602036600319011261031457609754600435906001600160a01b0316803b156103c15760206024916040519283809263237dfb4760e11b82523360048301525afa8015610599576129219184916122cb575061339b565b6098548181160361295f57806098556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a280f35b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b5034612b0b576020366003190112610314576004356001600160a01b038116908190036110ee576097546001600160a01b038116803b156103c15760405163755b36bd60e11b8152602081600481855afa8015612b0057612a3c91869161056a57506001600160a01b03163314613324565b8215612a835760407f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6918151908152846020820152a16001600160a01b0319161760975580f35b60405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a490fd5b6040513d87823e3d90fd5b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b60cd54811015612c165760cd60005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b60cc54811015612c165760cc60005260206000200190600090565b8054821015612c165760005260206000200190600090565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b606081019081106001600160401b03821117612ccb57604052565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b03821117612ccb57604052565b60c081019081106001600160401b03821117612ccb57604052565b60a081019081106001600160401b03821117612ccb57604052565b90601f801991011681019081106001600160401b03821117612ccb57604052565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b600435906001600160a01b0382168203612dba57565b600080fd5b35906001600160a01b0382168203612dba57565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b6001600160401b038111612ccb57601f01601f191660200190565b81601f82011215611b0457602081359101612e6182612e2c565b92612e6f6040519485612d32565b82845282820111612e8c5781600092602092838601378301015290565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b9190604083820312611b455760405190612efa82612ce1565b8193612f0581612dbf565b83526020810135916001600160401b038311611b0e57602092612f289201612e47565b910152565b6004359063ffffffff82168203612dba57565b359063ffffffff82168203612dba57565b602060408183019282815284518094520192019060005b818110612f755750505090565b82516001600160a01b0316845260209384019390920191600101612f68565b60005b838110612fa75750506000910152565b8181015183820152602001612f97565b90602091612fd081518092818552858086019101612f94565b601f01601f1916010190565b90604060206130019360018060a01b0381511684520151918160208201520190612fb7565b90565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b9181601f84011215611b04578235916001600160401b03831161308d576020808501948460051b010111611b0957565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b91909160a081840312611b45576040519061310082612d17565b81938135906001600160401b038211611b0e578261312760809492612f2894869401612e47565b8552602081013560208601526040810135604086015261314960608201612f40565b606086015201612dbf565b6001600160401b038111612ccb5760051b60200190565b60ce54811015612c165760ce60005260206000209060011b0190600090565b90600182811c921680156131ba575b60208310146131a457565b634e487b7160e01b600052602260045260246000fd5b91607f1691613199565b90604051918260008254926131d88461318a565b808452936001811690811561324657506001146131ff575b506131fd92500383612d32565b565b90506000929192526020600020906000915b81831061322a5750509060206131fd92820101386131f0565b6020919350806001915483858901015201910190918492613211565b9050602092506131fd94915060ff191682840152151560051b820101386131f0565b906040600319830112610314576004356001600160401b03811161042a5782613293916004016130e6565b91602435906001600160401b03821161042a5761300191600401612e47565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b9081602091031261031457516001600160a01b0381168103612dba5790565b1561332b57565b60405162461bcd60e51b815260206004820152602a60248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526939903ab73830bab9b2b960b11b6064820152608490fd5b9081602091031261031457518015158103612dba5790565b156133a257565b60405162461bcd60e51b815260206004820152602860248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526739903830bab9b2b960c11b6064820152608490fd5b818110613403575050565b600081556001016133f8565b90929192613538576001602091818060a01b038551166001600160601b0360a01b825416178155019201519182516001600160401b038111612ccb57613455825461318a565b601f81116134fb575b506020601f8211600114613499578192939460009261348e575b50508160011b916000199060031b1c1916179055565b015190503880613478565b601f1982169083600052806000209160005b8181106134e3575095836001959697106134ca575b505050811b019055565b015160001960f88460031b161c191690553880806134c0565b9192602060018192868b0151815501940192016134ab565b61352890836000526020600020601f840160051c8101916020851061352e575b601f0160051c01906133f8565b3861345e565b909150819061351b565b634e487b7160e01b600052600060045260246000fd5b80516001600160a01b031633036136ac57602081015151156135d55760005b60ce548110156135b1576135808161316b565b505482516001600160a01b0390811691161461359e5760010161356d565b906135ab6131fd9261316b565b9061340f565b5060ce5490600160401b821015612ccb576135ab8260016131fd940160ce5561316b565b60005b60ce5481101561366e576135eb8161316b565b505482516001600160a01b03908116911614613609576001016135d8565b613613915061316b565b613538578060006001925501613629815461318a565b9081613633575050565b81601f60009311600114613645575055565b8183526020832061366191601f0160051c8101906001016133f8565b8082528160208120915555565b60405162461bcd60e51b815260206004820152601260248201527113dc195c985d1bdc881b9bdd08199bdd5b9960721b6044820152606490fd5b0390fd5b60405162461bcd60e51b815260206004820152602660248201527f4d657461646174612061646472657373206d757374206d61746368207468652060448201526531b0b63632b960d11b6064820152608490fd5b1561370757565b60405162461bcd60e51b815260206004820152601360248201527221b0b63632b91034b9903737ba1030b236b4b760691b6044820152606490fd5b906137a05760005b60cc5481101561366e5761375d81612c2c565b905460039190911b1c6001600160a01b03908116908316146137815760010161374a565b61378b9150612c2c565b81549060018060a01b039060031b1b19169055565b60cc5490600160401b821015612ccb5761086b8260016131fd940160cc5560cc612c47565b6033546001600160a01b031633146138225760cd549060005b8281106137ed57505050600090565b6137f681612bfb565b905460039190911b1c6001600160a01b039081169083161461381a576001016137de565b505050600190565b50600190565b613831816137c5565b6138225760cc549060005b82811061384b57505050600090565b61385481612c2c565b905460039190911b1c6001600160a01b039081169083161461381a5760010161383c565b6040519061388582612ce1565b6060602083600081520152565b9060405161389f81612ce1565b82546001600160a01b03168152918290602090612f28906001016131c4565b6138c6613878565b5060ce549060005b82811061390f5760405162461bcd60e51b815260206004820152601260248201527113dc195c985d1bdc881b9bdd08199bdd5b9960721b6044820152606490fd5b6139188161316b565b50546001600160a01b03838116911614613934576001016138ce565b6130019250613943915061316b565b50613892565b1561395057565b60405162461bcd60e51b815260206004820152604a60248201527f4543445341536572766963654d616e61676572426173652e6f6e6c795374616b60448201527f6552656769737472793a2063616c6c6572206973206e6f7420746865207374616064820152696b65526567697374727960b01b608482015260a490fd5b9060806139e4835160a0845260a0840190612fb7565b602080850151908401526040808501519084015260608085015163ffffffff1690840152928101516001600160a01b031691015290565b90613a2f825160c0835260c08301906139ce565b9163ffffffff602082015116602083015263ffffffff604082015116604083015260ff60608201511660608301526080810151928281036080840152835180825260208201916020808360051b8301019601926000915b838310613a9e57505050505060a08091015191015290565b9091929396602080613abc600193601f198682030187528b51612fdc565b99019301930191939290613a86565b90613ad582613154565b613ae26040519182612d32565b8281528092613af3601f1991613154565b0190602036910137565b8051821015612c165760209160051b010190565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103c1576040516398ec1ac960e01b81526001600160a01b039091166004820152602081602481855afa908115613be157600091613bed575b50813b156103c1576020600492604051938480926340bf2fb760e01b82525afa918215613be157600092613bad575b50101590565b9091506020813d602011613bd9575b81613bc960209383612d32565b8101031261031457519038613ba7565b3d9150613bbc565b6040513d6000823e3d90fd5b90506020813d602011613c17575b81613c0860209383612d32565b81010312610314575138613b78565b3d9150613bfb565b602081830312610314578051906001600160401b03821161042a570190602082820312611b455760405191602083018381106001600160401b03821117612ccb576040528051906001600160401b038211611b0e570181601f82011215611b0457805190613c8c82613154565b92613c9a6040519485612d32565b82845260208085019360061b83010191818311611b0957602001925b828410613cc65750505050815290565b604084830312611b455760405190613cdd82612ce1565b84516001600160a01b0381168103612dba5782526020850151906001600160601b0382168203612dba5782602092836040950152815201930192613cb6565b6000198114613d2b5760010190565b634e487b7160e01b600052601160045260246000fd5b6033546001600160a01b03163303613d5557565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b606554604080516001600160a01b038084168252841660208201529192917fe11cddf1816a43318ca175bbc52cd0185436e9cbead7c83acc54a73e461717e39190a16001600160a01b03166001600160a01b03199190911617606555565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b6065546001600160a01b03163303613e5457565b60405162461bcd60e51b815260206004820152605160248201527f4543445341536572766963654d616e61676572426173652e6f6e6c795265776160448201527f726473496e69746961746f723a2063616c6c6572206973206e6f7420746865206064820152703932bbb0b932399034b734ba34b0ba37b960791b608482015260a490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206f6666736574000000006044820152606490fd5b9190811015612c165760051b8101359060be1981360301821215613f40570190565b613ed9565b903590601e1981360301821215613f4057018035906001600160401b038211613fbf57602001918160061b36038313613f7a57565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c64617461207461696c20746f6f2073686f72740000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206c656e677468000000006044820152606490fd5b91908201809211613d2b57565b356001600160a01b0381168103612dba5790565b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206c656e67746800006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c64617461206163636573732073747269646500006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206f666673657400006044820152606490fd5b9035601e19823603018112156103bc5701602081359101916001600160401b038211611d3b578160061b36038313611d3657565b916020908281520191906000905b8082106141435750505090565b909192833560018060a01b038116809103612dba5781526020840135906001600160601b038216809203612dba57604081600193602083940152019401920190614136565b6130019161420e91603a61420661419f83516143c5565b9260405192839160208301957f19457468657265756d205369676e6564204d6573736167653a0a00000000000087526141e18151809260208688019101612f94565b83016141f68251809360208685019101612f94565b010103601f198101835282612d32565b5190206145d1565b919091614641565b9063ffffffff8091169116039063ffffffff8211613d2b57565b811561423a570690565b634e487b7160e01b600052601260045260246000fd5b9190811015612c165760051b81013590609e1981360301821215613f40570190565b6040516323b872dd60e01b60208201526001600160a01b0392831660248201529290911660448301526064808301939093529181526131fd916142b6608483612d32565b61447d565b6001600160a01b038116803b156103c157604051636eb1769f60e11b81523060048201526001600160a01b038416602482015290602090829060449082905afa908115613be15760009161434e575b506131fd9361431891614004565b60405163095ea7b360e01b60208201526001600160a01b03909316602484015260448084019190915282526142b6606483612d32565b90506020813d60201161437a575b8161436960209383612d32565b8101031261031457516131fd61430a565b3d915061435c565b811561423a570490565b9061439682612e2c565b6143a36040519182612d32565b8281528092613af3601f1991612e2c565b908151811015612c16570160200190565b801561445d5780816000925b6144495750806143e08361438c565b92915b6143ec57505090565b6000198201918211613d2b5781600a820491600a8302838104600a1484151715613d2b578103908111613d2b5760ff1660300160ff8111613d2b5760f81b6001600160f81b03191660001a9061444290856143b4565b53806143e3565b91614455600a91613d1c565b9204806143d1565b5060405161446c604082612d32565b60018152600360fc1b602082015290565b60408051909290916001600160a01b03166144988484612d32565b602083527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020840152803b1561458d5760008281928260206145099796519301915af13d15614585573d906144ed82612e2c565b916144fa86519384612d32565b82523d6000602084013e6148a5565b8051908161451657505050565b602080614527938301019101613383565b1561452f5750565b5162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b6060906148a5565b835162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b8151604181036145fe5750906145fa916020820151906060604084015193015160001a906147bb565b9091565b6040036146375760406020830151920151918260ff1c91601b8301809311613d2b576145fa936001600160ff1b03169260ff16906147bb565b5050600090600290565b60058110156147a557806146525750565b6000600182036146a15760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b50600281036146ef5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b6000906003810361474a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b600491501461475557565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608490fd5b634e487b7160e01b600052602160045260246000fd5b907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116148575760ff1690601b8214158061484c575b61484057602093600093608093604051938452868401526040830152606082015282805260015afa15613be1576000516001600160a01b038116156148375790600090565b50600090600190565b50505050600090600490565b50601c8214156147f2565b50505050600090600390565b60f81c600a81101561488a5760300160ff8111613d2b5760f81b6001600160f81b03191690565b60570160ff8111613d2b5760f81b6001600160f81b03191690565b909190156148b1575090565b8151156148c15750805190602001fd5b60405162461bcd60e51b8152602060048201529081906136a8906024830190612fb756fea26469706673582212206d91c438b9b23fa88940cff9c59d5a51fb904c8d3f34eb034ed4fb0b3da4cd0164736f6c634300081a0033"; + "0x610100806040523461021057604051601f614db438819003918201601f19168301916001600160401b038311848410176101fa578084926080946040528339810103126101aa5761004f8161025d565b9061005c6020820161025d565b610074606061006d6040850161025d565b930161025d565b9260a05260805260c05260e05260005460ff8160081c166101555760ff8082161061011a575b604051614b3d9081610277823960805181818161094d01528181610b7a0152818161101a01528181612344015281816125ea015281816129bc0152613d41015260a051818181610a8b01528181610baa015281816110510152612300015260c05181818161027c01528181610c510152610f12015260e051816126800152f35b60ff90811916176000557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a18061009a565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b600052604160045260246000fd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b51906001600160a01b038216820361027157565b600080fdfe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b6000803560e01c806310d67a2f14612bbf578063136439dd14612ab957806314bfd6d014612a8e57806316bd83c3146129895780631be785ac1461294e57806321df0da71461292257806324d7806c146128ff5780632d89f6fc146128ca5780632e8da829146128a757806333cfb7b7146125cd5780633bc28c8c146125a8578063595c6a67146124f95780635ac86ab7146124c45780635c975abb146124a7578063630868dc1461246057806367ab980914612373578063683048351461232f5780636b3aa72e146122eb578063715018a61461228e578063762655e914611bce57806384681e4614611b6b578063886f119514611b435780638b00ce7c14611b1d5780638da5cb5b14611af557806394bb371b14611abd578063964c586d1461114b5780639926ee7d14610f7b578063a0169ddd14610eee578063a20b99bf14610c13578063a364f4da14610b5a578063a551c1b814610af8578063a98fb35514610a47578063d5dba76d14610a1a578063e481af9d1461093a578063f289a7fb146108f8578063f2fde38b14610867578063f8c8765e146105d7578063fabc1cbc1461048f578063fac5bb9b14610467578063fc299dee1461043f5763fce36c7d14610240575061000e565b3461043a57602036600319011261031f576004356001600160401b038111610435576102709036906004016132ca565b919061027a614137565b7f0000000000000000000000000000000000000000000000000000000000000000825b8481106103d157506001600160a01b031690813b156103cc576040519363fce36c7d60e01b855280602486016020600488015252604485019060448160051b8701019280928690609e1983360301905b84831061032f5788808b8181808c0381838f5af180156103245761030e5750f35b8161031891612f0c565b61031f5780f35b612d50565b6040513d84823e3d90fd5b9091929394956043198a8203018252863590838212156103c75760208091876001940190608063ffffffff6103b38261037961036b87806143de565b60a0885260a0880191614412565b95898060a01b0361038b898301612f99565b168887015260408101356040870152836103a76060830161311a565b1660608701520161311a565b1691015298019201930191909493926102ed565b614399565b613450565b806104066103ed60206103e76001958a89614472565b016142fb565b60406103fa848a89614472565b0135903090339061458f565b61042f61041960206103e7848a89614472565b846040610427858b8a614472565b0135916145d8565b0161029d565b612da0565b612d00565b503461043a5736600319011261031f576065546040516001600160a01b039091168152602090f35b503461043a5736600319011261031f5760c9546040516001600160a01b039091168152602090f35b503461043a57602036600319011261031f57609754600435906001600160a01b0316803b156103cc5760206004916040519283809263755b36bd60e11b82525afa80156105cc576104f291849161059d575b506001600160a01b031633146134c2565b60985419811981160361053257806098556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a280f35b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b6105bf915060203d6020116105c5575b6105b78183612f0c565b8101906134a3565b386104e1565b503d6105ad565b6040513d85823e3d90fd5b503461043a57608036600319011261031f576105f1612f7e565b602435906001600160a01b0382168203610863576044356001600160a01b038116810361085f576064356001600160a01b038116929083900361085b5784549360ff8560081c16159485809661084e575b8015610837575b156107db5760ff1981166001178755856107ca575b5060ff865460081c16156107715761067861067d92614019565b613fbb565b6001606060405161068d81612ea5565b61070881526020810183905261012c6040820152015260ca805468ffffffffffffffffff191666012c0100000708179055600160cb5560ce54600160401b81101561075d57906106e882600161070c940160ce5560ce612e3c565b81546001600160a01b0393841660039290921b91821b9390911b1916919091179055565b6001600160601b0360a01b60c954161760c9556107265780f35b61ff001981541681557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a180f35b634e487b7160e01b85526041600452602485fd5b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b61ffff19166101011786553861065e565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b1580156106495750600160ff821614610649565b50600160ff821610610642565b8480fd5b8380fd5b8280fd5b503461043a57602036600319011261031f57610881612f7e565b610889613f63565b6001600160a01b038116156108a4576108a190614019565b80f35b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b503461043a5736600319011261031f57608060ca5460cb5463ffffffff60405192818116845260ff8160201c16602085015260281c1660408301526060820152f35b503461043a578060031936011261031f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103cc5781600491604051928380926302e0740360e31b82525afa9081156103245782916109f8575b506109ad815151613c74565b915b815180518210156109e657600191906001600160a01b03906109d2908390613ca6565b5151166109df8286613ca6565b52016109af565b604051806109f4868261312b565b0390f35b610a1491503d8084833e610a0c8183612f0c565b810190613e41565b386109a1565b3461043a57602036600319011261031f576020610a3d610a38612f7e565b613d3f565b6040519015158152f35b503461043a57602036600319011261031f576004356001600160401b03811161043557610a78903690600401613021565b610a89610a84336139eb565b61389e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103cc5782610ae78193829360405194858094819363a98fb35560e01b835260206004840152602483019061320d565b03925af180156103245761030e5750f35b503461043a57602036600319011261031f5760043560cf54811015610b5657610b2090613353565b5080546001600160a01b031690610b39906001016133ac565b906109f4604051928392835260406020840152604083019061320d565b5080fd5b503461043a57602036600319011261031f57610b74612f7e565b610ba8337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614613cba565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103cc576040516351b27a6d60e11b81526001600160a01b03909216600483015282919082908290602490829084905af180156103245761030e5750f35b503461043a57602036600319011261031f576004356001600160401b03811161043557610c449036906004016132ca565b610c4f929192614137565b7f0000000000000000000000000000000000000000000000000000000000000000825b828110610e3957506001600160a01b0316803b156103cc5760405191634e5cd2fd60e11b835280604484013060048601526040602486015252606483019460648260051b8501019181869060be19813603015b838310610ce6578880898181808b0381838e5af180156103245761030e5750f35b9091929394606319888203018a528535828112156103c757830190610d1c610d0e83806143de565b60c0845260c0840191614412565b916001600160a01b03610d3160208301612f99565b1660208301526020610d4660408301836143de565b848603604086015280865294909101938c905b808210610e095750505063ffffffff610d746060830161311a565b16606083015263ffffffff610d8b6080830161311a565b16608083015260a0810135601e19823603018112156103c75701906020823592016001600160401b038311610e04578236038113610dff5783836020948594938460a0879660019a03910152818452848401378d838284010152601f8019910116010197019a019301919098939298610cc5565b614354565b61430f565b909194604080600192838060a01b03610e218a612f99565b16815260208901356020820152019601920190610d59565b909291829483955b610e59610e4f858585614215565b604081019061423c565b9050871015610ea957610e70610e4f858585614215565b881015610e95576001916020610e8d928a60061b0101359061410a565b960195610e41565b634e487b7160e01b86526032600452602486fd5b600192949593919650610ee890610ed281308a610ecd60206103e7898d3395614215565b61458f565b84610ee360206103e7868a8d614215565b6145d8565b01610c72565b503461043a57602036600319011261031f57610f08612f7e565b610f10613f63565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103cc5760405163a0169ddd60e01b81526001600160a01b03909216600483015282919082908290602490829084905af180156103245761030e5750f35b503461043a57604036600319011261031f57610f95612f7e565b602435906001600160401b03821161043557606060031983360301126111465760405190606082018281106001600160401b0382111761075d5760405282600401356001600160401b03811161114157610ff59060043691860101613021565b8252602082019060248401358252604460408401940135845261104160018060a01b037f0000000000000000000000000000000000000000000000000000000000000000163314613cba565b61104a81613a4e565b156110fc577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103cc578593846110c393819560405198899687958694639926ee7d60e01b865260018060a01b0316600486015260406024860152516060604486015260a485019061320d565b9151606484015251608483015203925af180156110ef576110e15780f35b6110ea91612f0c565b388180f35b50604051903d90823e3d90fd5b60405162461bcd60e51b815260206004820152601860248201527f4f70657261746f72206e6f742077686974656c697374656400000000000000006044820152606490fd5b612f2d565b612e54565b503461043a57604036600319011261031f576004356001600160401b0381116104355760406003198236030112611146576040519061118982612ef1565b80600401356001600160401b03811161114157810160c0600319823603011261114657604051906111b982612ed6565b60048101356001600160401b038111611141576111dc906004369184010161316e565b82526111ea6024820161311a565b60208301526111fb6044820161311a565b6040830152606481013560ff81168103611ab957606083015260848101356001600160401b0381116111415760049082010136601f82011215611a815780356112438161325a565b916112516040519384612f0c565b81835260208084019260051b82010190368211611a865760208101925b828410611a8b5750505050608083015260a4013560a082015282526024810135906001600160401b038211611141570136602382011215611a815760048101356112b78161325a565b916112c56040519384612f0c565b818352602060048185019360051b8301010190368211611a865760248101925b828410611a505750505050602082019081526024359163ffffffff831680930361085f578051604051611336816113286020820194602086526040830190613af3565b03601f198101835282612f0c565b51902083855260cc6020526040852054036119e55763ffffffff6040825101511663ffffffff421610156119ad5780519283519363ffffffff6020604087015196608060018060a01b039101511692015116906040519561139687612ea5565b86526020860152604085015260016060850152825192604051946113b986612ef1565b8552602085019384526113d160808451015151613c74565b93865b855181101561140957600190818060a01b036113f582608089510151613ca6565b5151166114028289613ca6565b52016113d4565b50909391948151511561197857519485519360405194602086015260208552611433604086612f0c565b84518060011b9080820460021490151715611964576114519061449e565b9560408051956114618288612f0c565b601087526f181899199a1a9b1b9c1cb0b131b232b360811b60208801528a5b885181101561153e57611493818a6144c6565b5188516001600160f81b0319916114b6916114b09160f81c614494565b8a6144c6565b51168160011b908282046002148315171561152a578d1a6114d7828d6144c6565b536114e2828b6144c6565b5189516001600160f81b031991611505916114ff9160f81c614117565b8b6144c6565b51166001820180921161152a5790611523600193928f1a918d6144c6565b5301611480565b634e487b7160e01b8e52601160045260248efd5b5061060f60f31b9650908a91898b611580602285518094602082019d8e5261156f81518092602086860191016131ea565b81010301601f198101845283612f0c565b60018060a01b0360208201511690845161159b606082612f0c565b6028815260208101926040368537875b6014811061185e57505085518093602082019261060f60f31b8452519081602284016115d6926131ea565b810103602201601f19810184526115ed9084612f0c565b8582015163ffffffff16611600906144d7565b916060015161160e906144d7565b9286519c8d9551908160208801611624926131ea565b850190600560f91b602083015251918260218301611641926131ea565b01602001600560f91b600182015281519182600283019160200191611665926131ea565b01600101600560f91b600182015281519182600283019160200191611689926131ea565b0160010103600101601f19810189526116a29089612f0c565b8651516116ae90613c74565b95835b885180518210156116ed57906116d36116cc82600194613ca6565b518c614062565b6116dd828b613ca6565b90838060a01b03169052016116b1565b50509293858791865b84518810156117ab578096815b85518110156117a0576001600160a01b0361171e8288613ca6565b51166001600160a01b036117328c8a613ca6565b51161461174157600101611703565b5092919790965060015b1561175c57600101969091956116f6565b855162461bcd60e51b815260206004820152601a60248201527f4d697373696e67206174746573746f72207369676e61747572650000000000006044820152606490fd5b50929197909661174b565b9185879283855260cc60205284828120556117d782519360208552518360208601526060850190613af3565b905191601f198483030190840152815180825260208201916020808360051b83010194019287915b8383106118315788887fb89b185f8ff547f2adc139e96d9ffe3ce49fac1d57931be0788b58aa670850cb8989038aa280f35b909192939460208061184f600193601f19868203018752895161320d565b970193019301919392906117ff565b806013036013811161195057600381901b906001600160fd1b038116036119505760ff81116119505760ff611897600182931b85614494565b161660f481901b600f60f81b169060f081169060ff16039060ff8211611928576118ca906001600160f81b031916614a85565b600183901b91906001600160ff1b038416840361193c5790611905918c1a6118f284886144c6565b5360f81b6001600160f81b031916614a85565b600182018092116119285790611921600193928c1a91866144c6565b53016115ab565b634e487b7160e01b8b52601160045260248bfd5b634e487b7160e01b8c52601160045260248cfd5b634e487b7160e01b8a52601160045260248afd5b634e487b7160e01b89526011600452602489fd5b60405162461bcd60e51b815260206004820152600d60248201526c4e6f207369676e61747572657360981b6044820152606490fd5b60405162461bcd60e51b815260206004820152601060248201526f15185cdac81a185cc8195e1c1a5c995960821b6044820152606490fd5b60405162461bcd60e51b815260206004820152603d60248201527f737570706c696564207461736b20646f6573206e6f74206d617463682074686560448201527f206f6e65207265636f7264656420696e2074686520636f6e74726163740000006064820152608490fd5b83356001600160401b038111611a8157602091611a768392836004369288010101613021565b8152019301926112e5565b612fad565b613271565b83356001600160401b038111611a8157602091611aae83928336918701016130bb565b81520193019261126e565b8580fd5b3461043a57602036600319011261031f576109f4611ae1611adc612f7e565b613be9565b604051918291602083526020830190613232565b503461043a5736600319011261031f576033546040516001600160a01b039091168152602090f35b503461043a5736600319011261031f57602063ffffffff60c95460a01c16604051908152f35b503461043a5736600319011261031f576097546040516001600160a01b039091168152602090f35b3461043a57602036600319011261031f576004356001600160401b03811161043557611328611bba611ba46109f493369060040161316e565b6040519283916020808401526040830190613a9e565b60405191829160208352602083019061320d565b503461043a57604036600319011261031f576004356001600160401b03811161043557611bff90369060040161316e565b906024356001600160401b03811161043557611c1f903690600401613021565b9160cb549260a082019384511061225b576080820180519091906001600160a01b031633036121c0575b505063ffffffff6060820151169063ffffffff421691828082116000146121b157611c73916140f0565b63ffffffff8060ca5460281c1691161161216c576001600160a01b03611c97613963565b16845190803b156103cc576040516323b872dd60e01b815233600482015230602482015260448101929092526020908290606490829088905af1908115612161578491612132575b50156120f45760405190611cf282612ed6565b8360a0604051611d0181612ed6565b6060815282602082015282604082015282606082015282608082015201526040820194848652606083019385855260808401966060885260a0850193878552855281602086015260ca549163ffffffff83160163ffffffff81116120e0579063ffffffff60ff939216905260201c16809452519052604051602081019060208252611d93816113286040820186613af3565b5190209060cf549182841161209b57611dab8361325a565b92611db96040519485612f0c565b80845260cf8652857facb8d954e2cfef495862221e91bd7523613cf8808827cb33edfe4904cc51bf29602086015b83831061207d5750505050825191611dfe8561325a565b94611e0c6040519687612f0c565b808652611e1b601f199161325a565b01865b81811061206657505085925b85519060ff851691821015611f99578015611f2e57611e7a81611e4d848761410a565b6040516020810191448352426040830152606082015260608152611e72608082612f0c565b519020614117565b90611e858288613ca6565b5191600019820191821161195057611eb390611ea1838a613ca6565b51611eac828b613ca6565b5288613ca6565b508151909590611ecb906001600160a01b0316613d3f565b15611f2557508051602091906001600160a01b0316611eea848a613ca6565b515201516020611efa8389613ca6565b51015260ff8114611f1157600101965b9692611e2a565b634e487b7160e01b87526011600452602487fd5b98915050611f0a565b60405162461bcd60e51b815260206004820152603760248201527f496e7465726e616c3a204665657320746f6f206c6f772e204e6f206f7065726160448201527f746f7273206c65667420746f207069636b2066726f6d2e0000000000000000006064820152608490fd5b8783888b52604051602081019060208252611fbb816113286040820186613af3565b51902063ffffffff60c95460a01c16835260cc6020526040832055600161202160c954927f07a2aac65c6401a6cbb0fa80ff456ec88725098383c7e585ee342ae74505c98b63ffffffff8560a01c16928392604051918291602083526020830190613af3565b0390a20163ffffffff81116120525763ffffffff60a01b1990911660a09190911b63ffffffff60a01b161760c95580f35b634e487b7160e01b83526011600452602483fd5b602090612071613ba3565b82828a01015201611e1e565b6002602060019261208d85613bbd565b815201920192019190611de7565b60405162461bcd60e51b815260206004820152601e60248201527f496e7465726e616c3a204e6f7420656e6f756768206f70657261746f727300006044820152606490fd5b634e487b7160e01b88526011600452602488fd5b60405162461bcd60e51b81526020600482015260166024820152754661696c656420746f207472616e736665722066656560501b6044820152606490fd5b612154915060203d60201161215a575b61214c8183612f0c565b810190613521565b38611cdf565b503d612142565b6040513d86823e3d90fd5b60405162461bcd60e51b815260206004820152601e60248201527f526571756573742074696d657374616d7020746f6f20666172206177617900006044820152606490fd5b906121bb916140f0565b611c73565b6121e3906040516020808201526121de816113286040820188613a9e565b614062565b90516001600160a01b039081169116036121fe573880611c49565b60405162461bcd60e51b815260206004820152602f60248201527f5369676e6572206f6620726571756573745369676e6174757265206973206e6f60448201526e3a103932b8bab2b9ba1737bbb732b960891b6064820152608490fd5b60405162461bcd60e51b815260206004820152600b60248201526a46656520746f6f206c6f7760a81b6044820152606490fd5b503461043a578060031936011261031f576122a7613f63565b603380546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461043a5736600319011261031f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461043a5736600319011261031f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461043a57608036600319011261031f5760405161239181612ea5565b612399613107565b815260243560ff8116810361086357602082019081526044359163ffffffff8316830361085f5780604063ffffffff920193845260643560608201526123e1610a84336139eb565b51168061244c575b505160ff811661242b575b505163ffffffff8116612405575080f35b68ffffffff000000000060ca549160281b169068ffffffff000000000019161760ca5580f35b64ff0000000060ca549160201b169064ff0000000019161760ca55386123f4565b63ffffffff1960ca54161760ca55386123e9565b503461043a57602036600319011261031f576004359060cd548210156124a457602061248b83612e21565b905460405160039290921b1c6001600160a01b03168152f35b80fd5b503461043a5736600319011261031f576020609854604051908152f35b503461043a57602036600319011261031f576004359060ff82168092036124a45760206001831b806098541614604051908152f35b503461043a578060031936011261031f576097546001600160a01b0316803b156103cc5760206024916040519283809263237dfb4760e11b82523360048301525afa801561032457612552918391612589575b50613539565b60001960985560405160001981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a280f35b6125a2915060203d60201161215a5761214c8183612f0c565b3861254c565b503461043a57602036600319011261031f576108a16125c5612f7e565b610678613f63565b503461043a57602036600319011261031f576125e7612f7e565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103cc5781600491604051928380926302e0740360e31b82525afa90811561032457829161288d575b508051519161264c8361325a565b9161265a6040519384612f0c565b8383526126668461325a565b602084019190601f1901368337825b8581106128655750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103cc5760408051639004134760e01b81526001600160a01b0390971660048801526024870152835160448701819052839287929091606484019190855b8181106128405750505082809103915afa9384156110ef5781946127ae575b5080815b848110612782575061271e90613c74565b93815b84811061273657604051806109f4888261312b565b6127408183613ca6565b5161274e575b600101612721565b9160019061277a906001600160a01b036127688688613ca6565b5116612774828a613ca6565b52613f3e565b929050612746565b61278c8187613ca6565b5161279a575b60010161270d565b906127a6600191613f3e565b919050612792565b9093503d8085833e6127c08183612f0c565b81019060208183031261031f578051906001600160401b03821161043557019080601f83011215611a815781516127f68161325a565b926128046040519485612f0c565b81845260208085019260051b820101928311611a8657602001905b828210612830575050509238612709565b815181526020918201910161281f565b82516001600160a01b031684528796508a9550602093840193909201916001016126ea565b600190818060a01b03612879828551613ca6565b5151166128868288613ca6565b5201612675565b6128a191503d8084833e610a0c8183612f0c565b3861263e565b3461043a57602036600319011261031f576020610a3d6128c5612f7e565b613a4e565b503461043a57602036600319011261031f57604060209163ffffffff6128ee613107565b16815260cc83522054604051908152f35b3461043a57602036600319011261031f576020610a3d61291d612f7e565b6139eb565b503461043a5736600319011261031f57602061293c613963565b6040516001600160a01b039091168152f35b503461043a57604036600319011261031f57612968612f7e565b6024358015158103610863576108a191612984610a84336139eb565b6138e0565b503461043a57602036600319011261031f576004356001600160401b038111610435576129ba9036906004016130bb565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103cc5760206024916040519283809263ec7fbb3160e01b82523360048301525afa80156105cc576001918491612a6f575b50151503612a2a576108a1906136ec565b60405162461bcd60e51b815260206004820152601b60248201527f4f70657261746f72206d757374206265207468652063616c6c657200000000006044820152606490fd5b612a88915060203d60201161215a5761214c8183612f0c565b38612a19565b503461043a57602036600319011261031f576004359060ce548210156124a457602061248b83612df0565b503461043a57602036600319011261031f57609754600435906001600160a01b0316803b156103cc5760206024916040519283809263237dfb4760e11b82523360048301525afa80156105cc57612b169184916125895750613539565b60985481811603612b5457806098556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a280f35b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b5034612d0057602036600319011261031f576004356001600160a01b03811690819003610b56576097546001600160a01b038116803b156103cc5760405163755b36bd60e11b8152602081600481855afa8015612cf557612c3191869161059d57506001600160a01b031633146134c2565b8215612c785760407f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6918151908152846020820152a16001600160a01b0319161760975580f35b60405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a490fd5b6040513d87823e3d90fd5b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b60ce54811015612e0b5760ce60005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b60cd54811015612e0b5760cd60005260206000200190600090565b8054821015612e0b5760005260206000200190600090565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b608081019081106001600160401b03821117612ec057604052565b634e487b7160e01b600052604160045260246000fd5b60c081019081106001600160401b03821117612ec057604052565b604081019081106001600160401b03821117612ec057604052565b90601f801991011681019081106001600160401b03821117612ec057604052565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b600435906001600160a01b0382168203612f9457565b600080fd5b35906001600160a01b0382168203612f9457565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b6001600160401b038111612ec057601f01601f191660200190565b81601f82011215611a815760208135910161303b82613006565b926130496040519485612f0c565b828452828201116130665781600092602092838601378301015290565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b919060408382031261114657604051906130d482612ef1565b81936130df81612f99565b83526020810135916001600160401b038311611141576020926131029201613021565b910152565b6004359063ffffffff82168203612f9457565b359063ffffffff82168203612f9457565b602060408183019282815284518094520192019060005b81811061314f5750505090565b82516001600160a01b0316845260209384019390920191600101613142565b91909160c081840312611146576040519061318882612ed6565b81938135916001600160401b038311611141576131ab60a0939284938301613021565b845260208101356020850152604081013560408501526131cd6060820161311a565b60608501526131de60808201612f99565b60808501520135910152565b60005b8381106131fd5750506000910152565b81810151838201526020016131ed565b90602091613226815180928185528580860191016131ea565b601f01601f1916010190565b90604060206132579360018060a01b038151168452015191816020820152019061320d565b90565b6001600160401b038111612ec05760051b60200190565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b9181601f84011215611a81578235916001600160401b0383116132fa576020808501948460051b010111611a8657565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b60cf54811015612e0b5760cf60005260206000209060011b0190600090565b90600182811c921680156133a2575b602083101461338c57565b634e487b7160e01b600052602260045260246000fd5b91607f1691613381565b90604051918260008254926133c084613372565b808452936001811690811561342e57506001146133e7575b506133e592500383612f0c565b565b90506000929192526020600020906000915b8183106134125750509060206133e592820101386133d8565b60209193508060019154838589010152019101909184926133f9565b9050602092506133e594915060ff191682840152151560051b820101386133d8565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b9081602091031261031f57516001600160a01b0381168103612f945790565b156134c957565b60405162461bcd60e51b815260206004820152602a60248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526939903ab73830bab9b2b960b11b6064820152608490fd5b9081602091031261031f57518015158103612f945790565b1561354057565b60405162461bcd60e51b815260206004820152602860248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526739903830bab9b2b960c11b6064820152608490fd5b8181106135a1575050565b60008155600101613596565b909291926136d6576001602091818060a01b038551166001600160601b0360a01b825416178155019201519182516001600160401b038111612ec0576135f38254613372565b601f8111613699575b506020601f8211600114613637578192939460009261362c575b50508160011b916000199060031b1c1916179055565b015190503880613616565b601f1982169083600052806000209160005b81811061368157509583600195969710613668575b505050811b019055565b015160001960f88460031b161c1916905538808061365e565b9192602060018192868b015181550194019201613649565b6136c690836000526020600020601f840160051c810191602085106136cc575b601f0160051c0190613596565b386135fc565b90915081906136b9565b634e487b7160e01b600052600060045260246000fd5b80516001600160a01b0316330361384a57602081015151156137735760005b60cf5481101561374f5761371e81613353565b505482516001600160a01b0390811691161461373c5760010161370b565b906137496133e592613353565b906135ad565b5060cf5490600160401b821015612ec0576137498260016133e5940160cf55613353565b60005b60cf5481101561380c5761378981613353565b505482516001600160a01b039081169116146137a757600101613776565b6137b19150613353565b6136d65780600060019255016137c78154613372565b90816137d1575050565b81601f600093116001146137e3575055565b818352602083206137ff91601f0160051c810190600101613596565b8082528160208120915555565b60405162461bcd60e51b815260206004820152601260248201527113dc195c985d1bdc881b9bdd08199bdd5b9960721b6044820152606490fd5b0390fd5b60405162461bcd60e51b815260206004820152602660248201527f4d657461646174612061646472657373206d757374206d61746368207468652060448201526531b0b63632b960d11b6064820152608490fd5b156138a557565b60405162461bcd60e51b815260206004820152601360248201527221b0b63632b91034b9903737ba1030b236b4b760691b6044820152606490fd5b9061393e5760005b60cd5481101561380c576138fb81612e21565b905460039190911b1c6001600160a01b039081169083161461391f576001016138e8565b6139299150612e21565b81549060018060a01b039060031b1b19169055565b60cd5490600160401b821015612ec0576106e88260016133e5940160cd5560cd612e3c565b60c9546001600160a01b0316803b156103cc57602060049160405192838092632495a59960e01b82525afa9081156139df576000916139a0575090565b90506020813d6020116139d7575b816139bb60209383612f0c565b8101031261031f57516001600160a01b0381168103612f945790565b3d91506139ae565b6040513d6000823e3d90fd5b6033546001600160a01b03163314613a485760ce549060005b828110613a1357505050600090565b613a1c81612df0565b905460039190911b1c6001600160a01b0390811690831614613a4057600101613a04565b505050600190565b50600190565b613a57816139eb565b613a485760cd549060005b828110613a7157505050600090565b613a7a81612e21565b905460039190911b1c6001600160a01b0390811690831614613a4057600101613a62565b9060a080613ab5845160c0855260c085019061320d565b93602081015160208501526040810151604085015263ffffffff6060820151166060850152600180831b036080820151166080850152015191015290565b90613b07825160c0835260c0830190613a9e565b9163ffffffff602082015116602083015263ffffffff604082015116604083015260ff60608201511660608301526080810151928281036080840152835180825260208201916020808360051b8301019601926000915b838310613b7657505050505060a08091015191015290565b9091929396602080613b94600193601f198682030187528b51613232565b99019301930191939290613b5e565b60405190613bb082612ef1565b6060602083600081520152565b90604051613bca81612ef1565b82546001600160a01b03168152918290602090613102906001016133ac565b613bf1613ba3565b5060cf549060005b828110613c3a5760405162461bcd60e51b815260206004820152601260248201527113dc195c985d1bdc881b9bdd08199bdd5b9960721b6044820152606490fd5b613c4381613353565b50546001600160a01b03838116911614613c5f57600101613bf9565b6132579250613c6e9150613353565b50613bbd565b90613c7e8261325a565b613c8b6040519182612f0c565b8281528092613c9c601f199161325a565b0190602036910137565b8051821015612e0b5760209160051b010190565b15613cc157565b60405162461bcd60e51b815260206004820152604a60248201527f4543445341536572766963654d616e61676572426173652e6f6e6c795374616b60448201527f6552656769737472793a2063616c6c6572206973206e6f7420746865207374616064820152696b65526567697374727960b01b608482015260a490fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103cc576040516398ec1ac960e01b81526001600160a01b039091166004820152602081602481855afa9081156139df57600091613e0f575b50813b156103cc576020600492604051938480926340bf2fb760e01b82525afa9182156139df57600092613ddb575b50101590565b9091506020813d602011613e07575b81613df760209383612f0c565b8101031261031f57519038613dd5565b3d9150613dea565b90506020813d602011613e39575b81613e2a60209383612f0c565b8101031261031f575138613da6565b3d9150613e1d565b60208183031261031f578051906001600160401b0382116104355701906020828203126111465760405191602083018381106001600160401b03821117612ec0576040528051906001600160401b038211611141570181601f82011215611a8157805190613eae8261325a565b92613ebc6040519485612f0c565b82845260208085019360061b83010191818311611a8657602001925b828410613ee85750505050815290565b6040848303126111465760405190613eff82612ef1565b84516001600160a01b0381168103612f945782526020850151906001600160601b0382168203612f945782602092836040950152815201930192613ed8565b6000198114613f4d5760010190565b634e487b7160e01b600052601160045260246000fd5b6033546001600160a01b03163303613f7757565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b606554604080516001600160a01b038084168252841660208201529192917fe11cddf1816a43318ca175bbc52cd0185436e9cbead7c83acc54a73e461717e39190a16001600160a01b03166001600160a01b03199190911617606555565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b613257916140e891603a6140e061407983516144d7565b9260405192839160208301957f19457468657265756d205369676e6564204d6573736167653a0a00000000000087526140bb81518092602086880191016131ea565b83016140d082518093602086850191016131ea565b010103601f198101835282612f0c565b51902061469f565b91909161470f565b9063ffffffff8091169116039063ffffffff8211613f4d57565b91908201809211613f4d57565b8115614121570690565b634e487b7160e01b600052601260045260246000fd5b6065546001600160a01b0316330361414b57565b60405162461bcd60e51b815260206004820152605160248201527f4543445341536572766963654d616e61676572426173652e6f6e6c795265776160448201527f726473496e69746961746f723a2063616c6c6572206973206e6f7420746865206064820152703932bbb0b932399034b734ba34b0ba37b960791b608482015260a490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206f6666736574000000006044820152606490fd5b9190811015612e0b5760051b8101359060be1981360301821215614237570190565b6141d0565b903590601e198136030182121561423757018035906001600160401b0382116142b657602001918160061b3603831361427157565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c64617461207461696c20746f6f2073686f72740000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206c656e677468000000006044820152606490fd5b356001600160a01b0381168103612f945790565b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206c656e67746800006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c64617461206163636573732073747269646500006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206f666673657400006044820152606490fd5b9035601e19823603018112156103c75701602081359101916001600160401b038211610e04578160061b36038313610dff57565b916020908281520191906000905b80821061442d5750505090565b909192833560018060a01b038116809103612f945781526020840135906001600160601b038216809203612f9457604081600193602083940152019401920190614420565b9190811015612e0b5760051b81013590609e1981360301821215614237570190565b8115614121570490565b906144a882613006565b6144b56040519182612f0c565b8281528092613c9c601f1991613006565b908151811015612e0b570160200190565b801561456f5780816000925b61455b5750806144f28361449e565b92915b6144fe57505090565b6000198201918211613f4d5781600a820491600a8302838104600a1484151715613f4d578103908111613f4d5760ff1660300160ff8111613f4d5760f81b6001600160f81b03191660001a9061455490856144c6565b53806144f5565b91614567600a91613f3e565b9204806144e3565b5060405161457e604082612f0c565b60018152600360fc1b602082015290565b6040516323b872dd60e01b60208201526001600160a01b0392831660248201529290911660448301526064808301939093529181526133e5916145d3608483612f0c565b614889565b6001600160a01b038116803b156103cc57604051636eb1769f60e11b81523060048201526001600160a01b038416602482015290602090829060449082905afa9081156139df5760009161466b575b506133e5936146359161410a565b60405163095ea7b360e01b60208201526001600160a01b03909316602484015260448084019190915282526145d3606483612f0c565b90506020813d602011614697575b8161468660209383612f0c565b8101031261031f57516133e5614627565b3d9150614679565b8151604181036146cc5750906146c8916020820151906060604084015193015160001a906149dd565b9091565b6040036147055760406020830151920151918260ff1c91601b8301809311613f4d576146c8936001600160ff1b03169260ff16906149dd565b5050600090600290565b600581101561487357806147205750565b60006001820361476f5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b50600281036147bd5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b600090600381036148185760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b600491501461482357565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608490fd5b634e487b7160e01b600052602160045260246000fd5b60408051909290916001600160a01b03166148a48484612f0c565b602083527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020840152803b156149995760008281928260206149159796519301915af13d15614991573d906148f982613006565b9161490686519384612f0c565b82523d6000602084013e614ac7565b8051908161492257505050565b602080614933938301019101613521565b1561493b5750565b5162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b606090614ac7565b835162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411614a795760ff1690601b82141580614a6e575b614a6257602093600093608093604051938452868401526040830152606082015282805260015afa156139df576000516001600160a01b03811615614a595790600090565b50600090600190565b50505050600090600490565b50601c821415614a14565b50505050600090600390565b60f81c600a811015614aac5760300160ff8111613f4d5760f81b6001600160f81b03191690565b60570160ff8111613f4d5760f81b6001600160f81b03191690565b90919015614ad3575090565b815115614ae35750805190602001fd5b60405162461bcd60e51b81526020600482015290819061384690602483019061320d56fea2646970667358221220b90eba4a1bf992fe7344d193caa24efcdebc8c04bbaa62d2764a88b825d5c5ad64736f6c634300081a0033"; type ReclaimServiceManagerConstructorParams = | [signer?: Signer] diff --git a/src/avs/contracts/factories/index.ts b/src/avs/contracts/factories/index.ts index 02498673..58689b35 100644 --- a/src/avs/contracts/factories/index.ts +++ b/src/avs/contracts/factories/index.ts @@ -4,4 +4,5 @@ export { AVSDirectory__factory } from "./AVSDirectory__factory"; export { DelegationManager__factory } from "./DelegationManager__factory"; export { ECDSAStakeRegistry__factory } from "./ECDSAStakeRegistry__factory"; +export { ERC20Mock__factory } from "./ERC20Mock__factory"; export { ReclaimServiceManager__factory } from "./ReclaimServiceManager__factory"; diff --git a/src/avs/contracts/index.ts b/src/avs/contracts/index.ts index b1ce7cfb..1c811969 100644 --- a/src/avs/contracts/index.ts +++ b/src/avs/contracts/index.ts @@ -4,9 +4,11 @@ export type { AVSDirectory } from "./AVSDirectory"; export type { DelegationManager } from "./DelegationManager"; export type { ECDSAStakeRegistry } from "./ECDSAStakeRegistry"; +export type { ERC20Mock } from "./ERC20Mock"; export type { ReclaimServiceManager } from "./ReclaimServiceManager"; export * as factories from "./factories"; export { ReclaimServiceManager__factory } from "./factories/ReclaimServiceManager__factory"; export { AVSDirectory__factory } from "./factories/AVSDirectory__factory"; export { DelegationManager__factory } from "./factories/DelegationManager__factory"; export { ECDSAStakeRegistry__factory } from "./factories/ECDSAStakeRegistry__factory"; +export { ERC20Mock__factory } from "./factories/ERC20Mock__factory"; diff --git a/src/avs/tests/test.operator.ts b/src/avs/tests/test.operator.ts index 41af507c..29b2294a 100644 --- a/src/avs/tests/test.operator.ts +++ b/src/avs/tests/test.operator.ts @@ -28,6 +28,8 @@ import { canonicalStringify, createSignDataForClaim, getIdentifierFromClaimInfo, const contracts = getContracts() +const defaultFee = 0x1000 + jest.setTimeout(60_000) describe('Operators', () => { @@ -127,7 +129,8 @@ describe('Operators', () => { contract.updateTaskCreationMetadata({ minSignaturesPerTask: 2, maxTaskLifetimeS: 10, - maxTaskCreationDelayS: 0 + maxTaskCreationDelayS: 0, + minFee: 1, }) ) ] @@ -172,20 +175,32 @@ describe('Operators', () => { await sendGasToAddress(userWallet.address) }) + it('should fail to create a task w insufficient balance', async() => { + await expect( + createNewTask(userWallet) + ).rejects.toMatchObject({ + message: /transfer amount exceeds balance/ + }) + }) + it('should create a task', async() => { + // add fees for wallet to create a task + await addTokensToAddress(userWallet.address) arg = await createNewTask(userWallet) }) it('should mark a task as completed', async() => { if(!arg) { + await addTokensToAddress(userWallet.address) arg = await createNewTask(userWallet) } await markTaskAsCompleted(userWallet, arg) }) - it('should create a task for another wallet', async() => { + it('should allow another wallet to create a task', async() => { const ownerWallet = randomWallet() + await addTokensToAddress(userWallet.address) const rslt = await createNewTask(userWallet, ownerWallet) assert.strictEqual(rslt.task.request.owner, ownerWallet.address) }) @@ -204,6 +219,10 @@ describe('Operators', () => { it('should make attestor pay for claim', async() => { const userWallet = randomWallet() + + // default address is the attestor's address + await addTokensToAddress(contracts.wallet!.address) + const { object: rslt } = await createClaimOnAvs({ ownerPrivateKey: userWallet.privateKey, name: 'http', @@ -297,12 +316,14 @@ describe('Operators', () => { claimOwner = userWallet ) { const params = makeNewCreateClaimParams() + const { task } = await createNewClaimRequestOnChain({ request: { provider: params.provider, claimUserId: new Uint8Array(32), claimHash: getIdentifierFromClaimInfo(params), requestedAt: unixTimestampSeconds(), + fee: defaultFee }, payer: userWallet, owner: claimOwner @@ -362,13 +383,15 @@ describe('Operators', () => { const tx = await contracts.contract.updateTaskCreationMetadata({ minSignaturesPerTask: 2, maxTaskLifetimeS: 0, - maxTaskCreationDelayS: 0 + maxTaskCreationDelayS: 0, + minFee: 1 }) await tx.wait() console.log('min sigs set to 2') const userWallet = randomWallet() await sendGasToAddress(userWallet.address) + await addTokensToAddress(userWallet.address) const { object: rslt } = await createClaimOnAvs({ ownerPrivateKey: userWallet.privateKey, @@ -394,6 +417,13 @@ describe('Operators', () => { } }) +async function addTokensToAddress(address: string) { + const mocktoken = await contracts.tokens.getDefault() + const tx = await mocktoken + .mint(address, defaultFee) + await tx.wait() +} + function randomWallet() { return Wallet.createRandom() .connect(contracts.provider) diff --git a/src/avs/types/index.ts b/src/avs/types/index.ts index 7853ae2c..c8b924c2 100644 --- a/src/avs/types/index.ts +++ b/src/avs/types/index.ts @@ -1,4 +1,5 @@ +import type { ethers } from 'ethers' import type { NewTaskCreatedEventObject } from 'src/avs/contracts/ReclaimServiceManager' import type { createClaimOnAttestor } from 'src/client' import type { ClaimTunnelResponse } from 'src/proto/api' @@ -52,6 +53,14 @@ export type CreateClaimOnAvsOpts = ( */ payer?: { attestor: string } + /** + * Specify the fee to pay for this claim. Ensure the wallet + * has enough balance to pay for the fee. + * + * @default 'minimum fee configured in the contract' + */ + fee?: ethers.BigNumberish + onStep?(step: CreateClaimOnAvsStep): void /** * Override the default createClaimOnAttestor function diff --git a/src/avs/utils/contracts.ts b/src/avs/utils/contracts.ts index 7977306e..63a7271f 100644 --- a/src/avs/utils/contracts.ts +++ b/src/avs/utils/contracts.ts @@ -1,6 +1,6 @@ import { ethers } from 'ethers' import { CHAIN_CONFIGS, PRIVATE_KEY, SELECTED_CHAIN_ID } from 'src/avs/config' -import { AVSDirectory__factory, DelegationManager__factory, ECDSAStakeRegistry__factory, ReclaimServiceManager__factory } from 'src/avs/contracts' +import { AVSDirectory__factory, DelegationManager__factory, ECDSAStakeRegistry__factory, ERC20Mock__factory, ReclaimServiceManager__factory } from 'src/avs/contracts' import { ChainConfig } from 'src/avs/types' type Contracts = ReturnType @@ -34,6 +34,11 @@ export function initialiseContracts( const wallet = privateKey ? new ethers.Wallet(privateKey, provider) : undefined + // eslint-disable-next-line camelcase + const contract = ReclaimServiceManager__factory.connect( + contractAddress, + wallet || provider + ) return { provider, @@ -43,11 +48,7 @@ export function initialiseContracts( delegationManagerAddress, wallet || provider ), - // eslint-disable-next-line camelcase - contract: ReclaimServiceManager__factory.connect( - contractAddress, - wallet || provider - ), + contract, // eslint-disable-next-line camelcase registryContract: ECDSAStakeRegistry__factory.connect( stakeRegistryAddress, @@ -58,5 +59,14 @@ export function initialiseContracts( avsDirectoryAddress, wallet || provider ), + // tokens + tokens: { + async getDefault() { + const tokenAddr = await contract.getToken() + // eslint-disable-next-line camelcase + return ERC20Mock__factory + .connect(tokenAddr, wallet || provider) + } + } } } \ No newline at end of file diff --git a/src/avs/utils/tasks.ts b/src/avs/utils/tasks.ts index 483bde6a..6867d830 100644 --- a/src/avs/utils/tasks.ts +++ b/src/avs/utils/tasks.ts @@ -34,11 +34,23 @@ export async function createNewClaimRequestOnChain({ owner: ownerAddress } const signature = await getSignature() + + // ensure the contract has enough allowance to transfer the token + const tokenContract = await contracts.tokens.getDefault() + const allowance = await tokenContract + .allowance(payer.address, contract.address) + if(allowance.lt(fullRequest.fee)) { + const tx = await tokenContract + .connect(payer) + .approve(contract.address, fullRequest.fee) + await tx.wait() + } + const task = await contract.createNewTask(fullRequest, signature || '0x00') const rslt = await task.wait() const events = rslt.events // check task created event was emitted - const ev = events?.[0] + const ev = events?.find(e => e.event === 'NewTaskCreated') const arg = ev?.args as unknown as NewTaskCreatedEventObject return { task: arg, tx: rslt } From 9eb92e1a5714986bb5fc06621bfb1dcfddb694ec Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Sat, 15 Feb 2025 12:02:20 +0530 Subject: [PATCH 07/26] feat: reward distribution init --- avs/contracts/deployments/core/31337.json | 2 +- avs/contracts/deployments/reclaim/31337.json | 2 +- avs/contracts/script/ReclaimDeployer.s.sol | 5 +- avs/contracts/script/SetupPayments.s.sol | 234 ++ .../script/utils/ReclaimDeploymentLib.sol | 3 +- .../script/utils/SetupPaymentsLib.sol | 317 +++ avs/contracts/src/ReclaimServiceManager.sol | 51 +- avs/utils/contract-data-gen.sh | 3 +- package.json | 1 + src/avs/config.ts | 6 +- src/avs/contracts/RewardsCoordinator.ts | 2502 +++++++++++++++++ .../ReclaimServiceManager__factory.ts | 2 +- .../factories/RewardsCoordinator__factory.ts | 2176 ++++++++++++++ src/avs/contracts/factories/index.ts | 1 + src/avs/contracts/index.ts | 2 + src/avs/tests/test.operator.ts | 27 +- src/avs/types/index.ts | 1 + src/avs/utils/contracts.ts | 10 +- 18 files changed, 5324 insertions(+), 21 deletions(-) create mode 100644 avs/contracts/script/SetupPayments.s.sol create mode 100644 avs/contracts/script/utils/SetupPaymentsLib.sol create mode 100644 src/avs/contracts/RewardsCoordinator.ts create mode 100644 src/avs/contracts/factories/RewardsCoordinator__factory.ts diff --git a/avs/contracts/deployments/core/31337.json b/avs/contracts/deployments/core/31337.json index 984b3516..b9db19a4 100644 --- a/avs/contracts/deployments/core/31337.json +++ b/avs/contracts/deployments/core/31337.json @@ -1 +1 @@ -{"lastUpdate":{"timestamp":"1739447610","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","avsDirectory":"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9","avsDirectoryImpl":"0x68b1d87f95878fe05b998f19b66f4baba5de1aed","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","eigenPodManagerImpl":"0x59b670e9fa9d0a427751af201d676719a970857b","strategyFactory":"0x959922be3caee4b8cd9a407cc3ac1c251c2007b1","strategyFactoryImpl":"0xc6e7df5e7b4f2a278906862b61205850344d4e7d","strategyBeacon":"0x09635f643e140090a9a8dcd712ed6285858cebef","rewardsCoordinator":"0x610178da211fef7d417bc0e6fed39f05609ad788"}} \ No newline at end of file +{"lastUpdate":{"timestamp":"1739600886","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","avsDirectory":"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9","avsDirectoryImpl":"0x68b1d87f95878fe05b998f19b66f4baba5de1aed","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","eigenPodManagerImpl":"0x59b670e9fa9d0a427751af201d676719a970857b","strategyFactory":"0x959922be3caee4b8cd9a407cc3ac1c251c2007b1","strategyFactoryImpl":"0xc6e7df5e7b4f2a278906862b61205850344d4e7d","strategyBeacon":"0x09635f643e140090a9a8dcd712ed6285858cebef","rewardsCoordinator":"0x610178da211fef7d417bc0e6fed39f05609ad788"}} \ No newline at end of file diff --git a/avs/contracts/deployments/reclaim/31337.json b/avs/contracts/deployments/reclaim/31337.json index abf69141..6f655fe7 100644 --- a/avs/contracts/deployments/reclaim/31337.json +++ b/avs/contracts/deployments/reclaim/31337.json @@ -1 +1 @@ -{"lastUpdate":{"timestamp":"1739447614","block_number":"15"},"addresses":{"proxyAdmin":"0xf5059a5d33d5853360d16c683c16e67980206f36","reclaimServiceManager":"0x998abeb3e57409262ae5b751f60747921b33613e","reclaimServiceManagerImpl":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","stakeRegistry":"0x4826533b4897376654bb4d4ad88b7fafd0c98528","stakeRegistryImpl":"0x99bba657f2bbc93c02d617f8ba121cb8fc104acf","strategy":"0x24b3c7704709ed1491473f30393ffc93cfb0fc34","token":"0x1613beb3b2c4f22ee086b2b38c1476a3ce7f78e8"}} \ No newline at end of file +{"lastUpdate":{"timestamp":"1739600923","block_number":"15"},"addresses":{"proxyAdmin":"0xf5059a5d33d5853360d16c683c16e67980206f36","reclaimServiceManager":"0x998abeb3e57409262ae5b751f60747921b33613e","reclaimServiceManagerImpl":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","stakeRegistry":"0x4826533b4897376654bb4d4ad88b7fafd0c98528","stakeRegistryImpl":"0x99bba657f2bbc93c02d617f8ba121cb8fc104acf","strategy":"0x24b3c7704709ed1491473f30393ffc93cfb0fc34","token":"0x1613beb3b2c4f22ee086b2b38c1476a3ce7f78e8"}} \ No newline at end of file diff --git a/avs/contracts/script/ReclaimDeployer.s.sol b/avs/contracts/script/ReclaimDeployer.s.sol index 172e27c2..39484420 100644 --- a/avs/contracts/script/ReclaimDeployer.s.sol +++ b/avs/contracts/script/ReclaimDeployer.s.sol @@ -64,9 +64,8 @@ contract ReclaimDeployer is Script, Test { reclaimDeployment = ReclaimDeploymentLib.deployContracts( proxyAdmin, coreDeployment, - quorum, rewardsInitiator, - rewardsOwner, deployer, - address(reclaimStrategy) + quorum, rewardsOwner, + deployer, address(reclaimStrategy) ); reclaimDeployment.strategy = address(reclaimStrategy); diff --git a/avs/contracts/script/SetupPayments.s.sol b/avs/contracts/script/SetupPayments.s.sol new file mode 100644 index 00000000..6a9c16d9 --- /dev/null +++ b/avs/contracts/script/SetupPayments.s.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +import {Script} from "forge-std/Script.sol"; +import {ReclaimDeploymentLib} from "./utils/ReclaimDeploymentLib.sol"; +import {CoreDeploymentLib} from "./utils/CoreDeploymentLib.sol"; +import {SetupPaymentsLib} from "./utils/SetupPaymentsLib.sol"; +import {IRewardsCoordinator} from "@eigenlayer/contracts/interfaces/IRewardsCoordinator.sol"; +import {RewardsCoordinator} from "@eigenlayer/contracts/core/RewardsCoordinator.sol"; +import {IStrategy} from "@eigenlayer/contracts/interfaces/IStrategy.sol"; +import {ERC20Mock} from "../src/ERC20Mock.sol"; + +import "forge-std/Test.sol"; + +contract SetupPayments is Script, Test { + struct PaymentInfo { + address recipient; + uint32 numPayments; + uint32 amountPerPayment; + uint32 duration; + uint32 startTimestamp; + uint32 endTimestamp; + uint256 indexToProve; + } + + address private deployer; + CoreDeploymentLib.DeploymentData coreDeployment; + CoreDeploymentLib.DeploymentConfigData coreConfig; + + ReclaimDeploymentLib.DeploymentData reclaimDeployment; + ReclaimDeploymentLib.DeploymentConfigData reclaimConfig; + + RewardsCoordinator rewardsCoordinator; + string internal constant paymentInfofilePath = "test/mockData/scratch/payment_info.json"; + string internal constant filePath = "test/mockData/scratch/payments.json"; + + + + uint32 constant CALCULATION_INTERVAL_SECONDS = 1 days; + uint256 constant NUM_TOKEN_EARNINGS = 1; + uint32 constant DURATION = 1; + uint256 constant NUM_EARNERS = 8; + + uint32 numPayments = 8; + uint32 indexToProve = 0; + uint32 amountPerPayment = 100; + + address recipient = address(1); + IRewardsCoordinator.EarnerTreeMerkleLeaf[] public earnerLeaves; + address[] public earners; + uint32 startTimestamp; + uint32 endTimestamp; + uint256 cumumlativePaymentMultiplier; + address nonceSender = 0x998abeb3E57409262aE5b751f60747921B33613E; + + address operator1 = address(1); + address operator2 = address(2); + + + function setUp() public { + deployer = vm.rememberKey(vm.envUint("PRIVATE_KEY")); + vm.label(deployer, "Deployer"); + + coreDeployment = CoreDeploymentLib.readDeploymentJson("deployments/core/", block.chainid); + coreConfig = CoreDeploymentLib.readDeploymentConfigValues("config/core/", block.chainid); + reclaimDeployment = ReclaimDeploymentLib.readDeploymentJson("deployments/reclaim/", block.chainid); + reclaimConfig = ReclaimDeploymentLib.readDeploymentConfigValues("config/reclaim/", block.chainid); + + rewardsCoordinator = RewardsCoordinator(coreDeployment.rewardsCoordinator); + + // TODO: Get the filePath from config + } + + function run() external { + vm.startBroadcast(reclaimConfig.rewardsInitiatorKey); + + if(rewardsCoordinator.currRewardsCalculationEndTimestamp() == 0) { + startTimestamp = uint32(block.timestamp) - (uint32(block.timestamp) % CALCULATION_INTERVAL_SECONDS); + } else { + startTimestamp = rewardsCoordinator.currRewardsCalculationEndTimestamp() - DURATION + CALCULATION_INTERVAL_SECONDS; + } + + endTimestamp = startTimestamp + 1; + + + if (endTimestamp > block.timestamp) { + revert("End timestamp must be in the future. Please wait to generate new payments."); + } + + // sets a multiplier based on block number such that cumulativeEarnings increase accordingly for multiple runs of this script in the same session + uint256 nonce = rewardsCoordinator.getDistributionRootsLength(); + amountPerPayment = uint32(amountPerPayment * (nonce + 1)); + + createAVSRewardsSubmissions(numPayments, amountPerPayment, startTimestamp); + vm.stopBroadcast(); + vm.startBroadcast(deployer); + earners = _getEarners(deployer); + submitPaymentRoot(earners, endTimestamp, numPayments, amountPerPayment); + vm.stopBroadcast(); + } + + function runOperatorDirected() external { + vm.startBroadcast(reclaimConfig.rewardsInitiatorKey); + if(rewardsCoordinator.currRewardsCalculationEndTimestamp() == 0) { + startTimestamp = uint32(block.timestamp) - (uint32(block.timestamp) % CALCULATION_INTERVAL_SECONDS); + } else { + startTimestamp = rewardsCoordinator.currRewardsCalculationEndTimestamp() - DURATION + CALCULATION_INTERVAL_SECONDS; + } + + endTimestamp = startTimestamp + 1; + + + if (endTimestamp > block.timestamp) { + revert("End timestamp must be in the future. Please wait to generate new payments."); + } + + // sets a multiplier based on block number such that cumulativeEarnings increase accordingly for multiple runs of this script in the same session + uint256 nonce = rewardsCoordinator.getDistributionRootsLength(); + amountPerPayment = uint32(amountPerPayment * (nonce + 1)); + + createOperatorDirectedAVSRewardsSubmissions(numPayments, amountPerPayment, startTimestamp); + vm.stopBroadcast(); + vm.startBroadcast(deployer); + earners = _getEarners(deployer); + submitPaymentRoot(earners, endTimestamp, numPayments, amountPerPayment); + vm.stopBroadcast(); + } + + + function executeProcessClaim() public { + uint256 nonce = rewardsCoordinator.getDistributionRootsLength(); + amountPerPayment = uint32(amountPerPayment * nonce); + + vm.startBroadcast(deployer); + earnerLeaves = _getEarnerLeaves(_getEarners(deployer), amountPerPayment, reclaimDeployment.strategy); + processClaim(filePath, indexToProve, recipient, earnerLeaves[indexToProve], amountPerPayment); + vm.stopBroadcast(); + } + + function createAVSRewardsSubmissions(uint256 numPayments, uint256 amountPerPayment, uint32 startTimestamp) public { + ERC20Mock(reclaimDeployment.token).mint(reclaimConfig.rewardsInitiator, amountPerPayment * numPayments); + ERC20Mock(reclaimDeployment.token).increaseAllowance(reclaimDeployment.reclaimServiceManager, amountPerPayment * numPayments); + uint32 duration = rewardsCoordinator.MAX_REWARDS_DURATION(); + SetupPaymentsLib.createAVSRewardsSubmissions( + reclaimDeployment.reclaimServiceManager, + reclaimDeployment.strategy, + numPayments, + amountPerPayment, + duration, + startTimestamp + ); + } + + + function createOperatorDirectedAVSRewardsSubmissions(uint256 numPayments, uint256 amountPerPayment, uint32 startTimestamp) public { + ERC20Mock(reclaimDeployment.token).mint(reclaimConfig.rewardsInitiator, amountPerPayment * numPayments); + ERC20Mock(reclaimDeployment.token).increaseAllowance(reclaimDeployment.reclaimServiceManager, amountPerPayment * numPayments); + uint32 duration = 0; + address[] memory operators = new address[](2); + operators[0] = operator1; + operators[1] = operator2; + + uint256 numOperators = operators.length; + + SetupPaymentsLib.createOperatorDirectedAVSRewardsSubmissions( + reclaimDeployment.reclaimServiceManager, + operators, + numOperators, + reclaimDeployment.strategy, + numPayments, + amountPerPayment, + duration, + startTimestamp + ); + } + + function processClaim(string memory filePath, uint256 indexToProve, address recipient, IRewardsCoordinator.EarnerTreeMerkleLeaf memory earnerLeaf, uint32 amountPerPayment) public { + SetupPaymentsLib.processClaim( + IRewardsCoordinator(coreDeployment.rewardsCoordinator), + filePath, + indexToProve, + recipient, + earnerLeaf, + NUM_TOKEN_EARNINGS, + reclaimDeployment.strategy, + amountPerPayment + ); + } + + function submitPaymentRoot(address[] memory earners, uint32 endTimestamp, uint32 numPayments, uint32 amountPerPayment) public { + emit log_named_uint("cumumlativePaymentMultiplier", cumumlativePaymentMultiplier); + bytes32[] memory tokenLeaves = SetupPaymentsLib.createTokenLeaves( + IRewardsCoordinator(coreDeployment.rewardsCoordinator), + NUM_TOKEN_EARNINGS, + amountPerPayment, + reclaimDeployment.strategy + ); + IRewardsCoordinator.EarnerTreeMerkleLeaf[] memory earnerLeaves = SetupPaymentsLib.createEarnerLeaves(earners, tokenLeaves); + emit log_named_uint("Earner Leaves Length", earnerLeaves.length); + emit log_named_uint("numPayments", numPayments); + + SetupPaymentsLib.submitRoot( + IRewardsCoordinator(coreDeployment.rewardsCoordinator), + tokenLeaves, + earnerLeaves, + reclaimDeployment.strategy, + endTimestamp, + numPayments, + NUM_TOKEN_EARNINGS, + filePath + ); + } + + function _getEarnerLeaves(address[] memory earners, uint32 amountPerPayment, address strategy) internal view returns (IRewardsCoordinator.EarnerTreeMerkleLeaf[] memory) { + bytes32[] memory tokenLeaves = SetupPaymentsLib.createTokenLeaves( + IRewardsCoordinator(coreDeployment.rewardsCoordinator), + NUM_TOKEN_EARNINGS, + amountPerPayment, + strategy + ); + + IRewardsCoordinator.EarnerTreeMerkleLeaf[] memory earnerLeaves = SetupPaymentsLib.createEarnerLeaves(earners, tokenLeaves); + + return earnerLeaves; + } + + function _getEarners(address deployer) internal pure returns (address[] memory) { + address[] memory earners = new address[](NUM_EARNERS); + for (uint256 i = 0; i < earners.length; i++) { + earners[i] = deployer; + } + return earners; + } +} \ No newline at end of file diff --git a/avs/contracts/script/utils/ReclaimDeploymentLib.sol b/avs/contracts/script/utils/ReclaimDeploymentLib.sol index e6a3a84d..0bd8082d 100644 --- a/avs/contracts/script/utils/ReclaimDeploymentLib.sol +++ b/avs/contracts/script/utils/ReclaimDeploymentLib.sol @@ -37,7 +37,6 @@ library ReclaimDeploymentLib { address proxyAdmin, CoreDeploymentLib.DeploymentData memory core, Quorum memory quorum, - address rewardsInitiator, address owner, address deployer, address strategy @@ -60,7 +59,7 @@ library ReclaimDeploymentLib { ECDSAStakeRegistry.initialize, (result.reclaimServiceManager, 0, quorum) ); UpgradeableProxyLib.upgradeAndCall(result.stakeRegistry, stakeRegistryImpl, upgradeCall); - upgradeCall = abi.encodeCall(ReclaimServiceManager.initialize, (owner, rewardsInitiator, deployer, strategy)); + upgradeCall = abi.encodeCall(ReclaimServiceManager.initialize, (owner, deployer, strategy)); UpgradeableProxyLib.upgradeAndCall(result.reclaimServiceManager, reclaimServiceManagerImpl, upgradeCall); return result; diff --git a/avs/contracts/script/utils/SetupPaymentsLib.sol b/avs/contracts/script/utils/SetupPaymentsLib.sol new file mode 100644 index 00000000..80e923f0 --- /dev/null +++ b/avs/contracts/script/utils/SetupPaymentsLib.sol @@ -0,0 +1,317 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +import {IRewardsCoordinator} from "@eigenlayer/contracts/interfaces/IRewardsCoordinator.sol"; +import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol"; +import {ECDSAServiceManagerBase} from "@eigenlayer-middleware/src/unaudited/ECDSAServiceManagerBase.sol"; +import {Vm} from "forge-std/Vm.sol"; + + +library SetupPaymentsLib { + + Vm internal constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); + + struct PaymentLeaves { + bytes32[] leaves; + bytes32[] tokenLeaves; + } + + function createAVSRewardsSubmissions( + address helloWorldServiceManager, + address strategy, + uint256 numPayments, + uint256 amountPerPayment, + uint32 duration, + uint32 startTimestamp + ) internal { + IRewardsCoordinator.RewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.RewardsSubmission[](numPayments); + for (uint256 i = 0; i < numPayments; i++) { + IRewardsCoordinator.StrategyAndMultiplier[] memory strategiesAndMultipliers = new IRewardsCoordinator.StrategyAndMultiplier[](1); + strategiesAndMultipliers[0] = IRewardsCoordinator.StrategyAndMultiplier({ + strategy: IStrategy(strategy), + multiplier: 10000 + }); + + IRewardsCoordinator.RewardsSubmission memory rewardsSubmission = IRewardsCoordinator.RewardsSubmission({ + strategiesAndMultipliers: strategiesAndMultipliers, + token: IStrategy(strategy).underlyingToken(), + amount: amountPerPayment, + startTimestamp: startTimestamp, + duration: duration + }); + + rewardsSubmissions[i] = rewardsSubmission; + } + ECDSAServiceManagerBase(helloWorldServiceManager).createAVSRewardsSubmission(rewardsSubmissions); + } + + function createOperatorDirectedAVSRewardsSubmissions( + address helloWorldServiceManager, + address[] memory operators, + uint256 numOperators, + address strategy, + uint256 numPayments, + uint256 amountPerPayment, + uint32 duration, + uint32 startTimestamp + ) internal { + + uint256 operatorRewardAmount = amountPerPayment / numOperators; + + IRewardsCoordinator.OperatorReward[] memory operatorRewards = new IRewardsCoordinator.OperatorReward[](2); + for (uint256 i = 0; i < 2; i++) { + operatorRewards[i] = IRewardsCoordinator.OperatorReward({ + operator: operators[i], + amount: operatorRewardAmount + }); + } + + IRewardsCoordinator.OperatorDirectedRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorDirectedRewardsSubmission[](numPayments); + for (uint256 i = 0; i < numPayments; i++) { + IRewardsCoordinator.StrategyAndMultiplier[] memory strategiesAndMultipliers = new IRewardsCoordinator.StrategyAndMultiplier[](1); + strategiesAndMultipliers[0] = IRewardsCoordinator.StrategyAndMultiplier({ + strategy: IStrategy(strategy), + multiplier: 10000 + }); + + IRewardsCoordinator.OperatorDirectedRewardsSubmission memory rewardsSubmission = IRewardsCoordinator.OperatorDirectedRewardsSubmission({ + strategiesAndMultipliers: strategiesAndMultipliers, + token: IStrategy(strategy).underlyingToken(), + operatorRewards: operatorRewards, + startTimestamp: startTimestamp, + duration: duration, + description: "test" + }); + + rewardsSubmissions[i] = rewardsSubmission; + } + ECDSAServiceManagerBase(helloWorldServiceManager).createOperatorDirectedAVSRewardsSubmission(rewardsSubmissions); + } + + function processClaim( + IRewardsCoordinator rewardsCoordinator, + string memory filePath, + uint256 indexToProve, + address recipient, + IRewardsCoordinator.EarnerTreeMerkleLeaf memory earnerLeaf, + uint256 NUM_TOKEN_EARNINGS, + address strategy, + uint32 amountPerPayment + ) internal { + PaymentLeaves memory paymentLeaves = parseLeavesFromJson(filePath); + + bytes memory proof = generateMerkleProof(paymentLeaves.leaves, indexToProve); + //we only have one token leaf + bytes memory tokenProof = generateMerkleProof(paymentLeaves.tokenLeaves, 0); + + uint32[] memory tokenIndices = new uint32[](NUM_TOKEN_EARNINGS); + bytes[] memory tokenProofs = new bytes[](NUM_TOKEN_EARNINGS); + tokenProofs[0] = tokenProof; + + IRewardsCoordinator.TokenTreeMerkleLeaf[] memory tokenLeaves = new IRewardsCoordinator.TokenTreeMerkleLeaf[](NUM_TOKEN_EARNINGS); + tokenLeaves[0] = defaultTokenLeaf(amountPerPayment, strategy); + + + // this workflow assumes a new root submitted for every payment claimed. So we get the latest rood index to process a claim for + uint256 rootIndex = rewardsCoordinator.getDistributionRootsLength() - 1; + + IRewardsCoordinator.RewardsMerkleClaim memory claim = IRewardsCoordinator.RewardsMerkleClaim({ + rootIndex: uint32(rootIndex), + earnerIndex: uint32(indexToProve), + earnerTreeProof: proof, + earnerLeaf: earnerLeaf, + tokenIndices: tokenIndices, + tokenTreeProofs: tokenProofs, + tokenLeaves: tokenLeaves + }); + + rewardsCoordinator.processClaim(claim, recipient); + } + + function submitRoot( + IRewardsCoordinator rewardsCoordinator, + bytes32[] memory tokenLeaves, + IRewardsCoordinator.EarnerTreeMerkleLeaf[] memory earnerLeaves, + address strategy, + uint32 rewardsCalculationEndTimestamp, + uint256 NUM_PAYMENTS, + uint256 NUM_TOKEN_EARNINGS, + string memory filePath + ) internal { + bytes32 paymentRoot = createPaymentRoot(rewardsCoordinator, tokenLeaves, earnerLeaves, NUM_PAYMENTS, NUM_TOKEN_EARNINGS, filePath); + rewardsCoordinator.submitRoot(paymentRoot, rewardsCalculationEndTimestamp); + } + + function createPaymentRoot( + IRewardsCoordinator rewardsCoordinator, + bytes32[] memory tokenLeaves, + IRewardsCoordinator.EarnerTreeMerkleLeaf[] memory earnerLeaves, + uint256 NUM_PAYMENTS, + uint256 NUM_TOKEN_EARNINGS, + string memory filePath + ) internal returns (bytes32) { + require(earnerLeaves.length == NUM_PAYMENTS, "Number of earners must match number of payments"); + bytes32[] memory leaves = new bytes32[](NUM_PAYMENTS); + + require(tokenLeaves.length == NUM_TOKEN_EARNINGS, "Number of token leaves must match number of token earnings"); + for (uint256 i = 0; i < NUM_PAYMENTS; i++) { + leaves[i] = rewardsCoordinator.calculateEarnerLeafHash(earnerLeaves[i]); + } + + writeLeavesToJson(leaves, tokenLeaves, filePath); + return (merkleizeKeccak(leaves)); + } + + function createEarnerLeaves( + address[] calldata earners, + bytes32[] memory tokenLeaves + ) public pure returns (IRewardsCoordinator.EarnerTreeMerkleLeaf[] memory) { + IRewardsCoordinator.EarnerTreeMerkleLeaf[] memory leaves = new IRewardsCoordinator.EarnerTreeMerkleLeaf[](earners.length); + for (uint256 i = 0; i < earners.length; i++) { + leaves[i] = IRewardsCoordinator.EarnerTreeMerkleLeaf({ + earner: earners[i], + earnerTokenRoot: createTokenRoot(tokenLeaves) + }); + } + return leaves; + } + + function createTokenRoot(bytes32[] memory tokenLeaves) public pure returns (bytes32) { + return merkleizeKeccak(tokenLeaves); + } + + function createTokenLeaves( + IRewardsCoordinator rewardsCoordinator, + uint256 NUM_TOKEN_EARNINGS, + uint256 TOKEN_EARNINGS, + address strategy + ) internal view returns (bytes32[] memory) { + bytes32[] memory leaves = new bytes32[](NUM_TOKEN_EARNINGS); + for (uint256 i = 0; i < NUM_TOKEN_EARNINGS; i++) { + IRewardsCoordinator.TokenTreeMerkleLeaf memory leaf = defaultTokenLeaf(TOKEN_EARNINGS, strategy); + leaves[i] = rewardsCoordinator.calculateTokenLeafHash(leaf); + } + return leaves; + } + + function defaultTokenLeaf( + uint256 TOKEN_EARNINGS, + address strategy + ) internal view returns (IRewardsCoordinator.TokenTreeMerkleLeaf memory) { + IRewardsCoordinator.TokenTreeMerkleLeaf memory leaf = IRewardsCoordinator.TokenTreeMerkleLeaf({ + token: IStrategy(strategy).underlyingToken(), + cumulativeEarnings: TOKEN_EARNINGS + }); + return leaf; + } + + function writeLeavesToJson( + bytes32[] memory leaves, + bytes32[] memory tokenLeaves, + string memory filePath + ) internal { + string memory parent_object = "parent_object"; + vm.serializeBytes32(parent_object, "leaves", leaves); + string memory finalJson = vm.serializeBytes32(parent_object, "tokenLeaves", tokenLeaves); + vm.writeJson(finalJson, filePath); + } + + function parseLeavesFromJson(string memory filePath) internal view returns (PaymentLeaves memory) { + string memory json = vm.readFile(filePath); + bytes memory data = vm.parseJson(json); + return abi.decode(data, (PaymentLeaves)); + } + + function generateMerkleProof(bytes32[] memory leaves, uint256 index) internal pure returns (bytes memory) { + require(leaves.length > 0, "Leaves array cannot be empty"); + require(index < leaves.length, "Index out of bounds"); + + leaves = padLeaves(leaves); + + uint256 n = leaves.length; + uint256 depth = 0; + while ((1 << depth) < n) { + depth++; + } + + bytes32[] memory proof = new bytes32[](depth); + uint256 proofIndex = 0; + + for (uint256 i = 0; i < depth; i++) { + uint256 levelSize = (n + 1) / 2; + uint256 siblingIndex = (index % 2 == 0) ? index + 1 : index - 1; + + if (siblingIndex < n) { + proof[proofIndex] = leaves[siblingIndex]; + proofIndex++; + } + + for (uint256 j = 0; j < levelSize; j++) { + if (2 * j + 1 < n) { + leaves[j] = keccak256(abi.encodePacked(leaves[2 * j], leaves[2 * j + 1])); + } else { + leaves[j] = leaves[2 * j]; + } + } + + n = levelSize; + index /= 2; + } + + return abi.encodePacked(proof); + } + + /** + * @notice this function returns the merkle root of a tree created from a set of leaves using keccak256 as its hash function + * @param leaves the leaves of the merkle tree + * @return The computed Merkle root of the tree. + * @dev This pads to the next power of 2. very inefficient! just for POC + */ + function merkleizeKeccak(bytes32[] memory leaves) internal pure returns (bytes32) { + // uint256 paddedLength = 2; + // while(paddedLength < leaves.length) { + // paddedLength <<= 1; + // } + + // bytes32[] memory paddedLeaves = new bytes32[](paddedLength); + // for (uint256 i = 0; i < leaves.length; i++) { + // paddedLeaves[i] = leaves[i]; + // } + leaves = padLeaves(leaves); + + //there are half as many nodes in the layer above the leaves + uint256 numNodesInLayer = leaves.length / 2; + //create a layer to store the internal nodes + bytes32[] memory layer = new bytes32[](numNodesInLayer); + //fill the layer with the pairwise hashes of the leaves + for (uint256 i = 0; i < numNodesInLayer; i++) { + layer[i] = keccak256(abi.encodePacked(leaves[2 * i], leaves[2 * i + 1])); + } + //the next layer above has half as many nodes + numNodesInLayer /= 2; + //while we haven't computed the root + while (numNodesInLayer != 0) { + //overwrite the first numNodesInLayer nodes in layer with the pairwise hashes of their children + for (uint256 i = 0; i < numNodesInLayer; i++) { + layer[i] = keccak256(abi.encodePacked(layer[2 * i], layer[2 * i + 1])); + } + //the next layer above has half as many nodes + numNodesInLayer /= 2; + } + //the first node in the layer is the root + return layer[0]; + } + + function padLeaves(bytes32[] memory leaves) internal pure returns (bytes32[] memory) { + uint256 paddedLength = 2; + while(paddedLength < leaves.length) { + paddedLength <<= 1; + } + + bytes32[] memory paddedLeaves = new bytes32[](paddedLength); + for (uint256 i = 0; i < leaves.length; i++) { + paddedLeaves[i] = leaves[i]; + } + return paddedLeaves; + } +} \ No newline at end of file diff --git a/avs/contracts/src/ReclaimServiceManager.sol b/avs/contracts/src/ReclaimServiceManager.sol index d0dfa0e1..acc0531a 100644 --- a/avs/contracts/src/ReclaimServiceManager.sol +++ b/avs/contracts/src/ReclaimServiceManager.sol @@ -10,6 +10,7 @@ import "@openzeppelin-upgrades/contracts/utils/cryptography/ECDSAUpgradeable.sol import "@eigenlayer/contracts/permissions/Pausable.sol"; import {IRegistryCoordinator} from "@eigenlayer-middleware/src/interfaces/IRegistryCoordinator.sol"; import {IStrategy} from "@eigenlayer/contracts/interfaces/IStrategy.sol"; +import {IRewardsCoordinator} from "@eigenlayer/contracts/interfaces/IRewardsCoordinator.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "./IReclaimServiceManager.sol"; import "./utils/Random.sol"; @@ -80,11 +81,10 @@ contract ReclaimServiceManager is function initialize( address initialOwner, - address _rewardsInitiator, address deployer, address strategy ) external initializer { - __ServiceManagerBase_init(initialOwner, _rewardsInitiator); + __ServiceManagerBase_init(initialOwner, address(this)); taskCreationMetadata = TaskCreationMetadata( // 30m 30 * 60, @@ -277,13 +277,54 @@ contract ReclaimServiceManager is // remove so it cannot be claimed again delete allTaskHashes[referenceTaskIndex]; - // TODO: distribute fees - - emit TaskCompleted(referenceTaskIndex, completedTask); + // distribute reward + _distributeReward(operatorAddrs, completedTask.task.feePaid); + + emit TaskCompleted(referenceTaskIndex, completedTask); } // HELPER + function _distributeReward(address[] memory operatorAddrs, uint256 reward) internal { + // distribute reward + IRewardsCoordinator coordinator = IRewardsCoordinator(rewardsCoordinator); + IERC20 token = getToken(); + + IRewardsCoordinator.StrategyAndMultiplier[] memory strats = new IRewardsCoordinator.StrategyAndMultiplier[](1); + strats[0].strategy = IStrategy(defaultStrategy); + strats[0].multiplier = 1; + + IRewardsCoordinator.OperatorReward[] memory ops = new IRewardsCoordinator.OperatorReward[](operatorAddrs.length); + uint256 perOpReward = reward / operatorAddrs.length; + for(uint i = 0; i < operatorAddrs.length; i++) { + ops[i].operator = operatorAddrs[i]; + ops[i].amount = perOpReward; + } + + IRewardsCoordinator.OperatorDirectedRewardsSubmission[] memory subs = new IRewardsCoordinator.OperatorDirectedRewardsSubmission[](1); + subs[0].strategiesAndMultipliers = strats; + subs[0].token = getToken(); + subs[0].operatorRewards = ops; + + // taken from hello-world example + uint32 calcIntervalS = coordinator.CALCULATION_INTERVAL_SECONDS(); + uint32 endStamp = coordinator.currRewardsCalculationEndTimestamp(); + if(endStamp == 0) { + subs[0].startTimestamp = uint32(block.timestamp) - (uint32(block.timestamp) % calcIntervalS); + } else { + subs[0].startTimestamp = endStamp - coordinator.MAX_REWARDS_DURATION() + calcIntervalS; + } + + // taken from hello-world example + subs[0].duration = 0; + subs[0].description = "Claim creation on AVS"; + + // call directly on rewardscoordinator, as this contract has already + // received the fees + token.approve(rewardsCoordinator, reward); + coordinator.createOperatorDirectedAVSRewardsSubmission(address(this), subs); + } + function encodeClaimRequest(ClaimRequest memory request) public pure returns (bytes memory) { return abi.encode(request); } diff --git a/avs/utils/contract-data-gen.sh b/avs/utils/contract-data-gen.sh index a62edb3c..0e496afa 100644 --- a/avs/utils/contract-data-gen.sh +++ b/avs/utils/contract-data-gen.sh @@ -5,4 +5,5 @@ typechain -- --target ethers-v5 --out-dir src/avs/contracts \ avs/contracts/out/AVSDirectory.sol/*.json \ avs/contracts/out/DelegationManager.sol/*.json \ avs/contracts/out/ECDSAStakeRegistry.sol/*.json \ - avs/contracts/out/ERC20Mock.sol/*.json \ No newline at end of file + avs/contracts/out/ERC20Mock.sol/*.json \ + avs/contracts/out/RewardsCoordinator.sol/*.json \ No newline at end of file diff --git a/package.json b/package.json index c14a86b2..99e15e06 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "update:avs-metadata": "npm run run:tsc -- src/scripts/update-avs-metadata.ts", "generate:avs-types": "sh ./avs/utils/contract-data-gen.sh", "start:chain": "sh ./avs/utils/anvil/start-anvil-chain-with-el-and-avs-deployed.sh", + "create:payments-root": "cd avs/contracts && forge script script/SetupPayments.s.sol --rpc-url http://localhost:8545 --broadcast -v --sender 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", "commitlint": "commitlint --edit", "download:zk-files": "node node_modules/@reclaimprotocol/zk-symmetric-crypto/lib/scripts/download-files", "generate:toprf-keys": "npm run run:tsc -- src/scripts/generate-toprf-keys.ts" diff --git a/src/avs/config.ts b/src/avs/config.ts index 1886cd8d..5f0aaaff 100644 --- a/src/avs/config.ts +++ b/src/avs/config.ts @@ -7,14 +7,16 @@ export const CHAIN_CONFIGS: { [key: string]: ChainConfig } = { contractAddress: '0x998abeb3e57409262ae5b751f60747921b33613e', delegationManagerAddress: '0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0', stakeRegistryAddress: '0x4826533b4897376654bb4d4ad88b7fafd0c98528', - avsDirectoryAddress: '0xdc64a140aa3e981100a9beca4e685f962f0cf6c9' + avsDirectoryAddress: '0xdc64a140aa3e981100a9beca4e685f962f0cf6c9', + rewardsCoordinatorAddress: '0x610178da211fef7d417bc0e6fed39f05609ad788', }, '17000': { rpcUrl: getEnvVariable('RPC_URL') || 'https://rpc.holesky.ethpandaops.io', contractAddress: '0x0861afc305999bfD3028dB66145395BdD7299366', delegationManagerAddress: '0xA44151489861Fe9e3055d95adC98FbD462B948e7', stakeRegistryAddress: '0xDa11C9Da04Ab02C4AF9374B27A5E727944D3E1dD', - avsDirectoryAddress: '0x055733000064333CaDDbC92763c58BF0192fFeBf' + avsDirectoryAddress: '0x055733000064333CaDDbC92763c58BF0192fFeBf', + rewardsCoordinatorAddress: '', } } diff --git a/src/avs/contracts/RewardsCoordinator.ts b/src/avs/contracts/RewardsCoordinator.ts new file mode 100644 index 00000000..256273e0 --- /dev/null +++ b/src/avs/contracts/RewardsCoordinator.ts @@ -0,0 +1,2502 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +} from "./common"; + +export declare namespace IRewardsCoordinator { + export type EarnerTreeMerkleLeafStruct = { + earner: string; + earnerTokenRoot: BytesLike; + }; + + export type EarnerTreeMerkleLeafStructOutput = [string, string] & { + earner: string; + earnerTokenRoot: string; + }; + + export type TokenTreeMerkleLeafStruct = { + token: string; + cumulativeEarnings: BigNumberish; + }; + + export type TokenTreeMerkleLeafStructOutput = [string, BigNumber] & { + token: string; + cumulativeEarnings: BigNumber; + }; + + export type RewardsMerkleClaimStruct = { + rootIndex: BigNumberish; + earnerIndex: BigNumberish; + earnerTreeProof: BytesLike; + earnerLeaf: IRewardsCoordinator.EarnerTreeMerkleLeafStruct; + tokenIndices: BigNumberish[]; + tokenTreeProofs: BytesLike[]; + tokenLeaves: IRewardsCoordinator.TokenTreeMerkleLeafStruct[]; + }; + + export type RewardsMerkleClaimStructOutput = [ + number, + number, + string, + IRewardsCoordinator.EarnerTreeMerkleLeafStructOutput, + number[], + string[], + IRewardsCoordinator.TokenTreeMerkleLeafStructOutput[] + ] & { + rootIndex: number; + earnerIndex: number; + earnerTreeProof: string; + earnerLeaf: IRewardsCoordinator.EarnerTreeMerkleLeafStructOutput; + tokenIndices: number[]; + tokenTreeProofs: string[]; + tokenLeaves: IRewardsCoordinator.TokenTreeMerkleLeafStructOutput[]; + }; + + export type StrategyAndMultiplierStruct = { + strategy: string; + multiplier: BigNumberish; + }; + + export type StrategyAndMultiplierStructOutput = [string, BigNumber] & { + strategy: string; + multiplier: BigNumber; + }; + + export type RewardsSubmissionStruct = { + strategiesAndMultipliers: IRewardsCoordinator.StrategyAndMultiplierStruct[]; + token: string; + amount: BigNumberish; + startTimestamp: BigNumberish; + duration: BigNumberish; + }; + + export type RewardsSubmissionStructOutput = [ + IRewardsCoordinator.StrategyAndMultiplierStructOutput[], + string, + BigNumber, + number, + number + ] & { + strategiesAndMultipliers: IRewardsCoordinator.StrategyAndMultiplierStructOutput[]; + token: string; + amount: BigNumber; + startTimestamp: number; + duration: number; + }; + + export type OperatorRewardStruct = { operator: string; amount: BigNumberish }; + + export type OperatorRewardStructOutput = [string, BigNumber] & { + operator: string; + amount: BigNumber; + }; + + export type OperatorDirectedRewardsSubmissionStruct = { + strategiesAndMultipliers: IRewardsCoordinator.StrategyAndMultiplierStruct[]; + token: string; + operatorRewards: IRewardsCoordinator.OperatorRewardStruct[]; + startTimestamp: BigNumberish; + duration: BigNumberish; + description: string; + }; + + export type OperatorDirectedRewardsSubmissionStructOutput = [ + IRewardsCoordinator.StrategyAndMultiplierStructOutput[], + string, + IRewardsCoordinator.OperatorRewardStructOutput[], + number, + number, + string + ] & { + strategiesAndMultipliers: IRewardsCoordinator.StrategyAndMultiplierStructOutput[]; + token: string; + operatorRewards: IRewardsCoordinator.OperatorRewardStructOutput[]; + startTimestamp: number; + duration: number; + description: string; + }; + + export type DistributionRootStruct = { + root: BytesLike; + rewardsCalculationEndTimestamp: BigNumberish; + activatedAt: BigNumberish; + disabled: boolean; + }; + + export type DistributionRootStructOutput = [ + string, + number, + number, + boolean + ] & { + root: string; + rewardsCalculationEndTimestamp: number; + activatedAt: number; + disabled: boolean; + }; +} + +export interface RewardsCoordinatorInterface extends utils.Interface { + functions: { + "CALCULATION_INTERVAL_SECONDS()": FunctionFragment; + "GENESIS_REWARDS_TIMESTAMP()": FunctionFragment; + "MAX_FUTURE_LENGTH()": FunctionFragment; + "MAX_RETROACTIVE_LENGTH()": FunctionFragment; + "MAX_REWARDS_DURATION()": FunctionFragment; + "activationDelay()": FunctionFragment; + "beaconChainETHStrategy()": FunctionFragment; + "calculateEarnerLeafHash((address,bytes32))": FunctionFragment; + "calculateTokenLeafHash((address,uint256))": FunctionFragment; + "checkClaim((uint32,uint32,bytes,(address,bytes32),uint32[],bytes[],(address,uint256)[]))": FunctionFragment; + "claimerFor(address)": FunctionFragment; + "createAVSRewardsSubmission(((address,uint96)[],address,uint256,uint32,uint32)[])": FunctionFragment; + "createOperatorDirectedAVSRewardsSubmission(address,((address,uint96)[],address,(address,uint256)[],uint32,uint32,string)[])": FunctionFragment; + "createRewardsForAllEarners(((address,uint96)[],address,uint256,uint32,uint32)[])": FunctionFragment; + "createRewardsForAllSubmission(((address,uint96)[],address,uint256,uint32,uint32)[])": FunctionFragment; + "cumulativeClaimed(address,address)": FunctionFragment; + "currRewardsCalculationEndTimestamp()": FunctionFragment; + "defaultOperatorSplitBips()": FunctionFragment; + "delegationManager()": FunctionFragment; + "disableRoot(uint32)": FunctionFragment; + "domainSeparator()": FunctionFragment; + "getCurrentClaimableDistributionRoot()": FunctionFragment; + "getCurrentDistributionRoot()": FunctionFragment; + "getDistributionRootAtIndex(uint256)": FunctionFragment; + "getDistributionRootsLength()": FunctionFragment; + "getOperatorAVSSplit(address,address)": FunctionFragment; + "getOperatorPISplit(address)": FunctionFragment; + "getRootIndexFromHash(bytes32)": FunctionFragment; + "initialize(address,address,uint256,address,uint32,uint16)": FunctionFragment; + "isAVSRewardsSubmissionHash(address,bytes32)": FunctionFragment; + "isOperatorDirectedAVSRewardsSubmissionHash(address,bytes32)": FunctionFragment; + "isRewardsForAllSubmitter(address)": FunctionFragment; + "isRewardsSubmissionForAllEarnersHash(address,bytes32)": FunctionFragment; + "isRewardsSubmissionForAllHash(address,bytes32)": FunctionFragment; + "owner()": FunctionFragment; + "pause(uint256)": FunctionFragment; + "pauseAll()": FunctionFragment; + "paused(uint8)": FunctionFragment; + "paused()": FunctionFragment; + "pauserRegistry()": FunctionFragment; + "processClaim((uint32,uint32,bytes,(address,bytes32),uint32[],bytes[],(address,uint256)[]),address)": FunctionFragment; + "processClaims((uint32,uint32,bytes,(address,bytes32),uint32[],bytes[],(address,uint256)[])[],address)": FunctionFragment; + "renounceOwnership()": FunctionFragment; + "rewardsUpdater()": FunctionFragment; + "setActivationDelay(uint32)": FunctionFragment; + "setClaimerFor(address)": FunctionFragment; + "setDefaultOperatorSplit(uint16)": FunctionFragment; + "setOperatorAVSSplit(address,address,uint16)": FunctionFragment; + "setOperatorPISplit(address,uint16)": FunctionFragment; + "setPauserRegistry(address)": FunctionFragment; + "setRewardsForAllSubmitter(address,bool)": FunctionFragment; + "setRewardsUpdater(address)": FunctionFragment; + "strategyManager()": FunctionFragment; + "submissionNonce(address)": FunctionFragment; + "submitRoot(bytes32,uint32)": FunctionFragment; + "transferOwnership(address)": FunctionFragment; + "unpause(uint256)": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "CALCULATION_INTERVAL_SECONDS" + | "GENESIS_REWARDS_TIMESTAMP" + | "MAX_FUTURE_LENGTH" + | "MAX_RETROACTIVE_LENGTH" + | "MAX_REWARDS_DURATION" + | "activationDelay" + | "beaconChainETHStrategy" + | "calculateEarnerLeafHash" + | "calculateTokenLeafHash" + | "checkClaim" + | "claimerFor" + | "createAVSRewardsSubmission" + | "createOperatorDirectedAVSRewardsSubmission" + | "createRewardsForAllEarners" + | "createRewardsForAllSubmission" + | "cumulativeClaimed" + | "currRewardsCalculationEndTimestamp" + | "defaultOperatorSplitBips" + | "delegationManager" + | "disableRoot" + | "domainSeparator" + | "getCurrentClaimableDistributionRoot" + | "getCurrentDistributionRoot" + | "getDistributionRootAtIndex" + | "getDistributionRootsLength" + | "getOperatorAVSSplit" + | "getOperatorPISplit" + | "getRootIndexFromHash" + | "initialize" + | "isAVSRewardsSubmissionHash" + | "isOperatorDirectedAVSRewardsSubmissionHash" + | "isRewardsForAllSubmitter" + | "isRewardsSubmissionForAllEarnersHash" + | "isRewardsSubmissionForAllHash" + | "owner" + | "pause" + | "pauseAll" + | "paused(uint8)" + | "paused()" + | "pauserRegistry" + | "processClaim" + | "processClaims" + | "renounceOwnership" + | "rewardsUpdater" + | "setActivationDelay" + | "setClaimerFor" + | "setDefaultOperatorSplit" + | "setOperatorAVSSplit" + | "setOperatorPISplit" + | "setPauserRegistry" + | "setRewardsForAllSubmitter" + | "setRewardsUpdater" + | "strategyManager" + | "submissionNonce" + | "submitRoot" + | "transferOwnership" + | "unpause" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "CALCULATION_INTERVAL_SECONDS", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "GENESIS_REWARDS_TIMESTAMP", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "MAX_FUTURE_LENGTH", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "MAX_RETROACTIVE_LENGTH", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "MAX_REWARDS_DURATION", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "activationDelay", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "beaconChainETHStrategy", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "calculateEarnerLeafHash", + values: [IRewardsCoordinator.EarnerTreeMerkleLeafStruct] + ): string; + encodeFunctionData( + functionFragment: "calculateTokenLeafHash", + values: [IRewardsCoordinator.TokenTreeMerkleLeafStruct] + ): string; + encodeFunctionData( + functionFragment: "checkClaim", + values: [IRewardsCoordinator.RewardsMerkleClaimStruct] + ): string; + encodeFunctionData(functionFragment: "claimerFor", values: [string]): string; + encodeFunctionData( + functionFragment: "createAVSRewardsSubmission", + values: [IRewardsCoordinator.RewardsSubmissionStruct[]] + ): string; + encodeFunctionData( + functionFragment: "createOperatorDirectedAVSRewardsSubmission", + values: [ + string, + IRewardsCoordinator.OperatorDirectedRewardsSubmissionStruct[] + ] + ): string; + encodeFunctionData( + functionFragment: "createRewardsForAllEarners", + values: [IRewardsCoordinator.RewardsSubmissionStruct[]] + ): string; + encodeFunctionData( + functionFragment: "createRewardsForAllSubmission", + values: [IRewardsCoordinator.RewardsSubmissionStruct[]] + ): string; + encodeFunctionData( + functionFragment: "cumulativeClaimed", + values: [string, string] + ): string; + encodeFunctionData( + functionFragment: "currRewardsCalculationEndTimestamp", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "defaultOperatorSplitBips", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "delegationManager", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "disableRoot", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "domainSeparator", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getCurrentClaimableDistributionRoot", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getCurrentDistributionRoot", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getDistributionRootAtIndex", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getDistributionRootsLength", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getOperatorAVSSplit", + values: [string, string] + ): string; + encodeFunctionData( + functionFragment: "getOperatorPISplit", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "getRootIndexFromHash", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "initialize", + values: [string, string, BigNumberish, string, BigNumberish, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "isAVSRewardsSubmissionHash", + values: [string, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "isOperatorDirectedAVSRewardsSubmissionHash", + values: [string, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "isRewardsForAllSubmitter", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "isRewardsSubmissionForAllEarnersHash", + values: [string, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "isRewardsSubmissionForAllHash", + values: [string, BytesLike] + ): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData(functionFragment: "pause", values: [BigNumberish]): string; + encodeFunctionData(functionFragment: "pauseAll", values?: undefined): string; + encodeFunctionData( + functionFragment: "paused(uint8)", + values: [BigNumberish] + ): string; + encodeFunctionData(functionFragment: "paused()", values?: undefined): string; + encodeFunctionData( + functionFragment: "pauserRegistry", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "processClaim", + values: [IRewardsCoordinator.RewardsMerkleClaimStruct, string] + ): string; + encodeFunctionData( + functionFragment: "processClaims", + values: [IRewardsCoordinator.RewardsMerkleClaimStruct[], string] + ): string; + encodeFunctionData( + functionFragment: "renounceOwnership", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "rewardsUpdater", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "setActivationDelay", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "setClaimerFor", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "setDefaultOperatorSplit", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "setOperatorAVSSplit", + values: [string, string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "setOperatorPISplit", + values: [string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "setPauserRegistry", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "setRewardsForAllSubmitter", + values: [string, boolean] + ): string; + encodeFunctionData( + functionFragment: "setRewardsUpdater", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "strategyManager", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "submissionNonce", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "submitRoot", + values: [BytesLike, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "unpause", + values: [BigNumberish] + ): string; + + decodeFunctionResult( + functionFragment: "CALCULATION_INTERVAL_SECONDS", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "GENESIS_REWARDS_TIMESTAMP", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "MAX_FUTURE_LENGTH", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "MAX_RETROACTIVE_LENGTH", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "MAX_REWARDS_DURATION", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "activationDelay", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "beaconChainETHStrategy", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "calculateEarnerLeafHash", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "calculateTokenLeafHash", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "checkClaim", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "claimerFor", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "createAVSRewardsSubmission", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "createOperatorDirectedAVSRewardsSubmission", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "createRewardsForAllEarners", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "createRewardsForAllSubmission", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "cumulativeClaimed", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "currRewardsCalculationEndTimestamp", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "defaultOperatorSplitBips", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "delegationManager", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "disableRoot", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "domainSeparator", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getCurrentClaimableDistributionRoot", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getCurrentDistributionRoot", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getDistributionRootAtIndex", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getDistributionRootsLength", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getOperatorAVSSplit", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getOperatorPISplit", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRootIndexFromHash", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "isAVSRewardsSubmissionHash", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isOperatorDirectedAVSRewardsSubmissionHash", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isRewardsForAllSubmitter", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isRewardsSubmissionForAllEarnersHash", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isRewardsSubmissionForAllHash", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "pause", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "pauseAll", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "paused(uint8)", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "paused()", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "pauserRegistry", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "processClaim", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "processClaims", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "renounceOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "rewardsUpdater", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setActivationDelay", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setClaimerFor", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setDefaultOperatorSplit", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setOperatorAVSSplit", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setOperatorPISplit", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setPauserRegistry", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setRewardsForAllSubmitter", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setRewardsUpdater", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "strategyManager", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "submissionNonce", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "submitRoot", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "transferOwnership", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "unpause", data: BytesLike): Result; + + events: { + "AVSRewardsSubmissionCreated(address,uint256,bytes32,((address,uint96)[],address,uint256,uint32,uint32))": EventFragment; + "ActivationDelaySet(uint32,uint32)": EventFragment; + "ClaimerForSet(address,address,address)": EventFragment; + "DefaultOperatorSplitBipsSet(uint16,uint16)": EventFragment; + "DistributionRootDisabled(uint32)": EventFragment; + "DistributionRootSubmitted(uint32,bytes32,uint32,uint32)": EventFragment; + "Initialized(uint8)": EventFragment; + "OperatorAVSSplitBipsSet(address,address,address,uint32,uint16,uint16)": EventFragment; + "OperatorDirectedAVSRewardsSubmissionCreated(address,address,bytes32,uint256,((address,uint96)[],address,(address,uint256)[],uint32,uint32,string))": EventFragment; + "OperatorPISplitBipsSet(address,address,uint32,uint16,uint16)": EventFragment; + "OwnershipTransferred(address,address)": EventFragment; + "Paused(address,uint256)": EventFragment; + "PauserRegistrySet(address,address)": EventFragment; + "RewardsClaimed(bytes32,address,address,address,address,uint256)": EventFragment; + "RewardsForAllSubmitterSet(address,bool,bool)": EventFragment; + "RewardsSubmissionForAllCreated(address,uint256,bytes32,((address,uint96)[],address,uint256,uint32,uint32))": EventFragment; + "RewardsSubmissionForAllEarnersCreated(address,uint256,bytes32,((address,uint96)[],address,uint256,uint32,uint32))": EventFragment; + "RewardsUpdaterSet(address,address)": EventFragment; + "Unpaused(address,uint256)": EventFragment; + }; + + getEvent( + nameOrSignatureOrTopic: "AVSRewardsSubmissionCreated" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "ActivationDelaySet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ClaimerForSet"): EventFragment; + getEvent( + nameOrSignatureOrTopic: "DefaultOperatorSplitBipsSet" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "DistributionRootDisabled"): EventFragment; + getEvent(nameOrSignatureOrTopic: "DistributionRootSubmitted"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OperatorAVSSplitBipsSet"): EventFragment; + getEvent( + nameOrSignatureOrTopic: "OperatorDirectedAVSRewardsSubmissionCreated" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "OperatorPISplitBipsSet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Paused"): EventFragment; + getEvent(nameOrSignatureOrTopic: "PauserRegistrySet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RewardsClaimed"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RewardsForAllSubmitterSet"): EventFragment; + getEvent( + nameOrSignatureOrTopic: "RewardsSubmissionForAllCreated" + ): EventFragment; + getEvent( + nameOrSignatureOrTopic: "RewardsSubmissionForAllEarnersCreated" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "RewardsUpdaterSet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Unpaused"): EventFragment; +} + +export interface AVSRewardsSubmissionCreatedEventObject { + avs: string; + submissionNonce: BigNumber; + rewardsSubmissionHash: string; + rewardsSubmission: IRewardsCoordinator.RewardsSubmissionStructOutput; +} +export type AVSRewardsSubmissionCreatedEvent = TypedEvent< + [ + string, + BigNumber, + string, + IRewardsCoordinator.RewardsSubmissionStructOutput + ], + AVSRewardsSubmissionCreatedEventObject +>; + +export type AVSRewardsSubmissionCreatedEventFilter = + TypedEventFilter; + +export interface ActivationDelaySetEventObject { + oldActivationDelay: number; + newActivationDelay: number; +} +export type ActivationDelaySetEvent = TypedEvent< + [number, number], + ActivationDelaySetEventObject +>; + +export type ActivationDelaySetEventFilter = + TypedEventFilter; + +export interface ClaimerForSetEventObject { + earner: string; + oldClaimer: string; + claimer: string; +} +export type ClaimerForSetEvent = TypedEvent< + [string, string, string], + ClaimerForSetEventObject +>; + +export type ClaimerForSetEventFilter = TypedEventFilter; + +export interface DefaultOperatorSplitBipsSetEventObject { + oldDefaultOperatorSplitBips: number; + newDefaultOperatorSplitBips: number; +} +export type DefaultOperatorSplitBipsSetEvent = TypedEvent< + [number, number], + DefaultOperatorSplitBipsSetEventObject +>; + +export type DefaultOperatorSplitBipsSetEventFilter = + TypedEventFilter; + +export interface DistributionRootDisabledEventObject { + rootIndex: number; +} +export type DistributionRootDisabledEvent = TypedEvent< + [number], + DistributionRootDisabledEventObject +>; + +export type DistributionRootDisabledEventFilter = + TypedEventFilter; + +export interface DistributionRootSubmittedEventObject { + rootIndex: number; + root: string; + rewardsCalculationEndTimestamp: number; + activatedAt: number; +} +export type DistributionRootSubmittedEvent = TypedEvent< + [number, string, number, number], + DistributionRootSubmittedEventObject +>; + +export type DistributionRootSubmittedEventFilter = + TypedEventFilter; + +export interface InitializedEventObject { + version: number; +} +export type InitializedEvent = TypedEvent<[number], InitializedEventObject>; + +export type InitializedEventFilter = TypedEventFilter; + +export interface OperatorAVSSplitBipsSetEventObject { + caller: string; + operator: string; + avs: string; + activatedAt: number; + oldOperatorAVSSplitBips: number; + newOperatorAVSSplitBips: number; +} +export type OperatorAVSSplitBipsSetEvent = TypedEvent< + [string, string, string, number, number, number], + OperatorAVSSplitBipsSetEventObject +>; + +export type OperatorAVSSplitBipsSetEventFilter = + TypedEventFilter; + +export interface OperatorDirectedAVSRewardsSubmissionCreatedEventObject { + caller: string; + avs: string; + operatorDirectedRewardsSubmissionHash: string; + submissionNonce: BigNumber; + operatorDirectedRewardsSubmission: IRewardsCoordinator.OperatorDirectedRewardsSubmissionStructOutput; +} +export type OperatorDirectedAVSRewardsSubmissionCreatedEvent = TypedEvent< + [ + string, + string, + string, + BigNumber, + IRewardsCoordinator.OperatorDirectedRewardsSubmissionStructOutput + ], + OperatorDirectedAVSRewardsSubmissionCreatedEventObject +>; + +export type OperatorDirectedAVSRewardsSubmissionCreatedEventFilter = + TypedEventFilter; + +export interface OperatorPISplitBipsSetEventObject { + caller: string; + operator: string; + activatedAt: number; + oldOperatorPISplitBips: number; + newOperatorPISplitBips: number; +} +export type OperatorPISplitBipsSetEvent = TypedEvent< + [string, string, number, number, number], + OperatorPISplitBipsSetEventObject +>; + +export type OperatorPISplitBipsSetEventFilter = + TypedEventFilter; + +export interface OwnershipTransferredEventObject { + previousOwner: string; + newOwner: string; +} +export type OwnershipTransferredEvent = TypedEvent< + [string, string], + OwnershipTransferredEventObject +>; + +export type OwnershipTransferredEventFilter = + TypedEventFilter; + +export interface PausedEventObject { + account: string; + newPausedStatus: BigNumber; +} +export type PausedEvent = TypedEvent<[string, BigNumber], PausedEventObject>; + +export type PausedEventFilter = TypedEventFilter; + +export interface PauserRegistrySetEventObject { + pauserRegistry: string; + newPauserRegistry: string; +} +export type PauserRegistrySetEvent = TypedEvent< + [string, string], + PauserRegistrySetEventObject +>; + +export type PauserRegistrySetEventFilter = + TypedEventFilter; + +export interface RewardsClaimedEventObject { + root: string; + earner: string; + claimer: string; + recipient: string; + token: string; + claimedAmount: BigNumber; +} +export type RewardsClaimedEvent = TypedEvent< + [string, string, string, string, string, BigNumber], + RewardsClaimedEventObject +>; + +export type RewardsClaimedEventFilter = TypedEventFilter; + +export interface RewardsForAllSubmitterSetEventObject { + rewardsForAllSubmitter: string; + oldValue: boolean; + newValue: boolean; +} +export type RewardsForAllSubmitterSetEvent = TypedEvent< + [string, boolean, boolean], + RewardsForAllSubmitterSetEventObject +>; + +export type RewardsForAllSubmitterSetEventFilter = + TypedEventFilter; + +export interface RewardsSubmissionForAllCreatedEventObject { + submitter: string; + submissionNonce: BigNumber; + rewardsSubmissionHash: string; + rewardsSubmission: IRewardsCoordinator.RewardsSubmissionStructOutput; +} +export type RewardsSubmissionForAllCreatedEvent = TypedEvent< + [ + string, + BigNumber, + string, + IRewardsCoordinator.RewardsSubmissionStructOutput + ], + RewardsSubmissionForAllCreatedEventObject +>; + +export type RewardsSubmissionForAllCreatedEventFilter = + TypedEventFilter; + +export interface RewardsSubmissionForAllEarnersCreatedEventObject { + tokenHopper: string; + submissionNonce: BigNumber; + rewardsSubmissionHash: string; + rewardsSubmission: IRewardsCoordinator.RewardsSubmissionStructOutput; +} +export type RewardsSubmissionForAllEarnersCreatedEvent = TypedEvent< + [ + string, + BigNumber, + string, + IRewardsCoordinator.RewardsSubmissionStructOutput + ], + RewardsSubmissionForAllEarnersCreatedEventObject +>; + +export type RewardsSubmissionForAllEarnersCreatedEventFilter = + TypedEventFilter; + +export interface RewardsUpdaterSetEventObject { + oldRewardsUpdater: string; + newRewardsUpdater: string; +} +export type RewardsUpdaterSetEvent = TypedEvent< + [string, string], + RewardsUpdaterSetEventObject +>; + +export type RewardsUpdaterSetEventFilter = + TypedEventFilter; + +export interface UnpausedEventObject { + account: string; + newPausedStatus: BigNumber; +} +export type UnpausedEvent = TypedEvent< + [string, BigNumber], + UnpausedEventObject +>; + +export type UnpausedEventFilter = TypedEventFilter; + +export interface RewardsCoordinator extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: RewardsCoordinatorInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + CALCULATION_INTERVAL_SECONDS(overrides?: CallOverrides): Promise<[number]>; + + GENESIS_REWARDS_TIMESTAMP(overrides?: CallOverrides): Promise<[number]>; + + MAX_FUTURE_LENGTH(overrides?: CallOverrides): Promise<[number]>; + + MAX_RETROACTIVE_LENGTH(overrides?: CallOverrides): Promise<[number]>; + + MAX_REWARDS_DURATION(overrides?: CallOverrides): Promise<[number]>; + + activationDelay(overrides?: CallOverrides): Promise<[number]>; + + beaconChainETHStrategy(overrides?: CallOverrides): Promise<[string]>; + + calculateEarnerLeafHash( + leaf: IRewardsCoordinator.EarnerTreeMerkleLeafStruct, + overrides?: CallOverrides + ): Promise<[string]>; + + calculateTokenLeafHash( + leaf: IRewardsCoordinator.TokenTreeMerkleLeafStruct, + overrides?: CallOverrides + ): Promise<[string]>; + + checkClaim( + claim: IRewardsCoordinator.RewardsMerkleClaimStruct, + overrides?: CallOverrides + ): Promise<[boolean]>; + + claimerFor(arg0: string, overrides?: CallOverrides): Promise<[string]>; + + createAVSRewardsSubmission( + rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createOperatorDirectedAVSRewardsSubmission( + avs: string, + operatorDirectedRewardsSubmissions: IRewardsCoordinator.OperatorDirectedRewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createRewardsForAllEarners( + rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createRewardsForAllSubmission( + rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + cumulativeClaimed( + arg0: string, + arg1: string, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + currRewardsCalculationEndTimestamp( + overrides?: CallOverrides + ): Promise<[number]>; + + defaultOperatorSplitBips(overrides?: CallOverrides): Promise<[number]>; + + delegationManager(overrides?: CallOverrides): Promise<[string]>; + + disableRoot( + rootIndex: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + domainSeparator(overrides?: CallOverrides): Promise<[string]>; + + getCurrentClaimableDistributionRoot( + overrides?: CallOverrides + ): Promise<[IRewardsCoordinator.DistributionRootStructOutput]>; + + getCurrentDistributionRoot( + overrides?: CallOverrides + ): Promise<[IRewardsCoordinator.DistributionRootStructOutput]>; + + getDistributionRootAtIndex( + index: BigNumberish, + overrides?: CallOverrides + ): Promise<[IRewardsCoordinator.DistributionRootStructOutput]>; + + getDistributionRootsLength(overrides?: CallOverrides): Promise<[BigNumber]>; + + getOperatorAVSSplit( + operator: string, + avs: string, + overrides?: CallOverrides + ): Promise<[number]>; + + getOperatorPISplit( + operator: string, + overrides?: CallOverrides + ): Promise<[number]>; + + getRootIndexFromHash( + rootHash: BytesLike, + overrides?: CallOverrides + ): Promise<[number]>; + + initialize( + initialOwner: string, + _pauserRegistry: string, + initialPausedStatus: BigNumberish, + _rewardsUpdater: string, + _activationDelay: BigNumberish, + _defaultSplitBips: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + isAVSRewardsSubmissionHash( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean]>; + + isOperatorDirectedAVSRewardsSubmissionHash( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean]>; + + isRewardsForAllSubmitter( + arg0: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + + isRewardsSubmissionForAllEarnersHash( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean]>; + + isRewardsSubmissionForAllHash( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean]>; + + owner(overrides?: CallOverrides): Promise<[string]>; + + pause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + pauseAll( + overrides?: Overrides & { from?: string } + ): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise<[boolean]>; + + "paused()"(overrides?: CallOverrides): Promise<[BigNumber]>; + + pauserRegistry(overrides?: CallOverrides): Promise<[string]>; + + processClaim( + claim: IRewardsCoordinator.RewardsMerkleClaimStruct, + recipient: string, + overrides?: Overrides & { from?: string } + ): Promise; + + processClaims( + claims: IRewardsCoordinator.RewardsMerkleClaimStruct[], + recipient: string, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + rewardsUpdater(overrides?: CallOverrides): Promise<[string]>; + + setActivationDelay( + _activationDelay: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setClaimerFor( + claimer: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setDefaultOperatorSplit( + split: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setOperatorAVSSplit( + operator: string, + avs: string, + split: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setOperatorPISplit( + operator: string, + split: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setPauserRegistry( + newPauserRegistry: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setRewardsForAllSubmitter( + _submitter: string, + _newValue: boolean, + overrides?: Overrides & { from?: string } + ): Promise; + + setRewardsUpdater( + _rewardsUpdater: string, + overrides?: Overrides & { from?: string } + ): Promise; + + strategyManager(overrides?: CallOverrides): Promise<[string]>; + + submissionNonce( + arg0: string, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + submitRoot( + root: BytesLike, + rewardsCalculationEndTimestamp: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + }; + + CALCULATION_INTERVAL_SECONDS(overrides?: CallOverrides): Promise; + + GENESIS_REWARDS_TIMESTAMP(overrides?: CallOverrides): Promise; + + MAX_FUTURE_LENGTH(overrides?: CallOverrides): Promise; + + MAX_RETROACTIVE_LENGTH(overrides?: CallOverrides): Promise; + + MAX_REWARDS_DURATION(overrides?: CallOverrides): Promise; + + activationDelay(overrides?: CallOverrides): Promise; + + beaconChainETHStrategy(overrides?: CallOverrides): Promise; + + calculateEarnerLeafHash( + leaf: IRewardsCoordinator.EarnerTreeMerkleLeafStruct, + overrides?: CallOverrides + ): Promise; + + calculateTokenLeafHash( + leaf: IRewardsCoordinator.TokenTreeMerkleLeafStruct, + overrides?: CallOverrides + ): Promise; + + checkClaim( + claim: IRewardsCoordinator.RewardsMerkleClaimStruct, + overrides?: CallOverrides + ): Promise; + + claimerFor(arg0: string, overrides?: CallOverrides): Promise; + + createAVSRewardsSubmission( + rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createOperatorDirectedAVSRewardsSubmission( + avs: string, + operatorDirectedRewardsSubmissions: IRewardsCoordinator.OperatorDirectedRewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createRewardsForAllEarners( + rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createRewardsForAllSubmission( + rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + cumulativeClaimed( + arg0: string, + arg1: string, + overrides?: CallOverrides + ): Promise; + + currRewardsCalculationEndTimestamp( + overrides?: CallOverrides + ): Promise; + + defaultOperatorSplitBips(overrides?: CallOverrides): Promise; + + delegationManager(overrides?: CallOverrides): Promise; + + disableRoot( + rootIndex: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + domainSeparator(overrides?: CallOverrides): Promise; + + getCurrentClaimableDistributionRoot( + overrides?: CallOverrides + ): Promise; + + getCurrentDistributionRoot( + overrides?: CallOverrides + ): Promise; + + getDistributionRootAtIndex( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getDistributionRootsLength(overrides?: CallOverrides): Promise; + + getOperatorAVSSplit( + operator: string, + avs: string, + overrides?: CallOverrides + ): Promise; + + getOperatorPISplit( + operator: string, + overrides?: CallOverrides + ): Promise; + + getRootIndexFromHash( + rootHash: BytesLike, + overrides?: CallOverrides + ): Promise; + + initialize( + initialOwner: string, + _pauserRegistry: string, + initialPausedStatus: BigNumberish, + _rewardsUpdater: string, + _activationDelay: BigNumberish, + _defaultSplitBips: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + isAVSRewardsSubmissionHash( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + isOperatorDirectedAVSRewardsSubmissionHash( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + isRewardsForAllSubmitter( + arg0: string, + overrides?: CallOverrides + ): Promise; + + isRewardsSubmissionForAllEarnersHash( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + isRewardsSubmissionForAllHash( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + pauseAll( + overrides?: Overrides & { from?: string } + ): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + pauserRegistry(overrides?: CallOverrides): Promise; + + processClaim( + claim: IRewardsCoordinator.RewardsMerkleClaimStruct, + recipient: string, + overrides?: Overrides & { from?: string } + ): Promise; + + processClaims( + claims: IRewardsCoordinator.RewardsMerkleClaimStruct[], + recipient: string, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + rewardsUpdater(overrides?: CallOverrides): Promise; + + setActivationDelay( + _activationDelay: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setClaimerFor( + claimer: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setDefaultOperatorSplit( + split: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setOperatorAVSSplit( + operator: string, + avs: string, + split: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setOperatorPISplit( + operator: string, + split: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setPauserRegistry( + newPauserRegistry: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setRewardsForAllSubmitter( + _submitter: string, + _newValue: boolean, + overrides?: Overrides & { from?: string } + ): Promise; + + setRewardsUpdater( + _rewardsUpdater: string, + overrides?: Overrides & { from?: string } + ): Promise; + + strategyManager(overrides?: CallOverrides): Promise; + + submissionNonce(arg0: string, overrides?: CallOverrides): Promise; + + submitRoot( + root: BytesLike, + rewardsCalculationEndTimestamp: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + callStatic: { + CALCULATION_INTERVAL_SECONDS(overrides?: CallOverrides): Promise; + + GENESIS_REWARDS_TIMESTAMP(overrides?: CallOverrides): Promise; + + MAX_FUTURE_LENGTH(overrides?: CallOverrides): Promise; + + MAX_RETROACTIVE_LENGTH(overrides?: CallOverrides): Promise; + + MAX_REWARDS_DURATION(overrides?: CallOverrides): Promise; + + activationDelay(overrides?: CallOverrides): Promise; + + beaconChainETHStrategy(overrides?: CallOverrides): Promise; + + calculateEarnerLeafHash( + leaf: IRewardsCoordinator.EarnerTreeMerkleLeafStruct, + overrides?: CallOverrides + ): Promise; + + calculateTokenLeafHash( + leaf: IRewardsCoordinator.TokenTreeMerkleLeafStruct, + overrides?: CallOverrides + ): Promise; + + checkClaim( + claim: IRewardsCoordinator.RewardsMerkleClaimStruct, + overrides?: CallOverrides + ): Promise; + + claimerFor(arg0: string, overrides?: CallOverrides): Promise; + + createAVSRewardsSubmission( + rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + overrides?: CallOverrides + ): Promise; + + createOperatorDirectedAVSRewardsSubmission( + avs: string, + operatorDirectedRewardsSubmissions: IRewardsCoordinator.OperatorDirectedRewardsSubmissionStruct[], + overrides?: CallOverrides + ): Promise; + + createRewardsForAllEarners( + rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + overrides?: CallOverrides + ): Promise; + + createRewardsForAllSubmission( + rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + overrides?: CallOverrides + ): Promise; + + cumulativeClaimed( + arg0: string, + arg1: string, + overrides?: CallOverrides + ): Promise; + + currRewardsCalculationEndTimestamp( + overrides?: CallOverrides + ): Promise; + + defaultOperatorSplitBips(overrides?: CallOverrides): Promise; + + delegationManager(overrides?: CallOverrides): Promise; + + disableRoot( + rootIndex: BigNumberish, + overrides?: CallOverrides + ): Promise; + + domainSeparator(overrides?: CallOverrides): Promise; + + getCurrentClaimableDistributionRoot( + overrides?: CallOverrides + ): Promise; + + getCurrentDistributionRoot( + overrides?: CallOverrides + ): Promise; + + getDistributionRootAtIndex( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getDistributionRootsLength(overrides?: CallOverrides): Promise; + + getOperatorAVSSplit( + operator: string, + avs: string, + overrides?: CallOverrides + ): Promise; + + getOperatorPISplit( + operator: string, + overrides?: CallOverrides + ): Promise; + + getRootIndexFromHash( + rootHash: BytesLike, + overrides?: CallOverrides + ): Promise; + + initialize( + initialOwner: string, + _pauserRegistry: string, + initialPausedStatus: BigNumberish, + _rewardsUpdater: string, + _activationDelay: BigNumberish, + _defaultSplitBips: BigNumberish, + overrides?: CallOverrides + ): Promise; + + isAVSRewardsSubmissionHash( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + isOperatorDirectedAVSRewardsSubmissionHash( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + isRewardsForAllSubmitter( + arg0: string, + overrides?: CallOverrides + ): Promise; + + isRewardsSubmissionForAllEarnersHash( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + isRewardsSubmissionForAllHash( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pause( + newPausedStatus: BigNumberish, + overrides?: CallOverrides + ): Promise; + + pauseAll(overrides?: CallOverrides): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + pauserRegistry(overrides?: CallOverrides): Promise; + + processClaim( + claim: IRewardsCoordinator.RewardsMerkleClaimStruct, + recipient: string, + overrides?: CallOverrides + ): Promise; + + processClaims( + claims: IRewardsCoordinator.RewardsMerkleClaimStruct[], + recipient: string, + overrides?: CallOverrides + ): Promise; + + renounceOwnership(overrides?: CallOverrides): Promise; + + rewardsUpdater(overrides?: CallOverrides): Promise; + + setActivationDelay( + _activationDelay: BigNumberish, + overrides?: CallOverrides + ): Promise; + + setClaimerFor(claimer: string, overrides?: CallOverrides): Promise; + + setDefaultOperatorSplit( + split: BigNumberish, + overrides?: CallOverrides + ): Promise; + + setOperatorAVSSplit( + operator: string, + avs: string, + split: BigNumberish, + overrides?: CallOverrides + ): Promise; + + setOperatorPISplit( + operator: string, + split: BigNumberish, + overrides?: CallOverrides + ): Promise; + + setPauserRegistry( + newPauserRegistry: string, + overrides?: CallOverrides + ): Promise; + + setRewardsForAllSubmitter( + _submitter: string, + _newValue: boolean, + overrides?: CallOverrides + ): Promise; + + setRewardsUpdater( + _rewardsUpdater: string, + overrides?: CallOverrides + ): Promise; + + strategyManager(overrides?: CallOverrides): Promise; + + submissionNonce( + arg0: string, + overrides?: CallOverrides + ): Promise; + + submitRoot( + root: BytesLike, + rewardsCalculationEndTimestamp: BigNumberish, + overrides?: CallOverrides + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: CallOverrides + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "AVSRewardsSubmissionCreated(address,uint256,bytes32,((address,uint96)[],address,uint256,uint32,uint32))"( + avs?: string | null, + submissionNonce?: BigNumberish | null, + rewardsSubmissionHash?: BytesLike | null, + rewardsSubmission?: null + ): AVSRewardsSubmissionCreatedEventFilter; + AVSRewardsSubmissionCreated( + avs?: string | null, + submissionNonce?: BigNumberish | null, + rewardsSubmissionHash?: BytesLike | null, + rewardsSubmission?: null + ): AVSRewardsSubmissionCreatedEventFilter; + + "ActivationDelaySet(uint32,uint32)"( + oldActivationDelay?: null, + newActivationDelay?: null + ): ActivationDelaySetEventFilter; + ActivationDelaySet( + oldActivationDelay?: null, + newActivationDelay?: null + ): ActivationDelaySetEventFilter; + + "ClaimerForSet(address,address,address)"( + earner?: string | null, + oldClaimer?: string | null, + claimer?: string | null + ): ClaimerForSetEventFilter; + ClaimerForSet( + earner?: string | null, + oldClaimer?: string | null, + claimer?: string | null + ): ClaimerForSetEventFilter; + + "DefaultOperatorSplitBipsSet(uint16,uint16)"( + oldDefaultOperatorSplitBips?: null, + newDefaultOperatorSplitBips?: null + ): DefaultOperatorSplitBipsSetEventFilter; + DefaultOperatorSplitBipsSet( + oldDefaultOperatorSplitBips?: null, + newDefaultOperatorSplitBips?: null + ): DefaultOperatorSplitBipsSetEventFilter; + + "DistributionRootDisabled(uint32)"( + rootIndex?: BigNumberish | null + ): DistributionRootDisabledEventFilter; + DistributionRootDisabled( + rootIndex?: BigNumberish | null + ): DistributionRootDisabledEventFilter; + + "DistributionRootSubmitted(uint32,bytes32,uint32,uint32)"( + rootIndex?: BigNumberish | null, + root?: BytesLike | null, + rewardsCalculationEndTimestamp?: BigNumberish | null, + activatedAt?: null + ): DistributionRootSubmittedEventFilter; + DistributionRootSubmitted( + rootIndex?: BigNumberish | null, + root?: BytesLike | null, + rewardsCalculationEndTimestamp?: BigNumberish | null, + activatedAt?: null + ): DistributionRootSubmittedEventFilter; + + "Initialized(uint8)"(version?: null): InitializedEventFilter; + Initialized(version?: null): InitializedEventFilter; + + "OperatorAVSSplitBipsSet(address,address,address,uint32,uint16,uint16)"( + caller?: string | null, + operator?: string | null, + avs?: string | null, + activatedAt?: null, + oldOperatorAVSSplitBips?: null, + newOperatorAVSSplitBips?: null + ): OperatorAVSSplitBipsSetEventFilter; + OperatorAVSSplitBipsSet( + caller?: string | null, + operator?: string | null, + avs?: string | null, + activatedAt?: null, + oldOperatorAVSSplitBips?: null, + newOperatorAVSSplitBips?: null + ): OperatorAVSSplitBipsSetEventFilter; + + "OperatorDirectedAVSRewardsSubmissionCreated(address,address,bytes32,uint256,((address,uint96)[],address,(address,uint256)[],uint32,uint32,string))"( + caller?: string | null, + avs?: string | null, + operatorDirectedRewardsSubmissionHash?: BytesLike | null, + submissionNonce?: null, + operatorDirectedRewardsSubmission?: null + ): OperatorDirectedAVSRewardsSubmissionCreatedEventFilter; + OperatorDirectedAVSRewardsSubmissionCreated( + caller?: string | null, + avs?: string | null, + operatorDirectedRewardsSubmissionHash?: BytesLike | null, + submissionNonce?: null, + operatorDirectedRewardsSubmission?: null + ): OperatorDirectedAVSRewardsSubmissionCreatedEventFilter; + + "OperatorPISplitBipsSet(address,address,uint32,uint16,uint16)"( + caller?: string | null, + operator?: string | null, + activatedAt?: null, + oldOperatorPISplitBips?: null, + newOperatorPISplitBips?: null + ): OperatorPISplitBipsSetEventFilter; + OperatorPISplitBipsSet( + caller?: string | null, + operator?: string | null, + activatedAt?: null, + oldOperatorPISplitBips?: null, + newOperatorPISplitBips?: null + ): OperatorPISplitBipsSetEventFilter; + + "OwnershipTransferred(address,address)"( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + OwnershipTransferred( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + + "Paused(address,uint256)"( + account?: string | null, + newPausedStatus?: null + ): PausedEventFilter; + Paused(account?: string | null, newPausedStatus?: null): PausedEventFilter; + + "PauserRegistrySet(address,address)"( + pauserRegistry?: null, + newPauserRegistry?: null + ): PauserRegistrySetEventFilter; + PauserRegistrySet( + pauserRegistry?: null, + newPauserRegistry?: null + ): PauserRegistrySetEventFilter; + + "RewardsClaimed(bytes32,address,address,address,address,uint256)"( + root?: null, + earner?: string | null, + claimer?: string | null, + recipient?: string | null, + token?: null, + claimedAmount?: null + ): RewardsClaimedEventFilter; + RewardsClaimed( + root?: null, + earner?: string | null, + claimer?: string | null, + recipient?: string | null, + token?: null, + claimedAmount?: null + ): RewardsClaimedEventFilter; + + "RewardsForAllSubmitterSet(address,bool,bool)"( + rewardsForAllSubmitter?: string | null, + oldValue?: boolean | null, + newValue?: boolean | null + ): RewardsForAllSubmitterSetEventFilter; + RewardsForAllSubmitterSet( + rewardsForAllSubmitter?: string | null, + oldValue?: boolean | null, + newValue?: boolean | null + ): RewardsForAllSubmitterSetEventFilter; + + "RewardsSubmissionForAllCreated(address,uint256,bytes32,((address,uint96)[],address,uint256,uint32,uint32))"( + submitter?: string | null, + submissionNonce?: BigNumberish | null, + rewardsSubmissionHash?: BytesLike | null, + rewardsSubmission?: null + ): RewardsSubmissionForAllCreatedEventFilter; + RewardsSubmissionForAllCreated( + submitter?: string | null, + submissionNonce?: BigNumberish | null, + rewardsSubmissionHash?: BytesLike | null, + rewardsSubmission?: null + ): RewardsSubmissionForAllCreatedEventFilter; + + "RewardsSubmissionForAllEarnersCreated(address,uint256,bytes32,((address,uint96)[],address,uint256,uint32,uint32))"( + tokenHopper?: string | null, + submissionNonce?: BigNumberish | null, + rewardsSubmissionHash?: BytesLike | null, + rewardsSubmission?: null + ): RewardsSubmissionForAllEarnersCreatedEventFilter; + RewardsSubmissionForAllEarnersCreated( + tokenHopper?: string | null, + submissionNonce?: BigNumberish | null, + rewardsSubmissionHash?: BytesLike | null, + rewardsSubmission?: null + ): RewardsSubmissionForAllEarnersCreatedEventFilter; + + "RewardsUpdaterSet(address,address)"( + oldRewardsUpdater?: string | null, + newRewardsUpdater?: string | null + ): RewardsUpdaterSetEventFilter; + RewardsUpdaterSet( + oldRewardsUpdater?: string | null, + newRewardsUpdater?: string | null + ): RewardsUpdaterSetEventFilter; + + "Unpaused(address,uint256)"( + account?: string | null, + newPausedStatus?: null + ): UnpausedEventFilter; + Unpaused( + account?: string | null, + newPausedStatus?: null + ): UnpausedEventFilter; + }; + + estimateGas: { + CALCULATION_INTERVAL_SECONDS(overrides?: CallOverrides): Promise; + + GENESIS_REWARDS_TIMESTAMP(overrides?: CallOverrides): Promise; + + MAX_FUTURE_LENGTH(overrides?: CallOverrides): Promise; + + MAX_RETROACTIVE_LENGTH(overrides?: CallOverrides): Promise; + + MAX_REWARDS_DURATION(overrides?: CallOverrides): Promise; + + activationDelay(overrides?: CallOverrides): Promise; + + beaconChainETHStrategy(overrides?: CallOverrides): Promise; + + calculateEarnerLeafHash( + leaf: IRewardsCoordinator.EarnerTreeMerkleLeafStruct, + overrides?: CallOverrides + ): Promise; + + calculateTokenLeafHash( + leaf: IRewardsCoordinator.TokenTreeMerkleLeafStruct, + overrides?: CallOverrides + ): Promise; + + checkClaim( + claim: IRewardsCoordinator.RewardsMerkleClaimStruct, + overrides?: CallOverrides + ): Promise; + + claimerFor(arg0: string, overrides?: CallOverrides): Promise; + + createAVSRewardsSubmission( + rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createOperatorDirectedAVSRewardsSubmission( + avs: string, + operatorDirectedRewardsSubmissions: IRewardsCoordinator.OperatorDirectedRewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createRewardsForAllEarners( + rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createRewardsForAllSubmission( + rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + cumulativeClaimed( + arg0: string, + arg1: string, + overrides?: CallOverrides + ): Promise; + + currRewardsCalculationEndTimestamp( + overrides?: CallOverrides + ): Promise; + + defaultOperatorSplitBips(overrides?: CallOverrides): Promise; + + delegationManager(overrides?: CallOverrides): Promise; + + disableRoot( + rootIndex: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + domainSeparator(overrides?: CallOverrides): Promise; + + getCurrentClaimableDistributionRoot( + overrides?: CallOverrides + ): Promise; + + getCurrentDistributionRoot(overrides?: CallOverrides): Promise; + + getDistributionRootAtIndex( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getDistributionRootsLength(overrides?: CallOverrides): Promise; + + getOperatorAVSSplit( + operator: string, + avs: string, + overrides?: CallOverrides + ): Promise; + + getOperatorPISplit( + operator: string, + overrides?: CallOverrides + ): Promise; + + getRootIndexFromHash( + rootHash: BytesLike, + overrides?: CallOverrides + ): Promise; + + initialize( + initialOwner: string, + _pauserRegistry: string, + initialPausedStatus: BigNumberish, + _rewardsUpdater: string, + _activationDelay: BigNumberish, + _defaultSplitBips: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + isAVSRewardsSubmissionHash( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + isOperatorDirectedAVSRewardsSubmissionHash( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + isRewardsForAllSubmitter( + arg0: string, + overrides?: CallOverrides + ): Promise; + + isRewardsSubmissionForAllEarnersHash( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + isRewardsSubmissionForAllHash( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + pauseAll(overrides?: Overrides & { from?: string }): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + pauserRegistry(overrides?: CallOverrides): Promise; + + processClaim( + claim: IRewardsCoordinator.RewardsMerkleClaimStruct, + recipient: string, + overrides?: Overrides & { from?: string } + ): Promise; + + processClaims( + claims: IRewardsCoordinator.RewardsMerkleClaimStruct[], + recipient: string, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + rewardsUpdater(overrides?: CallOverrides): Promise; + + setActivationDelay( + _activationDelay: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setClaimerFor( + claimer: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setDefaultOperatorSplit( + split: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setOperatorAVSSplit( + operator: string, + avs: string, + split: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setOperatorPISplit( + operator: string, + split: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setPauserRegistry( + newPauserRegistry: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setRewardsForAllSubmitter( + _submitter: string, + _newValue: boolean, + overrides?: Overrides & { from?: string } + ): Promise; + + setRewardsUpdater( + _rewardsUpdater: string, + overrides?: Overrides & { from?: string } + ): Promise; + + strategyManager(overrides?: CallOverrides): Promise; + + submissionNonce( + arg0: string, + overrides?: CallOverrides + ): Promise; + + submitRoot( + root: BytesLike, + rewardsCalculationEndTimestamp: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + }; + + populateTransaction: { + CALCULATION_INTERVAL_SECONDS( + overrides?: CallOverrides + ): Promise; + + GENESIS_REWARDS_TIMESTAMP( + overrides?: CallOverrides + ): Promise; + + MAX_FUTURE_LENGTH(overrides?: CallOverrides): Promise; + + MAX_RETROACTIVE_LENGTH( + overrides?: CallOverrides + ): Promise; + + MAX_REWARDS_DURATION( + overrides?: CallOverrides + ): Promise; + + activationDelay(overrides?: CallOverrides): Promise; + + beaconChainETHStrategy( + overrides?: CallOverrides + ): Promise; + + calculateEarnerLeafHash( + leaf: IRewardsCoordinator.EarnerTreeMerkleLeafStruct, + overrides?: CallOverrides + ): Promise; + + calculateTokenLeafHash( + leaf: IRewardsCoordinator.TokenTreeMerkleLeafStruct, + overrides?: CallOverrides + ): Promise; + + checkClaim( + claim: IRewardsCoordinator.RewardsMerkleClaimStruct, + overrides?: CallOverrides + ): Promise; + + claimerFor( + arg0: string, + overrides?: CallOverrides + ): Promise; + + createAVSRewardsSubmission( + rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createOperatorDirectedAVSRewardsSubmission( + avs: string, + operatorDirectedRewardsSubmissions: IRewardsCoordinator.OperatorDirectedRewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createRewardsForAllEarners( + rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createRewardsForAllSubmission( + rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + cumulativeClaimed( + arg0: string, + arg1: string, + overrides?: CallOverrides + ): Promise; + + currRewardsCalculationEndTimestamp( + overrides?: CallOverrides + ): Promise; + + defaultOperatorSplitBips( + overrides?: CallOverrides + ): Promise; + + delegationManager(overrides?: CallOverrides): Promise; + + disableRoot( + rootIndex: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + domainSeparator(overrides?: CallOverrides): Promise; + + getCurrentClaimableDistributionRoot( + overrides?: CallOverrides + ): Promise; + + getCurrentDistributionRoot( + overrides?: CallOverrides + ): Promise; + + getDistributionRootAtIndex( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getDistributionRootsLength( + overrides?: CallOverrides + ): Promise; + + getOperatorAVSSplit( + operator: string, + avs: string, + overrides?: CallOverrides + ): Promise; + + getOperatorPISplit( + operator: string, + overrides?: CallOverrides + ): Promise; + + getRootIndexFromHash( + rootHash: BytesLike, + overrides?: CallOverrides + ): Promise; + + initialize( + initialOwner: string, + _pauserRegistry: string, + initialPausedStatus: BigNumberish, + _rewardsUpdater: string, + _activationDelay: BigNumberish, + _defaultSplitBips: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + isAVSRewardsSubmissionHash( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + isOperatorDirectedAVSRewardsSubmissionHash( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + isRewardsForAllSubmitter( + arg0: string, + overrides?: CallOverrides + ): Promise; + + isRewardsSubmissionForAllEarnersHash( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + isRewardsSubmissionForAllHash( + arg0: string, + arg1: BytesLike, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + pauseAll( + overrides?: Overrides & { from?: string } + ): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + pauserRegistry(overrides?: CallOverrides): Promise; + + processClaim( + claim: IRewardsCoordinator.RewardsMerkleClaimStruct, + recipient: string, + overrides?: Overrides & { from?: string } + ): Promise; + + processClaims( + claims: IRewardsCoordinator.RewardsMerkleClaimStruct[], + recipient: string, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + rewardsUpdater(overrides?: CallOverrides): Promise; + + setActivationDelay( + _activationDelay: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setClaimerFor( + claimer: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setDefaultOperatorSplit( + split: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setOperatorAVSSplit( + operator: string, + avs: string, + split: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setOperatorPISplit( + operator: string, + split: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setPauserRegistry( + newPauserRegistry: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setRewardsForAllSubmitter( + _submitter: string, + _newValue: boolean, + overrides?: Overrides & { from?: string } + ): Promise; + + setRewardsUpdater( + _rewardsUpdater: string, + overrides?: Overrides & { from?: string } + ): Promise; + + strategyManager(overrides?: CallOverrides): Promise; + + submissionNonce( + arg0: string, + overrides?: CallOverrides + ): Promise; + + submitRoot( + root: BytesLike, + rewardsCalculationEndTimestamp: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + }; +} diff --git a/src/avs/contracts/factories/ReclaimServiceManager__factory.ts b/src/avs/contracts/factories/ReclaimServiceManager__factory.ts index 11137b8b..206d2995 100644 --- a/src/avs/contracts/factories/ReclaimServiceManager__factory.ts +++ b/src/avs/contracts/factories/ReclaimServiceManager__factory.ts @@ -1301,7 +1301,7 @@ const _abi = [ ] as const; const _bytecode = - "0x610100806040523461021057604051601f614db438819003918201601f19168301916001600160401b038311848410176101fa578084926080946040528339810103126101aa5761004f8161025d565b9061005c6020820161025d565b610074606061006d6040850161025d565b930161025d565b9260a05260805260c05260e05260005460ff8160081c166101555760ff8082161061011a575b604051614b3d9081610277823960805181818161094d01528181610b7a0152818161101a01528181612344015281816125ea015281816129bc0152613d41015260a051818181610a8b01528181610baa015281816110510152612300015260c05181818161027c01528181610c510152610f12015260e051816126800152f35b60ff90811916176000557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a18061009a565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b600052604160045260246000fd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b51906001600160a01b038216820361027157565b600080fdfe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b6000803560e01c806310d67a2f14612bbf578063136439dd14612ab957806314bfd6d014612a8e57806316bd83c3146129895780631be785ac1461294e57806321df0da71461292257806324d7806c146128ff5780632d89f6fc146128ca5780632e8da829146128a757806333cfb7b7146125cd5780633bc28c8c146125a8578063595c6a67146124f95780635ac86ab7146124c45780635c975abb146124a7578063630868dc1461246057806367ab980914612373578063683048351461232f5780636b3aa72e146122eb578063715018a61461228e578063762655e914611bce57806384681e4614611b6b578063886f119514611b435780638b00ce7c14611b1d5780638da5cb5b14611af557806394bb371b14611abd578063964c586d1461114b5780639926ee7d14610f7b578063a0169ddd14610eee578063a20b99bf14610c13578063a364f4da14610b5a578063a551c1b814610af8578063a98fb35514610a47578063d5dba76d14610a1a578063e481af9d1461093a578063f289a7fb146108f8578063f2fde38b14610867578063f8c8765e146105d7578063fabc1cbc1461048f578063fac5bb9b14610467578063fc299dee1461043f5763fce36c7d14610240575061000e565b3461043a57602036600319011261031f576004356001600160401b038111610435576102709036906004016132ca565b919061027a614137565b7f0000000000000000000000000000000000000000000000000000000000000000825b8481106103d157506001600160a01b031690813b156103cc576040519363fce36c7d60e01b855280602486016020600488015252604485019060448160051b8701019280928690609e1983360301905b84831061032f5788808b8181808c0381838f5af180156103245761030e5750f35b8161031891612f0c565b61031f5780f35b612d50565b6040513d84823e3d90fd5b9091929394956043198a8203018252863590838212156103c75760208091876001940190608063ffffffff6103b38261037961036b87806143de565b60a0885260a0880191614412565b95898060a01b0361038b898301612f99565b168887015260408101356040870152836103a76060830161311a565b1660608701520161311a565b1691015298019201930191909493926102ed565b614399565b613450565b806104066103ed60206103e76001958a89614472565b016142fb565b60406103fa848a89614472565b0135903090339061458f565b61042f61041960206103e7848a89614472565b846040610427858b8a614472565b0135916145d8565b0161029d565b612da0565b612d00565b503461043a5736600319011261031f576065546040516001600160a01b039091168152602090f35b503461043a5736600319011261031f5760c9546040516001600160a01b039091168152602090f35b503461043a57602036600319011261031f57609754600435906001600160a01b0316803b156103cc5760206004916040519283809263755b36bd60e11b82525afa80156105cc576104f291849161059d575b506001600160a01b031633146134c2565b60985419811981160361053257806098556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a280f35b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b6105bf915060203d6020116105c5575b6105b78183612f0c565b8101906134a3565b386104e1565b503d6105ad565b6040513d85823e3d90fd5b503461043a57608036600319011261031f576105f1612f7e565b602435906001600160a01b0382168203610863576044356001600160a01b038116810361085f576064356001600160a01b038116929083900361085b5784549360ff8560081c16159485809661084e575b8015610837575b156107db5760ff1981166001178755856107ca575b5060ff865460081c16156107715761067861067d92614019565b613fbb565b6001606060405161068d81612ea5565b61070881526020810183905261012c6040820152015260ca805468ffffffffffffffffff191666012c0100000708179055600160cb5560ce54600160401b81101561075d57906106e882600161070c940160ce5560ce612e3c565b81546001600160a01b0393841660039290921b91821b9390911b1916919091179055565b6001600160601b0360a01b60c954161760c9556107265780f35b61ff001981541681557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a180f35b634e487b7160e01b85526041600452602485fd5b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b61ffff19166101011786553861065e565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b1580156106495750600160ff821614610649565b50600160ff821610610642565b8480fd5b8380fd5b8280fd5b503461043a57602036600319011261031f57610881612f7e565b610889613f63565b6001600160a01b038116156108a4576108a190614019565b80f35b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b503461043a5736600319011261031f57608060ca5460cb5463ffffffff60405192818116845260ff8160201c16602085015260281c1660408301526060820152f35b503461043a578060031936011261031f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103cc5781600491604051928380926302e0740360e31b82525afa9081156103245782916109f8575b506109ad815151613c74565b915b815180518210156109e657600191906001600160a01b03906109d2908390613ca6565b5151166109df8286613ca6565b52016109af565b604051806109f4868261312b565b0390f35b610a1491503d8084833e610a0c8183612f0c565b810190613e41565b386109a1565b3461043a57602036600319011261031f576020610a3d610a38612f7e565b613d3f565b6040519015158152f35b503461043a57602036600319011261031f576004356001600160401b03811161043557610a78903690600401613021565b610a89610a84336139eb565b61389e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103cc5782610ae78193829360405194858094819363a98fb35560e01b835260206004840152602483019061320d565b03925af180156103245761030e5750f35b503461043a57602036600319011261031f5760043560cf54811015610b5657610b2090613353565b5080546001600160a01b031690610b39906001016133ac565b906109f4604051928392835260406020840152604083019061320d565b5080fd5b503461043a57602036600319011261031f57610b74612f7e565b610ba8337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614613cba565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103cc576040516351b27a6d60e11b81526001600160a01b03909216600483015282919082908290602490829084905af180156103245761030e5750f35b503461043a57602036600319011261031f576004356001600160401b03811161043557610c449036906004016132ca565b610c4f929192614137565b7f0000000000000000000000000000000000000000000000000000000000000000825b828110610e3957506001600160a01b0316803b156103cc5760405191634e5cd2fd60e11b835280604484013060048601526040602486015252606483019460648260051b8501019181869060be19813603015b838310610ce6578880898181808b0381838e5af180156103245761030e5750f35b9091929394606319888203018a528535828112156103c757830190610d1c610d0e83806143de565b60c0845260c0840191614412565b916001600160a01b03610d3160208301612f99565b1660208301526020610d4660408301836143de565b848603604086015280865294909101938c905b808210610e095750505063ffffffff610d746060830161311a565b16606083015263ffffffff610d8b6080830161311a565b16608083015260a0810135601e19823603018112156103c75701906020823592016001600160401b038311610e04578236038113610dff5783836020948594938460a0879660019a03910152818452848401378d838284010152601f8019910116010197019a019301919098939298610cc5565b614354565b61430f565b909194604080600192838060a01b03610e218a612f99565b16815260208901356020820152019601920190610d59565b909291829483955b610e59610e4f858585614215565b604081019061423c565b9050871015610ea957610e70610e4f858585614215565b881015610e95576001916020610e8d928a60061b0101359061410a565b960195610e41565b634e487b7160e01b86526032600452602486fd5b600192949593919650610ee890610ed281308a610ecd60206103e7898d3395614215565b61458f565b84610ee360206103e7868a8d614215565b6145d8565b01610c72565b503461043a57602036600319011261031f57610f08612f7e565b610f10613f63565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103cc5760405163a0169ddd60e01b81526001600160a01b03909216600483015282919082908290602490829084905af180156103245761030e5750f35b503461043a57604036600319011261031f57610f95612f7e565b602435906001600160401b03821161043557606060031983360301126111465760405190606082018281106001600160401b0382111761075d5760405282600401356001600160401b03811161114157610ff59060043691860101613021565b8252602082019060248401358252604460408401940135845261104160018060a01b037f0000000000000000000000000000000000000000000000000000000000000000163314613cba565b61104a81613a4e565b156110fc577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103cc578593846110c393819560405198899687958694639926ee7d60e01b865260018060a01b0316600486015260406024860152516060604486015260a485019061320d565b9151606484015251608483015203925af180156110ef576110e15780f35b6110ea91612f0c565b388180f35b50604051903d90823e3d90fd5b60405162461bcd60e51b815260206004820152601860248201527f4f70657261746f72206e6f742077686974656c697374656400000000000000006044820152606490fd5b612f2d565b612e54565b503461043a57604036600319011261031f576004356001600160401b0381116104355760406003198236030112611146576040519061118982612ef1565b80600401356001600160401b03811161114157810160c0600319823603011261114657604051906111b982612ed6565b60048101356001600160401b038111611141576111dc906004369184010161316e565b82526111ea6024820161311a565b60208301526111fb6044820161311a565b6040830152606481013560ff81168103611ab957606083015260848101356001600160401b0381116111415760049082010136601f82011215611a815780356112438161325a565b916112516040519384612f0c565b81835260208084019260051b82010190368211611a865760208101925b828410611a8b5750505050608083015260a4013560a082015282526024810135906001600160401b038211611141570136602382011215611a815760048101356112b78161325a565b916112c56040519384612f0c565b818352602060048185019360051b8301010190368211611a865760248101925b828410611a505750505050602082019081526024359163ffffffff831680930361085f578051604051611336816113286020820194602086526040830190613af3565b03601f198101835282612f0c565b51902083855260cc6020526040852054036119e55763ffffffff6040825101511663ffffffff421610156119ad5780519283519363ffffffff6020604087015196608060018060a01b039101511692015116906040519561139687612ea5565b86526020860152604085015260016060850152825192604051946113b986612ef1565b8552602085019384526113d160808451015151613c74565b93865b855181101561140957600190818060a01b036113f582608089510151613ca6565b5151166114028289613ca6565b52016113d4565b50909391948151511561197857519485519360405194602086015260208552611433604086612f0c565b84518060011b9080820460021490151715611964576114519061449e565b9560408051956114618288612f0c565b601087526f181899199a1a9b1b9c1cb0b131b232b360811b60208801528a5b885181101561153e57611493818a6144c6565b5188516001600160f81b0319916114b6916114b09160f81c614494565b8a6144c6565b51168160011b908282046002148315171561152a578d1a6114d7828d6144c6565b536114e2828b6144c6565b5189516001600160f81b031991611505916114ff9160f81c614117565b8b6144c6565b51166001820180921161152a5790611523600193928f1a918d6144c6565b5301611480565b634e487b7160e01b8e52601160045260248efd5b5061060f60f31b9650908a91898b611580602285518094602082019d8e5261156f81518092602086860191016131ea565b81010301601f198101845283612f0c565b60018060a01b0360208201511690845161159b606082612f0c565b6028815260208101926040368537875b6014811061185e57505085518093602082019261060f60f31b8452519081602284016115d6926131ea565b810103602201601f19810184526115ed9084612f0c565b8582015163ffffffff16611600906144d7565b916060015161160e906144d7565b9286519c8d9551908160208801611624926131ea565b850190600560f91b602083015251918260218301611641926131ea565b01602001600560f91b600182015281519182600283019160200191611665926131ea565b01600101600560f91b600182015281519182600283019160200191611689926131ea565b0160010103600101601f19810189526116a29089612f0c565b8651516116ae90613c74565b95835b885180518210156116ed57906116d36116cc82600194613ca6565b518c614062565b6116dd828b613ca6565b90838060a01b03169052016116b1565b50509293858791865b84518810156117ab578096815b85518110156117a0576001600160a01b0361171e8288613ca6565b51166001600160a01b036117328c8a613ca6565b51161461174157600101611703565b5092919790965060015b1561175c57600101969091956116f6565b855162461bcd60e51b815260206004820152601a60248201527f4d697373696e67206174746573746f72207369676e61747572650000000000006044820152606490fd5b50929197909661174b565b9185879283855260cc60205284828120556117d782519360208552518360208601526060850190613af3565b905191601f198483030190840152815180825260208201916020808360051b83010194019287915b8383106118315788887fb89b185f8ff547f2adc139e96d9ffe3ce49fac1d57931be0788b58aa670850cb8989038aa280f35b909192939460208061184f600193601f19868203018752895161320d565b970193019301919392906117ff565b806013036013811161195057600381901b906001600160fd1b038116036119505760ff81116119505760ff611897600182931b85614494565b161660f481901b600f60f81b169060f081169060ff16039060ff8211611928576118ca906001600160f81b031916614a85565b600183901b91906001600160ff1b038416840361193c5790611905918c1a6118f284886144c6565b5360f81b6001600160f81b031916614a85565b600182018092116119285790611921600193928c1a91866144c6565b53016115ab565b634e487b7160e01b8b52601160045260248bfd5b634e487b7160e01b8c52601160045260248cfd5b634e487b7160e01b8a52601160045260248afd5b634e487b7160e01b89526011600452602489fd5b60405162461bcd60e51b815260206004820152600d60248201526c4e6f207369676e61747572657360981b6044820152606490fd5b60405162461bcd60e51b815260206004820152601060248201526f15185cdac81a185cc8195e1c1a5c995960821b6044820152606490fd5b60405162461bcd60e51b815260206004820152603d60248201527f737570706c696564207461736b20646f6573206e6f74206d617463682074686560448201527f206f6e65207265636f7264656420696e2074686520636f6e74726163740000006064820152608490fd5b83356001600160401b038111611a8157602091611a768392836004369288010101613021565b8152019301926112e5565b612fad565b613271565b83356001600160401b038111611a8157602091611aae83928336918701016130bb565b81520193019261126e565b8580fd5b3461043a57602036600319011261031f576109f4611ae1611adc612f7e565b613be9565b604051918291602083526020830190613232565b503461043a5736600319011261031f576033546040516001600160a01b039091168152602090f35b503461043a5736600319011261031f57602063ffffffff60c95460a01c16604051908152f35b503461043a5736600319011261031f576097546040516001600160a01b039091168152602090f35b3461043a57602036600319011261031f576004356001600160401b03811161043557611328611bba611ba46109f493369060040161316e565b6040519283916020808401526040830190613a9e565b60405191829160208352602083019061320d565b503461043a57604036600319011261031f576004356001600160401b03811161043557611bff90369060040161316e565b906024356001600160401b03811161043557611c1f903690600401613021565b9160cb549260a082019384511061225b576080820180519091906001600160a01b031633036121c0575b505063ffffffff6060820151169063ffffffff421691828082116000146121b157611c73916140f0565b63ffffffff8060ca5460281c1691161161216c576001600160a01b03611c97613963565b16845190803b156103cc576040516323b872dd60e01b815233600482015230602482015260448101929092526020908290606490829088905af1908115612161578491612132575b50156120f45760405190611cf282612ed6565b8360a0604051611d0181612ed6565b6060815282602082015282604082015282606082015282608082015201526040820194848652606083019385855260808401966060885260a0850193878552855281602086015260ca549163ffffffff83160163ffffffff81116120e0579063ffffffff60ff939216905260201c16809452519052604051602081019060208252611d93816113286040820186613af3565b5190209060cf549182841161209b57611dab8361325a565b92611db96040519485612f0c565b80845260cf8652857facb8d954e2cfef495862221e91bd7523613cf8808827cb33edfe4904cc51bf29602086015b83831061207d5750505050825191611dfe8561325a565b94611e0c6040519687612f0c565b808652611e1b601f199161325a565b01865b81811061206657505085925b85519060ff851691821015611f99578015611f2e57611e7a81611e4d848761410a565b6040516020810191448352426040830152606082015260608152611e72608082612f0c565b519020614117565b90611e858288613ca6565b5191600019820191821161195057611eb390611ea1838a613ca6565b51611eac828b613ca6565b5288613ca6565b508151909590611ecb906001600160a01b0316613d3f565b15611f2557508051602091906001600160a01b0316611eea848a613ca6565b515201516020611efa8389613ca6565b51015260ff8114611f1157600101965b9692611e2a565b634e487b7160e01b87526011600452602487fd5b98915050611f0a565b60405162461bcd60e51b815260206004820152603760248201527f496e7465726e616c3a204665657320746f6f206c6f772e204e6f206f7065726160448201527f746f7273206c65667420746f207069636b2066726f6d2e0000000000000000006064820152608490fd5b8783888b52604051602081019060208252611fbb816113286040820186613af3565b51902063ffffffff60c95460a01c16835260cc6020526040832055600161202160c954927f07a2aac65c6401a6cbb0fa80ff456ec88725098383c7e585ee342ae74505c98b63ffffffff8560a01c16928392604051918291602083526020830190613af3565b0390a20163ffffffff81116120525763ffffffff60a01b1990911660a09190911b63ffffffff60a01b161760c95580f35b634e487b7160e01b83526011600452602483fd5b602090612071613ba3565b82828a01015201611e1e565b6002602060019261208d85613bbd565b815201920192019190611de7565b60405162461bcd60e51b815260206004820152601e60248201527f496e7465726e616c3a204e6f7420656e6f756768206f70657261746f727300006044820152606490fd5b634e487b7160e01b88526011600452602488fd5b60405162461bcd60e51b81526020600482015260166024820152754661696c656420746f207472616e736665722066656560501b6044820152606490fd5b612154915060203d60201161215a575b61214c8183612f0c565b810190613521565b38611cdf565b503d612142565b6040513d86823e3d90fd5b60405162461bcd60e51b815260206004820152601e60248201527f526571756573742074696d657374616d7020746f6f20666172206177617900006044820152606490fd5b906121bb916140f0565b611c73565b6121e3906040516020808201526121de816113286040820188613a9e565b614062565b90516001600160a01b039081169116036121fe573880611c49565b60405162461bcd60e51b815260206004820152602f60248201527f5369676e6572206f6620726571756573745369676e6174757265206973206e6f60448201526e3a103932b8bab2b9ba1737bbb732b960891b6064820152608490fd5b60405162461bcd60e51b815260206004820152600b60248201526a46656520746f6f206c6f7760a81b6044820152606490fd5b503461043a578060031936011261031f576122a7613f63565b603380546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461043a5736600319011261031f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461043a5736600319011261031f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461043a57608036600319011261031f5760405161239181612ea5565b612399613107565b815260243560ff8116810361086357602082019081526044359163ffffffff8316830361085f5780604063ffffffff920193845260643560608201526123e1610a84336139eb565b51168061244c575b505160ff811661242b575b505163ffffffff8116612405575080f35b68ffffffff000000000060ca549160281b169068ffffffff000000000019161760ca5580f35b64ff0000000060ca549160201b169064ff0000000019161760ca55386123f4565b63ffffffff1960ca54161760ca55386123e9565b503461043a57602036600319011261031f576004359060cd548210156124a457602061248b83612e21565b905460405160039290921b1c6001600160a01b03168152f35b80fd5b503461043a5736600319011261031f576020609854604051908152f35b503461043a57602036600319011261031f576004359060ff82168092036124a45760206001831b806098541614604051908152f35b503461043a578060031936011261031f576097546001600160a01b0316803b156103cc5760206024916040519283809263237dfb4760e11b82523360048301525afa801561032457612552918391612589575b50613539565b60001960985560405160001981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a280f35b6125a2915060203d60201161215a5761214c8183612f0c565b3861254c565b503461043a57602036600319011261031f576108a16125c5612f7e565b610678613f63565b503461043a57602036600319011261031f576125e7612f7e565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103cc5781600491604051928380926302e0740360e31b82525afa90811561032457829161288d575b508051519161264c8361325a565b9161265a6040519384612f0c565b8383526126668461325a565b602084019190601f1901368337825b8581106128655750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103cc5760408051639004134760e01b81526001600160a01b0390971660048801526024870152835160448701819052839287929091606484019190855b8181106128405750505082809103915afa9384156110ef5781946127ae575b5080815b848110612782575061271e90613c74565b93815b84811061273657604051806109f4888261312b565b6127408183613ca6565b5161274e575b600101612721565b9160019061277a906001600160a01b036127688688613ca6565b5116612774828a613ca6565b52613f3e565b929050612746565b61278c8187613ca6565b5161279a575b60010161270d565b906127a6600191613f3e565b919050612792565b9093503d8085833e6127c08183612f0c565b81019060208183031261031f578051906001600160401b03821161043557019080601f83011215611a815781516127f68161325a565b926128046040519485612f0c565b81845260208085019260051b820101928311611a8657602001905b828210612830575050509238612709565b815181526020918201910161281f565b82516001600160a01b031684528796508a9550602093840193909201916001016126ea565b600190818060a01b03612879828551613ca6565b5151166128868288613ca6565b5201612675565b6128a191503d8084833e610a0c8183612f0c565b3861263e565b3461043a57602036600319011261031f576020610a3d6128c5612f7e565b613a4e565b503461043a57602036600319011261031f57604060209163ffffffff6128ee613107565b16815260cc83522054604051908152f35b3461043a57602036600319011261031f576020610a3d61291d612f7e565b6139eb565b503461043a5736600319011261031f57602061293c613963565b6040516001600160a01b039091168152f35b503461043a57604036600319011261031f57612968612f7e565b6024358015158103610863576108a191612984610a84336139eb565b6138e0565b503461043a57602036600319011261031f576004356001600160401b038111610435576129ba9036906004016130bb565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103cc5760206024916040519283809263ec7fbb3160e01b82523360048301525afa80156105cc576001918491612a6f575b50151503612a2a576108a1906136ec565b60405162461bcd60e51b815260206004820152601b60248201527f4f70657261746f72206d757374206265207468652063616c6c657200000000006044820152606490fd5b612a88915060203d60201161215a5761214c8183612f0c565b38612a19565b503461043a57602036600319011261031f576004359060ce548210156124a457602061248b83612df0565b503461043a57602036600319011261031f57609754600435906001600160a01b0316803b156103cc5760206024916040519283809263237dfb4760e11b82523360048301525afa80156105cc57612b169184916125895750613539565b60985481811603612b5457806098556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a280f35b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b5034612d0057602036600319011261031f576004356001600160a01b03811690819003610b56576097546001600160a01b038116803b156103cc5760405163755b36bd60e11b8152602081600481855afa8015612cf557612c3191869161059d57506001600160a01b031633146134c2565b8215612c785760407f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6918151908152846020820152a16001600160a01b0319161760975580f35b60405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a490fd5b6040513d87823e3d90fd5b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b60ce54811015612e0b5760ce60005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b60cd54811015612e0b5760cd60005260206000200190600090565b8054821015612e0b5760005260206000200190600090565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b608081019081106001600160401b03821117612ec057604052565b634e487b7160e01b600052604160045260246000fd5b60c081019081106001600160401b03821117612ec057604052565b604081019081106001600160401b03821117612ec057604052565b90601f801991011681019081106001600160401b03821117612ec057604052565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b600435906001600160a01b0382168203612f9457565b600080fd5b35906001600160a01b0382168203612f9457565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b6001600160401b038111612ec057601f01601f191660200190565b81601f82011215611a815760208135910161303b82613006565b926130496040519485612f0c565b828452828201116130665781600092602092838601378301015290565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b919060408382031261114657604051906130d482612ef1565b81936130df81612f99565b83526020810135916001600160401b038311611141576020926131029201613021565b910152565b6004359063ffffffff82168203612f9457565b359063ffffffff82168203612f9457565b602060408183019282815284518094520192019060005b81811061314f5750505090565b82516001600160a01b0316845260209384019390920191600101613142565b91909160c081840312611146576040519061318882612ed6565b81938135916001600160401b038311611141576131ab60a0939284938301613021565b845260208101356020850152604081013560408501526131cd6060820161311a565b60608501526131de60808201612f99565b60808501520135910152565b60005b8381106131fd5750506000910152565b81810151838201526020016131ed565b90602091613226815180928185528580860191016131ea565b601f01601f1916010190565b90604060206132579360018060a01b038151168452015191816020820152019061320d565b90565b6001600160401b038111612ec05760051b60200190565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b9181601f84011215611a81578235916001600160401b0383116132fa576020808501948460051b010111611a8657565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b60cf54811015612e0b5760cf60005260206000209060011b0190600090565b90600182811c921680156133a2575b602083101461338c57565b634e487b7160e01b600052602260045260246000fd5b91607f1691613381565b90604051918260008254926133c084613372565b808452936001811690811561342e57506001146133e7575b506133e592500383612f0c565b565b90506000929192526020600020906000915b8183106134125750509060206133e592820101386133d8565b60209193508060019154838589010152019101909184926133f9565b9050602092506133e594915060ff191682840152151560051b820101386133d8565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b9081602091031261031f57516001600160a01b0381168103612f945790565b156134c957565b60405162461bcd60e51b815260206004820152602a60248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526939903ab73830bab9b2b960b11b6064820152608490fd5b9081602091031261031f57518015158103612f945790565b1561354057565b60405162461bcd60e51b815260206004820152602860248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526739903830bab9b2b960c11b6064820152608490fd5b8181106135a1575050565b60008155600101613596565b909291926136d6576001602091818060a01b038551166001600160601b0360a01b825416178155019201519182516001600160401b038111612ec0576135f38254613372565b601f8111613699575b506020601f8211600114613637578192939460009261362c575b50508160011b916000199060031b1c1916179055565b015190503880613616565b601f1982169083600052806000209160005b81811061368157509583600195969710613668575b505050811b019055565b015160001960f88460031b161c1916905538808061365e565b9192602060018192868b015181550194019201613649565b6136c690836000526020600020601f840160051c810191602085106136cc575b601f0160051c0190613596565b386135fc565b90915081906136b9565b634e487b7160e01b600052600060045260246000fd5b80516001600160a01b0316330361384a57602081015151156137735760005b60cf5481101561374f5761371e81613353565b505482516001600160a01b0390811691161461373c5760010161370b565b906137496133e592613353565b906135ad565b5060cf5490600160401b821015612ec0576137498260016133e5940160cf55613353565b60005b60cf5481101561380c5761378981613353565b505482516001600160a01b039081169116146137a757600101613776565b6137b19150613353565b6136d65780600060019255016137c78154613372565b90816137d1575050565b81601f600093116001146137e3575055565b818352602083206137ff91601f0160051c810190600101613596565b8082528160208120915555565b60405162461bcd60e51b815260206004820152601260248201527113dc195c985d1bdc881b9bdd08199bdd5b9960721b6044820152606490fd5b0390fd5b60405162461bcd60e51b815260206004820152602660248201527f4d657461646174612061646472657373206d757374206d61746368207468652060448201526531b0b63632b960d11b6064820152608490fd5b156138a557565b60405162461bcd60e51b815260206004820152601360248201527221b0b63632b91034b9903737ba1030b236b4b760691b6044820152606490fd5b9061393e5760005b60cd5481101561380c576138fb81612e21565b905460039190911b1c6001600160a01b039081169083161461391f576001016138e8565b6139299150612e21565b81549060018060a01b039060031b1b19169055565b60cd5490600160401b821015612ec0576106e88260016133e5940160cd5560cd612e3c565b60c9546001600160a01b0316803b156103cc57602060049160405192838092632495a59960e01b82525afa9081156139df576000916139a0575090565b90506020813d6020116139d7575b816139bb60209383612f0c565b8101031261031f57516001600160a01b0381168103612f945790565b3d91506139ae565b6040513d6000823e3d90fd5b6033546001600160a01b03163314613a485760ce549060005b828110613a1357505050600090565b613a1c81612df0565b905460039190911b1c6001600160a01b0390811690831614613a4057600101613a04565b505050600190565b50600190565b613a57816139eb565b613a485760cd549060005b828110613a7157505050600090565b613a7a81612e21565b905460039190911b1c6001600160a01b0390811690831614613a4057600101613a62565b9060a080613ab5845160c0855260c085019061320d565b93602081015160208501526040810151604085015263ffffffff6060820151166060850152600180831b036080820151166080850152015191015290565b90613b07825160c0835260c0830190613a9e565b9163ffffffff602082015116602083015263ffffffff604082015116604083015260ff60608201511660608301526080810151928281036080840152835180825260208201916020808360051b8301019601926000915b838310613b7657505050505060a08091015191015290565b9091929396602080613b94600193601f198682030187528b51613232565b99019301930191939290613b5e565b60405190613bb082612ef1565b6060602083600081520152565b90604051613bca81612ef1565b82546001600160a01b03168152918290602090613102906001016133ac565b613bf1613ba3565b5060cf549060005b828110613c3a5760405162461bcd60e51b815260206004820152601260248201527113dc195c985d1bdc881b9bdd08199bdd5b9960721b6044820152606490fd5b613c4381613353565b50546001600160a01b03838116911614613c5f57600101613bf9565b6132579250613c6e9150613353565b50613bbd565b90613c7e8261325a565b613c8b6040519182612f0c565b8281528092613c9c601f199161325a565b0190602036910137565b8051821015612e0b5760209160051b010190565b15613cc157565b60405162461bcd60e51b815260206004820152604a60248201527f4543445341536572766963654d616e61676572426173652e6f6e6c795374616b60448201527f6552656769737472793a2063616c6c6572206973206e6f7420746865207374616064820152696b65526567697374727960b01b608482015260a490fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103cc576040516398ec1ac960e01b81526001600160a01b039091166004820152602081602481855afa9081156139df57600091613e0f575b50813b156103cc576020600492604051938480926340bf2fb760e01b82525afa9182156139df57600092613ddb575b50101590565b9091506020813d602011613e07575b81613df760209383612f0c565b8101031261031f57519038613dd5565b3d9150613dea565b90506020813d602011613e39575b81613e2a60209383612f0c565b8101031261031f575138613da6565b3d9150613e1d565b60208183031261031f578051906001600160401b0382116104355701906020828203126111465760405191602083018381106001600160401b03821117612ec0576040528051906001600160401b038211611141570181601f82011215611a8157805190613eae8261325a565b92613ebc6040519485612f0c565b82845260208085019360061b83010191818311611a8657602001925b828410613ee85750505050815290565b6040848303126111465760405190613eff82612ef1565b84516001600160a01b0381168103612f945782526020850151906001600160601b0382168203612f945782602092836040950152815201930192613ed8565b6000198114613f4d5760010190565b634e487b7160e01b600052601160045260246000fd5b6033546001600160a01b03163303613f7757565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b606554604080516001600160a01b038084168252841660208201529192917fe11cddf1816a43318ca175bbc52cd0185436e9cbead7c83acc54a73e461717e39190a16001600160a01b03166001600160a01b03199190911617606555565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b613257916140e891603a6140e061407983516144d7565b9260405192839160208301957f19457468657265756d205369676e6564204d6573736167653a0a00000000000087526140bb81518092602086880191016131ea565b83016140d082518093602086850191016131ea565b010103601f198101835282612f0c565b51902061469f565b91909161470f565b9063ffffffff8091169116039063ffffffff8211613f4d57565b91908201809211613f4d57565b8115614121570690565b634e487b7160e01b600052601260045260246000fd5b6065546001600160a01b0316330361414b57565b60405162461bcd60e51b815260206004820152605160248201527f4543445341536572766963654d616e61676572426173652e6f6e6c795265776160448201527f726473496e69746961746f723a2063616c6c6572206973206e6f7420746865206064820152703932bbb0b932399034b734ba34b0ba37b960791b608482015260a490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206f6666736574000000006044820152606490fd5b9190811015612e0b5760051b8101359060be1981360301821215614237570190565b6141d0565b903590601e198136030182121561423757018035906001600160401b0382116142b657602001918160061b3603831361427157565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c64617461207461696c20746f6f2073686f72740000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206c656e677468000000006044820152606490fd5b356001600160a01b0381168103612f945790565b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206c656e67746800006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c64617461206163636573732073747269646500006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206f666673657400006044820152606490fd5b9035601e19823603018112156103c75701602081359101916001600160401b038211610e04578160061b36038313610dff57565b916020908281520191906000905b80821061442d5750505090565b909192833560018060a01b038116809103612f945781526020840135906001600160601b038216809203612f9457604081600193602083940152019401920190614420565b9190811015612e0b5760051b81013590609e1981360301821215614237570190565b8115614121570490565b906144a882613006565b6144b56040519182612f0c565b8281528092613c9c601f1991613006565b908151811015612e0b570160200190565b801561456f5780816000925b61455b5750806144f28361449e565b92915b6144fe57505090565b6000198201918211613f4d5781600a820491600a8302838104600a1484151715613f4d578103908111613f4d5760ff1660300160ff8111613f4d5760f81b6001600160f81b03191660001a9061455490856144c6565b53806144f5565b91614567600a91613f3e565b9204806144e3565b5060405161457e604082612f0c565b60018152600360fc1b602082015290565b6040516323b872dd60e01b60208201526001600160a01b0392831660248201529290911660448301526064808301939093529181526133e5916145d3608483612f0c565b614889565b6001600160a01b038116803b156103cc57604051636eb1769f60e11b81523060048201526001600160a01b038416602482015290602090829060449082905afa9081156139df5760009161466b575b506133e5936146359161410a565b60405163095ea7b360e01b60208201526001600160a01b03909316602484015260448084019190915282526145d3606483612f0c565b90506020813d602011614697575b8161468660209383612f0c565b8101031261031f57516133e5614627565b3d9150614679565b8151604181036146cc5750906146c8916020820151906060604084015193015160001a906149dd565b9091565b6040036147055760406020830151920151918260ff1c91601b8301809311613f4d576146c8936001600160ff1b03169260ff16906149dd565b5050600090600290565b600581101561487357806147205750565b60006001820361476f5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b50600281036147bd5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b600090600381036148185760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b600491501461482357565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608490fd5b634e487b7160e01b600052602160045260246000fd5b60408051909290916001600160a01b03166148a48484612f0c565b602083527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020840152803b156149995760008281928260206149159796519301915af13d15614991573d906148f982613006565b9161490686519384612f0c565b82523d6000602084013e614ac7565b8051908161492257505050565b602080614933938301019101613521565b1561493b5750565b5162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b606090614ac7565b835162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411614a795760ff1690601b82141580614a6e575b614a6257602093600093608093604051938452868401526040830152606082015282805260015afa156139df576000516001600160a01b03811615614a595790600090565b50600090600190565b50505050600090600490565b50601c821415614a14565b50505050600090600390565b60f81c600a811015614aac5760300160ff8111613f4d5760f81b6001600160f81b03191690565b60570160ff8111613f4d5760f81b6001600160f81b03191690565b90919015614ad3575090565b815115614ae35750805190602001fd5b60405162461bcd60e51b81526020600482015290819061384690602483019061320d56fea2646970667358221220b90eba4a1bf992fe7344d193caa24efcdebc8c04bbaa62d2764a88b825d5c5ad64736f6c634300081a0033"; + "0x610100806040523461024f57604051601f61555038819003918201601f19168301916001600160401b03831184841017610239578084926080946040528339810103126101e95761004f8161029c565b9061005c6020820161029c565b610074606061006d6040850161029c565b930161029c565b9260a05260805260c05260e05260005460ff8160081c166101945760ff80821610610159575b60405161529a90816102b6823960805181818161093f01528181610b6c0152818161100b01528181612a2f01528181612cda015281816130b90152614491015260a051818181610a7d01528181610b9c0152818161104201526129eb015260c05181818161027c01528181610c4301528181610f04015281816118d80152818161191a015281816119550152818161199801528181611a8201528181611ad301528181611b4f01528181611dc50152611e07015260e05181612d700152f35b60ff90811916176000557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a18061009a565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b600052604160045260246000fd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b51906001600160a01b03821682036102b057565b600080fdfe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b6000803560e01c806310d67a2f146132bc578063136439dd146131b657806314bfd6d01461318b57806316bd83c3146130865780631be785ac1461304b57806321df0da71461301f57806324d7806c14612ffc5780632d89f6fc14612fc75780632e8da82914612fa457806333cfb7b714612cbd5780633bc28c8c14612c93578063595c6a6714612be45780635ac86ab714612baf5780635c975abb14612b92578063630868dc14612b4b57806367ab980914612a5e5780636830483514612a1a5780636b3aa72e146129d6578063715018a614612979578063762655e9146122e757806384681e4614612284578063886f11951461225c5780638b00ce7c146122365780638da5cb5b1461220e57806394bb371b146121d6578063964c586d146111215780639926ee7d14610f6d578063a0169ddd14610ee0578063a20b99bf14610c05578063a364f4da14610b4c578063a551c1b814610aea578063a98fb35514610a39578063d5dba76d14610a0c578063e481af9d1461092c578063f289a7fb146108ea578063f2fde38b14610859578063f8c8765e146105d7578063fabc1cbc1461048f578063fac5bb9b14610467578063fc299dee1461043f5763fce36c7d14610240575061000e565b3461043a57602036600319011261031f576004356001600160401b038111610435576102709036906004016139dd565b919061027a614897565b7f0000000000000000000000000000000000000000000000000000000000000000825b8481106103d157506001600160a01b031690813b156103cc576040519363fce36c7d60e01b855280602486016020600488015252604485019060448160051b8701019280928690609e1983360301905b84831061032f5788808b8181808c0381838f5af180156103245761030e5750f35b8161031891613609565b61031f5780f35b61344d565b6040513d84823e3d90fd5b9091929394956043198a8203018252863590838212156103c75760208091876001940190608063ffffffff6103b38261037961036b8780614b3e565b60a0885260a0880191614b72565b95898060a01b0361038b8983016136ac565b168887015260408101356040870152836103a76060830161382d565b1660608701520161382d565b1691015298019201930191909493926102ed565b614af9565b613b63565b806104066103ed60206103e76001958a89614bd2565b01614a5b565b60406103fa848a89614bd2565b01359030903390614ce5565b61042f61041960206103e7848a89614bd2565b846040610427858b8a614bd2565b013591614d36565b0161029d565b61349d565b6133fd565b503461043a5736600319011261031f576065546040516001600160a01b039091168152602090f35b503461043a5736600319011261031f5760c9546040516001600160a01b039091168152602090f35b503461043a57602036600319011261031f57609754600435906001600160a01b0316803b156103cc5760206004916040519283809263755b36bd60e11b82525afa80156105cc576104f291849161059d575b506001600160a01b03163314613bd5565b60985419811981160361053257806098556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a280f35b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b6105bf915060203d6020116105c5575b6105b78183613609565b810190613bb6565b386104e1565b503d6105ad565b6040513d85823e3d90fd5b503461043a57608036600319011261031f576105f161367b565b6105f9613696565b506044356001600160a01b0381168103610855576064356001600160a01b03811691908290036108515783549260ff8460081c161593848095610844575b801561082d575b156107d15760ff1981166001178655846107c0575b5060ff855460081c16156107675761066a90614753565b610673306146f5565b60016060604051610683816135a2565b61070881526020810183905261012c6040820152015260ca805468ffffffffffffffffff191666012c0100000708179055600160cb5560ce54600160401b81101561075357906106de826001610702940160ce5560ce613539565b81546001600160a01b0393841660039290921b91821b9390911b1916919091179055565b6001600160601b0360a01b60c954161760c95561071c5780f35b61ff001981541681557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a180f35b634e487b7160e01b85526041600452602485fd5b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b61ffff191661010117855538610653565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b15801561063e5750600160ff82161461063e565b50600160ff821610610637565b8380fd5b8280fd5b503461043a57602036600319011261031f5761087361367b565b61087b61469d565b6001600160a01b038116156108965761089390614753565b80f35b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b503461043a5736600319011261031f57608060ca5460cb5463ffffffff60405192818116845260ff8160201c16602085015260281c1660408301526060820152f35b503461043a578060031936011261031f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103cc5781600491604051928380926302e0740360e31b82525afa9081156103245782916109ea575b5061099f8151516143b7565b915b815180518210156109d857600191906001600160a01b03906109c49083906143f6565b5151166109d182866143f6565b52016109a1565b604051806109e6868261383e565b0390f35b610a0691503d8084833e6109fe8183613609565b810190614591565b38610993565b3461043a57602036600319011261031f576020610a2f610a2a61367b565b61448f565b6040519015158152f35b503461043a57602036600319011261031f576004356001600160401b03811161043557610a6a903690600401613734565b610a7b610a76336140fe565b613fb1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103cc5782610ad98193829360405194858094819363a98fb35560e01b8352602060048401526024830190613920565b03925af180156103245761030e5750f35b503461043a57602036600319011261031f5760043560cf54811015610b4857610b1290613a66565b5080546001600160a01b031690610b2b90600101613abf565b906109e66040519283928352604060208401526040830190613920565b5080fd5b503461043a57602036600319011261031f57610b6661367b565b610b9a337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461440a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103cc576040516351b27a6d60e11b81526001600160a01b03909216600483015282919082908290602490829084905af180156103245761030e5750f35b503461043a57602036600319011261031f576004356001600160401b03811161043557610c369036906004016139dd565b610c41929192614897565b7f0000000000000000000000000000000000000000000000000000000000000000825b828110610e2b57506001600160a01b0316803b156103cc5760405191634e5cd2fd60e11b835280604484013060048601526040602486015252606483019460648260051b8501019181869060be19813603015b838310610cd8578880898181808b0381838e5af180156103245761030e5750f35b9091929394606319888203018a528535828112156103c757830190610d0e610d008380614b3e565b60c0845260c0840191614b72565b916001600160a01b03610d23602083016136ac565b1660208301526020610d386040830183614b3e565b848603604086015280865294909101938c905b808210610dfb5750505063ffffffff610d666060830161382d565b16606083015263ffffffff610d7d6080830161382d565b16608083015260a0810135601e19823603018112156103c75701906020823592016001600160401b038311610df6578236038113610df15783836020948594938460a0879660019a03910152818452848401378d838284010152601f8019910116010197019a019301919098939298610cb7565b614ab4565b614a6f565b909194604080600192838060a01b03610e138a6136ac565b16815260208901356020820152019601920190610d4b565b909291829483955b610e4b610e41858585614975565b604081019061499c565b9050871015610e9b57610e62610e41858585614975565b881015610e87576001916020610e7f928a60061b01013590614844565b960195610e33565b634e487b7160e01b86526032600452602486fd5b600192949593919650610eda90610ec481308a610ebf60206103e7898d3395614975565b614ce5565b84610ed560206103e7868a8d614975565b614d36565b01610c64565b503461043a57602036600319011261031f57610efa61367b565b610f0261469d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103cc5760405163a0169ddd60e01b81526001600160a01b03909216600483015282919082908290602490829084905af180156103245761030e5750f35b503461043a57604036600319011261031f57610f8761367b565b6024356001600160401b038111610435576060600319823603011261111c5760405191606083018381106001600160401b038211176107535760405281600401356001600160401b03811161111757610fe69060043691850101613734565b8352602083019060248301358252604460408501930135835261103260018060a01b037f000000000000000000000000000000000000000000000000000000000000000016331461440a565b61103b81614161565b156110d2577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103cc578594856110b493819560405197889687958694639926ee7d60e01b865260018060a01b0316600486015260406024860152516060604486015260a4850190613920565b9151606484015251608483015203925af180156103245761030e5750f35b60405162461bcd60e51b815260206004820152601860248201527f4f70657261746f72206e6f742077686974656c697374656400000000000000006044820152606490fd5b61362a565b613551565b503461043a57604036600319011261031f576004356001600160401b038111610435576040600319823603011261111c576040519061115f826135ee565b80600401356001600160401b03811161111757810160c0600319823603011261111c576040519061118f826135d3565b60048101356001600160401b038111611117576111b29060043691840101613881565b82526111c06024820161382d565b60208301526111d16044820161382d565b6040830152606481013560ff811681036121d257606083015260848101356001600160401b0381116111175760049082010136601f8201121561219a5780356112198161396d565b916112276040519384613609565b81835260208084019260051b8201019036821161219f5760208101925b8284106121a45750505050608083015260a4013560a082015282526024810135906001600160401b03821161111757013660238201121561219a57600481013561128d8161396d565b9161129b6040519384613609565b818352602060048185019360051b830101019036821161219f5760248101925b8284106121695750505050602082015260243563ffffffff81168103610855578151604051611308816112fa6020820194602086526040830190614236565b03601f198101835282613609565b51902063ffffffff8216845260cc6020526040842054036120fe5763ffffffff6040835101511663ffffffff421610156120c65781519182519263ffffffff6020604086015195608060018060a01b039101511692015116906040519461136e866135a2565b8552602085015260408401526001606084015260208101519160405193611394856135ee565b8452602084019283526113ac608083510151516143b7565b92855b84518110156113e457600190818060a01b036113d0826080885101516143f6565b5151166113dd82886143f6565b52016113af565b50909293815151156120915751908151926040519360208501526020845261140d604085613609565b83518060011b908082046002149015171561207d5761142b90614bf4565b9460409384519461143c8187613609565b601086526f181899199a1a9b1b9c1cb0b131b232b360811b6020870152895b87518110156115195761146e8189614c1c565b5187516001600160f81b0319916114919161148b9160f81c614871565b89614c1c565b51168160011b9082820460021483151715611505578c1a6114b2828c614c1c565b536114bd828a614c1c565b5188516001600160f81b0319916114e0916114da9160f81c614851565b8a614c1c565b51166001820180921161150557906114fe600193928e1a918c614c1c565b530161145b565b634e487b7160e01b8d52601160045260248dfd5b508795508990898151611559602282602081019b61060f60f31b8d5261154881518092602086860191016138fd565b81010301601f198101835282613609565b60018060a01b0360208601511660609584516115758882613609565b602881526020810192601f198901368537875b60148110611f7757505085518093602082019261060f60f31b8452519081602284016115b3926138fd565b810103602201601f19810184526115ca9084613609565b878683015163ffffffff166115de90614c2d565b9201516115ea90614c2d565b9286519c8d9551908160208801611600926138fd565b850190600560f91b60208301525191826021830161161d926138fd565b01602001600560f91b600182015281519182600283019160200191611641926138fd565b01600101600560f91b600182015281519182600283019160200191611665926138fd565b0160010103600101601f198101895261167e9089613609565b86515161168a906143b7565b95835b885180518210156116c957906116af6116a8826001946143f6565b518c61479c565b6116b9828b6143f6565b90838060a01b031690520161168d565b50509293858791865b8451881015611787578096815b855181101561177c576001600160a01b036116fa82886143f6565b51166001600160a01b0361170e8c8a6143f6565b51161461171d576001016116df565b5092919790965060015b1561173857600101969091956116d2565b855162461bcd60e51b815260206004820152601a60248201527f4d697373696e67206174746573746f72207369676e61747572650000000000006044820152606490fd5b509291979096611727565b91949093925063ffffffff8516825260cc602052818181205560a086510151936117af614076565b958251976117bd848a613609565b60018952845b601f1985018110611f55575060c9546001600160a01b03166117e48a6143e9565b5152600160206117f38b6143e9565b5101528551986118028a61396d565b9961180f86519b8c613609565b808b5261181e601f199161396d565b01865b818110611f32575050611835875189614871565b97865b885181101561187a57808a60206118718f946001958e61185e83898060a01b03926143f6565b511661186a83836143f6565b51526143f6565b51015201611838565b50898b87519361188a8986613609565b60018552895b601f198a018110611efa57506118a5856143e9565b51526118af614076565b60206118ba866143e9565b516001600160a01b03909216910152876118d3856143e9565b5101527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b156103cc578651639d45c28160e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115611ef0578991611ed1575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b156103cc578751634d18cc3560e01b8152906020826004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa918215611ec7578a92611ea6575b5063ffffffff8216611dc35763ffffffff9150168015611daf57611a029063ffffffff42160663ffffffff421661482a565b63ffffffff87611a11866143e9565b5101911690525b876080611a24856143e9565b51015260a0611a32846143e9565b5101875190611a418983613609565b6015825274436c61696d206372656174696f6e206f6e2041565360581b6020830152526001600160a01b0316803b156103cc57865163095ea7b360e01b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660048201526024810192909252602090829060449082908b905af18015611da557611d78575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b156103cc578585518092634e5cd2fd60e11b82526044820130600484015288602484015281518091526064830190602060648260051b86010193019185905b828210611c4c5750505090829003905081837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af18015611c4257611c2e575b506020611ba08551948286528351908784880152860190614236565b91015193601f198483030190840152835180825260208201916020808360051b83010196019287915b838310611c01578863ffffffff87167fb89b185f8ff547f2adc139e96d9ffe3ce49fac1d57931be0788b58aa670850cb898b038aa280f35b9091929396602080611c1f600193601f198682030187528b51613920565b99019301930191939290611bc9565b85611c3b91969296613609565b9385611b84565b85513d88823e3d90fd5b9295509290935060631986820301825284519060c08101918c8c82519460c085528551809152602060e08601960192915b818310611d4257505050506020818101516001600160a01b0316838201528c8201518385038e8501528051808652948201948d9291909101908f908f5b818310611d12575050505060019360209360a0848463ffffffff611d019689980151169084015263ffffffff608082015116608084015201519060a0818403910152613920565b9601920192019285938b9593611b3b565b835180516001600160a01b03168952602090810151818a01529701968f945090920191600191909101908f611cba565b835180516001600160a01b031688526020908101516001600160601b03168189015296019590920191600191909101908e611c7d565b611d999060203d602011611d9e575b611d918183613609565b810190613c34565b611ad0565b503d611d87565b86513d89823e3d90fd5b634e487b7160e01b89526012600452602489fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b156103cc578851635f90d45560e11b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015611e9c57611e5193611e4c928d92611e6b575b5061482a565b614206565b63ffffffff87611e60866143e9565b510191169052611a18565b611e8e91925060203d602011611e95575b611e868183613609565b81019061487b565b908d611e46565b503d611e7c565b8a513d8d823e3d90fd5b611ec091925060203d602011611e9557611e868183613609565b908a6119d0565b89513d8c823e3d90fd5b611eea915060203d602011611e9557611e868183613609565b89611952565b88513d8b823e3d90fd5b6020908a51611f08816135d3565b8a81528c838201528a8c8201528c8b8201528c60808201528a60a082015282828901015201611890565b6020908c82828a5192611f44846135ee565b8c84528c8385015201015201611821565b6020908551611f63816135ee565b878152878382015282828d010152016117c3565b806013036013811161206957600381901b906001600160fd1b038116036120695760ff81116120695760ff611fb0600182931b85614871565b161660f481901b600f60f81b169060f081169060ff16039060ff821161204157611fe3906001600160f81b0319166151e2565b600183901b91906001600160ff1b0384168403612055579061201e918c1a61200b8488614c1c565b5360f81b6001600160f81b0319166151e2565b60018201809211612041579061203a600193928c1a9186614c1c565b5301611588565b634e487b7160e01b8b52601160045260248bfd5b634e487b7160e01b8c52601160045260248cfd5b634e487b7160e01b8a52601160045260248afd5b634e487b7160e01b88526011600452602488fd5b60405162461bcd60e51b815260206004820152600d60248201526c4e6f207369676e61747572657360981b6044820152606490fd5b60405162461bcd60e51b815260206004820152601060248201526f15185cdac81a185cc8195e1c1a5c995960821b6044820152606490fd5b60405162461bcd60e51b815260206004820152603d60248201527f737570706c696564207461736b20646f6573206e6f74206d617463682074686560448201527f206f6e65207265636f7264656420696e2074686520636f6e74726163740000006064820152608490fd5b83356001600160401b03811161219a5760209161218f8392836004369288010101613734565b8152019301926112bb565b6136c0565b613984565b83356001600160401b03811161219a576020916121c783928336918701016137ce565b815201930192611244565b8580fd5b3461043a57602036600319011261031f576109e66121fa6121f561367b565b61432c565b604051918291602083526020830190613945565b503461043a5736600319011261031f576033546040516001600160a01b039091168152602090f35b503461043a5736600319011261031f57602063ffffffff60c95460a01c16604051908152f35b503461043a5736600319011261031f576097546040516001600160a01b039091168152602090f35b3461043a57602036600319011261031f576004356001600160401b038111610435576112fa6122d36122bd6109e6933690600401613881565b60405192839160208084015260408301906141b1565b604051918291602083526020830190613920565b503461043a57604036600319011261031f576004356001600160401b03811161043557612318903690600401613881565b906024356001600160401b03811161043557612338903690600401613734565b9160cb549260a0820193845110612946576080820180519091906001600160a01b031633036128ab575b505063ffffffff6060820151169063ffffffff4216918280821160001461289c5761238c9161482a565b63ffffffff8060ca5460281c16911611612857576001600160a01b036123b0614076565b16845190803b156103cc576040516323b872dd60e01b815233600482015230602482015260448101929092526020908290606490829088905af190811561284c57849161282d575b50156127ef576040519061240b826135d3565b8360a060405161241a816135d3565b606081528260208201528260408201528260608201528260808201520152604082019484865260ff606084019486865260808501976060895260a0860194888652865281602087015263ffffffff61247860ca549382851690614206565b16905260201c168094525190526040516020810190602082526124a2816112fa6040820186614236565b5190209060cf54918284116127aa576124ba8361396d565b926124c86040519485613609565b80845260cf8652857facb8d954e2cfef495862221e91bd7523613cf8808827cb33edfe4904cc51bf29602086015b83831061278c575050505082519161250d8561396d565b9461251b6040519687613609565b80865261252a601f199161396d565b01865b81811061277557505085925b85519060ff8516918210156126a857801561263d576125898161255c8487614844565b6040516020810191448352426040830152606082015260608152612581608082613609565b519020614851565b9061259482886143f6565b51916000198201918211612069576125c2906125b0838a6143f6565b516125bb828b6143f6565b52886143f6565b5081519095906125da906001600160a01b031661448f565b1561263457508051602091906001600160a01b03166125f9848a6143f6565b51520151602061260983896143f6565b51015260ff811461262057600101965b9692612539565b634e487b7160e01b87526011600452602487fd5b98915050612619565b60405162461bcd60e51b815260206004820152603760248201527f496e7465726e616c3a204665657320746f6f206c6f772e204e6f206f7065726160448201527f746f7273206c65667420746f207069636b2066726f6d2e0000000000000000006064820152608490fd5b8783888b526040516020810190602082526126ca816112fa6040820186614236565b51902063ffffffff60c95460a01c16835260cc6020526040832055600161273060c954927f07a2aac65c6401a6cbb0fa80ff456ec88725098383c7e585ee342ae74505c98b63ffffffff8560a01c16928392604051918291602083526020830190614236565b0390a20163ffffffff81116127615763ffffffff60a01b1990911660a09190911b63ffffffff60a01b161760c95580f35b634e487b7160e01b83526011600452602483fd5b6020906127806142e6565b82828a0101520161252d565b6002602060019261279c85614300565b8152019201920191906124f6565b60405162461bcd60e51b815260206004820152601e60248201527f496e7465726e616c3a204e6f7420656e6f756768206f70657261746f727300006044820152606490fd5b60405162461bcd60e51b81526020600482015260166024820152754661696c656420746f207472616e736665722066656560501b6044820152606490fd5b612846915060203d602011611d9e57611d918183613609565b386123f8565b6040513d86823e3d90fd5b60405162461bcd60e51b815260206004820152601e60248201527f526571756573742074696d657374616d7020746f6f20666172206177617900006044820152606490fd5b906128a69161482a565b61238c565b6128ce906040516020808201526128c9816112fa60408201886141b1565b61479c565b90516001600160a01b039081169116036128e9573880612362565b60405162461bcd60e51b815260206004820152602f60248201527f5369676e6572206f6620726571756573745369676e6174757265206973206e6f60448201526e3a103932b8bab2b9ba1737bbb732b960891b6064820152608490fd5b60405162461bcd60e51b815260206004820152600b60248201526a46656520746f6f206c6f7760a81b6044820152606490fd5b503461043a578060031936011261031f5761299261469d565b603380546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461043a5736600319011261031f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461043a5736600319011261031f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461043a57608036600319011261031f57604051612a7c816135a2565b612a8461381a565b815260243560ff8116810361085557602082019081526044359163ffffffff831683036108515780604063ffffffff92019384526064356060820152612acc610a76336140fe565b511680612b37575b505160ff8116612b16575b505163ffffffff8116612af0575080f35b68ffffffff000000000060ca549160281b169068ffffffff000000000019161760ca5580f35b64ff0000000060ca549160201b169064ff0000000019161760ca5538612adf565b63ffffffff1960ca54161760ca5538612ad4565b503461043a57602036600319011261031f576004359060cd54821015612b8f576020612b768361351e565b905460405160039290921b1c6001600160a01b03168152f35b80fd5b503461043a5736600319011261031f576020609854604051908152f35b503461043a57602036600319011261031f576004359060ff8216809203612b8f5760206001831b806098541614604051908152f35b503461043a578060031936011261031f576097546001600160a01b0316803b156103cc5760206024916040519283809263237dfb4760e11b82523360048301525afa801561032457612c3d918391612c74575b50613c4c565b60001960985560405160001981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a280f35b612c8d915060203d602011611d9e57611d918183613609565b38612c37565b503461043a57602036600319011261031f57610893612cb061367b565b612cb861469d565b6146f5565b503461043a57602036600319011261031f57612cd761367b565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103cc5781600491604051928380926302e0740360e31b82525afa908115610324578291612f8a575b5080515191612d3c8361396d565b91612d4a6040519384613609565b838352612d568461396d565b602084019190601f1901368337825b858110612f625750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103cc5760408051639004134760e01b81526001600160a01b0390971660048801526024870152835160448701819052839287929091606484019190855b818110612f3d5750505082809103915afa938415612f30578194612e9e575b5080815b848110612e725750612e0e906143b7565b93815b848110612e2657604051806109e6888261383e565b612e3081836143f6565b51612e3e575b600101612e11565b91600190612e6a906001600160a01b03612e5886886143f6565b5116612e64828a6143f6565b5261468e565b929050612e36565b612e7c81876143f6565b51612e8a575b600101612dfd565b90612e9660019161468e565b919050612e82565b9093503d8085833e612eb08183613609565b81019060208183031261031f578051906001600160401b03821161043557019080601f8301121561219a578151612ee68161396d565b92612ef46040519485613609565b81845260208085019260051b82010192831161219f57602001905b828210612f20575050509238612df9565b8151815260209182019101612f0f565b50604051903d90823e3d90fd5b82516001600160a01b031684528796508a955060209384019390920191600101612dda565b600190818060a01b03612f768285516143f6565b515116612f8382886143f6565b5201612d65565b612f9e91503d8084833e6109fe8183613609565b38612d2e565b3461043a57602036600319011261031f576020610a2f612fc261367b565b614161565b503461043a57602036600319011261031f57604060209163ffffffff612feb61381a565b16815260cc83522054604051908152f35b3461043a57602036600319011261031f576020610a2f61301a61367b565b6140fe565b503461043a5736600319011261031f576020613039614076565b6040516001600160a01b039091168152f35b503461043a57604036600319011261031f5761306561367b565b60243580151581036108555761089391613081610a76336140fe565b613ff3565b503461043a57602036600319011261031f576004356001600160401b038111610435576130b79036906004016137ce565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103cc5760206024916040519283809263ec7fbb3160e01b82523360048301525afa80156105cc57600191849161316c575b501515036131275761089390613dff565b60405162461bcd60e51b815260206004820152601b60248201527f4f70657261746f72206d757374206265207468652063616c6c657200000000006044820152606490fd5b613185915060203d602011611d9e57611d918183613609565b38613116565b503461043a57602036600319011261031f576004359060ce54821015612b8f576020612b76836134ed565b503461043a57602036600319011261031f57609754600435906001600160a01b0316803b156103cc5760206024916040519283809263237dfb4760e11b82523360048301525afa80156105cc57613213918491612c745750613c4c565b6098548181160361325157806098556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a280f35b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b50346133fd57602036600319011261031f576004356001600160a01b03811690819003610b48576097546001600160a01b038116803b156103cc5760405163755b36bd60e11b8152602081600481855afa80156133f25761332e91869161059d57506001600160a01b03163314613bd5565b82156133755760407f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6918151908152846020820152a16001600160a01b0319161760975580f35b60405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a490fd5b6040513d87823e3d90fd5b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b60ce548110156135085760ce60005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b60cd548110156135085760cd60005260206000200190600090565b80548210156135085760005260206000200190600090565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b608081019081106001600160401b038211176135bd57604052565b634e487b7160e01b600052604160045260246000fd5b60c081019081106001600160401b038211176135bd57604052565b604081019081106001600160401b038211176135bd57604052565b90601f801991011681019081106001600160401b038211176135bd57604052565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b600435906001600160a01b038216820361369157565b600080fd5b602435906001600160a01b038216820361369157565b35906001600160a01b038216820361369157565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b6001600160401b0381116135bd57601f01601f191660200190565b81601f8201121561219a5760208135910161374e82613719565b9261375c6040519485613609565b828452828201116137795781600092602092838601378301015290565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b919060408382031261111c57604051906137e7826135ee565b81936137f2816136ac565b83526020810135916001600160401b038311611117576020926138159201613734565b910152565b6004359063ffffffff8216820361369157565b359063ffffffff8216820361369157565b602060408183019282815284518094520192019060005b8181106138625750505090565b82516001600160a01b0316845260209384019390920191600101613855565b91909160c08184031261111c576040519061389b826135d3565b81938135916001600160401b038311611117576138be60a0939284938301613734565b845260208101356020850152604081013560408501526138e06060820161382d565b60608501526138f1608082016136ac565b60808501520135910152565b60005b8381106139105750506000910152565b8181015183820152602001613900565b90602091613939815180928185528580860191016138fd565b601f01601f1916010190565b906040602061396a9360018060a01b0381511684520151918160208201520190613920565b90565b6001600160401b0381116135bd5760051b60200190565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b9181601f8401121561219a578235916001600160401b038311613a0d576020808501948460051b01011161219f57565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b60cf548110156135085760cf60005260206000209060011b0190600090565b90600182811c92168015613ab5575b6020831014613a9f57565b634e487b7160e01b600052602260045260246000fd5b91607f1691613a94565b9060405191826000825492613ad384613a85565b8084529360018116908115613b415750600114613afa575b50613af892500383613609565b565b90506000929192526020600020906000915b818310613b25575050906020613af89282010138613aeb565b6020919350806001915483858901015201910190918492613b0c565b905060209250613af894915060ff191682840152151560051b82010138613aeb565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b9081602091031261031f57516001600160a01b03811681036136915790565b15613bdc57565b60405162461bcd60e51b815260206004820152602a60248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526939903ab73830bab9b2b960b11b6064820152608490fd5b9081602091031261031f575180151581036136915790565b15613c5357565b60405162461bcd60e51b815260206004820152602860248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526739903830bab9b2b960c11b6064820152608490fd5b818110613cb4575050565b60008155600101613ca9565b90929192613de9576001602091818060a01b038551166001600160601b0360a01b825416178155019201519182516001600160401b0381116135bd57613d068254613a85565b601f8111613dac575b506020601f8211600114613d4a5781929394600092613d3f575b50508160011b916000199060031b1c1916179055565b015190503880613d29565b601f1982169083600052806000209160005b818110613d9457509583600195969710613d7b575b505050811b019055565b015160001960f88460031b161c19169055388080613d71565b9192602060018192868b015181550194019201613d5c565b613dd990836000526020600020601f840160051c81019160208510613ddf575b601f0160051c0190613ca9565b38613d0f565b9091508190613dcc565b634e487b7160e01b600052600060045260246000fd5b80516001600160a01b03163303613f5d5760208101515115613e865760005b60cf54811015613e6257613e3181613a66565b505482516001600160a01b03908116911614613e4f57600101613e1e565b90613e5c613af892613a66565b90613cc0565b5060cf5490600160401b8210156135bd57613e5c826001613af8940160cf55613a66565b60005b60cf54811015613f1f57613e9c81613a66565b505482516001600160a01b03908116911614613eba57600101613e89565b613ec49150613a66565b613de9578060006001925501613eda8154613a85565b9081613ee4575050565b81601f60009311600114613ef6575055565b81835260208320613f1291601f0160051c810190600101613ca9565b8082528160208120915555565b60405162461bcd60e51b815260206004820152601260248201527113dc195c985d1bdc881b9bdd08199bdd5b9960721b6044820152606490fd5b0390fd5b60405162461bcd60e51b815260206004820152602660248201527f4d657461646174612061646472657373206d757374206d61746368207468652060448201526531b0b63632b960d11b6064820152608490fd5b15613fb857565b60405162461bcd60e51b815260206004820152601360248201527221b0b63632b91034b9903737ba1030b236b4b760691b6044820152606490fd5b906140515760005b60cd54811015613f1f5761400e8161351e565b905460039190911b1c6001600160a01b039081169083161461403257600101613ffb565b61403c915061351e565b81549060018060a01b039060031b1b19169055565b60cd5490600160401b8210156135bd576106de826001613af8940160cd5560cd613539565b60c9546001600160a01b0316803b156103cc57602060049160405192838092632495a59960e01b82525afa9081156140f2576000916140b3575090565b90506020813d6020116140ea575b816140ce60209383613609565b8101031261031f57516001600160a01b03811681036136915790565b3d91506140c1565b6040513d6000823e3d90fd5b6033546001600160a01b0316331461415b5760ce549060005b82811061412657505050600090565b61412f816134ed565b905460039190911b1c6001600160a01b039081169083161461415357600101614117565b505050600190565b50600190565b61416a816140fe565b61415b5760cd549060005b82811061418457505050600090565b61418d8161351e565b905460039190911b1c6001600160a01b039081169083161461415357600101614175565b9060a0806141c8845160c0855260c0850190613920565b93602081015160208501526040810151604085015263ffffffff6060820151166060850152600180831b036080820151166080850152015191015290565b9063ffffffff8091169116019063ffffffff821161422057565b634e487b7160e01b600052601160045260246000fd5b9061424a825160c0835260c08301906141b1565b9163ffffffff602082015116602083015263ffffffff604082015116604083015260ff60608201511660608301526080810151928281036080840152835180825260208201916020808360051b8301019601926000915b8383106142b957505050505060a08091015191015290565b90919293966020806142d7600193601f198682030187528b51613945565b990193019301919392906142a1565b604051906142f3826135ee565b6060602083600081520152565b9060405161430d816135ee565b82546001600160a01b0316815291829060209061381590600101613abf565b6143346142e6565b5060cf549060005b82811061437d5760405162461bcd60e51b815260206004820152601260248201527113dc195c985d1bdc881b9bdd08199bdd5b9960721b6044820152606490fd5b61438681613a66565b50546001600160a01b038381169116146143a25760010161433c565b61396a92506143b19150613a66565b50614300565b906143c18261396d565b6143ce6040519182613609565b82815280926143df601f199161396d565b0190602036910137565b8051156135085760200190565b80518210156135085760209160051b010190565b1561441157565b60405162461bcd60e51b815260206004820152604a60248201527f4543445341536572766963654d616e61676572426173652e6f6e6c795374616b60448201527f6552656769737472793a2063616c6c6572206973206e6f7420746865207374616064820152696b65526567697374727960b01b608482015260a490fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103cc576040516398ec1ac960e01b81526001600160a01b039091166004820152602081602481855afa9081156140f25760009161455f575b50813b156103cc576020600492604051938480926340bf2fb760e01b82525afa9182156140f25760009261452b575b50101590565b9091506020813d602011614557575b8161454760209383613609565b8101031261031f57519038614525565b3d915061453a565b90506020813d602011614589575b8161457a60209383613609565b8101031261031f5751386144f6565b3d915061456d565b60208183031261031f578051906001600160401b03821161043557019060208282031261111c5760405191602083018381106001600160401b038211176135bd576040528051906001600160401b038211611117570181601f8201121561219a578051906145fe8261396d565b9261460c6040519485613609565b82845260208085019360061b8301019181831161219f57602001925b8284106146385750505050815290565b60408483031261111c576040519061464f826135ee565b84516001600160a01b03811681036136915782526020850151906001600160601b03821682036136915782602092836040950152815201930192614628565b60001981146142205760010190565b6033546001600160a01b031633036146b157565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b606554604080516001600160a01b038084168252841660208201529192917fe11cddf1816a43318ca175bbc52cd0185436e9cbead7c83acc54a73e461717e39190a16001600160a01b03166001600160a01b03199190911617606555565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b61396a9161482291603a61481a6147b38351614c2d565b9260405192839160208301957f19457468657265756d205369676e6564204d6573736167653a0a00000000000087526147f581518092602086880191016138fd565b830161480a82518093602086850191016138fd565b010103601f198101835282613609565b519020614dfc565b919091614e6c565b9063ffffffff8091169116039063ffffffff821161422057565b9190820180921161422057565b811561485b570690565b634e487b7160e01b600052601260045260246000fd5b811561485b570490565b9081602091031261031f575163ffffffff811681036136915790565b6065546001600160a01b031633036148ab57565b60405162461bcd60e51b815260206004820152605160248201527f4543445341536572766963654d616e61676572426173652e6f6e6c795265776160448201527f726473496e69746961746f723a2063616c6c6572206973206e6f7420746865206064820152703932bbb0b932399034b734ba34b0ba37b960791b608482015260a490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206f6666736574000000006044820152606490fd5b91908110156135085760051b8101359060be1981360301821215614997570190565b614930565b903590601e198136030182121561499757018035906001600160401b038211614a1657602001918160061b360383136149d157565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c64617461207461696c20746f6f2073686f72740000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206c656e677468000000006044820152606490fd5b356001600160a01b03811681036136915790565b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206c656e67746800006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c64617461206163636573732073747269646500006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206f666673657400006044820152606490fd5b9035601e19823603018112156103c75701602081359101916001600160401b038211610df6578160061b36038313610df157565b916020908281520191906000905b808210614b8d5750505090565b909192833560018060a01b0381168091036136915781526020840135906001600160601b03821680920361369157604081600193602083940152019401920190614b80565b91908110156135085760051b81013590609e1981360301821215614997570190565b90614bfe82613719565b614c0b6040519182613609565b82815280926143df601f1991613719565b908151811015613508570160200190565b8015614cc55780816000925b614cb1575080614c4883614bf4565b92915b614c5457505090565b60001982019182116142205781600a820491600a8302838104600a14841517156142205781039081116142205760ff1660300160ff81116142205760f81b6001600160f81b03191660001a90614caa9085614c1c565b5380614c4b565b91614cbd600a9161468e565b920480614c39565b50604051614cd4604082613609565b60018152600360fc1b602082015290565b6040516323b872dd60e01b60208201526001600160a01b0392831660248201529290911660448301526064820192909252613af891614d3182608481015b03601f198101845283613609565b614fe6565b6001600160a01b03811692833b156103cc57604051636eb1769f60e11b81523060048201526001600160a01b038416602482015293602090859060449082905afa9384156140f257600094614dc6575b50614d97614d3191613af895614844565b60405163095ea7b360e01b60208201526001600160a01b03909416602485015260448401528260648101614d23565b93506020843d602011614df4575b81614de160209383613609565b8101031261031f57925192614d97614d86565b3d9150614dd4565b815160418103614e29575090614e25916020820151906060604084015193015160001a9061513a565b9091565b604003614e625760406020830151920151918260ff1c91601b830180931161422057614e25936001600160ff1b03169260ff169061513a565b5050600090600290565b6005811015614fd05780614e7d5750565b600060018203614ecc5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b5060028103614f1a5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b60009060038103614f755760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b6004915014614f8057565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608490fd5b634e487b7160e01b600052602160045260246000fd5b60408051909290916001600160a01b03166150018484613609565b602083527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020840152803b156150f65760008281928260206150729796519301915af13d156150ee573d9061505682613719565b9161506386519384613609565b82523d6000602084013e615224565b8051908161507f57505050565b602080615090938301019101613c34565b156150985750565b5162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b606090615224565b835162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116151d65760ff1690601b821415806151cb575b6151bf57602093600093608093604051938452868401526040830152606082015282805260015afa156140f2576000516001600160a01b038116156151b65790600090565b50600090600190565b50505050600090600490565b50601c821415615171565b50505050600090600390565b60f81c600a8110156152095760300160ff81116142205760f81b6001600160f81b03191690565b60570160ff81116142205760f81b6001600160f81b03191690565b90919015615230575090565b8151156152405750805190602001fd5b60405162461bcd60e51b815260206004820152908190613f5990602483019061392056fea26469706673582212206a37532f698adfa346f4301fb50002c7b974da091305d128ab05d3c3044e7d8364736f6c634300081a0033"; type ReclaimServiceManagerConstructorParams = | [signer?: Signer] diff --git a/src/avs/contracts/factories/RewardsCoordinator__factory.ts b/src/avs/contracts/factories/RewardsCoordinator__factory.ts new file mode 100644 index 00000000..2318c86f --- /dev/null +++ b/src/avs/contracts/factories/RewardsCoordinator__factory.ts @@ -0,0 +1,2176 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Signer, + utils, + Contract, + ContractFactory, + BigNumberish, + Overrides, +} from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { + RewardsCoordinator, + RewardsCoordinatorInterface, +} from "../RewardsCoordinator"; + +const _abi = [ + { + type: "constructor", + inputs: [ + { + name: "_delegationManager", + type: "address", + internalType: "contract IDelegationManager", + }, + { + name: "_strategyManager", + type: "address", + internalType: "contract IStrategyManager", + }, + { + 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: "contract IStrategy", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "calculateEarnerLeafHash", + inputs: [ + { + name: "leaf", + type: "tuple", + internalType: "struct IRewardsCoordinator.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: "struct IRewardsCoordinator.TokenTreeMerkleLeaf", + components: [ + { + name: "token", + type: "address", + internalType: "contract IERC20", + }, + { + name: "cumulativeEarnings", + type: "uint256", + internalType: "uint256", + }, + ], + }, + ], + outputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "pure", + }, + { + type: "function", + name: "checkClaim", + inputs: [ + { + name: "claim", + type: "tuple", + internalType: "struct IRewardsCoordinator.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: "struct IRewardsCoordinator.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: "struct IRewardsCoordinator.TokenTreeMerkleLeaf[]", + components: [ + { + name: "token", + type: "address", + internalType: "contract IERC20", + }, + { + 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: "struct IRewardsCoordinator.RewardsSubmission[]", + components: [ + { + name: "strategiesAndMultipliers", + type: "tuple[]", + internalType: "struct IRewardsCoordinator.StrategyAndMultiplier[]", + components: [ + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + { + name: "multiplier", + type: "uint96", + internalType: "uint96", + }, + ], + }, + { + name: "token", + type: "address", + internalType: "contract IERC20", + }, + { + name: "amount", + type: "uint256", + internalType: "uint256", + }, + { + name: "startTimestamp", + type: "uint32", + internalType: "uint32", + }, + { + name: "duration", + type: "uint32", + internalType: "uint32", + }, + ], + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "createOperatorDirectedAVSRewardsSubmission", + inputs: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "operatorDirectedRewardsSubmissions", + type: "tuple[]", + internalType: + "struct IRewardsCoordinator.OperatorDirectedRewardsSubmission[]", + components: [ + { + name: "strategiesAndMultipliers", + type: "tuple[]", + internalType: "struct IRewardsCoordinator.StrategyAndMultiplier[]", + components: [ + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + { + name: "multiplier", + type: "uint96", + internalType: "uint96", + }, + ], + }, + { + name: "token", + type: "address", + internalType: "contract IERC20", + }, + { + name: "operatorRewards", + type: "tuple[]", + internalType: "struct IRewardsCoordinator.OperatorReward[]", + components: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "startTimestamp", + type: "uint32", + internalType: "uint32", + }, + { + name: "duration", + type: "uint32", + internalType: "uint32", + }, + { + name: "description", + type: "string", + internalType: "string", + }, + ], + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "createRewardsForAllEarners", + inputs: [ + { + name: "rewardsSubmissions", + type: "tuple[]", + internalType: "struct IRewardsCoordinator.RewardsSubmission[]", + components: [ + { + name: "strategiesAndMultipliers", + type: "tuple[]", + internalType: "struct IRewardsCoordinator.StrategyAndMultiplier[]", + components: [ + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + { + name: "multiplier", + type: "uint96", + internalType: "uint96", + }, + ], + }, + { + name: "token", + type: "address", + internalType: "contract IERC20", + }, + { + 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: "struct IRewardsCoordinator.RewardsSubmission[]", + components: [ + { + name: "strategiesAndMultipliers", + type: "tuple[]", + internalType: "struct IRewardsCoordinator.StrategyAndMultiplier[]", + components: [ + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + { + name: "multiplier", + type: "uint96", + internalType: "uint96", + }, + ], + }, + { + name: "token", + type: "address", + internalType: "contract IERC20", + }, + { + 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: "contract IERC20", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "currRewardsCalculationEndTimestamp", + inputs: [], + outputs: [ + { + name: "", + type: "uint32", + internalType: "uint32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "defaultOperatorSplitBips", + inputs: [], + outputs: [ + { + name: "", + type: "uint16", + internalType: "uint16", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "delegationManager", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IDelegationManager", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "disableRoot", + inputs: [ + { + name: "rootIndex", + type: "uint32", + internalType: "uint32", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "domainSeparator", + inputs: [], + outputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getCurrentClaimableDistributionRoot", + inputs: [], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct IRewardsCoordinator.DistributionRoot", + components: [ + { + name: "root", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "rewardsCalculationEndTimestamp", + type: "uint32", + internalType: "uint32", + }, + { + name: "activatedAt", + type: "uint32", + internalType: "uint32", + }, + { + name: "disabled", + type: "bool", + internalType: "bool", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getCurrentDistributionRoot", + inputs: [], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct IRewardsCoordinator.DistributionRoot", + components: [ + { + name: "root", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "rewardsCalculationEndTimestamp", + type: "uint32", + internalType: "uint32", + }, + { + name: "activatedAt", + type: "uint32", + internalType: "uint32", + }, + { + name: "disabled", + type: "bool", + internalType: "bool", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getDistributionRootAtIndex", + inputs: [ + { + name: "index", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct IRewardsCoordinator.DistributionRoot", + components: [ + { + name: "root", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "rewardsCalculationEndTimestamp", + type: "uint32", + internalType: "uint32", + }, + { + name: "activatedAt", + type: "uint32", + internalType: "uint32", + }, + { + name: "disabled", + type: "bool", + internalType: "bool", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getDistributionRootsLength", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getOperatorAVSSplit", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "avs", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "uint16", + internalType: "uint16", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getOperatorPISplit", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "uint16", + internalType: "uint16", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getRootIndexFromHash", + inputs: [ + { + name: "rootHash", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "", + type: "uint32", + internalType: "uint32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "initialize", + inputs: [ + { + name: "initialOwner", + type: "address", + internalType: "address", + }, + { + name: "_pauserRegistry", + type: "address", + internalType: "contract IPauserRegistry", + }, + { + name: "initialPausedStatus", + type: "uint256", + internalType: "uint256", + }, + { + name: "_rewardsUpdater", + type: "address", + internalType: "address", + }, + { + name: "_activationDelay", + type: "uint32", + internalType: "uint32", + }, + { + name: "_defaultSplitBips", + type: "uint16", + internalType: "uint16", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "isAVSRewardsSubmissionHash", + inputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "isOperatorDirectedAVSRewardsSubmissionHash", + inputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "isRewardsForAllSubmitter", + inputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "isRewardsSubmissionForAllEarnersHash", + inputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "isRewardsSubmissionForAllHash", + inputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "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: "contract IPauserRegistry", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "processClaim", + inputs: [ + { + name: "claim", + type: "tuple", + internalType: "struct IRewardsCoordinator.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: "struct IRewardsCoordinator.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: "struct IRewardsCoordinator.TokenTreeMerkleLeaf[]", + components: [ + { + name: "token", + type: "address", + internalType: "contract IERC20", + }, + { + name: "cumulativeEarnings", + type: "uint256", + internalType: "uint256", + }, + ], + }, + ], + }, + { + name: "recipient", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "processClaims", + inputs: [ + { + name: "claims", + type: "tuple[]", + internalType: "struct IRewardsCoordinator.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: "struct IRewardsCoordinator.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: "struct IRewardsCoordinator.TokenTreeMerkleLeaf[]", + components: [ + { + name: "token", + type: "address", + internalType: "contract IERC20", + }, + { + 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: "setDefaultOperatorSplit", + inputs: [ + { + name: "split", + type: "uint16", + internalType: "uint16", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setOperatorAVSSplit", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "split", + type: "uint16", + internalType: "uint16", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setOperatorPISplit", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "split", + type: "uint16", + internalType: "uint16", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setPauserRegistry", + inputs: [ + { + name: "newPauserRegistry", + type: "address", + internalType: "contract IPauserRegistry", + }, + ], + 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: "contract IStrategyManager", + }, + ], + 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: "struct IRewardsCoordinator.RewardsSubmission", + components: [ + { + name: "strategiesAndMultipliers", + type: "tuple[]", + internalType: "struct IRewardsCoordinator.StrategyAndMultiplier[]", + components: [ + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + { + name: "multiplier", + type: "uint96", + internalType: "uint96", + }, + ], + }, + { + name: "token", + type: "address", + internalType: "contract IERC20", + }, + { + name: "amount", + type: "uint256", + internalType: "uint256", + }, + { + name: "startTimestamp", + type: "uint32", + internalType: "uint32", + }, + { + name: "duration", + type: "uint32", + internalType: "uint32", + }, + ], + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ActivationDelaySet", + inputs: [ + { + name: "oldActivationDelay", + type: "uint32", + indexed: false, + internalType: "uint32", + }, + { + name: "newActivationDelay", + type: "uint32", + indexed: false, + internalType: "uint32", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ClaimerForSet", + inputs: [ + { + name: "earner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "oldClaimer", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "claimer", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "DefaultOperatorSplitBipsSet", + inputs: [ + { + name: "oldDefaultOperatorSplitBips", + type: "uint16", + indexed: false, + internalType: "uint16", + }, + { + name: "newDefaultOperatorSplitBips", + type: "uint16", + indexed: false, + internalType: "uint16", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "DistributionRootDisabled", + inputs: [ + { + name: "rootIndex", + type: "uint32", + indexed: true, + internalType: "uint32", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "DistributionRootSubmitted", + inputs: [ + { + name: "rootIndex", + type: "uint32", + indexed: true, + internalType: "uint32", + }, + { + name: "root", + type: "bytes32", + indexed: true, + internalType: "bytes32", + }, + { + name: "rewardsCalculationEndTimestamp", + type: "uint32", + indexed: true, + internalType: "uint32", + }, + { + name: "activatedAt", + type: "uint32", + indexed: false, + internalType: "uint32", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Initialized", + inputs: [ + { + name: "version", + type: "uint8", + indexed: false, + internalType: "uint8", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OperatorAVSSplitBipsSet", + inputs: [ + { + name: "caller", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "operator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "avs", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "activatedAt", + type: "uint32", + indexed: false, + internalType: "uint32", + }, + { + name: "oldOperatorAVSSplitBips", + type: "uint16", + indexed: false, + internalType: "uint16", + }, + { + name: "newOperatorAVSSplitBips", + type: "uint16", + indexed: false, + internalType: "uint16", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OperatorDirectedAVSRewardsSubmissionCreated", + inputs: [ + { + name: "caller", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "avs", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "operatorDirectedRewardsSubmissionHash", + type: "bytes32", + indexed: true, + internalType: "bytes32", + }, + { + name: "submissionNonce", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "operatorDirectedRewardsSubmission", + type: "tuple", + indexed: false, + internalType: + "struct IRewardsCoordinator.OperatorDirectedRewardsSubmission", + components: [ + { + name: "strategiesAndMultipliers", + type: "tuple[]", + internalType: "struct IRewardsCoordinator.StrategyAndMultiplier[]", + components: [ + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + { + name: "multiplier", + type: "uint96", + internalType: "uint96", + }, + ], + }, + { + name: "token", + type: "address", + internalType: "contract IERC20", + }, + { + name: "operatorRewards", + type: "tuple[]", + internalType: "struct IRewardsCoordinator.OperatorReward[]", + components: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "startTimestamp", + type: "uint32", + internalType: "uint32", + }, + { + name: "duration", + type: "uint32", + internalType: "uint32", + }, + { + name: "description", + type: "string", + internalType: "string", + }, + ], + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OperatorPISplitBipsSet", + inputs: [ + { + name: "caller", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "operator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "activatedAt", + type: "uint32", + indexed: false, + internalType: "uint32", + }, + { + name: "oldOperatorPISplitBips", + type: "uint16", + indexed: false, + internalType: "uint16", + }, + { + name: "newOperatorPISplitBips", + type: "uint16", + indexed: false, + internalType: "uint16", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OwnershipTransferred", + inputs: [ + { + name: "previousOwner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newOwner", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Paused", + inputs: [ + { + name: "account", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newPausedStatus", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "PauserRegistrySet", + inputs: [ + { + name: "pauserRegistry", + type: "address", + indexed: false, + internalType: "contract IPauserRegistry", + }, + { + name: "newPauserRegistry", + type: "address", + indexed: false, + internalType: "contract IPauserRegistry", + }, + ], + 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: "contract IERC20", + }, + { + 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: "struct IRewardsCoordinator.RewardsSubmission", + components: [ + { + name: "strategiesAndMultipliers", + type: "tuple[]", + internalType: "struct IRewardsCoordinator.StrategyAndMultiplier[]", + components: [ + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + { + name: "multiplier", + type: "uint96", + internalType: "uint96", + }, + ], + }, + { + name: "token", + type: "address", + internalType: "contract IERC20", + }, + { + name: "amount", + type: "uint256", + internalType: "uint256", + }, + { + name: "startTimestamp", + type: "uint32", + internalType: "uint32", + }, + { + name: "duration", + type: "uint32", + internalType: "uint32", + }, + ], + }, + ], + anonymous: false, + }, + { + type: "event", + name: "RewardsSubmissionForAllEarnersCreated", + inputs: [ + { + name: "tokenHopper", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "submissionNonce", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + { + name: "rewardsSubmissionHash", + type: "bytes32", + indexed: true, + internalType: "bytes32", + }, + { + name: "rewardsSubmission", + type: "tuple", + indexed: false, + internalType: "struct IRewardsCoordinator.RewardsSubmission", + components: [ + { + name: "strategiesAndMultipliers", + type: "tuple[]", + internalType: "struct IRewardsCoordinator.StrategyAndMultiplier[]", + components: [ + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + { + name: "multiplier", + type: "uint96", + internalType: "uint96", + }, + ], + }, + { + name: "token", + type: "address", + internalType: "contract IERC20", + }, + { + 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, + }, +] as const; + +const _bytecode = + "0x61018080604052346103c757604051601f61552238819003918201601f19168301916001600160401b038311848410176103b15780849260e094604052833981010312610361578051906001600160a01b038216820361035c5760208101516001600160a01b038116810361035c5761007a60408301610414565b61008660608401610414565b9061009360808501610414565b926100ac60c06100a560a08801610414565b9601610414565b9563ffffffff831680156103465763ffffffff81818a1606166102b5576201518063ffffffff91061661022457610120526101405260805260a05260c05260e0526101005260005460ff8160081c166101cf5760ff80821610610194575b46610160526040516150fc908161042682396080518181816114bb01526148ca015260a0518181816117f0015261488f015260c051818181610b89015261490e015260e05181818161050f01526137040152610100518181816107030152614a5a01526101205181611c26015261014051818181610bc3015261494c015261016051816132120152f35b60ff90811916176000557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a18061010a565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b60405162461bcd60e51b815260206004820152605760248201527f52657761726473436f6f7264696e61746f723a2043414c43554c4154494f4e5f60448201527f494e54455256414c5f5345434f4e4453206d7573742062652061206d756c746960648201527f706c65206f6620534e415053484f545f434144454e4345000000000000000000608482015260a490fd5b60405162461bcd60e51b815260206004820152606060248201527f52657761726473436f6f7264696e61746f723a2047454e455349535f5245574160448201527f5244535f54494d455354414d50206d7573742062652061206d756c7469706c6560648201527f206f662043414c43554c4154494f4e5f494e54455256414c5f5345434f4e4453608482015260a490fd5b634e487b7160e01b600052601260045260246000fd5b600080fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b600052604160045260246000fd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b519063ffffffff8216820361035c5756fe60806040526004361061215c5760003560e01c806218572c1461039b57806304a0c502146103965780630e9a53cf146103915780630eb383451461038c57806310d67a2f14610387578063131433b414610382578063136439dd1461037d578063149bc872146103785780632b9f64a41461037357806336af41fa1461036e57806337838ed01461036957806339b70e38146103645780633a8c07861461035f5780633ccc861d1461035a5780633efe1db6146103555780634596021c146103505780634b9439601461034b5780634d18cc351461034657806358baaa3e14610341578063595c6a671461033c5780635ac86ab7146103375780635c975abb146103325780635e9d83481461032d57806363f6a798146103285780636d21117e14610323578063715018a61461031e5780637b8f8b0514610319578063863cb9a914610314578063865c69531461030f578063886f11951461030a5780638da5cb5b146103055780639104c319146103005780639be3d4e4146102fb5780639cb9a5fa146102f65780639d45c281146102f1578063a0169ddd146102ec578063a50a1d9c146102e7578063aebd8bae146102e2578063b3dbb0e0146102dd578063bb7e451f146102d8578063bf21a8aa146102d3578063c46db606146102ce578063d4540a55146102c9578063dcbb03b3146102c4578063de02e503146102bf578063e063f81f146102ba578063e810ce21146102b5578063ea4d3c9b146102b0578063ed71e6a2146102ab578063f2fde38b146102a6578063f698da25146102a1578063f8cd84481461029c578063f96abf2e14610297578063fabc1cbc14610292578063fbf1e2c11461028d578063fce36c7d146102885763ff9f6cce0361215c57612046565b611f4a565b611f21565b611eb6565b611d77565b611d53565b611d38565b611ca7565b611c55565b611c10565b611be4565b611b73565b611b48565b611991565b611866565b611814565b6117d3565b611796565b611608565b6115b6565b611586565b6114df565b61149e565b61132d565b6112f0565b6112c1565b611298565b61126f565b61120c565b6111df565b6111c1565b611164565b611112565b6110ed565b61108d565b61106f565b61103c565b610fdb565b610fae565b610f87565b610f05565b610e66565b610cb4565b610c28565b610bf2565b610bad565b610b6c565b610a0c565b610854565b610828565b610727565b6106e6565b610635565b61059c565b610533565b6104f2565b6104a6565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b6001600160a01b038116036104a157565b600080fd5b346104ed5760203660031901126104e8576004356104c381610490565b60018060a01b031660005260d1602052602060ff604060002054166040519015158152f35b6103f0565b6103a0565b346104ed5760003660031901126104e857602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346104ed5760003660031901126104e85761058e61054f61233b565b6040519182918291909160608060808301948051845263ffffffff602082015116602085015263ffffffff604082015116604085015201511515910152565b0390f35b801515036104a157565b346104ed5760403660031901126104e8576004356105b981610490565b602435906105c682610592565b6105ce61340d565b60018060a01b03168060005260d160205260ff60406000205416151582151590827f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c600080a460005260d160205260406000209060ff801983541691151516179055600080f35b346104ed5760203660031901126104e85760043561065281610490565b6065546001600160a01b031690813b156106e15760206004926040519384809263755b36bd60e11b82525afa9182156106dc576106ab926106a6916000916106ad575b506001600160a01b03163314612444565b613465565b005b6106cf915060203d6020116106d5575b6106c78183612210565b810190612420565b38610695565b503d6106bd565b612438565b6123cd565b346104ed5760003660031901126104e857602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346104ed5760203660031901126104e8576065546001600160a01b0316600435813b156106e15760206024926040519384809263237dfb4760e11b82523360048301525afa9182156106dc576106ab926107899160009161078e575b506124b8565b612515565b6107b0915060203d6020116107b6575b6107a88183612210565b8101906124a3565b38610783565b503d61079e565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a207374727563742063616c6c6461746120746f6044820152661bc81cda1bdc9d60ca1b6064820152608490fd5b604090600319011261082357600490565b6107bd565b346104ed5760403660031901126104e857602061084c61084736610812565b6125ca565b604051908152f35b346104ed5760203660031901126104e85760043561087181610490565b60018060a01b031660005260cc602052602060018060a01b0360406000205416604051908152f35b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b9181601f84011215610980578235916001600160401b038311610927576020808501948460051b01011161092257565b610899565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b60206003198201126104e857600435906001600160401b038211610a0757610a03916004016108f2565b9091565b610440565b346104ed57610a1a366109d9565b90610a32610a2c600280606654161490565b15612614565b3360005260d1602052610a4c60ff60406000205416612660565b610a5b600260975414156126ec565b600260975560005b828110610a74576106ab6001609755565b80610b66610a856001938686612807565b33600090815260ce60205260409020546040516020810190610abb81610aad86863387612a10565b03601f198101835282612210565b51902090610ac883613692565b33600090815260d060205260409020610afe90610af19084905b90600052602052604060002090565b805460ff19166001179055565b610b0781612a34565b33600090815260ce60205260409020556040517f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf270482339180610b488782612a5d565b0390a46040610b59602083016125c0565b91013590309033906137a8565b01610a63565b346104ed5760003660031901126104e857602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346104ed5760003660031901126104e8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346104ed5760003660031901126104e857602063ffffffff60cb5460a01c16604051908152f35b90816101009103126108235790565b346104ed5760403660031901126104e8576004356001600160401b038111610a0757610c5b610c92913690600401610c19565b60243590610c6882610490565b610c79610a2c600480606654161490565b610c88600260975414156126ec565b6002609755613938565b6001609755005b63ffffffff8116036104a157565b3590610cb282610c99565b565b346104ed5760403660031901126104e857602435600435610cd482610c99565b610ce5610a2c600880606654161490565b60cb5491610cfd336001600160a01b03851614612a6e565b63ffffffff81169263ffffffff8160c01c16841115610de75763ffffffff7fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd0891610d48428710612ad7565b610dcd610d75610d6d610d6060ca5463ffffffff1690565b9360a01c63ffffffff1690565b844216612b67565b94610da8610d81612231565b88815263ffffffff8316602082015263ffffffff8816604082015260006060820152612b81565b60cb805463ffffffff60c01b191660c09290921b63ffffffff60c01b16919091179055565b60405163ffffffff9094168452169180602081015b0390a4005b60405162461bcd60e51b815260206004820152604b60248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a206e60448201527f657720726f6f74206d75737420626520666f72206e657765722063616c63756c60648201526a185d1959081c195c9a5bd960aa1b608482015260a490fd5b346104ed5760403660031901126104e8576004356001600160401b038111610a0757610e969036906004016108f2565b60243591610ea383610490565b610eb4610a2c600480606654161490565b610ec3600260975414156126ec565b60026097553681900360fe19019260005b83811015610c92578060051b8301359085821215610f0057610efa836001938601613938565b01610ed4565b612738565b346104ed5760203660031901126104e857600435610f2281610490565b60018060a01b031660005260d560205261058e610f72604060002063ffffffff60405191610f4f836121d5565b5461ffff8116835261ffff8160101c16602084015260201c166040820152613afb565b60405161ffff90911681529081906020820190565b346104ed5760003660031901126104e857602063ffffffff60cb5460c01c16604051908152f35b346104ed5760203660031901126104e8576106ab600435610fce81610c99565b610fd661340d565b613b32565b346104ed5760003660031901126104e8576065546001600160a01b0316803b156106e15760206024916040519283809263237dfb4760e11b82523360048301525afa80156106dc576110349160009161078e57506124b8565b6106ab612c6a565b346104ed5760203660031901126104e85760043560ff81168091036104a15760016020911b806066541614604051908152f35b346104ed5760003660031901126104e8576020606654604051908152f35b346104ed5760203660031901126104e8576004356001600160401b038111610a07576110c06110e2913690600401610c19565b6110dc6110d682356110d181610c99565b6122ba565b506122fa565b90613d82565b602060405160018152f35b346104ed5760003660031901126104e857602061ffff60cb5460e01c16604051908152f35b346104ed5760403660031901126104e85760043561112f81610490565b6024359060018060a01b031660005260cf602052604060002090600052602052602060ff604060002054166040519015158152f35b346104ed5760003660031901126104e85761117d61340d565b603380546001600160a01b031981169091556000906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346104ed5760003660031901126104e857602060ca54604051908152f35b346104ed5760203660031901126104e8576106ab6004356111ff81610490565b61120761340d565b613efa565b346104ed5760403660031901126104e857602061126660043561122e81610490565b6024359061123b82610490565b60018060a01b031660005260cd835260406000209060018060a01b0316600052602052604060002090565b54604051908152f35b346104ed5760003660031901126104e8576065546040516001600160a01b039091168152602090f35b346104ed5760003660031901126104e8576033546040516001600160a01b039091168152602090f35b346104ed5760003660031901126104e857602060405173beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08152f35b346104ed5760003660031901126104e857611309612240565b5060ca5460001981019081116113285761054f6110d661058e926122ba565b612265565b346104ed5760403660031901126104e85760043561134a81610490565b6024356001600160401b038111610a07576113699036906004016108f2565b919061137c610a2c602080606654161490565b61138b600260975414156126ec565b60026097556001600160a01b038216916113a6338414612caa565b60005b8481106113ba576106ab6001609755565b806114986113cb6001938887612d39565b6001600160a01b038516600090815260ce60205260409020549060405160208101906113fd81610aad85878c87612ea1565b5190208861140a836141de565b9361142e610af184610ae28c60018060a01b031660005260d3602052604060002090565b61143781612a34565b6001600160a01b038a16600090815260ce60205260409020557ffc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e06040518061148187339583612ec5565b0390a4309061149360203392016125c0565b6137a8565b016113a9565b346104ed5760003660031901126104e857602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346104ed5760203660031901126104e8576004356114fc81610490565b33600081815260cc6020526040812080546001600160a01b039485166001600160a01b03198216811790925590931691907fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca3129080a4005b6024359061ffff821682036104a157565b60a4359061ffff821682036104a157565b6044359061ffff821682036104a157565b346104ed5760203660031901126104e85760043561ffff811681036104a1576106ab906115b161340d565b6142f5565b346104ed5760403660031901126104e8576004356115d381610490565b6024359060018060a01b031660005260d2602052604060002090600052602052602060ff604060002054166040519015158152f35b346104ed5760403660031901126104e85760043561162581610490565b61162d611553565b9061163f610a2c608080606654161490565b6001600160a01b0381169133839003611721578061168661271061ffff7fd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f7494161115612edc565b60cb546116a39060a01c63ffffffff165b63ffffffff4216612b67565b926116f984836116f46116d86116d36116ce8760018060a01b031660005260d5602052604060002090565b612c36565b613afb565b6001600160a01b03909516600090815260d56020526040902090565b614350565b6040805163ffffffff95909516855261ffff91821660208601529116908301523391606090a3005b60405162461bcd60e51b815260206004820152604160248201527f52657761726473436f6f7264696e61746f722e7365744f70657261746f72504960448201527f53706c69743a2063616c6c6572206973206e6f7420746865206f70657261746f6064820152603960f91b608482015260a490fd5b346104ed5760203660031901126104e8576004356117b381610490565b60018060a01b031660005260ce6020526020604060002054604051908152f35b346104ed5760003660031901126104e857602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346104ed5760403660031901126104e85760043561183181610490565b6024359060018060a01b031660005260d0602052604060002090600052602052602060ff604060002054166040519015158152f35b346104ed5760c03660031901126104e85760043561188381610490565b61190560243561189281610490565b6044356064356118a181610490565b608435916118ae83610c99565b6118b6611564565b93600054966118e96118d36118cf8a60ff9060081c1690565b1590565b8099819a611983575b8115611963575b50612f59565b876118fc600160ff196000541617600055565b61194a57612fbc565b61190b57005b61191b61ff001960005416600055565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1005b61195e61010061ff00196000541617600055565b612fbc565b303b15915081611975575b50386118e3565b60ff1660011490503861196e565b600160ff82161091506118dc565b346104ed5760603660031901126104e8576004356119ae81610490565b6024356119ba81610490565b6119c2611575565b6119d3610a2c604080606654161490565b6001600160a01b0383169133839003611ad257817f48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae693491611a1e61271061ffff611a65961611156130c5565b611a9886836116f484611a65611a7c6116d36116ce84611a4a61169760cb5463ffffffff9060a01c1690565b9d8e9960018060a01b031660005260d4602052604060002090565b9060018060a01b0316600052602052604060002090565b6001600160a01b03909c16600090815260d46020526040902090565b6040805163ffffffff95909516855261ffff968716602086015291909516908301526001600160a01b039093169233918060608101610de2565b60405162461bcd60e51b815260206004820152604260248201527f52657761726473436f6f7264696e61746f722e7365744f70657261746f72415660448201527f5353706c69743a2063616c6c6572206973206e6f7420746865206f706572617460648201526137b960f11b608482015260a490fd5b346104ed5760203660031901126104e85761058e61054f6110d6600435611b6d612240565b506122ba565b346104ed5760403660031901126104e85761058e610f72611bd2600435611b9981610490565b60243590611ba682610490565b60018060a01b031660005260d460205260406000209060018060a01b0316600052602052604060002090565b63ffffffff60405191610f4f836121d5565b346104ed5760203660031901126104e8576020611c0260043561315c565b63ffffffff60405191168152f35b346104ed5760003660031901126104e8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346104ed5760403660031901126104e857600435611c7281610490565b6024359060018060a01b031660005260d3602052604060002090600052602052602060ff604060002054166040519015158152f35b346104ed5760203660031901126104e857600435611cc481610490565b611ccc61340d565b6001600160a01b03811615611ce4576106ab90613eb1565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346104ed5760003660031901126104e857602061084c61320f565b346104ed5760403660031901126104e857602061084c611d7236610812565b613244565b346104ed5760203660031901126104e857600435611d9481610c99565b611da5610a2c600880606654161490565b611dba60018060a01b0360cb54163314612a6e565b60ca549063ffffffff811691821015611e57576001611ddb611e30926122ba565b5001611e1d611e16611e0d8354611e01611dfc6118cf8360ff9060401c1690565b61328b565b60201c63ffffffff1690565b63ffffffff1690565b42106132f5565b805460ff60401b1916600160401b179055565b7fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e600080a2005b60405162461bcd60e51b815260206004820152603160248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152700d2dcecc2d8d2c840e4dedee892dcc8caf607b1b6064820152608490fd5b346104ed5760203660031901126104e8576065546001600160a01b0316600435813b156106e15760206004926040519384809263755b36bd60e11b82525afa9182156106dc576106ab92611f1c916000916106ad57506001600160a01b03163314612444565b613360565b346104ed5760003660031901126104e85760cb546040516001600160a01b039091168152602090f35b346104ed57611f58366109d9565b90611f6a610a2c600180606654161490565b611f79600260975414156126ec565b600260975560005b828110611f92576106ab6001609755565b80612040611fa36001938686612807565b33600090815260ce60205260409020546040516020810190611fcb81610aad86863387612a10565b51902090611fd883613692565b33600090815260cf60205260409020611ff690610af1908490610ae2565b611fff81612a34565b33600090815260ce60205260409020556040517f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e6281339180610b488782612a5d565b01611f81565b346104ed57612054366109d9565b90612066610a2c601080606654161490565b3360005260d160205261208060ff60406000205416612660565b61208f600260975414156126ec565b600260975560005b8281106120a8576106ab6001609755565b806121566120b96001938686612807565b33600090815260ce602052604090205460405160208101906120e181610aad86863387612a10565b519020906120ee83613692565b33600090815260d26020526040902061210c90610af1908490610ae2565b61211581612a34565b33600090815260ce60205260409020556040517f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b339180610b488782612a5d565b01612097565b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b634e487b7160e01b600052604160045260246000fd5b606081019081106001600160401b038211176121f057604052565b6121bf565b608081019081106001600160401b038211176121f057604052565b90601f801991011681019081106001600160401b038211176121f057604052565b60405190610cb2608083612210565b6040519061224d826121f5565b60006060838281528260208201528260408201520152565b634e487b7160e01b600052601160045260246000fd5b8015611328576000190190565b60001981019190821161132857565b9190820391821161132857565b634e487b7160e01b600052603260045260246000fd5b60ca548110156122d95760ca60005260206000209060011b0190600090565b6122a4565b80548210156122d95760005260206000209060011b0190600090565b90604051612307816121f5565b606060ff6001839580548552015463ffffffff8116602085015263ffffffff8160201c16604085015260401c161515910152565b612343612240565b5060ca54805b6123725750612356612231565b6000815260006020820152600060408201526000606082015290565b6123816110d66110d183612288565b906123926118cf6060840151151590565b806123b0575b6123ac576123a6915061227b565b80612349565b5090565b506123c5611e0d604084015163ffffffff1690565b421015612398565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b908160209103126104e8575161243581610490565b90565b6040513d6000823e3d90fd5b1561244b57565b60405162461bcd60e51b815260206004820152602a60248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526939903ab73830bab9b2b960b11b6064820152608490fd5b908160209103126104e8575161243581610592565b156124bf57565b60405162461bcd60e51b815260206004820152602860248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526739903830bab9b2b960c11b6064820152608490fd5b6066548181160361255557606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d90602090a2565b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b3561243581610490565b60208135916125d883610490565b0135604051906020820192600084526001600160601b03199060601b16602183015260358201526035815261260e605582612210565b51902090565b1561261b57565b60405162461bcd60e51b815260206004820152601960248201527f5061757361626c653a20696e64657820697320706175736564000000000000006044820152606490fd5b1561266757565b60405162461bcd60e51b815260206004820152605160248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f60448201527f7420612076616c69642063726561746552657761726473466f72416c6c53756260648201527036b4b9b9b4b7b71039bab136b4ba3a32b960791b608482015260a490fd5b156126f357565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206f6666736574000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206c656e677468000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527f43616c6c64617461207461696c20746f6f2073686f72740000000000000000006044820152606490fd5b91908110156122d95760051b81013590609e1981360301821215610f00570190565b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206c656e67746800006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c64617461206163636573732073747269646500006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206f666673657400006044820152606490fd5b9035601e19823603018112156129365701602081359101916001600160401b038211612931578160061b3603831361292c57565b61286e565b612829565b6128b3565b916020908281520191906000905b8082106129565750505090565b909192833561296481610490565b6001600160a01b0316815260208401356001600160601b03811691908290036104a157604081600193602083940152019401920190612949565b90608063ffffffff816129c26129b486806128f8565b60a0875260a087019161293b565b9460208101356129d181610490565b6001600160a01b03166020860152604081810135908601528260608201356129f881610c99565b1660608601520135612a0981610c99565b1691015290565b612435939260609260018060a01b031682526020820152816040820152019061299e565b906001820180921161132857565b906020820180921161132857565b9190820180921161132857565b90602061243592818152019061299e565b15612a7557565b60405162461bcd60e51b815260206004820152603460248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f6044820152733a103a3432903932bbb0b93239aab83230ba32b960611b6064820152608490fd5b15612ade57565b60405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a207260448201527f65776172647343616c63756c6174696f6e456e6454696d657374616d702063616064820152746e6e6f7420626520696e207468652066757475726560581b608482015260a490fd5b9063ffffffff8091169116019063ffffffff821161132857565b60ca54600160401b8110156121f057806001612ba2920160ca5560ca6122de565b919091612c205760606001610cb29383518155019163ffffffff60208201511663ffffffff19845416178355612bff63ffffffff604083015116849067ffffffff0000000082549160201b169067ffffffff000000001916179055565b0151815460ff60401b191690151560401b68ff000000000000000016179055565b634e487b7160e01b600052600060045260246000fd5b90604051612c43816121d5565b604063ffffffff82945461ffff8116845261ffff8160101c16602085015260201c16910152565b60001960665560405160001981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2565b3561243581610c99565b15612cb157565b60405162461bcd60e51b815260206004820152605460248201527f52657761726473436f6f7264696e61746f722e6372656174654f70657261746f60448201527f724469726563746564415653526577617264735375626d697373696f6e3a2063606482015273616c6c6572206973206e6f74207468652041565360601b608482015260a490fd5b91908110156122d95760051b8101359060be1981360301821215610f00570190565b9035601e19823603018112156129365701602081359101916001600160401b03821161293157813603831361292c57565b908060209392818452848401376000828201840152601f01601f1916010190565b9190612dca612dbc84806128f8565b60c0845260c084019161293b565b906020840135612dd981610490565b6001600160a01b0316602082810191909152612df860408601866128f8565b8385036040850152808552939091019260005b818110612e6d57505050612e5f84612e39612e2c6060612435979801610ca7565b63ffffffff166060850152565b612e55612e4860808301610ca7565b63ffffffff166080850152565b60a0810190612d5b565b9160a0818503910152612d8c565b9091936040806001928735612e8181610490565b848060a01b03168152602088013560208201520195019101919091612e0b565b612435939260609260018060a01b0316825260208201528160408201520190612dad565b604090612435939281528160208201520190612dad565b15612ee357565b60405162461bcd60e51b815260206004820152604260248201527f52657761726473436f6f7264696e61746f722e7365744f70657261746f72504960448201527f53706c69743a2073706c6974206d757374206265203c3d203130303030206269606482015261707360f01b608482015260a490fd5b15612f6057565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b929493919094612fca6143f6565b60c9556065546001600160a01b031615806130b3575b15613038576112076115b194613033610cb29885613000610fd697606655565b60405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d90602090a2613465565b613eb1565b60405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a490fd5b506001600160a01b0386161515612fe0565b156130cc57565b60405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e7365744f70657261746f72415660448201527f5353706c69743a2073706c6974206d757374206265203c3d203130303030206260648201526269707360e81b608482015260a490fd5b63ffffffff6000199116019063ffffffff821161132857565b63ffffffff60ca54165b63ffffffff81166131dc5760405162461bcd60e51b815260206004820152603760248201527f52657761726473436f6f7264696e61746f722e676574526f6f74496e6465784660448201527f726f6d486173683a20726f6f74206e6f7420666f756e640000000000000000006064820152608490fd5b816131e96110d183613143565b5054146132055763ffffffff1680156113285760001901613166565b6124359150613143565b467f00000000000000000000000000000000000000000000000000000000000000000361323c5760c95490565b6124356143f6565b602081359161325283610490565b0135604051906020820192600160f81b84526001600160601b03199060601b16602183015260358201526035815261260e605582612210565b1561329257565b60405162461bcd60e51b815260206004820152603560248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152741c9bdbdd08185b1c9958591e48191a5cd8589b1959605a1b6064820152608490fd5b156132fc57565b60405162461bcd60e51b815260206004820152603660248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152751c9bdbdd08185b1c9958591e481858dd1a5d985d195960521b6064820152608490fd5b6066541981198116036133a257606681905560405190815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602090a2565b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b6033546001600160a01b0316330361342157565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b6001600160a01b038116156134d657606554604080516001600160a01b0392831681529183166020830152610cb292917f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb69190a160018060a01b03166001600160601b0360a01b6065541617606555565b60405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a490fd5b903590601e1981360301821215610f0057018035906001600160401b03821161358d57602001918160061b3603831361358857565b6127c2565b61277d565b1561359957565b60405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f76616c69646174655265776160448201527f7264735375626d697373696f6e3a20616d6f756e7420746f6f206c61726765006064820152608490fd5b1561360b57565b60405162461bcd60e51b815260206004820152605360248201527f52657761726473436f6f7264696e61746f722e5f76616c69646174655265776160448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152726f2066617220696e207468652066757475726560681b608482015260a490fd5b60406136c9916136a28180613553565b939060608301948535906136b582610c99565b6080850135926136c484610c99565b61486a565b0135801561373357610cb2916136f46f4b3b4ca85a86c47a098a223fffffffff6136f9931115613592565b612ca0565b63ffffffff61372a817f00000000000000000000000000000000000000000000000000000000000000001642612a50565b91161115613604565b60405162461bcd60e51b815260206004820152604160248201527f52657761726473436f6f7264696e61746f722e5f76616c69646174655265776160448201527f7264735375626d697373696f6e3a20616d6f756e742063616e6e6f74206265206064820152600360fc1b608482015260a490fd5b6040516323b872dd60e01b60208201526001600160a01b039283166024820152929091166044830152606480830193909352918152610cb2916137ec608483612210565b614ae1565b156137f857565b60405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063616c6c6572206973206e6f742076616c696420636c61696d6572000000006064820152608490fd5b903590601e1981360301821215610f0057018035906001600160401b03821161358d57602001918160051b3603831361358857565b91908110156122d95760061b0190565b156138af57565b60405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063756d756c61746976654561726e696e6773206d75737420626520677420746064820152741a185b8818dd5b5d5b185d1a5d9950db185a5b5959605a1b608482015260a490fd5b906139486110d66110d184612ca0565b906139538284613d82565b61395f606084016125c0565b9361398c61397f8660018060a01b031660005260cc602052604060002090565b546001600160a01b031690565b6001600160a01b03811615613af4575b90936001600160a01b03909116916139b53384146137f1565b6001600160a01b0386169160005b6139d060a0830183613863565b9050811015613aea57806139f36001926139ed60e0860186613553565b90613898565b86867f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce318c613a55613a368260018060a01b031660005260cd602052604060002090565b613a3f876125c0565b60018060a01b0316600052602052604060002090565b54613a9b613a92613a76602089013593613a708186116138a8565b84612297565b6001600160a01b03909416600090815260cd6020526040902090565b613a3f886125c0565b55613aaf818a613aaa886125c0565b614bb6565b613aba8c51956125c0565b604080519687526001600160a01b0391909116602087015285015260a086901b869003881693606090a4016139c3565b5050505050509050565b508461399c565b604081015163ffffffff169081613b1b57505061ffff60cb5460e01c1690565b61ffff914210613b2d57602001511690565b511690565b60cb54907faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b36040805163ffffffff8560a01c16815263ffffffff84166020820152a163ffffffff60a01b1990911660a09190911b63ffffffff60a01b161760cb55565b15613b9c57565b60405162461bcd60e51b8152602060048201526030602482015260008051602061504783398151915260448201526f1c9bdbdd081a5cc8191a5cd8589b195960821b6064820152608490fd5b15613bef57565b60405162461bcd60e51b815260206004820152603660248201526000805160206150478339815191526044820152751c9bdbdd081b9bdd081858dd1a5d985d1959081e595d60521b6064820152608490fd5b15613c4857565b60405162461bcd60e51b815260206004820152604c602482015260008051602061504783398151915260448201527f746f6b656e496e646963657320616e6420746f6b656e50726f6f6673206c656e60648201526b0cee8d040dad2e6dac2e8c6d60a31b608482015260a490fd5b15613cbd57565b60405162461bcd60e51b815260206004820152604a602482015260008051602061504783398151915260448201527f746f6b656e5472656550726f6f667320616e64206c6561766573206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a490fd5b903590601e1981360301821215610f0057018035906001600160401b03821161358d5760200191813603831361358857565b91908110156122d95760051b0190565b908210156122d957610a039160051b810190613d29565b919091613d9d613d986118cf6060860151151590565b613b95565b613dbc613db4611e0d604086015163ffffffff1690565b421015613be8565b60a0810190613dcb8282613863565b9050613de860c0830191613ddf8385613863565b91905014613c41565b613e38613df58284613863565b969050613e1360e0850197613e0a8987613553565b91905014613cb6565b51613e2060208501612ca0565b613e2d6040860186613d29565b916060870193614c7d565b60808201359260005b613e4b8285613863565b9050811015613ea85780613ea2856139ed8a613e9b85613e9281613e8c8c8f6136f460019d8f613e8090613e8694508d613863565b90613d5b565b98613863565b90613d6b565b9490938c613553565b928a614dad565b01613e41565b50505050509050565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b60cb546001600160a01b0391821691829082167f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb600080a36001600160a01b0319161760cb55565b15613f4957565b60405162461bcd60e51b8152602060048201526054602482015260008051602061508783398151915260448201527f61746f724469726563746564526577617264735375626d697373696f6e3a206e6064820152731bc81bdc195c985d1bdc9cc81c995dd85c99195960621b608482015260a490fd5b15613fc657565b60405162461bcd60e51b815260206004820152605b6024820152600080516020615087833981519152604482015260008051602061506783398151915260648201527f70657261746f722063616e6e6f74206265203020616464726573730000000000608482015260a490fd5b1561403a57565b60405162461bcd60e51b81526020600482015260786024820152600080516020615087833981519152604482015260008051602061506783398151915260648201527f70657261746f7273206d75737420626520696e20617363656e64696e67206f7260848201527f64657220746f2068616e646c65206475706c696361746573000000000000000060a482015260c490fd5b156140d457565b60405162461bcd60e51b81526020600482015260616024820152600080516020615087833981519152604482015260008051602061506783398151915260648201527f70657261746f722072657761726420616d6f756e742063616e6e6f74206265206084820152600360fc1b60a482015260c490fd5b1561415257565b60405162461bcd60e51b81526020600482015260766024820152600080516020615087833981519152604482015260008051602061506783398151915260648201527f70657261746f722d64697265637465642072657761726473207375626d697373608482015275696f6e206973206e6f7420726574726f61637469766560501b60a482015260c490fd5b906141e98280613553565b909261421060608201946141fc86612ca0565b608084019461420a86612ca0565b9261486a565b604081019061422b6142228383613553565b90501515613f42565b6000938493845b61423c8585613553565b90508710156142c0576142b860019161429961425c8a6139ed8a8a613553565b9861427f61427861426c8c6125c0565b6001600160a01b031690565b1515613fbf565b61428b61426c8b6125c0565b90858060a01b031610614033565b60206142a4896125c0565b980135906142b38215156140cd565b612a50565b960195614232565b955091509461243593506142e792506142db6142e191612ca0565b91612ca0565b90612b67565b63ffffffff4291161061414b565b60cb54907fe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e6040805161ffff8560e01c16815261ffff84166020820152a161ffff60e01b1990911660e09190911b61ffff60e01b161760cb55565b610cb29291815463ffffffff8160201c168042101561439e575b5050815467ffffffffffff0000191660109190911b63ffff0000161760209290921b67ffffffff0000000016919091179055565b6143c2575060cb54825461ffff191660e09190911c61ffff161782555b388061436a565b825461ffff191660109190911c61ffff161782556143bb565b6001600160401b0381116121f057601f01601f191660200190565b6040600a602082516144088482612210565b828152016922b4b3b2b72630bcb2b960b11b81522081519060208201927f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86684528201524660608201523060808201526080815261260e60a082612210565b1561446d57565b60405162461bcd60e51b815260206004820152604660248201526000805160206150a783398151915260448201527f6f6e526577617264735375626d697373696f6e3a206e6f207374726174656769606482015265195cc81cd95d60d21b608482015260a490fd5b156144dc57565b60405162461bcd60e51b815260206004820152605a60248201526000805160206150a783398151915260448201527f6f6e526577617264735375626d697373696f6e3a206475726174696f6e20657860648201527f6365656473204d41585f524557415244535f4455524154494f4e000000000000608482015260a490fd5b9063ffffffff169081156145735763ffffffff160690565b634e487b7160e01b600052601260045260246000fd5b1561459057565b60405162461bcd60e51b815260206004820152607060248201526000805160206150a783398151915260448201527f6f6e526577617264735375626d697373696f6e3a206475726174696f6e206d7560648201527f73742062652061206d756c7469706c65206f662043414c43554c4154494f4e5f60848201526f494e54455256414c5f5345434f4e445360801b60a482015260c490fd5b1561462f57565b60405162461bcd60e51b815260206004820152607660248201526000805160206150a783398151915260448201527f6f6e526577617264735375626d697373696f6e3a20737461727454696d65737460648201527f616d70206d7573742062652061206d756c7469706c65206f662043414c43554c6084820152754154494f4e5f494e54455256414c5f5345434f4e445360501b60a482015260c490fd5b156146d457565b60405162461bcd60e51b815260206004820152605760248201526000805160206150a783398151915260448201527f6f6e526577617264735375626d697373696f6e3a20737461727454696d65737460648201527f616d7020746f6f2066617220696e207468652070617374000000000000000000608482015260a490fd5b1561475a57565b60405162461bcd60e51b815260206004820152605060248201526000805160206150a783398151915260448201527f6f6e526577617264735375626d697373696f6e3a20696e76616c69642073747260648201526f185d1959de4818dbdb9cda59195c995960821b608482015260a490fd5b156147d357565b60405162461bcd60e51b815260206004820152606f60248201526000805160206150a783398151915260448201527f6f6e526577617264735375626d697373696f6e3a20737472617465676965732060648201527f6d75737420626520696e20617363656e64696e67206f7264657220746f20686160848201526e6e646c65206475706c69636174657360881b60a482015260c490fd5b92916149036148fd611e0d61494a9495614885871515614466565b6148bd63ffffffff7f00000000000000000000000000000000000000000000000000000000000000001663ffffffff831611156144d5565b6148f763ffffffff6148f07f0000000000000000000000000000000000000000000000000000000000000000809461455b565b1615614589565b8461455b565b15614628565b63ffffffff614934817f00000000000000000000000000000000000000000000000000000000000000001642612297565b9116809111159081614a51575b509291926146cd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691600090815b818310614988575050505050565b61499b614996848487613898565b6125c0565b90853b156106e15760405163198f077960e21b81526001600160a01b03831660048201526020816024818a5afa9283156106dc57600193614a0592600091614a33575b508015614a0d575b6149ef90614753565b838060a01b03168092848060a01b0316106147cc565b92019161497a565b5060a084901b849003811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146149e6565b614a4b915060203d81116107b6576107a88183612210565b386149de565b905063ffffffff7f000000000000000000000000000000000000000000000000000000000000000016111538614941565b15614a8957565b60405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b6040805192916001600160a01b031690614afb8185612210565b602084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020850152813b15614b7357506000828192826020614b4e9796519301915af1614b48614f9f565b90614fcf565b805180614b59575050565b81602080614b6e93610cb295010191016124a3565b614a82565b5162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b60405163a9059cbb60e01b60208201526001600160a01b039092166024830152604480830193909352918152610cb2916137ec606483612210565b929192614bfd826143db565b91614c0b6040519384612210565b829481845281830111614c28578281602093846000960137010152565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b9063ffffffff9094939294169260018360051c1b841015614d3657614cb594614ca8614cb0926125ca565b933691614bf1565b614eb5565b15614cbc57565b60405162461bcd60e51b815260206004820152604660248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e657220636c61696d60648201526510383937b7b360d11b608482015260a490fd5b60405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e65724c656166496e6064820152620c8caf60eb1b608482015260a490fd5b9063ffffffff9094939294169260018360051c1b841015614e4a57614dd894614ca8614cb092613244565b15614ddf57565b60405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e20636c61696d2070726f6f66006064820152608490fd5b60405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e4c656166496e646578000000006064820152608490fd5b93909291601f855116614f205791906020925b85518411614f175760018316614efb5760005282850151602052614ef460406000209260011c93612a42565b9291614ec8565b83860151600052602052614ef460406000209260011c93612a42565b92509350501490565b60405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a490fd5b3d15614fca573d90614fb0826143db565b91614fbe6040519384612210565b82523d6000602084013e565b606090565b90919015614fdb575090565b815115614feb5750805190602001fd5b6040519062461bcd60e51b8252602060048301528181519182602483015260005b83811061502e5750508160006044809484010152601f80199101168101030190fd5b6020828201810151604487840101528593500161500c56fe52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2061746f724469726563746564526577617264735375626d697373696f6e3a206f52657761726473436f6f7264696e61746f722e5f76616c69646174654f70657252657761726473436f6f7264696e61746f722e5f76616c6964617465436f6d6da2646970667358221220fd153cb31a057eeed1466a91f80fff18d437f1e0e2cbe4dbcc4ebaee34d0428364736f6c634300081a0033"; + +type RewardsCoordinatorConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: RewardsCoordinatorConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class RewardsCoordinator__factory extends ContractFactory { + constructor(...args: RewardsCoordinatorConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + _delegationManager: string, + _strategyManager: string, + _CALCULATION_INTERVAL_SECONDS: BigNumberish, + _MAX_REWARDS_DURATION: BigNumberish, + _MAX_RETROACTIVE_LENGTH: BigNumberish, + _MAX_FUTURE_LENGTH: BigNumberish, + __GENESIS_REWARDS_TIMESTAMP: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise { + return super.deploy( + _delegationManager, + _strategyManager, + _CALCULATION_INTERVAL_SECONDS, + _MAX_REWARDS_DURATION, + _MAX_RETROACTIVE_LENGTH, + _MAX_FUTURE_LENGTH, + __GENESIS_REWARDS_TIMESTAMP, + overrides || {} + ) as Promise; + } + override getDeployTransaction( + _delegationManager: string, + _strategyManager: string, + _CALCULATION_INTERVAL_SECONDS: BigNumberish, + _MAX_REWARDS_DURATION: BigNumberish, + _MAX_RETROACTIVE_LENGTH: BigNumberish, + _MAX_FUTURE_LENGTH: BigNumberish, + __GENESIS_REWARDS_TIMESTAMP: BigNumberish, + overrides?: Overrides & { from?: string } + ): TransactionRequest { + return super.getDeployTransaction( + _delegationManager, + _strategyManager, + _CALCULATION_INTERVAL_SECONDS, + _MAX_REWARDS_DURATION, + _MAX_RETROACTIVE_LENGTH, + _MAX_FUTURE_LENGTH, + __GENESIS_REWARDS_TIMESTAMP, + overrides || {} + ); + } + override attach(address: string): RewardsCoordinator { + return super.attach(address) as RewardsCoordinator; + } + override connect(signer: Signer): RewardsCoordinator__factory { + return super.connect(signer) as RewardsCoordinator__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): RewardsCoordinatorInterface { + return new utils.Interface(_abi) as RewardsCoordinatorInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): RewardsCoordinator { + return new Contract(address, _abi, signerOrProvider) as RewardsCoordinator; + } +} diff --git a/src/avs/contracts/factories/index.ts b/src/avs/contracts/factories/index.ts index 58689b35..3539dbc2 100644 --- a/src/avs/contracts/factories/index.ts +++ b/src/avs/contracts/factories/index.ts @@ -6,3 +6,4 @@ export { DelegationManager__factory } from "./DelegationManager__factory"; export { ECDSAStakeRegistry__factory } from "./ECDSAStakeRegistry__factory"; export { ERC20Mock__factory } from "./ERC20Mock__factory"; export { ReclaimServiceManager__factory } from "./ReclaimServiceManager__factory"; +export { RewardsCoordinator__factory } from "./RewardsCoordinator__factory"; diff --git a/src/avs/contracts/index.ts b/src/avs/contracts/index.ts index 1c811969..bb83243b 100644 --- a/src/avs/contracts/index.ts +++ b/src/avs/contracts/index.ts @@ -6,9 +6,11 @@ export type { DelegationManager } from "./DelegationManager"; export type { ECDSAStakeRegistry } from "./ECDSAStakeRegistry"; export type { ERC20Mock } from "./ERC20Mock"; export type { ReclaimServiceManager } from "./ReclaimServiceManager"; +export type { RewardsCoordinator } from "./RewardsCoordinator"; export * as factories from "./factories"; export { ReclaimServiceManager__factory } from "./factories/ReclaimServiceManager__factory"; export { AVSDirectory__factory } from "./factories/AVSDirectory__factory"; export { DelegationManager__factory } from "./factories/DelegationManager__factory"; export { ECDSAStakeRegistry__factory } from "./factories/ECDSAStakeRegistry__factory"; export { ERC20Mock__factory } from "./factories/ERC20Mock__factory"; +export { RewardsCoordinator__factory } from "./factories/RewardsCoordinator__factory"; diff --git a/src/avs/tests/test.operator.ts b/src/avs/tests/test.operator.ts index 29b2294a..78c89ac5 100644 --- a/src/avs/tests/test.operator.ts +++ b/src/avs/tests/test.operator.ts @@ -373,10 +373,31 @@ describe('Operators', () => { ) const rslt = await tx.wait() const events = rslt.events - const arg = events?.[0]?.args as unknown as TaskCompletedEventObject - assert.strictEqual(events?.length, 1) - + const arg = events + ?.find(ev => (ev.event === 'TaskCompleted')) + ?.args as unknown as TaskCompletedEventObject assert.ok(arg.task) + + console.log('events', events) + console.log('rewardsCoord', contracts.rewardsCoordinator.address) + + const rewardsCoordEvents = events + ?.filter(ev => ( + ev.address.toLowerCase() + === contracts.rewardsCoordinator.address.toLowerCase() + )) + ?.map(ev => ( + contracts.rewardsCoordinator.interface.parseLog(ev) + )) + expect(rewardsCoordEvents).toHaveLength(1) + const parsedData = rewardsCoordEvents?.[0].args + .operatorDirectedRewardsSubmission + console.log('parsedData', parsedData) + + const nonce = await contracts.rewardsCoordinator + .getDistributionRootsLength() + console.log('nonce', nonce) + expect(nonce).toBeGreaterThan(0) } async function createClaimViaFn() { diff --git a/src/avs/types/index.ts b/src/avs/types/index.ts index c8b924c2..aafb7b9d 100644 --- a/src/avs/types/index.ts +++ b/src/avs/types/index.ts @@ -12,6 +12,7 @@ export type ChainConfig = { */ contractAddress: string delegationManagerAddress: string + rewardsCoordinatorAddress: string stakeRegistryAddress: string avsDirectoryAddress: string } diff --git a/src/avs/utils/contracts.ts b/src/avs/utils/contracts.ts index 63a7271f..c160dc42 100644 --- a/src/avs/utils/contracts.ts +++ b/src/avs/utils/contracts.ts @@ -1,9 +1,9 @@ import { ethers } from 'ethers' import { CHAIN_CONFIGS, PRIVATE_KEY, SELECTED_CHAIN_ID } from 'src/avs/config' -import { AVSDirectory__factory, DelegationManager__factory, ECDSAStakeRegistry__factory, ERC20Mock__factory, ReclaimServiceManager__factory } from 'src/avs/contracts' +import { AVSDirectory__factory, DelegationManager__factory, ECDSAStakeRegistry__factory, ERC20Mock__factory, ReclaimServiceManager__factory, RewardsCoordinator__factory } from 'src/avs/contracts' import { ChainConfig } from 'src/avs/types' -type Contracts = ReturnType +export type Contracts = ReturnType const configs: { [key: string]: Contracts } = {} @@ -27,6 +27,7 @@ export function initialiseContracts( avsDirectoryAddress, contractAddress, delegationManagerAddress, + rewardsCoordinatorAddress, }: ChainConfig, privateKey: string | undefined = PRIVATE_KEY ) { @@ -59,6 +60,11 @@ export function initialiseContracts( avsDirectoryAddress, wallet || provider ), + // eslint-disable-next-line camelcase + rewardsCoordinator: RewardsCoordinator__factory.connect( + rewardsCoordinatorAddress, + wallet || provider + ), // tokens tokens: { async getDefault() { From 1c0c49060aec360cdb78cb98c387b23da41c0b13 Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Wed, 26 Feb 2025 19:42:04 +0530 Subject: [PATCH 08/26] test: distribution of rewards --- avs/contracts/config/core/31337.json | 2 - avs/contracts/deployments/core/31337.json | 2 +- avs/contracts/deployments/reclaim/31337.json | 2 +- avs/contracts/mockData/payments.json | 8 +++ avs/contracts/script/SetupPayments.s.sol | 43 +++++--------- .../script/utils/CoreDeploymentLib.sol | 6 +- avs/utils/submit-payments-root.sh | 20 +++++++ package.json | 2 +- src/avs/tests/test.operator.ts | 58 +++++++++++-------- src/avs/tests/utils.ts | 51 +++++++++++----- src/server/handlers/completeClaimOnChain.ts | 9 ++- src/utils/generics.ts | 3 +- 12 files changed, 126 insertions(+), 80 deletions(-) create mode 100644 avs/contracts/mockData/payments.json create mode 100644 avs/utils/submit-payments-root.sh diff --git a/avs/contracts/config/core/31337.json b/avs/contracts/config/core/31337.json index 53d25eff..3b623c19 100644 --- a/avs/contracts/config/core/31337.json +++ b/avs/contracts/config/core/31337.json @@ -19,8 +19,6 @@ "MAX_RETROACTIVE_LENGTH": 86400, "MAX_FUTURE_LENGTH": 86400, "GENESIS_REWARDS_TIMESTAMP": 1672531200, - "rewards_updater_address": "0x14dC79964da2C08b23698B3D3cc7Ca32193d9955", - "rewards_updater_key": "0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356", "activation_delay": 0, "calculation_interval_seconds": 86400, "global_operator_commission_bips": 1000 diff --git a/avs/contracts/deployments/core/31337.json b/avs/contracts/deployments/core/31337.json index b9db19a4..669f01ae 100644 --- a/avs/contracts/deployments/core/31337.json +++ b/avs/contracts/deployments/core/31337.json @@ -1 +1 @@ -{"lastUpdate":{"timestamp":"1739600886","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","avsDirectory":"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9","avsDirectoryImpl":"0x68b1d87f95878fe05b998f19b66f4baba5de1aed","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","eigenPodManagerImpl":"0x59b670e9fa9d0a427751af201d676719a970857b","strategyFactory":"0x959922be3caee4b8cd9a407cc3ac1c251c2007b1","strategyFactoryImpl":"0xc6e7df5e7b4f2a278906862b61205850344d4e7d","strategyBeacon":"0x09635f643e140090a9a8dcd712ed6285858cebef","rewardsCoordinator":"0x610178da211fef7d417bc0e6fed39f05609ad788"}} \ No newline at end of file +{"lastUpdate":{"timestamp":"1740579115","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","avsDirectory":"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9","avsDirectoryImpl":"0x68b1d87f95878fe05b998f19b66f4baba5de1aed","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","eigenPodManagerImpl":"0x59b670e9fa9d0a427751af201d676719a970857b","strategyFactory":"0x959922be3caee4b8cd9a407cc3ac1c251c2007b1","strategyFactoryImpl":"0xc6e7df5e7b4f2a278906862b61205850344d4e7d","strategyBeacon":"0x09635f643e140090a9a8dcd712ed6285858cebef","rewardsCoordinator":"0x610178da211fef7d417bc0e6fed39f05609ad788"}} \ No newline at end of file diff --git a/avs/contracts/deployments/reclaim/31337.json b/avs/contracts/deployments/reclaim/31337.json index 6f655fe7..468863b5 100644 --- a/avs/contracts/deployments/reclaim/31337.json +++ b/avs/contracts/deployments/reclaim/31337.json @@ -1 +1 @@ -{"lastUpdate":{"timestamp":"1739600923","block_number":"15"},"addresses":{"proxyAdmin":"0xf5059a5d33d5853360d16c683c16e67980206f36","reclaimServiceManager":"0x998abeb3e57409262ae5b751f60747921b33613e","reclaimServiceManagerImpl":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","stakeRegistry":"0x4826533b4897376654bb4d4ad88b7fafd0c98528","stakeRegistryImpl":"0x99bba657f2bbc93c02d617f8ba121cb8fc104acf","strategy":"0x24b3c7704709ed1491473f30393ffc93cfb0fc34","token":"0x1613beb3b2c4f22ee086b2b38c1476a3ce7f78e8"}} \ No newline at end of file +{"lastUpdate":{"timestamp":"1740579118","block_number":"18"},"addresses":{"proxyAdmin":"0xf5059a5d33d5853360d16c683c16e67980206f36","reclaimServiceManager":"0x998abeb3e57409262ae5b751f60747921b33613e","reclaimServiceManagerImpl":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","stakeRegistry":"0x4826533b4897376654bb4d4ad88b7fafd0c98528","stakeRegistryImpl":"0x99bba657f2bbc93c02d617f8ba121cb8fc104acf","strategy":"0x24b3c7704709ed1491473f30393ffc93cfb0fc34","token":"0x1613beb3b2c4f22ee086b2b38c1476a3ce7f78e8"}} \ No newline at end of file diff --git a/avs/contracts/mockData/payments.json b/avs/contracts/mockData/payments.json new file mode 100644 index 00000000..08db709c --- /dev/null +++ b/avs/contracts/mockData/payments.json @@ -0,0 +1,8 @@ +{ + "leaves": [ + "0xa4ebcf624e2aba970e0413953e00e14c30f4d8200fec5b7d324321eb6d02f29d" + ], + "tokenLeaves": [ + "0xa89857f92e6538d6fa34b70183565e197302e46fa3709957fbe0580f2ad5d365" + ] +} \ No newline at end of file diff --git a/avs/contracts/script/SetupPayments.s.sol b/avs/contracts/script/SetupPayments.s.sol index 6a9c16d9..26dccfc8 100644 --- a/avs/contracts/script/SetupPayments.s.sol +++ b/avs/contracts/script/SetupPayments.s.sol @@ -13,16 +13,6 @@ import {ERC20Mock} from "../src/ERC20Mock.sol"; import "forge-std/Test.sol"; contract SetupPayments is Script, Test { - struct PaymentInfo { - address recipient; - uint32 numPayments; - uint32 amountPerPayment; - uint32 duration; - uint32 startTimestamp; - uint32 endTimestamp; - uint256 indexToProve; - } - address private deployer; CoreDeploymentLib.DeploymentData coreDeployment; CoreDeploymentLib.DeploymentConfigData coreConfig; @@ -31,10 +21,8 @@ contract SetupPayments is Script, Test { ReclaimDeploymentLib.DeploymentConfigData reclaimConfig; RewardsCoordinator rewardsCoordinator; - string internal constant paymentInfofilePath = "test/mockData/scratch/payment_info.json"; - string internal constant filePath = "test/mockData/scratch/payments.json"; - - + string internal constant paymentInfofilePath = "mockData/payment_info.json"; + string internal constant filePath = "mockData/payments.json"; uint32 constant CALCULATION_INTERVAL_SECONDS = 1 days; uint256 constant NUM_TOKEN_EARNINGS = 1; @@ -45,7 +33,6 @@ contract SetupPayments is Script, Test { uint32 indexToProve = 0; uint32 amountPerPayment = 100; - address recipient = address(1); IRewardsCoordinator.EarnerTreeMerkleLeaf[] public earnerLeaves; address[] public earners; uint32 startTimestamp; @@ -56,7 +43,6 @@ contract SetupPayments is Script, Test { address operator1 = address(1); address operator2 = address(2); - function setUp() public { deployer = vm.rememberKey(vm.envUint("PRIVATE_KEY")); vm.label(deployer, "Deployer"); @@ -87,7 +73,8 @@ contract SetupPayments is Script, Test { revert("End timestamp must be in the future. Please wait to generate new payments."); } - // sets a multiplier based on block number such that cumulativeEarnings increase accordingly for multiple runs of this script in the same session + // sets a multiplier based on block number such that cumulativeEarnings + // increase accordingly for multiple runs of this script in the same session uint256 nonce = rewardsCoordinator.getDistributionRootsLength(); amountPerPayment = uint32(amountPerPayment * (nonce + 1)); @@ -99,6 +86,14 @@ contract SetupPayments is Script, Test { vm.stopBroadcast(); } + function runPaymentRoot( + address[] memory earners, uint32 endTimestamp, uint32 numPayments, uint32 amountPerPayment + ) external { + vm.startBroadcast(deployer); + submitPaymentRoot(earners, endTimestamp, numPayments, amountPerPayment); + vm.stopBroadcast(); + } + function runOperatorDirected() external { vm.startBroadcast(reclaimConfig.rewardsInitiatorKey); if(rewardsCoordinator.currRewardsCalculationEndTimestamp() == 0) { @@ -127,7 +122,7 @@ contract SetupPayments is Script, Test { } - function executeProcessClaim() public { + function executeProcessClaim(address recipient) public { uint256 nonce = rewardsCoordinator.getDistributionRootsLength(); amountPerPayment = uint32(amountPerPayment * nonce); @@ -199,16 +194,8 @@ contract SetupPayments is Script, Test { emit log_named_uint("Earner Leaves Length", earnerLeaves.length); emit log_named_uint("numPayments", numPayments); - SetupPaymentsLib.submitRoot( - IRewardsCoordinator(coreDeployment.rewardsCoordinator), - tokenLeaves, - earnerLeaves, - reclaimDeployment.strategy, - endTimestamp, - numPayments, - NUM_TOKEN_EARNINGS, - filePath - ); + bytes32 paymentRoot = SetupPaymentsLib.createPaymentRoot(rewardsCoordinator, tokenLeaves, earnerLeaves, numPayments, NUM_TOKEN_EARNINGS, filePath); + rewardsCoordinator.submitRoot(paymentRoot, endTimestamp); } function _getEarnerLeaves(address[] memory earners, uint32 amountPerPayment, address strategy) internal view returns (IRewardsCoordinator.EarnerTreeMerkleLeaf[] memory) { diff --git a/avs/contracts/script/utils/CoreDeploymentLib.sol b/avs/contracts/script/utils/CoreDeploymentLib.sol index 1a415e6d..06dcad9e 100644 --- a/avs/contracts/script/utils/CoreDeploymentLib.sol +++ b/avs/contracts/script/utils/CoreDeploymentLib.sol @@ -65,8 +65,8 @@ library CoreDeploymentLib { uint256 maxRetroactiveLength; uint256 maxFutureLength; uint256 genesisRewardsTimestamp; + // will be deployer address updater; - uint256 updaterKey; uint256 activationDelay; uint256 calculationIntervalSeconds; uint256 globalOperatorCommissionBips; @@ -331,10 +331,6 @@ library CoreDeploymentLib { json.readUint(".rewardsCoordinator.MAX_FUTURE_LENGTH"); data.rewardsCoordinator.genesisRewardsTimestamp = json.readUint(".rewardsCoordinator.GENESIS_REWARDS_TIMESTAMP"); - data.rewardsCoordinator.updater = - json.readAddress(".rewardsCoordinator.rewards_updater_address"); - data.rewardsCoordinator.updaterKey = - json.readUint(".rewardsCoordinator.rewards_updater_key"); data.rewardsCoordinator.activationDelay = json.readUint(".rewardsCoordinator.activation_delay"); data.rewardsCoordinator.calculationIntervalSeconds = diff --git a/avs/utils/submit-payments-root.sh b/avs/utils/submit-payments-root.sh new file mode 100644 index 00000000..042cd7cb --- /dev/null +++ b/avs/utils/submit-payments-root.sh @@ -0,0 +1,20 @@ +set -e +cd avs/contracts + +echo "submitting payments root: $OPERATOR_ADDRESS $END_TIMESTAMP $PAYMENT" + +forge script script/SetupPayments.s.sol \ + --rpc-url http://localhost:8545 \ + --broadcast -v --via-ir \ + --revert-strings debug \ + --sender 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 \ + --sig "runPaymentRoot(address[], uint32, uint32, uint32)" \ + "[$OPERATOR_ADDRESS]" \ + $END_TIMESTAMP 1 $PAYMENT +# forge script script/SetupPayments.s.sol \ +# --rpc-url http://localhost:8545 \ +# --broadcast -v --via-ir \ +# --revert-strings debug \ +# --sender 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 \ +# --sig "executeProcessClaim(address)" \ +# '0x1234567890123456789012345678901234567890' \ No newline at end of file diff --git a/package.json b/package.json index 99e15e06..4b3fa5c7 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "update:avs-metadata": "npm run run:tsc -- src/scripts/update-avs-metadata.ts", "generate:avs-types": "sh ./avs/utils/contract-data-gen.sh", "start:chain": "sh ./avs/utils/anvil/start-anvil-chain-with-el-and-avs-deployed.sh", - "create:payments-root": "cd avs/contracts && forge script script/SetupPayments.s.sol --rpc-url http://localhost:8545 --broadcast -v --sender 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "submit:payments-root": "sh avs/utils/submit-payments-root.sh", "commitlint": "commitlint --edit", "download:zk-files": "node node_modules/@reclaimprotocol/zk-symmetric-crypto/lib/scripts/download-files", "generate:toprf-keys": "npm run run:tsc -- src/scripts/generate-toprf-keys.ts" diff --git a/src/avs/tests/test.operator.ts b/src/avs/tests/test.operator.ts index 78c89ac5..c6be23eb 100644 --- a/src/avs/tests/test.operator.ts +++ b/src/avs/tests/test.operator.ts @@ -17,7 +17,7 @@ import { arrayify } from 'ethers/lib/utils' import assert from 'node:assert' import { createClaimOnAvs } from 'src/avs/client/create-claim-on-avs' import { NewTaskCreatedEventObject, TaskCompletedEventObject } from 'src/avs/contracts/ReclaimServiceManager' -import { runFreshChain, sendGasToAddress } from 'src/avs/tests/utils' +import { runFreshChain, sendGasToAddress, submitPaymentRoot } from 'src/avs/tests/utils' import { getContracts } from 'src/avs/utils/contracts' import { registerOperator } from 'src/avs/utils/register' import { createNewClaimRequestOnChain } from 'src/avs/utils/tasks' @@ -195,7 +195,34 @@ describe('Operators', () => { arg = await createNewTask(userWallet) } - await markTaskAsCompleted(userWallet, arg) + const { + taskCompletedEvent: { task }, events + } = await markTaskAsCompleted(userWallet, arg) + + const rewardsCoordEvents = events + ?.filter(ev => ( + ev.address.toLowerCase() + === contracts.rewardsCoordinator.address.toLowerCase() + )) + ?.map(ev => ( + contracts.rewardsCoordinator.interface.parseLog(ev) + )) + expect(rewardsCoordEvents).toHaveLength(1) + + const evArgs = rewardsCoordEvents![0].args + // hardcode the index of the endTimestamp -- as the logs + // don't have the keys of the event args + const endTimestamp = evArgs[4][3] + + await submitPaymentRoot( + task.task.operators[0].addr, + endTimestamp, + task.task.feePaid.toNumber() + ) + + const nonce = await contracts.rewardsCoordinator + .getDistributionRootsLength() + expect(nonce.toNumber()).toBeGreaterThan(0) }) it('should allow another wallet to create a task', async() => { @@ -373,31 +400,12 @@ describe('Operators', () => { ) const rslt = await tx.wait() const events = rslt.events - const arg = events + const taskCompletedEvent = events ?.find(ev => (ev.event === 'TaskCompleted')) ?.args as unknown as TaskCompletedEventObject - assert.ok(arg.task) - - console.log('events', events) - console.log('rewardsCoord', contracts.rewardsCoordinator.address) - - const rewardsCoordEvents = events - ?.filter(ev => ( - ev.address.toLowerCase() - === contracts.rewardsCoordinator.address.toLowerCase() - )) - ?.map(ev => ( - contracts.rewardsCoordinator.interface.parseLog(ev) - )) - expect(rewardsCoordEvents).toHaveLength(1) - const parsedData = rewardsCoordEvents?.[0].args - .operatorDirectedRewardsSubmission - console.log('parsedData', parsedData) - - const nonce = await contracts.rewardsCoordinator - .getDistributionRootsLength() - console.log('nonce', nonce) - expect(nonce).toBeGreaterThan(0) + assert.ok(taskCompletedEvent.task) + + return { taskCompletedEvent, events } } async function createClaimViaFn() { diff --git a/src/avs/tests/utils.ts b/src/avs/tests/utils.ts index 3e747371..e7526d2c 100644 --- a/src/avs/tests/utils.ts +++ b/src/avs/tests/utils.ts @@ -1,4 +1,5 @@ import { spawn } from 'child_process' +import { BigNumberish } from 'ethers' export async function runFreshChain() { const PRIVATE_KEY = process.env.PRIVATE_KEY @@ -35,25 +36,47 @@ export async function runFreshChain() { } } -export async function sendGasToAddress(address: string) { - const task = spawn('cast', [ - 'send', - address, - '--value', - '10ether', - '--private-key', - '0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6' - ]) - - task.stdout.pipe(process.stdout) - task.stderr.pipe(process.stderr) +export function submitPaymentRoot( + operator: string, + endTimestampS: number, + payment: number | BigNumberish +) { + return spawnAndWait('npm', ['run', 'submit:payments-root'], { + env: { + ...process.env, + OPERATOR_ADDRESS: operator, + END_TIMESTAMP: endTimestampS.toString(), + PAYMENT: payment.toString() + }, + }) +} - await new Promise((resolve, reject) => { +export function sendGasToAddress(address: string) { + return spawnAndWait( + 'cast', + [ + 'send', + address, + '--value', + '10ether', + '--private-key', + '0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6' + ], + {} + ) +} + +function spawnAndWait(...args: Parameters) { + const task = spawn(...args) + task.stdout?.pipe(process.stdout) + task.stderr?.pipe(process.stderr) + + return new Promise((resolve, reject) => { task.on('exit', (code) => { if(code === 0) { resolve() } else { - reject(`Gas add process exited with code ${code || 0}`) + reject(`${args[0]} process exited with code ${code || 0}`) } }) }) diff --git a/src/server/handlers/completeClaimOnChain.ts b/src/server/handlers/completeClaimOnChain.ts index 77f8a93c..01218862 100644 --- a/src/server/handlers/completeClaimOnChain.ts +++ b/src/server/handlers/completeClaimOnChain.ts @@ -24,7 +24,14 @@ export const completeClaimOnChain: RPCHandler<'completeClaimOnChain'> = async( const rslt = await tx.wait() // check task created event was emitted - const ev = rslt.events?.[0] + const ev = rslt.events?.find((ev) => ev.event === 'TaskCompleted') + if(!ev) { + throw new AttestorError( + 'ERROR_INTERNAL', + 'TaskCompleted event not emitted' + ) + } + const obj = ev?.args as unknown as TaskCompletedEventObject const plainObj = ethersStructToPlainObject(obj) diff --git a/src/utils/generics.ts b/src/utils/generics.ts index e627d808..7dff1b27 100644 --- a/src/utils/generics.ts +++ b/src/utils/generics.ts @@ -414,8 +414,7 @@ export function ethersStructToPlainObject(struct: T): T { return struct } - const namedKeys = Object.keys(struct) - .filter(key => isNaN(Number(key))) + const namedKeys = Object.keys(struct).filter(key => isNaN(Number(key))) // seems to be an actual array if(!namedKeys.length) { return struct.map(ethersStructToPlainObject) as any From 723df82908836843f50b19235540ecc1c65df153 Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Wed, 26 Feb 2025 19:55:04 +0530 Subject: [PATCH 09/26] test: resolve issues --- avs/contracts/deployments/core/31337.json | 2 +- avs/contracts/deployments/reclaim/31337.json | 2 +- avs/contracts/src/ReclaimServiceManager.sol | 15 ++++++++++++++- src/avs/client/create-claim-on-avs.ts | 2 +- src/avs/tests/test.operator.ts | 4 ++-- 5 files changed, 19 insertions(+), 6 deletions(-) diff --git a/avs/contracts/deployments/core/31337.json b/avs/contracts/deployments/core/31337.json index 669f01ae..74aaad53 100644 --- a/avs/contracts/deployments/core/31337.json +++ b/avs/contracts/deployments/core/31337.json @@ -1 +1 @@ -{"lastUpdate":{"timestamp":"1740579115","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","avsDirectory":"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9","avsDirectoryImpl":"0x68b1d87f95878fe05b998f19b66f4baba5de1aed","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","eigenPodManagerImpl":"0x59b670e9fa9d0a427751af201d676719a970857b","strategyFactory":"0x959922be3caee4b8cd9a407cc3ac1c251c2007b1","strategyFactoryImpl":"0xc6e7df5e7b4f2a278906862b61205850344d4e7d","strategyBeacon":"0x09635f643e140090a9a8dcd712ed6285858cebef","rewardsCoordinator":"0x610178da211fef7d417bc0e6fed39f05609ad788"}} \ No newline at end of file +{"lastUpdate":{"timestamp":"1740579865","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","avsDirectory":"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9","avsDirectoryImpl":"0x68b1d87f95878fe05b998f19b66f4baba5de1aed","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","eigenPodManagerImpl":"0x59b670e9fa9d0a427751af201d676719a970857b","strategyFactory":"0x959922be3caee4b8cd9a407cc3ac1c251c2007b1","strategyFactoryImpl":"0xc6e7df5e7b4f2a278906862b61205850344d4e7d","strategyBeacon":"0x09635f643e140090a9a8dcd712ed6285858cebef","rewardsCoordinator":"0x610178da211fef7d417bc0e6fed39f05609ad788"}} \ No newline at end of file diff --git a/avs/contracts/deployments/reclaim/31337.json b/avs/contracts/deployments/reclaim/31337.json index 468863b5..e80e32c7 100644 --- a/avs/contracts/deployments/reclaim/31337.json +++ b/avs/contracts/deployments/reclaim/31337.json @@ -1 +1 @@ -{"lastUpdate":{"timestamp":"1740579118","block_number":"18"},"addresses":{"proxyAdmin":"0xf5059a5d33d5853360d16c683c16e67980206f36","reclaimServiceManager":"0x998abeb3e57409262ae5b751f60747921b33613e","reclaimServiceManagerImpl":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","stakeRegistry":"0x4826533b4897376654bb4d4ad88b7fafd0c98528","stakeRegistryImpl":"0x99bba657f2bbc93c02d617f8ba121cb8fc104acf","strategy":"0x24b3c7704709ed1491473f30393ffc93cfb0fc34","token":"0x1613beb3b2c4f22ee086b2b38c1476a3ce7f78e8"}} \ No newline at end of file +{"lastUpdate":{"timestamp":"1740579868","block_number":"23"},"addresses":{"proxyAdmin":"0xf5059a5d33d5853360d16c683c16e67980206f36","reclaimServiceManager":"0x998abeb3e57409262ae5b751f60747921b33613e","reclaimServiceManagerImpl":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","stakeRegistry":"0x4826533b4897376654bb4d4ad88b7fafd0c98528","stakeRegistryImpl":"0x99bba657f2bbc93c02d617f8ba121cb8fc104acf","strategy":"0x24b3c7704709ed1491473f30393ffc93cfb0fc34","token":"0x1613beb3b2c4f22ee086b2b38c1476a3ce7f78e8"}} \ No newline at end of file diff --git a/avs/contracts/src/ReclaimServiceManager.sol b/avs/contracts/src/ReclaimServiceManager.sol index acc0531a..992a838f 100644 --- a/avs/contracts/src/ReclaimServiceManager.sol +++ b/avs/contracts/src/ReclaimServiceManager.sol @@ -93,7 +93,7 @@ contract ReclaimServiceManager is // 5m 5 * 60, // spend a little bit - 1 + 2 ); admins.push(deployer); defaultStrategy = strategy; @@ -286,6 +286,7 @@ contract ReclaimServiceManager is // HELPER function _distributeReward(address[] memory operatorAddrs, uint256 reward) internal { + _sortAddresses(operatorAddrs); // distribute reward IRewardsCoordinator coordinator = IRewardsCoordinator(rewardsCoordinator); IERC20 token = getToken(); @@ -402,6 +403,18 @@ contract ReclaimServiceManager is return output; } + function _sortAddresses(address[] memory addresses) internal pure { + for(uint i = 0; i < addresses.length; i++) { + for(uint j = i + 1; j < addresses.length; j++) { + if(addresses[i] > addresses[j]) { + address temp = addresses[i]; + addresses[i] = addresses[j]; + addresses[j] = temp; + } + } + } + } + function _absDiff(uint32 a, uint32 b) internal pure returns (uint32) { return a > b ? a - b : b - a; } diff --git a/src/avs/client/create-claim-on-avs.ts b/src/avs/client/create-claim-on-avs.ts index 1685782e..3435e76d 100644 --- a/src/avs/client/create-claim-on-avs.ts +++ b/src/avs/client/create-claim-on-avs.ts @@ -172,7 +172,7 @@ export async function createClaimOnAvs({ const tx = await contract.taskCompleted(data, arg.taskIndex) const rslt = await tx.wait() // check task created event was emitted - const ev = rslt.events?.[0] + const ev = rslt.events?.find((ev) => ev.event === 'TaskCompleted') return { object: ev?.args as unknown as TaskCompletedEventObject, txHash: rslt.transactionHash diff --git a/src/avs/tests/test.operator.ts b/src/avs/tests/test.operator.ts index c6be23eb..9f2f7e7a 100644 --- a/src/avs/tests/test.operator.ts +++ b/src/avs/tests/test.operator.ts @@ -130,7 +130,7 @@ describe('Operators', () => { minSignaturesPerTask: 2, maxTaskLifetimeS: 10, maxTaskCreationDelayS: 0, - minFee: 1, + minFee: defaultFee, }) ) ] @@ -413,7 +413,7 @@ describe('Operators', () => { minSignaturesPerTask: 2, maxTaskLifetimeS: 0, maxTaskCreationDelayS: 0, - minFee: 1 + minFee: defaultFee }) await tx.wait() console.log('min sigs set to 2') From 3635241b0517b1532c6429d9dea2261bed36b924 Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Thu, 27 Feb 2025 08:44:19 +0530 Subject: [PATCH 10/26] chore: add payments json to gitignore --- .gitignore | 3 ++- avs/contracts/mockData/payments.json | 8 -------- 2 files changed, 2 insertions(+), 9 deletions(-) delete mode 100644 avs/contracts/mockData/payments.json diff --git a/.gitignore b/.gitignore index cf20bba3..9a6cc3b9 100644 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,5 @@ ngrok.yml src/test.ts .env.* .cache -envs \ No newline at end of file +envs +avs/contracts/mockData \ No newline at end of file diff --git a/avs/contracts/mockData/payments.json b/avs/contracts/mockData/payments.json deleted file mode 100644 index 08db709c..00000000 --- a/avs/contracts/mockData/payments.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "leaves": [ - "0xa4ebcf624e2aba970e0413953e00e14c30f4d8200fec5b7d324321eb6d02f29d" - ], - "tokenLeaves": [ - "0xa89857f92e6538d6fa34b70183565e197302e46fa3709957fbe0580f2ad5d365" - ] -} \ No newline at end of file From 3454c58332e6cc7fe0f2134df8580b578f18d3e0 Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Thu, 27 Feb 2025 08:46:11 +0530 Subject: [PATCH 11/26] fix: setting minFee --- avs/contracts/src/ReclaimServiceManager.sol | 4 ++++ src/scripts/update-avs-metadata.ts | 1 + 2 files changed, 5 insertions(+) diff --git a/avs/contracts/src/ReclaimServiceManager.sol b/avs/contracts/src/ReclaimServiceManager.sol index 992a838f..057ebcbc 100644 --- a/avs/contracts/src/ReclaimServiceManager.sol +++ b/avs/contracts/src/ReclaimServiceManager.sol @@ -124,6 +124,10 @@ contract ReclaimServiceManager is taskCreationMetadata.maxTaskCreationDelayS = newMetadata .maxTaskCreationDelayS; } + + if(newMetadata.minFee != 0) { + taskCreationMetadata.minFee = newMetadata.minFee; + } } function whitelistAddressAsOperator( diff --git a/src/scripts/update-avs-metadata.ts b/src/scripts/update-avs-metadata.ts index a5370899..f3d040c8 100644 --- a/src/scripts/update-avs-metadata.ts +++ b/src/scripts/update-avs-metadata.ts @@ -17,6 +17,7 @@ async function main() { minSignaturesPerTask: +(minSignaturesPerTask || 0), maxTaskCreationDelayS: 0, maxTaskLifetimeS: 0, + minFee: 0 }) await tx.wait() From 6a0a5f75997331486a5f6d4b908aae6a2375ce53 Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Thu, 27 Feb 2025 08:48:38 +0530 Subject: [PATCH 12/26] fix: ignore --- .gitignore | 2 +- avs/contracts/deployments/core/31337.json | 2 +- avs/contracts/deployments/reclaim/31337.json | 2 +- avs/contracts/mockData/.gitadd | 0 4 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 avs/contracts/mockData/.gitadd diff --git a/.gitignore b/.gitignore index 9a6cc3b9..6bd71076 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,4 @@ src/test.ts .env.* .cache envs -avs/contracts/mockData \ No newline at end of file +avs/contracts/mockData/payments.json \ No newline at end of file diff --git a/avs/contracts/deployments/core/31337.json b/avs/contracts/deployments/core/31337.json index 74aaad53..9e793d47 100644 --- a/avs/contracts/deployments/core/31337.json +++ b/avs/contracts/deployments/core/31337.json @@ -1 +1 @@ -{"lastUpdate":{"timestamp":"1740579865","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","avsDirectory":"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9","avsDirectoryImpl":"0x68b1d87f95878fe05b998f19b66f4baba5de1aed","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","eigenPodManagerImpl":"0x59b670e9fa9d0a427751af201d676719a970857b","strategyFactory":"0x959922be3caee4b8cd9a407cc3ac1c251c2007b1","strategyFactoryImpl":"0xc6e7df5e7b4f2a278906862b61205850344d4e7d","strategyBeacon":"0x09635f643e140090a9a8dcd712ed6285858cebef","rewardsCoordinator":"0x610178da211fef7d417bc0e6fed39f05609ad788"}} \ No newline at end of file +{"lastUpdate":{"timestamp":"1740626300","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","avsDirectory":"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9","avsDirectoryImpl":"0x68b1d87f95878fe05b998f19b66f4baba5de1aed","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","eigenPodManagerImpl":"0x59b670e9fa9d0a427751af201d676719a970857b","strategyFactory":"0x959922be3caee4b8cd9a407cc3ac1c251c2007b1","strategyFactoryImpl":"0xc6e7df5e7b4f2a278906862b61205850344d4e7d","strategyBeacon":"0x09635f643e140090a9a8dcd712ed6285858cebef","rewardsCoordinator":"0x610178da211fef7d417bc0e6fed39f05609ad788"}} \ No newline at end of file diff --git a/avs/contracts/deployments/reclaim/31337.json b/avs/contracts/deployments/reclaim/31337.json index e80e32c7..841633a6 100644 --- a/avs/contracts/deployments/reclaim/31337.json +++ b/avs/contracts/deployments/reclaim/31337.json @@ -1 +1 @@ -{"lastUpdate":{"timestamp":"1740579868","block_number":"23"},"addresses":{"proxyAdmin":"0xf5059a5d33d5853360d16c683c16e67980206f36","reclaimServiceManager":"0x998abeb3e57409262ae5b751f60747921b33613e","reclaimServiceManagerImpl":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","stakeRegistry":"0x4826533b4897376654bb4d4ad88b7fafd0c98528","stakeRegistryImpl":"0x99bba657f2bbc93c02d617f8ba121cb8fc104acf","strategy":"0x24b3c7704709ed1491473f30393ffc93cfb0fc34","token":"0x1613beb3b2c4f22ee086b2b38c1476a3ce7f78e8"}} \ No newline at end of file +{"lastUpdate":{"timestamp":"1740626302","block_number":"16"},"addresses":{"proxyAdmin":"0xf5059a5d33d5853360d16c683c16e67980206f36","reclaimServiceManager":"0x998abeb3e57409262ae5b751f60747921b33613e","reclaimServiceManagerImpl":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","stakeRegistry":"0x4826533b4897376654bb4d4ad88b7fafd0c98528","stakeRegistryImpl":"0x99bba657f2bbc93c02d617f8ba121cb8fc104acf","strategy":"0x24b3c7704709ed1491473f30393ffc93cfb0fc34","token":"0x1613beb3b2c4f22ee086b2b38c1476a3ce7f78e8"}} \ No newline at end of file diff --git a/avs/contracts/mockData/.gitadd b/avs/contracts/mockData/.gitadd new file mode 100644 index 00000000..e69de29b From b8d5d821b19a2c278c5790c2e6f1289e1c5d49d3 Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Mon, 17 Mar 2025 12:21:20 +0530 Subject: [PATCH 13/26] refactor: use owner instead of admins --- avs/contracts/deployments/core/31337.json | 2 +- avs/contracts/deployments/reclaim/31337.json | 2 +- .../script/DeployEigenLayerCore.s.sol | 2 +- avs/contracts/script/ReclaimDeployer.s.sol | 34 +- avs/contracts/script/SetupPayments.s.sol | 92 ++++-- .../script/utils/CoreDeploymentLib.sol | 131 ++++---- .../script/utils/ReclaimDeploymentLib.sol | 84 +++-- .../script/utils/SetupPaymentsLib.sol | 84 +++-- .../script/utils/UpgradeableProxyLib.sol | 23 +- avs/contracts/script/utils/Utils.sol | 74 ++--- avs/contracts/src/ERC20Mock.sol | 4 +- avs/contracts/src/IReclaimServiceManager.sol | 56 ++-- avs/contracts/src/ReclaimServiceManager.sol | 306 ++++++------------ avs/contracts/src/utils/BytesUtils.sol | 11 +- avs/contracts/src/utils/Claims.sol | 170 +++++----- avs/contracts/src/utils/Random.sol | 14 +- avs/contracts/src/utils/StringUtils.sol | 115 ++++--- src/avs/contracts/ReclaimServiceManager.ts | 51 +-- .../factories/AVSDirectory__factory.ts | 2 +- .../factories/DelegationManager__factory.ts | 2 +- .../factories/ECDSAStakeRegistry__factory.ts | 2 +- .../contracts/factories/ERC20Mock__factory.ts | 2 +- .../ReclaimServiceManager__factory.ts | 50 +-- .../factories/RewardsCoordinator__factory.ts | 2 +- src/avs/tests/test.operator.ts | 4 +- src/avs/tests/utils.ts | 6 +- src/avs/utils/contracts.ts | 22 +- 27 files changed, 537 insertions(+), 810 deletions(-) diff --git a/avs/contracts/deployments/core/31337.json b/avs/contracts/deployments/core/31337.json index 9e793d47..5408b00f 100644 --- a/avs/contracts/deployments/core/31337.json +++ b/avs/contracts/deployments/core/31337.json @@ -1 +1 @@ -{"lastUpdate":{"timestamp":"1740626300","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","avsDirectory":"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9","avsDirectoryImpl":"0x68b1d87f95878fe05b998f19b66f4baba5de1aed","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","eigenPodManagerImpl":"0x59b670e9fa9d0a427751af201d676719a970857b","strategyFactory":"0x959922be3caee4b8cd9a407cc3ac1c251c2007b1","strategyFactoryImpl":"0xc6e7df5e7b4f2a278906862b61205850344d4e7d","strategyBeacon":"0x09635f643e140090a9a8dcd712ed6285858cebef","rewardsCoordinator":"0x610178da211fef7d417bc0e6fed39f05609ad788"}} \ No newline at end of file +{"lastUpdate":{"timestamp":"1742193734","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","avsDirectory":"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9","avsDirectoryImpl":"0x68b1d87f95878fe05b998f19b66f4baba5de1aed","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","eigenPodManagerImpl":"0x59b670e9fa9d0a427751af201d676719a970857b","strategyFactory":"0x959922be3caee4b8cd9a407cc3ac1c251c2007b1","strategyFactoryImpl":"0xc6e7df5e7b4f2a278906862b61205850344d4e7d","strategyBeacon":"0x09635f643e140090a9a8dcd712ed6285858cebef","rewardsCoordinator":"0x610178da211fef7d417bc0e6fed39f05609ad788"}} \ No newline at end of file diff --git a/avs/contracts/deployments/reclaim/31337.json b/avs/contracts/deployments/reclaim/31337.json index 841633a6..110765f6 100644 --- a/avs/contracts/deployments/reclaim/31337.json +++ b/avs/contracts/deployments/reclaim/31337.json @@ -1 +1 @@ -{"lastUpdate":{"timestamp":"1740626302","block_number":"16"},"addresses":{"proxyAdmin":"0xf5059a5d33d5853360d16c683c16e67980206f36","reclaimServiceManager":"0x998abeb3e57409262ae5b751f60747921b33613e","reclaimServiceManagerImpl":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","stakeRegistry":"0x4826533b4897376654bb4d4ad88b7fafd0c98528","stakeRegistryImpl":"0x99bba657f2bbc93c02d617f8ba121cb8fc104acf","strategy":"0x24b3c7704709ed1491473f30393ffc93cfb0fc34","token":"0x1613beb3b2c4f22ee086b2b38c1476a3ce7f78e8"}} \ No newline at end of file +{"lastUpdate":{"timestamp":"1742193737","block_number":"18"},"addresses":{"proxyAdmin":"0xf5059a5d33d5853360d16c683c16e67980206f36","reclaimServiceManager":"0x998abeb3e57409262ae5b751f60747921b33613e","reclaimServiceManagerImpl":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","stakeRegistry":"0x4826533b4897376654bb4d4ad88b7fafd0c98528","stakeRegistryImpl":"0x99bba657f2bbc93c02d617f8ba121cb8fc104acf","strategy":"0x24b3c7704709ed1491473f30393ffc93cfb0fc34","token":"0x1613beb3b2c4f22ee086b2b38c1476a3ce7f78e8"}} \ No newline at end of file diff --git a/avs/contracts/script/DeployEigenLayerCore.s.sol b/avs/contracts/script/DeployEigenLayerCore.s.sol index e18b092d..18dbd9aa 100644 --- a/avs/contracts/script/DeployEigenLayerCore.s.sol +++ b/avs/contracts/script/DeployEigenLayerCore.s.sol @@ -35,4 +35,4 @@ contract DeployEigenlayerCore is Script, Test { string memory deploymentPath = "deployments/core/"; CoreDeploymentLib.writeDeploymentJson(deploymentPath, block.chainid, deploymentData); } -} \ No newline at end of file +} diff --git a/avs/contracts/script/ReclaimDeployer.s.sol b/avs/contracts/script/ReclaimDeployer.s.sol index 39484420..b725eb40 100644 --- a/avs/contracts/script/ReclaimDeployer.s.sol +++ b/avs/contracts/script/ReclaimDeployer.s.sol @@ -8,14 +8,11 @@ import {CoreDeploymentLib} from "./utils/CoreDeploymentLib.sol"; import {UpgradeableProxyLib} from "./utils/UpgradeableProxyLib.sol"; import {StrategyBase} from "@eigenlayer/contracts/strategies/StrategyBase.sol"; import {ERC20Mock} from "../src/ERC20Mock.sol"; -import {TransparentUpgradeableProxy} from - "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import {StrategyFactory} from "@eigenlayer/contracts/strategies/StrategyFactory.sol"; import {StrategyManager} from "@eigenlayer/contracts/core/StrategyManager.sol"; import {IRewardsCoordinator} from "@eigenlayer/contracts/interfaces/IRewardsCoordinator.sol"; - - import { Quorum, StrategyParams, @@ -38,13 +35,13 @@ contract ReclaimDeployer is Script, Test { ReclaimDeploymentLib.DeploymentConfigData reclaimConfig; Quorum internal quorum; ERC20Mock token; + function setUp() public virtual { deployer = vm.rememberKey(vm.envUint("PRIVATE_KEY")); vm.label(deployer, "Deployer"); reclaimConfig = ReclaimDeploymentLib.readDeploymentConfigValues("config/reclaim/", block.chainid); - coreDeployment = CoreDeploymentLib.readDeploymentJson("deployments/core/", block.chainid); } @@ -56,17 +53,12 @@ contract ReclaimDeployer is Script, Test { token = new ERC20Mock(); reclaimStrategy = IStrategy(StrategyFactory(coreDeployment.strategyFactory).deployNewStrategy(token)); - quorum.strategies.push( - StrategyParams({strategy: reclaimStrategy, multiplier: 10_000}) - ); + quorum.strategies.push(StrategyParams({strategy: reclaimStrategy, multiplier: 10_000})); proxyAdmin = UpgradeableProxyLib.deployProxyAdmin(); - reclaimDeployment = ReclaimDeploymentLib.deployContracts( - proxyAdmin, coreDeployment, - quorum, rewardsOwner, - deployer, address(reclaimStrategy) - ); + reclaimDeployment = + ReclaimDeploymentLib.deployContracts(proxyAdmin, coreDeployment, quorum, deployer, address(reclaimStrategy)); reclaimDeployment.strategy = address(reclaimStrategy); reclaimDeployment.token = address(token); @@ -77,19 +69,11 @@ contract ReclaimDeployer is Script, Test { } function verifyDeployment() internal view { - require( - reclaimDeployment.stakeRegistry != address(0), "StakeRegistry address cannot be zero" - ); - require( - reclaimDeployment.reclaimServiceManager != address(0), - "ReclaimServiceManager address cannot be zero" - ); + require(reclaimDeployment.stakeRegistry != address(0), "StakeRegistry address cannot be zero"); + require(reclaimDeployment.reclaimServiceManager != address(0), "ReclaimServiceManager address cannot be zero"); require(reclaimDeployment.strategy != address(0), "Strategy address cannot be zero"); require(proxyAdmin != address(0), "ProxyAdmin address cannot be zero"); - require( - coreDeployment.delegationManager != address(0), - "DelegationManager address cannot be zero" - ); + require(coreDeployment.delegationManager != address(0), "DelegationManager address cannot be zero"); require(coreDeployment.avsDirectory != address(0), "AVSDirectory address cannot be zero"); } -} \ No newline at end of file +} diff --git a/avs/contracts/script/SetupPayments.s.sol b/avs/contracts/script/SetupPayments.s.sol index 26dccfc8..b939a89e 100644 --- a/avs/contracts/script/SetupPayments.s.sol +++ b/avs/contracts/script/SetupPayments.s.sol @@ -23,7 +23,7 @@ contract SetupPayments is Script, Test { RewardsCoordinator rewardsCoordinator; string internal constant paymentInfofilePath = "mockData/payment_info.json"; string internal constant filePath = "mockData/payments.json"; - + uint32 constant CALCULATION_INTERVAL_SECONDS = 1 days; uint256 constant NUM_TOKEN_EARNINGS = 1; uint32 constant DURATION = 1; @@ -59,25 +59,25 @@ contract SetupPayments is Script, Test { function run() external { vm.startBroadcast(reclaimConfig.rewardsInitiatorKey); - - if(rewardsCoordinator.currRewardsCalculationEndTimestamp() == 0) { - startTimestamp = uint32(block.timestamp) - (uint32(block.timestamp) % CALCULATION_INTERVAL_SECONDS); + + if (rewardsCoordinator.currRewardsCalculationEndTimestamp() == 0) { + startTimestamp = uint32(block.timestamp) - (uint32(block.timestamp) % CALCULATION_INTERVAL_SECONDS); } else { - startTimestamp = rewardsCoordinator.currRewardsCalculationEndTimestamp() - DURATION + CALCULATION_INTERVAL_SECONDS; + startTimestamp = + rewardsCoordinator.currRewardsCalculationEndTimestamp() - DURATION + CALCULATION_INTERVAL_SECONDS; } endTimestamp = startTimestamp + 1; - if (endTimestamp > block.timestamp) { revert("End timestamp must be in the future. Please wait to generate new payments."); } // sets a multiplier based on block number such that cumulativeEarnings - // increase accordingly for multiple runs of this script in the same session + // increase accordingly for multiple runs of this script in the same session uint256 nonce = rewardsCoordinator.getDistributionRootsLength(); amountPerPayment = uint32(amountPerPayment * (nonce + 1)); - + createAVSRewardsSubmissions(numPayments, amountPerPayment, startTimestamp); vm.stopBroadcast(); vm.startBroadcast(deployer); @@ -86,9 +86,9 @@ contract SetupPayments is Script, Test { vm.stopBroadcast(); } - function runPaymentRoot( - address[] memory earners, uint32 endTimestamp, uint32 numPayments, uint32 amountPerPayment - ) external { + function runPaymentRoot(address[] memory earners, uint32 endTimestamp, uint32 numPayments, uint32 amountPerPayment) + external + { vm.startBroadcast(deployer); submitPaymentRoot(earners, endTimestamp, numPayments, amountPerPayment); vm.stopBroadcast(); @@ -96,15 +96,15 @@ contract SetupPayments is Script, Test { function runOperatorDirected() external { vm.startBroadcast(reclaimConfig.rewardsInitiatorKey); - if(rewardsCoordinator.currRewardsCalculationEndTimestamp() == 0) { - startTimestamp = uint32(block.timestamp) - (uint32(block.timestamp) % CALCULATION_INTERVAL_SECONDS); + if (rewardsCoordinator.currRewardsCalculationEndTimestamp() == 0) { + startTimestamp = uint32(block.timestamp) - (uint32(block.timestamp) % CALCULATION_INTERVAL_SECONDS); } else { - startTimestamp = rewardsCoordinator.currRewardsCalculationEndTimestamp() - DURATION + CALCULATION_INTERVAL_SECONDS; + startTimestamp = + rewardsCoordinator.currRewardsCalculationEndTimestamp() - DURATION + CALCULATION_INTERVAL_SECONDS; } endTimestamp = startTimestamp + 1; - if (endTimestamp > block.timestamp) { revert("End timestamp must be in the future. Please wait to generate new payments."); } @@ -120,7 +120,6 @@ contract SetupPayments is Script, Test { submitPaymentRoot(earners, endTimestamp, numPayments, amountPerPayment); vm.stopBroadcast(); } - function executeProcessClaim(address recipient) public { uint256 nonce = rewardsCoordinator.getDistributionRootsLength(); @@ -134,7 +133,9 @@ contract SetupPayments is Script, Test { function createAVSRewardsSubmissions(uint256 numPayments, uint256 amountPerPayment, uint32 startTimestamp) public { ERC20Mock(reclaimDeployment.token).mint(reclaimConfig.rewardsInitiator, amountPerPayment * numPayments); - ERC20Mock(reclaimDeployment.token).increaseAllowance(reclaimDeployment.reclaimServiceManager, amountPerPayment * numPayments); + ERC20Mock(reclaimDeployment.token).increaseAllowance( + reclaimDeployment.reclaimServiceManager, amountPerPayment * numPayments + ); uint32 duration = rewardsCoordinator.MAX_REWARDS_DURATION(); SetupPaymentsLib.createAVSRewardsSubmissions( reclaimDeployment.reclaimServiceManager, @@ -146,10 +147,15 @@ contract SetupPayments is Script, Test { ); } - - function createOperatorDirectedAVSRewardsSubmissions(uint256 numPayments, uint256 amountPerPayment, uint32 startTimestamp) public { + function createOperatorDirectedAVSRewardsSubmissions( + uint256 numPayments, + uint256 amountPerPayment, + uint32 startTimestamp + ) public { ERC20Mock(reclaimDeployment.token).mint(reclaimConfig.rewardsInitiator, amountPerPayment * numPayments); - ERC20Mock(reclaimDeployment.token).increaseAllowance(reclaimDeployment.reclaimServiceManager, amountPerPayment * numPayments); + ERC20Mock(reclaimDeployment.token).increaseAllowance( + reclaimDeployment.reclaimServiceManager, amountPerPayment * numPayments + ); uint32 duration = 0; address[] memory operators = new address[](2); operators[0] = operator1; @@ -169,7 +175,13 @@ contract SetupPayments is Script, Test { ); } - function processClaim(string memory filePath, uint256 indexToProve, address recipient, IRewardsCoordinator.EarnerTreeMerkleLeaf memory earnerLeaf, uint32 amountPerPayment) public { + function processClaim( + string memory filePath, + uint256 indexToProve, + address recipient, + IRewardsCoordinator.EarnerTreeMerkleLeaf memory earnerLeaf, + uint32 amountPerPayment + ) public { SetupPaymentsLib.processClaim( IRewardsCoordinator(coreDeployment.rewardsCoordinator), filePath, @@ -182,31 +194,41 @@ contract SetupPayments is Script, Test { ); } - function submitPaymentRoot(address[] memory earners, uint32 endTimestamp, uint32 numPayments, uint32 amountPerPayment) public { + function submitPaymentRoot( + address[] memory earners, + uint32 endTimestamp, + uint32 numPayments, + uint32 amountPerPayment + ) public { emit log_named_uint("cumumlativePaymentMultiplier", cumumlativePaymentMultiplier); bytes32[] memory tokenLeaves = SetupPaymentsLib.createTokenLeaves( - IRewardsCoordinator(coreDeployment.rewardsCoordinator), - NUM_TOKEN_EARNINGS, - amountPerPayment, + IRewardsCoordinator(coreDeployment.rewardsCoordinator), + NUM_TOKEN_EARNINGS, + amountPerPayment, reclaimDeployment.strategy ); - IRewardsCoordinator.EarnerTreeMerkleLeaf[] memory earnerLeaves = SetupPaymentsLib.createEarnerLeaves(earners, tokenLeaves); + IRewardsCoordinator.EarnerTreeMerkleLeaf[] memory earnerLeaves = + SetupPaymentsLib.createEarnerLeaves(earners, tokenLeaves); emit log_named_uint("Earner Leaves Length", earnerLeaves.length); - emit log_named_uint("numPayments", numPayments); + emit log_named_uint("numPayments", numPayments); - bytes32 paymentRoot = SetupPaymentsLib.createPaymentRoot(rewardsCoordinator, tokenLeaves, earnerLeaves, numPayments, NUM_TOKEN_EARNINGS, filePath); + bytes32 paymentRoot = SetupPaymentsLib.createPaymentRoot( + rewardsCoordinator, tokenLeaves, earnerLeaves, numPayments, NUM_TOKEN_EARNINGS, filePath + ); rewardsCoordinator.submitRoot(paymentRoot, endTimestamp); } - function _getEarnerLeaves(address[] memory earners, uint32 amountPerPayment, address strategy) internal view returns (IRewardsCoordinator.EarnerTreeMerkleLeaf[] memory) { + function _getEarnerLeaves(address[] memory earners, uint32 amountPerPayment, address strategy) + internal + view + returns (IRewardsCoordinator.EarnerTreeMerkleLeaf[] memory) + { bytes32[] memory tokenLeaves = SetupPaymentsLib.createTokenLeaves( - IRewardsCoordinator(coreDeployment.rewardsCoordinator), - NUM_TOKEN_EARNINGS, - amountPerPayment, - strategy + IRewardsCoordinator(coreDeployment.rewardsCoordinator), NUM_TOKEN_EARNINGS, amountPerPayment, strategy ); - IRewardsCoordinator.EarnerTreeMerkleLeaf[] memory earnerLeaves = SetupPaymentsLib.createEarnerLeaves(earners, tokenLeaves); + IRewardsCoordinator.EarnerTreeMerkleLeaf[] memory earnerLeaves = + SetupPaymentsLib.createEarnerLeaves(earners, tokenLeaves); return earnerLeaves; } @@ -218,4 +240,4 @@ contract SetupPayments is Script, Test { } return earners; } -} \ No newline at end of file +} diff --git a/avs/contracts/script/utils/CoreDeploymentLib.sol b/avs/contracts/script/utils/CoreDeploymentLib.sol index 06dcad9e..3c073df6 100644 --- a/avs/contracts/script/utils/CoreDeploymentLib.sol +++ b/avs/contracts/script/utils/CoreDeploymentLib.sol @@ -2,8 +2,7 @@ pragma solidity ^0.8.0; import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; -import {TransparentUpgradeableProxy} from - "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import {UpgradeableBeacon} from "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; import {console2} from "forge-std/Test.sol"; import {Vm} from "forge-std/Vm.sol"; @@ -89,10 +88,10 @@ library CoreDeploymentLib { address initialOwner; } - function deployContracts( - address proxyAdmin, - DeploymentConfigData memory configData - ) internal returns (DeploymentData memory) { + function deployContracts(address proxyAdmin, DeploymentConfigData memory configData) + internal + returns (DeploymentData memory) + { DeploymentData memory result; result.delegationManager = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); @@ -107,13 +106,10 @@ library CoreDeploymentLib { // Deploy the implementation contracts, using the proxy contracts as inputs address delegationManagerImpl = address( new DelegationManager( - IStrategyManager(result.strategyManager), - ISlasher(address(0)), - IEigenPodManager(result.eigenPodManager) + IStrategyManager(result.strategyManager), ISlasher(address(0)), IEigenPodManager(result.eigenPodManager) ) ); - address avsDirectoryImpl = - address(new AVSDirectory(IDelegationManager(result.delegationManager))); + address avsDirectoryImpl = address(new AVSDirectory(IDelegationManager(result.delegationManager))); address strategyManagerImpl = address( new StrategyManager( @@ -123,8 +119,7 @@ library CoreDeploymentLib { ) ); - address strategyFactoryImpl = - address(new StrategyFactory(IStrategyManager(result.strategyManager))); + address strategyFactoryImpl = address(new StrategyFactory(IStrategyManager(result.strategyManager))); address ethPOSDeposit; if (block.chainid == 1) { @@ -166,16 +161,10 @@ library CoreDeploymentLib { /// TODO: Get actual genesis time uint64 GENESIS_TIME = 1_564_000; - address eigenPodImpl = address( - new EigenPod( - IETHPOSDeposit(ethPOSDeposit), - IEigenPodManager(result.eigenPodManager), - GENESIS_TIME - ) - ); + address eigenPodImpl = + address(new EigenPod(IETHPOSDeposit(ethPOSDeposit), IEigenPodManager(result.eigenPodManager), GENESIS_TIME)); address eigenPodBeaconImpl = address(new UpgradeableBeacon(eigenPodImpl)); - address baseStrategyImpl = - address(new StrategyBase(IStrategyManager(result.strategyManager))); + address baseStrategyImpl = address(new StrategyBase(IStrategyManager(result.strategyManager))); /// TODO: PauserRegistry isn't upgradeable address pauserRegistryImpl = address( new PauserRegistry( @@ -200,9 +189,7 @@ library CoreDeploymentLib { new uint256[](0) // _withdrawalDelayBlocks (empty array for now) ) ); - UpgradeableProxyLib.upgradeAndCall( - result.delegationManager, delegationManagerImpl, upgradeCall - ); + UpgradeableProxyLib.upgradeAndCall(result.delegationManager, delegationManagerImpl, upgradeCall); // Upgrade StrategyManager contract upgradeCall = abi.encodeCall( @@ -262,9 +249,7 @@ library CoreDeploymentLib { uint16(configData.rewardsCoordinator.globalOperatorCommissionBips) // _globalCommissionBips ) ); - UpgradeableProxyLib.upgradeAndCall( - result.rewardsCoordinator, rewardsCoordinatorImpl, upgradeCall - ); + UpgradeableProxyLib.upgradeAndCall(result.rewardsCoordinator, rewardsCoordinatorImpl, upgradeCall); // Upgrade EigenPod contract upgradeCall = abi.encodeCall( @@ -287,10 +272,11 @@ library CoreDeploymentLib { } // StrategyConfig[] strategies; - function readDeploymentConfigValues( - string memory directoryPath, - string memory fileName - ) internal view returns (DeploymentConfigData memory) { + function readDeploymentConfigValues(string memory directoryPath, string memory fileName) + internal + view + returns (DeploymentConfigData memory) + { string memory pathToFile = string.concat(directoryPath, fileName); require(vm.exists(pathToFile), "CoreDeployment: Deployment config file does not exist"); @@ -307,8 +293,7 @@ library CoreDeploymentLib { // DelegationManager config start data.delegationManager.initPausedStatus = json.readUint(".delegation.init_paused_status"); - data.delegationManager.withdrawalDelayBlocks = - json.readUint(".delegation.init_withdrawal_delay_blocks"); + data.delegationManager.withdrawalDelayBlocks = json.readUint(".delegation.init_withdrawal_delay_blocks"); // DelegationManager config end // Slasher config start @@ -321,18 +306,12 @@ library CoreDeploymentLib { // EigenPodManager config end // RewardsCoordinator config start - data.rewardsCoordinator.initPausedStatus = - json.readUint(".rewardsCoordinator.init_paused_status"); - data.rewardsCoordinator.maxRewardsDuration = - json.readUint(".rewardsCoordinator.MAX_REWARDS_DURATION"); - data.rewardsCoordinator.maxRetroactiveLength = - json.readUint(".rewardsCoordinator.MAX_RETROACTIVE_LENGTH"); - data.rewardsCoordinator.maxFutureLength = - json.readUint(".rewardsCoordinator.MAX_FUTURE_LENGTH"); - data.rewardsCoordinator.genesisRewardsTimestamp = - json.readUint(".rewardsCoordinator.GENESIS_REWARDS_TIMESTAMP"); - data.rewardsCoordinator.activationDelay = - json.readUint(".rewardsCoordinator.activation_delay"); + data.rewardsCoordinator.initPausedStatus = json.readUint(".rewardsCoordinator.init_paused_status"); + data.rewardsCoordinator.maxRewardsDuration = json.readUint(".rewardsCoordinator.MAX_REWARDS_DURATION"); + data.rewardsCoordinator.maxRetroactiveLength = json.readUint(".rewardsCoordinator.MAX_RETROACTIVE_LENGTH"); + data.rewardsCoordinator.maxFutureLength = json.readUint(".rewardsCoordinator.MAX_FUTURE_LENGTH"); + data.rewardsCoordinator.genesisRewardsTimestamp = json.readUint(".rewardsCoordinator.GENESIS_REWARDS_TIMESTAMP"); + data.rewardsCoordinator.activationDelay = json.readUint(".rewardsCoordinator.activation_delay"); data.rewardsCoordinator.calculationIntervalSeconds = json.readUint(".rewardsCoordinator.calculation_interval_seconds"); data.rewardsCoordinator.globalOperatorCommissionBips = @@ -342,25 +321,27 @@ library CoreDeploymentLib { return data; } - function readDeploymentConfigValues( - string memory directoryPath, - uint256 chainId - ) internal view returns (DeploymentConfigData memory) { - return - readDeploymentConfigValues(directoryPath, string.concat(vm.toString(chainId), ".json")); + function readDeploymentConfigValues(string memory directoryPath, uint256 chainId) + internal + view + returns (DeploymentConfigData memory) + { + return readDeploymentConfigValues(directoryPath, string.concat(vm.toString(chainId), ".json")); } - function readDeploymentJson( - string memory directoryPath, - uint256 chainId - ) internal view returns (DeploymentData memory) { + function readDeploymentJson(string memory directoryPath, uint256 chainId) + internal + view + returns (DeploymentData memory) + { return readDeploymentJson(directoryPath, string.concat(vm.toString(chainId), ".json")); } - function readDeploymentJson( - string memory path, - string memory fileName - ) internal view returns (DeploymentData memory) { + function readDeploymentJson(string memory path, string memory fileName) + internal + view + returns (DeploymentData memory) + { string memory pathToFile = string.concat(path, fileName); require(vm.exists(pathToFile), "CoreDeployment: Deployment file does not exist"); @@ -380,17 +361,11 @@ library CoreDeploymentLib { } /// TODO: Need to be able to read json from eigenlayer-contracts repo for holesky/mainnet and output the json here - function writeDeploymentJson( - DeploymentData memory data - ) internal { + function writeDeploymentJson(DeploymentData memory data) internal { writeDeploymentJson("deployments/core/", block.chainid, data); } - function writeDeploymentJson( - string memory path, - uint256 chainId, - DeploymentData memory data - ) internal { + function writeDeploymentJson(string memory path, uint256 chainId, DeploymentData memory data) internal { address proxyAdmin = address(UpgradeableProxyLib.getProxyAdmin(data.strategyManager)); string memory deploymentData = _generateDeploymentJson(data, proxyAdmin); @@ -404,10 +379,11 @@ library CoreDeploymentLib { console2.log("Deployment artifacts written to:", fileName); } - function _generateDeploymentJson( - DeploymentData memory data, - address proxyAdmin - ) private view returns (string memory) { + function _generateDeploymentJson(DeploymentData memory data, address proxyAdmin) + private + view + returns (string memory) + { return string.concat( '{"lastUpdate":{"timestamp":"', vm.toString(block.timestamp), @@ -419,10 +395,11 @@ library CoreDeploymentLib { ); } - function _generateContractsJson( - DeploymentData memory data, - address proxyAdmin - ) private view returns (string memory) { + function _generateContractsJson(DeploymentData memory data, address proxyAdmin) + private + view + returns (string memory) + { /// TODO: namespace contracts -> {avs, core} return string.concat( '{"proxyAdmin":"', @@ -454,4 +431,4 @@ library CoreDeploymentLib { '"}' ); } -} \ No newline at end of file +} diff --git a/avs/contracts/script/utils/ReclaimDeploymentLib.sol b/avs/contracts/script/utils/ReclaimDeploymentLib.sol index 0bd8082d..e3f7af0d 100644 --- a/avs/contracts/script/utils/ReclaimDeploymentLib.sol +++ b/avs/contracts/script/utils/ReclaimDeploymentLib.sol @@ -37,8 +37,7 @@ library ReclaimDeploymentLib { address proxyAdmin, CoreDeploymentLib.DeploymentData memory core, Quorum memory quorum, - address owner, - address deployer, + address contractOwner, address strategy ) internal returns (DeploymentData memory) { DeploymentData memory result; @@ -47,34 +46,31 @@ library ReclaimDeploymentLib { result.reclaimServiceManager = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); result.stakeRegistry = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); // Deploy the implementation contracts, using the proxy contracts as inputs - address stakeRegistryImpl = - address(new ECDSAStakeRegistry(IDelegationManager(core.delegationManager))); + address stakeRegistryImpl = address(new ECDSAStakeRegistry(IDelegationManager(core.delegationManager))); address reclaimServiceManagerImpl = address( new ReclaimServiceManager( core.avsDirectory, result.stakeRegistry, core.rewardsCoordinator, core.delegationManager ) ); // Upgrade contracts - bytes memory upgradeCall = abi.encodeCall( - ECDSAStakeRegistry.initialize, (result.reclaimServiceManager, 0, quorum) - ); + bytes memory upgradeCall = + abi.encodeCall(ECDSAStakeRegistry.initialize, (result.reclaimServiceManager, 0, quorum)); UpgradeableProxyLib.upgradeAndCall(result.stakeRegistry, stakeRegistryImpl, upgradeCall); - upgradeCall = abi.encodeCall(ReclaimServiceManager.initialize, (owner, deployer, strategy)); + upgradeCall = abi.encodeCall(ReclaimServiceManager.initialize, (contractOwner, strategy)); UpgradeableProxyLib.upgradeAndCall(result.reclaimServiceManager, reclaimServiceManagerImpl, upgradeCall); return result; } - function readDeploymentJson( - uint256 chainId - ) internal view returns (DeploymentData memory) { + function readDeploymentJson(uint256 chainId) internal view returns (DeploymentData memory) { return readDeploymentJson("deployments/", chainId); } - function readDeploymentJson( - string memory directoryPath, - uint256 chainId - ) internal view returns (DeploymentData memory) { + function readDeploymentJson(string memory directoryPath, uint256 chainId) + internal + view + returns (DeploymentData memory) + { string memory fileName = string.concat(directoryPath, vm.toString(chainId), ".json"); require(vm.exists(fileName), "ReclaimDeployment: Deployment file does not exist"); @@ -90,22 +86,14 @@ library ReclaimDeploymentLib { return data; } - /// write to default output path - function writeDeploymentJson( - DeploymentData memory data - ) internal { + function writeDeploymentJson(DeploymentData memory data) internal { writeDeploymentJson("deployments/reclaim/", block.chainid, data); } - function writeDeploymentJson( - string memory outputPath, - uint256 chainId, - DeploymentData memory data - ) internal { - address proxyAdmin = - address(UpgradeableProxyLib.getProxyAdmin(data.reclaimServiceManager)); + function writeDeploymentJson(string memory outputPath, uint256 chainId, DeploymentData memory data) internal { + address proxyAdmin = address(UpgradeableProxyLib.getProxyAdmin(data.reclaimServiceManager)); string memory deploymentData = _generateDeploymentJson(data, proxyAdmin); @@ -117,12 +105,12 @@ library ReclaimDeploymentLib { vm.writeFile(fileName, deploymentData); console2.log("Deployment artifacts written to:", fileName); } - - function readDeploymentConfigValues( - string memory directoryPath, - string memory fileName - ) internal view returns (DeploymentConfigData memory) { + function readDeploymentConfigValues(string memory directoryPath, string memory fileName) + internal + view + returns (DeploymentConfigData memory) + { string memory pathToFile = string.concat(directoryPath, fileName); require(vm.exists(pathToFile), "ReclaimDeployment: Deployment Config file does not exist"); @@ -137,18 +125,19 @@ library ReclaimDeploymentLib { return data; } - function readDeploymentConfigValues( - string memory directoryPath, - uint256 chainId - ) internal view returns (DeploymentConfigData memory) { - return - readDeploymentConfigValues(directoryPath, string.concat(vm.toString(chainId), ".json")); + function readDeploymentConfigValues(string memory directoryPath, uint256 chainId) + internal + view + returns (DeploymentConfigData memory) + { + return readDeploymentConfigValues(directoryPath, string.concat(vm.toString(chainId), ".json")); } - function _generateDeploymentJson( - DeploymentData memory data, - address proxyAdmin - ) private view returns (string memory) { + function _generateDeploymentJson(DeploymentData memory data, address proxyAdmin) + private + view + returns (string memory) + { return string.concat( '{"lastUpdate":{"timestamp":"', vm.toString(block.timestamp), @@ -160,10 +149,11 @@ library ReclaimDeploymentLib { ); } - function _generateContractsJson( - DeploymentData memory data, - address proxyAdmin - ) private view returns (string memory) { + function _generateContractsJson(DeploymentData memory data, address proxyAdmin) + private + view + returns (string memory) + { return string.concat( '{"proxyAdmin":"', proxyAdmin.toHexString(), @@ -179,7 +169,7 @@ library ReclaimDeploymentLib { data.strategy.toHexString(), '","token":"', data.token.toHexString(), - '"}' + '"}' ); } -} \ No newline at end of file +} diff --git a/avs/contracts/script/utils/SetupPaymentsLib.sol b/avs/contracts/script/utils/SetupPaymentsLib.sol index 80e923f0..e0ca94b5 100644 --- a/avs/contracts/script/utils/SetupPaymentsLib.sol +++ b/avs/contracts/script/utils/SetupPaymentsLib.sol @@ -6,9 +6,7 @@ import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategy import {ECDSAServiceManagerBase} from "@eigenlayer-middleware/src/unaudited/ECDSAServiceManagerBase.sol"; import {Vm} from "forge-std/Vm.sol"; - library SetupPaymentsLib { - Vm internal constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); struct PaymentLeaves { @@ -24,13 +22,13 @@ library SetupPaymentsLib { uint32 duration, uint32 startTimestamp ) internal { - IRewardsCoordinator.RewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.RewardsSubmission[](numPayments); + IRewardsCoordinator.RewardsSubmission[] memory rewardsSubmissions = + new IRewardsCoordinator.RewardsSubmission[](numPayments); for (uint256 i = 0; i < numPayments; i++) { - IRewardsCoordinator.StrategyAndMultiplier[] memory strategiesAndMultipliers = new IRewardsCoordinator.StrategyAndMultiplier[](1); - strategiesAndMultipliers[0] = IRewardsCoordinator.StrategyAndMultiplier({ - strategy: IStrategy(strategy), - multiplier: 10000 - }); + IRewardsCoordinator.StrategyAndMultiplier[] memory strategiesAndMultipliers = + new IRewardsCoordinator.StrategyAndMultiplier[](1); + strategiesAndMultipliers[0] = + IRewardsCoordinator.StrategyAndMultiplier({strategy: IStrategy(strategy), multiplier: 10000}); IRewardsCoordinator.RewardsSubmission memory rewardsSubmission = IRewardsCoordinator.RewardsSubmission({ strategiesAndMultipliers: strategiesAndMultipliers, @@ -55,26 +53,24 @@ library SetupPaymentsLib { uint32 duration, uint32 startTimestamp ) internal { - uint256 operatorRewardAmount = amountPerPayment / numOperators; IRewardsCoordinator.OperatorReward[] memory operatorRewards = new IRewardsCoordinator.OperatorReward[](2); for (uint256 i = 0; i < 2; i++) { - operatorRewards[i] = IRewardsCoordinator.OperatorReward({ - operator: operators[i], - amount: operatorRewardAmount - }); + operatorRewards[i] = + IRewardsCoordinator.OperatorReward({operator: operators[i], amount: operatorRewardAmount}); } - IRewardsCoordinator.OperatorDirectedRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorDirectedRewardsSubmission[](numPayments); + IRewardsCoordinator.OperatorDirectedRewardsSubmission[] memory rewardsSubmissions = + new IRewardsCoordinator.OperatorDirectedRewardsSubmission[](numPayments); for (uint256 i = 0; i < numPayments; i++) { - IRewardsCoordinator.StrategyAndMultiplier[] memory strategiesAndMultipliers = new IRewardsCoordinator.StrategyAndMultiplier[](1); - strategiesAndMultipliers[0] = IRewardsCoordinator.StrategyAndMultiplier({ - strategy: IStrategy(strategy), - multiplier: 10000 - }); + IRewardsCoordinator.StrategyAndMultiplier[] memory strategiesAndMultipliers = + new IRewardsCoordinator.StrategyAndMultiplier[](1); + strategiesAndMultipliers[0] = + IRewardsCoordinator.StrategyAndMultiplier({strategy: IStrategy(strategy), multiplier: 10000}); - IRewardsCoordinator.OperatorDirectedRewardsSubmission memory rewardsSubmission = IRewardsCoordinator.OperatorDirectedRewardsSubmission({ + IRewardsCoordinator.OperatorDirectedRewardsSubmission memory rewardsSubmission = IRewardsCoordinator + .OperatorDirectedRewardsSubmission({ strategiesAndMultipliers: strategiesAndMultipliers, token: IStrategy(strategy).underlyingToken(), operatorRewards: operatorRewards, @@ -99,7 +95,7 @@ library SetupPaymentsLib { uint32 amountPerPayment ) internal { PaymentLeaves memory paymentLeaves = parseLeavesFromJson(filePath); - + bytes memory proof = generateMerkleProof(paymentLeaves.leaves, indexToProve); //we only have one token leaf bytes memory tokenProof = generateMerkleProof(paymentLeaves.tokenLeaves, 0); @@ -108,10 +104,10 @@ library SetupPaymentsLib { bytes[] memory tokenProofs = new bytes[](NUM_TOKEN_EARNINGS); tokenProofs[0] = tokenProof; - IRewardsCoordinator.TokenTreeMerkleLeaf[] memory tokenLeaves = new IRewardsCoordinator.TokenTreeMerkleLeaf[](NUM_TOKEN_EARNINGS); + IRewardsCoordinator.TokenTreeMerkleLeaf[] memory tokenLeaves = + new IRewardsCoordinator.TokenTreeMerkleLeaf[](NUM_TOKEN_EARNINGS); tokenLeaves[0] = defaultTokenLeaf(amountPerPayment, strategy); - // this workflow assumes a new root submitted for every payment claimed. So we get the latest rood index to process a claim for uint256 rootIndex = rewardsCoordinator.getDistributionRootsLength() - 1; @@ -134,11 +130,12 @@ library SetupPaymentsLib { IRewardsCoordinator.EarnerTreeMerkleLeaf[] memory earnerLeaves, address strategy, uint32 rewardsCalculationEndTimestamp, - uint256 NUM_PAYMENTS, + uint256 NUM_PAYMENTS, uint256 NUM_TOKEN_EARNINGS, string memory filePath ) internal { - bytes32 paymentRoot = createPaymentRoot(rewardsCoordinator, tokenLeaves, earnerLeaves, NUM_PAYMENTS, NUM_TOKEN_EARNINGS, filePath); + bytes32 paymentRoot = + createPaymentRoot(rewardsCoordinator, tokenLeaves, earnerLeaves, NUM_PAYMENTS, NUM_TOKEN_EARNINGS, filePath); rewardsCoordinator.submitRoot(paymentRoot, rewardsCalculationEndTimestamp); } @@ -152,7 +149,7 @@ library SetupPaymentsLib { ) internal returns (bytes32) { require(earnerLeaves.length == NUM_PAYMENTS, "Number of earners must match number of payments"); bytes32[] memory leaves = new bytes32[](NUM_PAYMENTS); - + require(tokenLeaves.length == NUM_TOKEN_EARNINGS, "Number of token leaves must match number of token earnings"); for (uint256 i = 0; i < NUM_PAYMENTS; i++) { leaves[i] = rewardsCoordinator.calculateEarnerLeafHash(earnerLeaves[i]); @@ -162,11 +159,13 @@ library SetupPaymentsLib { return (merkleizeKeccak(leaves)); } - function createEarnerLeaves( - address[] calldata earners, - bytes32[] memory tokenLeaves - ) public pure returns (IRewardsCoordinator.EarnerTreeMerkleLeaf[] memory) { - IRewardsCoordinator.EarnerTreeMerkleLeaf[] memory leaves = new IRewardsCoordinator.EarnerTreeMerkleLeaf[](earners.length); + function createEarnerLeaves(address[] calldata earners, bytes32[] memory tokenLeaves) + public + pure + returns (IRewardsCoordinator.EarnerTreeMerkleLeaf[] memory) + { + IRewardsCoordinator.EarnerTreeMerkleLeaf[] memory leaves = + new IRewardsCoordinator.EarnerTreeMerkleLeaf[](earners.length); for (uint256 i = 0; i < earners.length; i++) { leaves[i] = IRewardsCoordinator.EarnerTreeMerkleLeaf({ earner: earners[i], @@ -177,7 +176,7 @@ library SetupPaymentsLib { } function createTokenRoot(bytes32[] memory tokenLeaves) public pure returns (bytes32) { - return merkleizeKeccak(tokenLeaves); + return merkleizeKeccak(tokenLeaves); } function createTokenLeaves( @@ -194,10 +193,11 @@ library SetupPaymentsLib { return leaves; } - function defaultTokenLeaf( - uint256 TOKEN_EARNINGS, - address strategy - ) internal view returns (IRewardsCoordinator.TokenTreeMerkleLeaf memory) { + function defaultTokenLeaf(uint256 TOKEN_EARNINGS, address strategy) + internal + view + returns (IRewardsCoordinator.TokenTreeMerkleLeaf memory) + { IRewardsCoordinator.TokenTreeMerkleLeaf memory leaf = IRewardsCoordinator.TokenTreeMerkleLeaf({ token: IStrategy(strategy).underlyingToken(), cumulativeEarnings: TOKEN_EARNINGS @@ -205,11 +205,9 @@ library SetupPaymentsLib { return leaf; } - function writeLeavesToJson( - bytes32[] memory leaves, - bytes32[] memory tokenLeaves, - string memory filePath - ) internal { + function writeLeavesToJson(bytes32[] memory leaves, bytes32[] memory tokenLeaves, string memory filePath) + internal + { string memory parent_object = "parent_object"; vm.serializeBytes32(parent_object, "leaves", leaves); string memory finalJson = vm.serializeBytes32(parent_object, "tokenLeaves", tokenLeaves); @@ -304,7 +302,7 @@ library SetupPaymentsLib { function padLeaves(bytes32[] memory leaves) internal pure returns (bytes32[] memory) { uint256 paddedLength = 2; - while(paddedLength < leaves.length) { + while (paddedLength < leaves.length) { paddedLength <<= 1; } @@ -314,4 +312,4 @@ library SetupPaymentsLib { } return paddedLeaves; } -} \ No newline at end of file +} diff --git a/avs/contracts/script/utils/UpgradeableProxyLib.sol b/avs/contracts/script/utils/UpgradeableProxyLib.sol index 82bc2c93..9d8a4f0f 100644 --- a/avs/contracts/script/utils/UpgradeableProxyLib.sol +++ b/avs/contracts/script/utils/UpgradeableProxyLib.sol @@ -3,15 +3,12 @@ pragma solidity ^0.8.0; import {Vm} from "forge-std/Vm.sol"; import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; -import {TransparentUpgradeableProxy} from - "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import {EmptyContract} from "@eigenlayer/test/mocks/EmptyContract.sol"; library UpgradeableProxyLib { - bytes32 internal constant IMPLEMENTATION_SLOT = - 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - bytes32 internal constant ADMIN_SLOT = - 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; + bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; + bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; Vm internal constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); @@ -19,9 +16,7 @@ library UpgradeableProxyLib { return address(new ProxyAdmin()); } - function setUpEmptyProxy( - address admin - ) internal returns (address) { + function setUpEmptyProxy(address admin) internal returns (address) { address emptyContract = address(new EmptyContract()); return address(new TransparentUpgradeableProxy(emptyContract, admin, "")); } @@ -36,17 +31,13 @@ library UpgradeableProxyLib { admin.upgradeAndCall(TransparentUpgradeableProxy(payable(proxy)), impl, initData); } - function getImplementation( - address proxy - ) internal view returns (address) { + function getImplementation(address proxy) internal view returns (address) { bytes32 value = vm.load(proxy, IMPLEMENTATION_SLOT); return address(uint160(uint256(value))); } - function getProxyAdmin( - address proxy - ) internal view returns (ProxyAdmin) { + function getProxyAdmin(address proxy) internal view returns (ProxyAdmin) { bytes32 value = vm.load(proxy, ADMIN_SLOT); return ProxyAdmin(address(uint160(uint256(value)))); } -} \ No newline at end of file +} diff --git a/avs/contracts/script/utils/Utils.sol b/avs/contracts/script/utils/Utils.sol index 4cf599e6..4ea2e832 100644 --- a/avs/contracts/script/utils/Utils.sol +++ b/avs/contracts/script/utils/Utils.sol @@ -10,22 +10,14 @@ import "forge-std/StdJson.sol"; contract Utils is Script { // Note that this fct will only work for the ERC20Mock that has a public mint function - function _mintTokens( - address strategyAddress, - address[] memory tos, - uint256[] memory amounts - ) internal { + function _mintTokens(address strategyAddress, address[] memory tos, uint256[] memory amounts) internal { for (uint256 i = 0; i < tos.length; i++) { - ERC20Mock underlyingToken = ERC20Mock( - address(StrategyBase(strategyAddress).underlyingToken()) - ); + ERC20Mock underlyingToken = ERC20Mock(address(StrategyBase(strategyAddress).underlyingToken())); underlyingToken.mint(tos[i], amounts[i]); } } - function convertBoolToString( - bool input - ) public pure returns (string memory) { + function convertBoolToString(bool input) public pure returns (string memory) { if (input) { return "true"; } else { @@ -33,21 +25,16 @@ contract Utils is Script { } } - function convertOperatorStatusToString( - IRegistryCoordinator.OperatorStatus operatorStatus - ) public pure returns (string memory) { - if ( - operatorStatus == - IRegistryCoordinator.OperatorStatus.NEVER_REGISTERED - ) { + function convertOperatorStatusToString(IRegistryCoordinator.OperatorStatus operatorStatus) + public + pure + returns (string memory) + { + if (operatorStatus == IRegistryCoordinator.OperatorStatus.NEVER_REGISTERED) { return "NEVER_REGISTERED"; - } else if ( - operatorStatus == IRegistryCoordinator.OperatorStatus.REGISTERED - ) { + } else if (operatorStatus == IRegistryCoordinator.OperatorStatus.REGISTERED) { return "REGISTERED"; - } else if ( - operatorStatus == IRegistryCoordinator.OperatorStatus.DEREGISTERED - ) { + } else if (operatorStatus == IRegistryCoordinator.OperatorStatus.DEREGISTERED) { return "DEREGISTERED"; } else { return "UNKNOWN"; @@ -55,49 +42,28 @@ contract Utils is Script { } // Forge scripts best practice: https://book.getfoundry.sh/tutorials/best-practices#scripts - function readInput( - string memory inputFileName - ) internal returns (string memory) { - string memory inputDir = string.concat( - vm.projectRoot(), - "/script/input/" - ); + function readInput(string memory inputFileName) internal returns (string memory) { + string memory inputDir = string.concat(vm.projectRoot(), "/script/input/"); string memory chainDir = string.concat(vm.toString(block.chainid), "/"); string memory file = string.concat(inputFileName, ".json"); string memory path = string.concat(inputDir, chainDir, file); - if(!vm.isFile(path)) { - return ''; + if (!vm.isFile(path)) { + return ""; } return vm.readFile(path); } - function readOutput( - string memory outputFileName - ) internal view returns (string memory) { - string memory inputDir = string.concat( - vm.projectRoot(), - "/script/output/" - ); + function readOutput(string memory outputFileName) internal view returns (string memory) { + string memory inputDir = string.concat(vm.projectRoot(), "/script/output/"); string memory chainDir = string.concat(vm.toString(block.chainid), "/"); string memory file = string.concat(outputFileName, ".json"); return vm.readFile(string.concat(inputDir, chainDir, file)); } - function writeOutput( - string memory outputJson, - string memory outputFileName - ) internal { - string memory outputDir = string.concat( - vm.projectRoot(), - "/script/output/" - ); + function writeOutput(string memory outputJson, string memory outputFileName) internal { + string memory outputDir = string.concat(vm.projectRoot(), "/script/output/"); string memory chainDir = string.concat(vm.toString(block.chainid), "/"); - string memory outputFilePath = string.concat( - outputDir, - chainDir, - outputFileName, - ".json" - ); + string memory outputFilePath = string.concat(outputDir, chainDir, outputFileName, ".json"); vm.writeJson(outputJson, outputFilePath); } } diff --git a/avs/contracts/src/ERC20Mock.sol b/avs/contracts/src/ERC20Mock.sol index 81531531..f7b8b29e 100644 --- a/avs/contracts/src/ERC20Mock.sol +++ b/avs/contracts/src/ERC20Mock.sol @@ -5,8 +5,8 @@ import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract ERC20Mock is ERC20 { constructor() ERC20("", "") {} - + function mint(address account, uint256 amount) public { _mint(account, amount); } -} \ No newline at end of file +} diff --git a/avs/contracts/src/IReclaimServiceManager.sol b/avs/contracts/src/IReclaimServiceManager.sol index 59c55547..b053f187 100644 --- a/avs/contracts/src/IReclaimServiceManager.sol +++ b/avs/contracts/src/IReclaimServiceManager.sol @@ -11,7 +11,7 @@ interface IReclaimServiceManager { struct ClaimRequest { /** * Name of the provider. - * @example "http" + * @example "http" */ string provider; /** @@ -39,11 +39,15 @@ interface IReclaimServiceManager { } struct Operator { - /** ETH address */ - address addr; - /** Reclaim RPC Url to connect to */ - string url; - } + /** + * ETH address + */ + address addr; + /** + * Reclaim RPC Url to connect to + */ + string url; + } struct Task { ClaimRequest request; @@ -67,18 +71,19 @@ interface IReclaimServiceManager { uint256 feePaid; } - /** Claim with signatures & signer */ - struct CompletedTask { - Task task; - bytes[] signatures; - } + /** + * Claim with signatures & signer + */ + struct CompletedTask { + Task task; + bytes[] signatures; + } struct OperatorMetadata { - address addr; /** * RPC URL for the operator - */ + */ string url; } @@ -107,21 +112,14 @@ interface IReclaimServiceManager { // update the task creation metadata // 0 values, empty strings are ignored -- essentially // all falsey values are ignored. - function updateTaskCreationMetadata( - TaskCreationMetadata memory metadata - ) external; + function updateTaskCreationMetadata(TaskCreationMetadata memory metadata) external; - function whitelistAddressAsOperator( - address operator, - bool isWhitelisted - ) external; + function whitelistAddressAsOperator(address operator, bool isWhitelisted) external; // NOTE: this function is called by the operator // updating their metadata. // pass empty data to remove operator - function updateOperatorMetadata( - OperatorMetadata memory metadata - ) external; + function updateOperatorMetadata(OperatorMetadata memory metadata) external; /** * Create a new task. @@ -130,16 +128,10 @@ interface IReclaimServiceManager { * by the request.owner address. Required when msg.sender is not * the request.owner */ - function createNewTask( - ClaimRequest memory request, - bytes memory requestSignature - ) external; + function createNewTask(ClaimRequest memory request, bytes memory requestSignature) external; // NOTE: this function is called by the user // once they have aggregated all the responses // to the task. - function taskCompleted( - CompletedTask memory completedTask, - uint32 referenceTaskIndex - ) external; -} \ No newline at end of file + function taskCompleted(CompletedTask memory completedTask, uint32 referenceTaskIndex) external; +} diff --git a/avs/contracts/src/ReclaimServiceManager.sol b/avs/contracts/src/ReclaimServiceManager.sol index 057ebcbc..6c0ca5ed 100644 --- a/avs/contracts/src/ReclaimServiceManager.sol +++ b/avs/contracts/src/ReclaimServiceManager.sol @@ -3,8 +3,7 @@ pragma solidity ^0.8.9; import "@eigenlayer/contracts/libraries/BytesLib.sol"; import "@eigenlayer/contracts/core/DelegationManager.sol"; -import {ECDSAServiceManagerBase} from - "@eigenlayer-middleware/src/unaudited/ECDSAServiceManagerBase.sol"; +import {ECDSAServiceManagerBase} from "@eigenlayer-middleware/src/unaudited/ECDSAServiceManagerBase.sol"; import {ECDSAStakeRegistry} from "@eigenlayer-middleware/src/unaudited/ECDSAStakeRegistry.sol"; import "@openzeppelin-upgrades/contracts/utils/cryptography/ECDSAUpgradeable.sol"; import "@eigenlayer/contracts/permissions/Pausable.sol"; @@ -18,11 +17,8 @@ import "./utils/Claims.sol"; /** * @title Primary entrypoint for procuring services from Reclaim. */ -contract ReclaimServiceManager is - ECDSAServiceManagerBase, - IReclaimServiceManager, - Pausable -{ + +contract ReclaimServiceManager is ECDSAServiceManagerBase, IReclaimServiceManager, Pausable { using BytesLib for bytes; using ECDSAUpgradeable for bytes32; @@ -31,59 +27,36 @@ contract ReclaimServiceManager is /* STORAGE */ // The latest task index uint32 public latestTaskNum; - /** - * Default task creation metadata. - */ - TaskCreationMetadata public taskCreationMetadata; + /** + * Default task creation metadata. + */ + TaskCreationMetadata public taskCreationMetadata; // mapping of task indices to all tasks hashes // when a task is created, task hash is stored here, // and responses need to pass the actual task, // which is hashed onchain and checked against this mapping - // Note: I'm guessing task hashes are stored to reduce gas costs + // Note: I'm guessing task hashes are stored to reduce gas costs mapping(uint32 => bytes32) public allTaskHashes; /** * Operators whitelisted to respond to tasks. */ address[] public whitelistedOperators; - /** - * Admins of the contract. - */ - address[] public admins; - OperatorMetadata[] public registeredOperators; + OperatorMetadata[] public registeredOperators; /* MODIFIERS */ modifier onlyOperator() { - require( - ECDSAStakeRegistry(stakeRegistry).operatorRegistered(msg.sender) - == - true, - "Operator must be the caller" - ); + require(ECDSAStakeRegistry(stakeRegistry).operatorRegistered(msg.sender) == true, "Operator must be the caller"); _; } - constructor( - address _avsDirectory, - address _stakeRegistry, - address _rewardsCoordinator, - address _delegationManager - ) - ECDSAServiceManagerBase( - _avsDirectory, - _stakeRegistry, - _rewardsCoordinator, - _delegationManager - ) + constructor(address _avsDirectory, address _stakeRegistry, address _rewardsCoordinator, address _delegationManager) + ECDSAServiceManagerBase(_avsDirectory, _stakeRegistry, _rewardsCoordinator, _delegationManager) {} - function initialize( - address initialOwner, - address deployer, - address strategy - ) external initializer { + function initialize(address initialOwner, address strategy) external initializer { __ServiceManagerBase_init(initialOwner, address(this)); taskCreationMetadata = TaskCreationMetadata( // 30m @@ -95,52 +68,41 @@ contract ReclaimServiceManager is // spend a little bit 2 ); - admins.push(deployer); defaultStrategy = strategy; } /* FUNCTIONS */ - function updateAVSMetadataURI( - string memory _metadataURI - ) external override virtual onlyAdmin { + function updateAVSMetadataURI(string memory _metadataURI) external virtual override onlyOwner { _updateAVSMetadataURI(_metadataURI); } - function updateTaskCreationMetadata( - TaskCreationMetadata memory newMetadata - ) external onlyAdmin { - if(newMetadata.maxTaskLifetimeS != 0) { - taskCreationMetadata.maxTaskLifetimeS = newMetadata - .maxTaskLifetimeS; + function updateTaskCreationMetadata(TaskCreationMetadata memory newMetadata) external onlyOwner { + if (newMetadata.maxTaskLifetimeS != 0) { + taskCreationMetadata.maxTaskLifetimeS = newMetadata.maxTaskLifetimeS; } - if(newMetadata.minSignaturesPerTask != 0) { - taskCreationMetadata.minSignaturesPerTask = newMetadata - .minSignaturesPerTask; + if (newMetadata.minSignaturesPerTask != 0) { + taskCreationMetadata.minSignaturesPerTask = newMetadata.minSignaturesPerTask; } - if(newMetadata.maxTaskCreationDelayS != 0) { - taskCreationMetadata.maxTaskCreationDelayS = newMetadata - .maxTaskCreationDelayS; + if (newMetadata.maxTaskCreationDelayS != 0) { + taskCreationMetadata.maxTaskCreationDelayS = newMetadata.maxTaskCreationDelayS; } - if(newMetadata.minFee != 0) { + if (newMetadata.minFee != 0) { taskCreationMetadata.minFee = newMetadata.minFee; } } - function whitelistAddressAsOperator( - address operator, - bool isWhitelisted - ) external onlyAdmin { - if(isWhitelisted) { + function whitelistAddressAsOperator(address operator, bool isWhitelisted) external onlyOwner { + if (isWhitelisted) { whitelistedOperators.push(operator); return; } - for(uint i = 0; i < whitelistedOperators.length; i++) { - if(whitelistedOperators[i] == operator) { + for (uint256 i = 0; i < whitelistedOperators.length; i++) { + if (whitelistedOperators[i] == operator) { delete whitelistedOperators[i]; return; } @@ -157,18 +119,13 @@ contract ReclaimServiceManager is _registerOperatorToAVS(operator, operatorSignature); } - function updateOperatorMetadata( - OperatorMetadata memory metadata - ) external onlyOperator { - require( - metadata.addr == msg.sender, - 'Metadata address must match the caller' - ); + function updateOperatorMetadata(OperatorMetadata memory metadata) external onlyOperator { + require(metadata.addr == msg.sender, "Metadata address must match the caller"); bool isEmpty = bytes(metadata.url).length == 0; - if(isEmpty) { - for(uint i = 0; i < registeredOperators.length; i++) { - if(registeredOperators[i].addr == metadata.addr) { + if (isEmpty) { + for (uint256 i = 0; i < registeredOperators.length; i++) { + if (registeredOperators[i].addr == metadata.addr) { delete registeredOperators[i]; return; } @@ -178,7 +135,7 @@ contract ReclaimServiceManager is } // update operator metadata - for (uint i = 0; i < registeredOperators.length; i++) { + for (uint256 i = 0; i < registeredOperators.length; i++) { if (registeredOperators[i].addr == metadata.addr) { registeredOperators[i] = metadata; return; @@ -188,10 +145,8 @@ contract ReclaimServiceManager is registeredOperators.push(metadata); } - function getMetadataForOperator( - address operator - ) external view returns (OperatorMetadata memory) { - for (uint i = 0; i < registeredOperators.length; i++) { + function getMetadataForOperator(address operator) external view returns (OperatorMetadata memory) { + for (uint256 i = 0; i < registeredOperators.length; i++) { if (registeredOperators[i].addr == operator) { return registeredOperators[i]; } @@ -201,13 +156,10 @@ contract ReclaimServiceManager is } // NOTE: this function creates new task, assigns it a taskId - function createNewTask( - ClaimRequest memory request, - bytes memory requestSignature - ) external { + function createNewTask(ClaimRequest memory request, bytes memory requestSignature) external { require(taskCreationMetadata.minFee <= request.fee, "Fee too low"); - if(request.owner != msg.sender) { + if (request.owner != msg.sender) { bytes memory encodedReq = abi.encode(request); address signer = Claims.verifySignature(encodedReq, requestSignature); require(signer == request.owner, "Signer of requestSignature is not request.owner"); @@ -222,57 +174,40 @@ contract ReclaimServiceManager is // create a new task struct Task memory newTask; newTask.request = request; - newTask.createdAt = uint32(block.timestamp); - newTask.expiresAt = uint32( - newTask.createdAt + taskCreationMetadata.maxTaskLifetimeS - ); - newTask.minimumSignatures = taskCreationMetadata.minSignaturesPerTask; + newTask.createdAt = uint32(block.timestamp); + newTask.expiresAt = uint32(newTask.createdAt + taskCreationMetadata.maxTaskLifetimeS); + newTask.minimumSignatures = taskCreationMetadata.minSignaturesPerTask; newTask.feePaid = request.fee; - // hash before picking operators -- we'll use this - // as the seed for randomness - bytes32 preOpHash = keccak256(abi.encode(newTask)); - newTask.operators = _pickRandomOperators( - taskCreationMetadata.minSignaturesPerTask, - uint256(preOpHash) - ); + // hash before picking operators -- we'll use this + // as the seed for randomness + bytes32 preOpHash = keccak256(abi.encode(newTask)); + newTask.operators = _pickRandomOperators(taskCreationMetadata.minSignaturesPerTask, uint256(preOpHash)); // store hash of task onchain, emit event, and increase taskNum allTaskHashes[latestTaskNum] = keccak256(abi.encode(newTask)); emit NewTaskCreated(latestTaskNum, newTask); latestTaskNum = latestTaskNum + 1; } - function taskCompleted( - CompletedTask memory completedTask, - uint32 referenceTaskIndex - ) external { - // check that the task is valid, hasn't been responsed yet, - // and is being responded in time + function taskCompleted(CompletedTask memory completedTask, uint32 referenceTaskIndex) external { + // check that the task is valid, hasn't been responsed yet, + // and is being responded in time require( - keccak256(abi.encode(completedTask.task)) == - allTaskHashes[referenceTaskIndex], + keccak256(abi.encode(completedTask.task)) == allTaskHashes[referenceTaskIndex], "supplied task does not match the one recorded in the contract" ); - require( - completedTask.task.expiresAt > uint32(block.timestamp), - "Task has expired" - ); + require(completedTask.task.expiresAt > uint32(block.timestamp), "Task has expired"); - Claims.SignedClaim memory signedClaim = Claims.SignedClaim( + Claims.SignedClaim memory signedClaim = Claims.SignedClaim( Claims.CompleteClaimData( - completedTask.task.request.claimHash, - completedTask.task.request.owner, - completedTask.task.createdAt, - 1 + completedTask.task.request.claimHash, completedTask.task.request.owner, completedTask.task.createdAt, 1 ), completedTask.signatures ); - address[] memory operatorAddrs = new address[]( - completedTask.task.operators.length - ); - for (uint i = 0; i < operatorAddrs.length; i++) { + address[] memory operatorAddrs = new address[](completedTask.task.operators.length); + for (uint256 i = 0; i < operatorAddrs.length; i++) { operatorAddrs[i] = completedTask.task.operators[i].addr; } @@ -283,9 +218,9 @@ contract ReclaimServiceManager is // distribute reward _distributeReward(operatorAddrs, completedTask.task.feePaid); - + emit TaskCompleted(referenceTaskIndex, completedTask); - } + } // HELPER @@ -301,12 +236,13 @@ contract ReclaimServiceManager is IRewardsCoordinator.OperatorReward[] memory ops = new IRewardsCoordinator.OperatorReward[](operatorAddrs.length); uint256 perOpReward = reward / operatorAddrs.length; - for(uint i = 0; i < operatorAddrs.length; i++) { + for (uint256 i = 0; i < operatorAddrs.length; i++) { ops[i].operator = operatorAddrs[i]; ops[i].amount = perOpReward; } - IRewardsCoordinator.OperatorDirectedRewardsSubmission[] memory subs = new IRewardsCoordinator.OperatorDirectedRewardsSubmission[](1); + IRewardsCoordinator.OperatorDirectedRewardsSubmission[] memory subs = + new IRewardsCoordinator.OperatorDirectedRewardsSubmission[](1); subs[0].strategiesAndMultipliers = strats; subs[0].token = getToken(); subs[0].operatorRewards = ops; @@ -314,7 +250,7 @@ contract ReclaimServiceManager is // taken from hello-world example uint32 calcIntervalS = coordinator.CALCULATION_INTERVAL_SECONDS(); uint32 endStamp = coordinator.currRewardsCalculationEndTimestamp(); - if(endStamp == 0) { + if (endStamp == 0) { subs[0].startTimestamp = uint32(block.timestamp) - (uint32(block.timestamp) % calcIntervalS); } else { subs[0].startTimestamp = endStamp - coordinator.MAX_REWARDS_DURATION() + calcIntervalS; @@ -327,7 +263,7 @@ contract ReclaimServiceManager is // call directly on rewardscoordinator, as this contract has already // received the fees token.approve(rewardsCoordinator, reward); - coordinator.createOperatorDirectedAVSRewardsSubmission(address(this), subs); + coordinator.createOperatorDirectedAVSRewardsSubmission(address(this), subs); } function encodeClaimRequest(ClaimRequest memory request) public pure returns (bytes memory) { @@ -338,15 +274,10 @@ contract ReclaimServiceManager is return IStrategy(defaultStrategy).underlyingToken(); } - // for a whitelist to count -- operator must either be whitelisted - // or be an admin + // for a whitelist to count -- operator must be whitelisted function isOperatorWhitelisted(address operator) public view returns (bool) { - if(isAdmin(operator)) { - return true; - } - - for(uint i = 0; i < whitelistedOperators.length; i++) { - if(whitelistedOperators[i] == operator) { + for (uint256 i = 0; i < whitelistedOperators.length; i++) { + if (whitelistedOperators[i] == operator) { return true; } } @@ -355,62 +286,52 @@ contract ReclaimServiceManager is } function operatorHasMinimumWeight(address operator) public view returns (bool) { - uint opWeight = ECDSAStakeRegistry(stakeRegistry) - .getOperatorWeight(operator); - uint minWeight = ECDSAStakeRegistry(stakeRegistry).minimumWeight(); + uint256 opWeight = ECDSAStakeRegistry(stakeRegistry).getOperatorWeight(operator); + uint256 minWeight = ECDSAStakeRegistry(stakeRegistry).minimumWeight(); return opWeight >= minWeight; } - /** - * @dev Pick a random set of operators from the available list - * @param count number of operators to pick - * @param seed Seed to use for randomness - * @return Array of the selected operators - */ - function _pickRandomOperators( - uint8 count, - uint256 seed - ) internal view returns (Operator[] memory) { - require( - count <= registeredOperators.length, - "Internal: Not enough operators" - ); - OperatorMetadata[] memory temp = registeredOperators; - uint256 left = temp.length; - - Operator[] memory output = new Operator[](count); - for (uint8 i = 0; i < output.length;) { - require( - left > 0, - "Internal: Fees too low. No operators left to pick from." - ); - uint256 idx = Random.random(seed + i) % left; - OperatorMetadata memory item = temp[idx]; - // we've utilised operator at index "idx" - // we of course don't want to pick the same operator twice - // so we remove it from the list of operators - // and reduce the number of operators left to pick from - // since solidity doesn't support "pop()" in memory arrays - // we swap the last element with the element we want to remove - temp[idx] = temp[left - 1]; - left -= 1; - - if(!operatorHasMinimumWeight(item.addr)) { - continue; - } - - output[i].addr = item.addr; - output[i].url = item.url; - i++; - } - - return output; - } + /** + * @dev Pick a random set of operators from the available list + * @param count number of operators to pick + * @param seed Seed to use for randomness + * @return Array of the selected operators + */ + function _pickRandomOperators(uint8 count, uint256 seed) internal view returns (Operator[] memory) { + require(count <= registeredOperators.length, "Internal: Not enough operators"); + OperatorMetadata[] memory temp = registeredOperators; + uint256 left = temp.length; + + Operator[] memory output = new Operator[](count); + for (uint8 i = 0; i < output.length;) { + require(left > 0, "Internal: Fees too low. No operators left to pick from."); + uint256 idx = Random.random(seed + i) % left; + OperatorMetadata memory item = temp[idx]; + // we've utilised operator at index "idx" + // we of course don't want to pick the same operator twice + // so we remove it from the list of operators + // and reduce the number of operators left to pick from + // since solidity doesn't support "pop()" in memory arrays + // we swap the last element with the element we want to remove + temp[idx] = temp[left - 1]; + left -= 1; + + if (!operatorHasMinimumWeight(item.addr)) { + continue; + } + + output[i].addr = item.addr; + output[i].url = item.url; + i++; + } + + return output; + } function _sortAddresses(address[] memory addresses) internal pure { - for(uint i = 0; i < addresses.length; i++) { - for(uint j = i + 1; j < addresses.length; j++) { - if(addresses[i] > addresses[j]) { + for (uint256 i = 0; i < addresses.length; i++) { + for (uint256 j = i + 1; j < addresses.length; j++) { + if (addresses[i] > addresses[j]) { address temp = addresses[i]; addresses[i] = addresses[j]; addresses[j] = temp; @@ -422,23 +343,4 @@ contract ReclaimServiceManager is function _absDiff(uint32 a, uint32 b) internal pure returns (uint32) { return a > b ? a - b : b - a; } - - function isAdmin(address _admin) public view returns (bool) { - if(msg.sender == owner()) { - return true; - } - - for(uint i = 0; i < admins.length; i++) { - if(admins[i] == _admin) { - return true; - } - } - - return false; - } - - modifier onlyAdmin { - require(isAdmin(msg.sender), "Caller is not admin"); - _; - } -} \ No newline at end of file +} diff --git a/avs/contracts/src/utils/BytesUtils.sol b/avs/contracts/src/utils/BytesUtils.sol index 00bd8a99..b757122e 100644 --- a/avs/contracts/src/utils/BytesUtils.sol +++ b/avs/contracts/src/utils/BytesUtils.sol @@ -5,16 +5,15 @@ pragma solidity ^0.8.9; * Utilities for bytes manipulation & conversion */ library BytesUtils { + function bytesToUInt(bytes memory data, uint256 offset) internal pure returns (uint256) { + require(offset + 4 <= data.length, "Offset + 4 must be within data bounds"); - function bytesToUInt(bytes memory data, uint offset) internal pure returns (uint) { - require(offset + 4 <= data.length, "Offset + 4 must be within data bounds"); - uint32 result; assembly { // Load the 32 bits (4 bytes) from the data at the given offset into the result variable result := mload(add(add(data, 0x4), offset)) } - + return result; - } -} \ No newline at end of file + } +} diff --git a/avs/contracts/src/utils/Claims.sol b/avs/contracts/src/utils/Claims.sol index da46bfb0..5a1cf4a7 100644 --- a/avs/contracts/src/utils/Claims.sol +++ b/avs/contracts/src/utils/Claims.sol @@ -9,103 +9,91 @@ import "./StringUtils.sol"; * serialising & verifying credentials */ library Claims { - /** Data required to describe a claim */ - struct CompleteClaimData { - bytes32 identifier; - address owner; - uint32 timestampS; - uint256 epoch; - } + /** + * Data required to describe a claim + */ + struct CompleteClaimData { + bytes32 identifier; + address owner; + uint32 timestampS; + uint256 epoch; + } - struct ClaimInfo { - string provider; - string parameters; - string context; - } + struct ClaimInfo { + string provider; + string parameters; + string context; + } - /** Claim with signatures & signer */ - struct SignedClaim { - CompleteClaimData claim; - bytes[] signatures; - } + /** + * Claim with signatures & signer + */ + struct SignedClaim { + CompleteClaimData claim; + bytes[] signatures; + } - /** - * Asserts that the claim is signed by the expected attestors - */ - function assertValidSignedClaim( - SignedClaim memory self, - address[] memory expectedSignerAddresses - ) internal pure { - require(self.signatures.length > 0, "No signatures"); - address[] memory claimSigners = recoverSignersOfSignedClaim(self); - for(uint256 i = 0; i < expectedSignerAddresses.length; i++) { - bool found = false; - for(uint256 j = 0; j < claimSigners.length; j++) { - if(claimSigners[j] == expectedSignerAddresses[i]) { - found = true; - break; - } - } - require(found, "Missing attestor signature"); - } - } + /** + * Asserts that the claim is signed by the expected attestors + */ + function assertValidSignedClaim(SignedClaim memory self, address[] memory expectedSignerAddresses) internal pure { + require(self.signatures.length > 0, "No signatures"); + address[] memory claimSigners = recoverSignersOfSignedClaim(self); + for (uint256 i = 0; i < expectedSignerAddresses.length; i++) { + bool found = false; + for (uint256 j = 0; j < claimSigners.length; j++) { + if (claimSigners[j] == expectedSignerAddresses[i]) { + found = true; + break; + } + } + require(found, "Missing attestor signature"); + } + } - /** - * @dev recovers the signer of the claim - */ - function recoverSignersOfSignedClaim(SignedClaim memory self) internal pure returns (address[] memory) { - bytes memory serialised = serialise(self.claim); - address[] memory signers = new address[](self.signatures.length); - for (uint256 i = 0; i < self.signatures.length; i++) { - signers[i] = verifySignature(serialised, self.signatures[i]); - } + /** + * @dev recovers the signer of the claim + */ + function recoverSignersOfSignedClaim(SignedClaim memory self) internal pure returns (address[] memory) { + bytes memory serialised = serialise(self.claim); + address[] memory signers = new address[](self.signatures.length); + for (uint256 i = 0; i < self.signatures.length; i++) { + signers[i] = verifySignature(serialised, self.signatures[i]); + } - return signers; - } + return signers; + } - /** - * @dev serialises the credential into a string; - * the string is used to verify the signature - * - * the serialisation is the same as done by the TS library - */ - function serialise(CompleteClaimData memory self) internal pure returns (bytes memory) { - return abi.encodePacked( - StringUtils.bytes2str(abi.encodePacked(self.identifier)), - "\n", - StringUtils.address2str(self.owner), - "\n", - StringUtils.uint2str(self.timestampS), - "\n", - StringUtils.uint2str(self.epoch) - ); - } + /** + * @dev serialises the credential into a string; + * the string is used to verify the signature + * + * the serialisation is the same as done by the TS library + */ + function serialise(CompleteClaimData memory self) internal pure returns (bytes memory) { + return abi.encodePacked( + StringUtils.bytes2str(abi.encodePacked(self.identifier)), + "\n", + StringUtils.address2str(self.owner), + "\n", + StringUtils.uint2str(self.timestampS), + "\n", + StringUtils.uint2str(self.epoch) + ); + } - /** - * @dev returns the address of the user that generated the signature - */ - function verifySignature( - bytes memory content, - bytes memory signature - ) internal pure returns (address signer) { - bytes32 signedHash = keccak256( - abi.encodePacked( - "\x19Ethereum Signed Message:\n", - StringUtils.uint2str(content.length), - content - ) - ); - return ECDSA.recover(signedHash, signature); - } + /** + * @dev returns the address of the user that generated the signature + */ + function verifySignature(bytes memory content, bytes memory signature) internal pure returns (address signer) { + bytes32 signedHash = + keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", StringUtils.uint2str(content.length), content)); + return ECDSA.recover(signedHash, signature); + } - function hashClaimInfo(ClaimInfo memory claimInfo) internal pure returns (bytes32) { - bytes memory serialised = abi.encodePacked( - claimInfo.provider, - "\n", - claimInfo.parameters, - "\n", - claimInfo.context - ); - return keccak256(serialised); - } + function hashClaimInfo(ClaimInfo memory claimInfo) internal pure returns (bytes32) { + bytes memory serialised = + abi.encodePacked(claimInfo.provider, "\n", claimInfo.parameters, "\n", claimInfo.context); + return keccak256(serialised); + } } diff --git a/avs/contracts/src/utils/Random.sol b/avs/contracts/src/utils/Random.sol index 1fba7697..a78ab977 100644 --- a/avs/contracts/src/utils/Random.sol +++ b/avs/contracts/src/utils/Random.sol @@ -4,11 +4,11 @@ pragma solidity ^0.8.17; // implementation from: https://stackoverflow.com/a/67332959 // Utils for random number generation library Random { - /** - * @dev generates a random number from the given seed - * This will always return the same number for the same seed & block - */ - function random(uint256 seed) internal view returns (uint) { - return uint(keccak256(abi.encodePacked(block.prevrandao, block.timestamp, seed))); - } + /** + * @dev generates a random number from the given seed + * This will always return the same number for the same seed & block + */ + function random(uint256 seed) internal view returns (uint256) { + return uint256(keccak256(abi.encodePacked(block.prevrandao, block.timestamp, seed))); + } } diff --git a/avs/contracts/src/utils/StringUtils.sol b/avs/contracts/src/utils/StringUtils.sol index d80f52b0..201fda26 100644 --- a/avs/contracts/src/utils/StringUtils.sol +++ b/avs/contracts/src/utils/StringUtils.sol @@ -5,70 +5,67 @@ pragma solidity ^0.8.9; * Utilities for string manipulation & conversion */ library StringUtils { - function address2str(address x) internal pure returns (string memory) { - bytes memory s = new bytes(40); - for (uint i = 0; i < 20; i++) { - bytes1 b = bytes1(uint8(uint(uint160(x)) / (2 ** (8 * (19 - i))))); - bytes1 hi = bytes1(uint8(b) / 16); - bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi)); - s[2 * i] = getChar(hi); - s[2 * i + 1] = getChar(lo); - } - return string(abi.encodePacked("0x", s)); - } + function address2str(address x) internal pure returns (string memory) { + bytes memory s = new bytes(40); + for (uint256 i = 0; i < 20; i++) { + bytes1 b = bytes1(uint8(uint256(uint160(x)) / (2 ** (8 * (19 - i))))); + bytes1 hi = bytes1(uint8(b) / 16); + bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi)); + s[2 * i] = getChar(hi); + s[2 * i + 1] = getChar(lo); + } + return string(abi.encodePacked("0x", s)); + } - function bytes2str(bytes memory buffer) internal pure returns (string memory) { - // Fixed buffer size for hexadecimal convertion - bytes memory converted = new bytes(buffer.length * 2); - bytes memory _base = "0123456789abcdef"; + function bytes2str(bytes memory buffer) internal pure returns (string memory) { + // Fixed buffer size for hexadecimal convertion + bytes memory converted = new bytes(buffer.length * 2); + bytes memory _base = "0123456789abcdef"; - for (uint256 i = 0; i < buffer.length; i++) { - converted[i * 2] = _base[uint8(buffer[i]) / _base.length]; - converted[i * 2 + 1] = _base[uint8(buffer[i]) % _base.length]; - } + for (uint256 i = 0; i < buffer.length; i++) { + converted[i * 2] = _base[uint8(buffer[i]) / _base.length]; + converted[i * 2 + 1] = _base[uint8(buffer[i]) % _base.length]; + } - return string(abi.encodePacked("0x", converted)); - } + return string(abi.encodePacked("0x", converted)); + } - function getChar(bytes1 b) internal pure returns (bytes1 c) { - if (uint8(b) < 10) return bytes1(uint8(b) + 0x30); - else return bytes1(uint8(b) + 0x57); - } + function getChar(bytes1 b) internal pure returns (bytes1 c) { + if (uint8(b) < 10) return bytes1(uint8(b) + 0x30); + else return bytes1(uint8(b) + 0x57); + } - function bool2str(bool _b) internal pure returns (string memory _uintAsString) { - if (_b) { - return "true"; - } else { - return "false"; - } - } + function bool2str(bool _b) internal pure returns (string memory _uintAsString) { + if (_b) { + return "true"; + } else { + return "false"; + } + } - function uint2str(uint _i) internal pure returns (string memory _uintAsString) { - if (_i == 0) { - return "0"; - } - uint j = _i; - uint len; - while (j != 0) { - len++; - j /= 10; - } - bytes memory bstr = new bytes(len); - uint k = len; - while (_i != 0) { - k = k - 1; - uint8 temp = (48 + uint8(_i - (_i / 10) * 10)); - bytes1 b1 = bytes1(temp); - bstr[k] = b1; - _i /= 10; - } - return string(bstr); - } + function uint2str(uint256 _i) internal pure returns (string memory _uintAsString) { + if (_i == 0) { + return "0"; + } + uint256 j = _i; + uint256 len; + while (j != 0) { + len++; + j /= 10; + } + bytes memory bstr = new bytes(len); + uint256 k = len; + while (_i != 0) { + k = k - 1; + uint8 temp = (48 + uint8(_i - (_i / 10) * 10)); + bytes1 b1 = bytes1(temp); + bstr[k] = b1; + _i /= 10; + } + return string(bstr); + } - function areEqual( - string calldata _a, - string storage _b - ) internal pure returns (bool) { - return keccak256(abi.encodePacked((_a))) == keccak256(abi.encodePacked((_b))); - } + function areEqual(string calldata _a, string storage _b) internal pure returns (bool) { + return keccak256(abi.encodePacked((_a))) == keccak256(abi.encodePacked((_b))); + } } diff --git a/src/avs/contracts/ReclaimServiceManager.ts b/src/avs/contracts/ReclaimServiceManager.ts index 15dbac7f..e3cc95b8 100644 --- a/src/avs/contracts/ReclaimServiceManager.ts +++ b/src/avs/contracts/ReclaimServiceManager.ts @@ -203,7 +203,6 @@ export declare namespace ISignatureUtils { export interface ReclaimServiceManagerInterface extends utils.Interface { functions: { - "admins(uint256)": FunctionFragment; "allTaskHashes(uint32)": FunctionFragment; "avsDirectory()": FunctionFragment; "createAVSRewardsSubmission(((address,uint96)[],address,uint256,uint32,uint32)[])": FunctionFragment; @@ -216,8 +215,7 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { "getOperatorRestakedStrategies(address)": FunctionFragment; "getRestakeableStrategies()": FunctionFragment; "getToken()": FunctionFragment; - "initialize(address,address,address,address)": FunctionFragment; - "isAdmin(address)": FunctionFragment; + "initialize(address,address)": FunctionFragment; "isOperatorWhitelisted(address)": FunctionFragment; "latestTaskNum()": FunctionFragment; "operatorHasMinimumWeight(address)": FunctionFragment; @@ -248,7 +246,6 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { getFunction( nameOrSignatureOrTopic: - | "admins" | "allTaskHashes" | "avsDirectory" | "createAVSRewardsSubmission" @@ -262,7 +259,6 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { | "getRestakeableStrategies" | "getToken" | "initialize" - | "isAdmin" | "isOperatorWhitelisted" | "latestTaskNum" | "operatorHasMinimumWeight" @@ -291,10 +287,6 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { | "whitelistedOperators" ): FunctionFragment; - encodeFunctionData( - functionFragment: "admins", - values: [BigNumberish] - ): string; encodeFunctionData( functionFragment: "allTaskHashes", values: [BigNumberish] @@ -342,9 +334,8 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { encodeFunctionData(functionFragment: "getToken", values?: undefined): string; encodeFunctionData( functionFragment: "initialize", - values: [string, string, string, string] + values: [string, string] ): string; - encodeFunctionData(functionFragment: "isAdmin", values: [string]): string; encodeFunctionData( functionFragment: "isOperatorWhitelisted", values: [string] @@ -438,7 +429,6 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { values: [BigNumberish] ): string; - decodeFunctionResult(functionFragment: "admins", data: BytesLike): Result; decodeFunctionResult( functionFragment: "allTaskHashes", data: BytesLike @@ -485,7 +475,6 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { ): Result; decodeFunctionResult(functionFragment: "getToken", data: BytesLike): Result; decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; - decodeFunctionResult(functionFragment: "isAdmin", data: BytesLike): Result; decodeFunctionResult( functionFragment: "isOperatorWhitelisted", data: BytesLike @@ -708,8 +697,6 @@ export interface ReclaimServiceManager extends BaseContract { removeListener: OnEvent; functions: { - admins(arg0: BigNumberish, overrides?: CallOverrides): Promise<[string]>; - allTaskHashes( arg0: BigNumberish, overrides?: CallOverrides @@ -761,14 +748,10 @@ export interface ReclaimServiceManager extends BaseContract { initialize( initialOwner: string, - _rewardsInitiator: string, - deployer: string, strategy: string, overrides?: Overrides & { from?: string } ): Promise; - isAdmin(_admin: string, overrides?: CallOverrides): Promise<[boolean]>; - isOperatorWhitelisted( operator: string, overrides?: CallOverrides @@ -889,8 +872,6 @@ export interface ReclaimServiceManager extends BaseContract { ): Promise<[string]>; }; - admins(arg0: BigNumberish, overrides?: CallOverrides): Promise; - allTaskHashes(arg0: BigNumberish, overrides?: CallOverrides): Promise; avsDirectory(overrides?: CallOverrides): Promise; @@ -939,14 +920,10 @@ export interface ReclaimServiceManager extends BaseContract { initialize( initialOwner: string, - _rewardsInitiator: string, - deployer: string, strategy: string, overrides?: Overrides & { from?: string } ): Promise; - isAdmin(_admin: string, overrides?: CallOverrides): Promise; - isOperatorWhitelisted( operator: string, overrides?: CallOverrides @@ -1067,8 +1044,6 @@ export interface ReclaimServiceManager extends BaseContract { ): Promise; callStatic: { - admins(arg0: BigNumberish, overrides?: CallOverrides): Promise; - allTaskHashes( arg0: BigNumberish, overrides?: CallOverrides @@ -1120,14 +1095,10 @@ export interface ReclaimServiceManager extends BaseContract { initialize( initialOwner: string, - _rewardsInitiator: string, - deployer: string, strategy: string, overrides?: CallOverrides ): Promise; - isAdmin(_admin: string, overrides?: CallOverrides): Promise; - isOperatorWhitelisted( operator: string, overrides?: CallOverrides @@ -1307,8 +1278,6 @@ export interface ReclaimServiceManager extends BaseContract { }; estimateGas: { - admins(arg0: BigNumberish, overrides?: CallOverrides): Promise; - allTaskHashes( arg0: BigNumberish, overrides?: CallOverrides @@ -1360,14 +1329,10 @@ export interface ReclaimServiceManager extends BaseContract { initialize( initialOwner: string, - _rewardsInitiator: string, - deployer: string, strategy: string, overrides?: Overrides & { from?: string } ): Promise; - isAdmin(_admin: string, overrides?: CallOverrides): Promise; - isOperatorWhitelisted( operator: string, overrides?: CallOverrides @@ -1478,11 +1443,6 @@ export interface ReclaimServiceManager extends BaseContract { }; populateTransaction: { - admins( - arg0: BigNumberish, - overrides?: CallOverrides - ): Promise; - allTaskHashes( arg0: BigNumberish, overrides?: CallOverrides @@ -1536,17 +1496,10 @@ export interface ReclaimServiceManager extends BaseContract { initialize( initialOwner: string, - _rewardsInitiator: string, - deployer: string, strategy: string, overrides?: Overrides & { from?: string } ): Promise; - isAdmin( - _admin: string, - overrides?: CallOverrides - ): Promise; - isOperatorWhitelisted( operator: string, overrides?: CallOverrides diff --git a/src/avs/contracts/factories/AVSDirectory__factory.ts b/src/avs/contracts/factories/AVSDirectory__factory.ts index 25b0067c..1b660217 100644 --- a/src/avs/contracts/factories/AVSDirectory__factory.ts +++ b/src/avs/contracts/factories/AVSDirectory__factory.ts @@ -508,7 +508,7 @@ const _abi = [ ] as const; const _bytecode = - "0x60c0806040523461019957604051601f611fa438819003918201601f19168301916001600160401b038311848410176101835780849260209460405283398101031261013357516001600160a01b038116810361012e5760805260005460ff8160081c166100d95760ff8082161061009e575b4660a052604051611dbd90816101e7823960805181818161044601526108dd015260a051816118b50152f35b60ff90811916176000557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a180610072565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b600080fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b600052604160045260246000fd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fdfe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b60003560e01c806310d67a2f1461145b578063136439dd146113375780631794bb3c1461111d57806320606b70146110e2578063374823b51461109557806349075da314611033578063595c6a6714610f845780635ac86ab714610f515780635c975abb14610f33578063715018a614610ed6578063886f119514610ead5780638da5cb5b14610e845780639926ee7d14610781578063a1060c881461074d578063a364f4da14610611578063a98fb355146104b0578063d79aceab14610475578063df5cf72314610430578063ec76f44214610371578063f2fde38b146102e2578063f698da25146102bf5763fabc1cbc0361000e57346102ba5760203660031901126102b557606554600435906001600160a01b0316803b156102b05760206004916040519283809263755b36bd60e11b82525afa80156102a4576101cb91600091610275575b506001600160a01b031633146116f4565b60665419811981160361020a57806066556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a2005b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b610297915060203d60201161029d575b61028f8183611607565b8101906116d5565b386101ba565b503d610285565b6040513d6000823e3d90fd5b611682565b61153b565b6114eb565b346102ba5760003660031901126102b55760206102da6118b2565b604051908152f35b346102ba5760203660031901126102b5576102fb6115db565b610303611a7d565b6001600160a01b0381161561031d5761031b90611a34565b005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346102ba5760203660031901126102b55760043533600052609960205260406000208160005260205260ff604060002054166103d1573360005260996020526040600020906000526020526040600020600160ff19825416179055600080f35b60405162461bcd60e51b815260206004820152603160248201527f4156534469726563746f72792e63616e63656c53616c743a2063616e6e6f742060448201527018d85b98d95b081cdc195b9d081cd85b1d607a1b6064820152608490fd5b346102ba5760003660031901126102b5576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346102ba5760003660031901126102b55760206040517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd8152f35b346102ba5760203660031901126102b55760043567ffffffffffffffff811161060c57366023820112156106075780600401359067ffffffffffffffff82116105ae573660248383010111610555577fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437139082602460405192602084528260208501520160408301376000604084830101526040813394601f80199101168101030190a2005b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b611629565b61158b565b346102ba5760203660031901126102b55761062a6115db565b61063b6001806066541614156117c8565b336000526098602052604060002060018060a01b03821660005260205260ff604060002054166002811015610737576001036106cc573360008181526098602090815260408083206001600160a01b0395909516808452948252808320805460ff19169055519182529192917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191a3005b60405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f742072656769737465726564006064820152608490fd5b634e487b7160e01b600052602160045260246000fd5b346102ba5760803660031901126102b55760206102da61076b6115db565b6107736115f1565b906064359160443591611814565b346102ba5760403660031901126102b55761079a6115db565b6024359067ffffffffffffffff821161060c5760606003198336030112610e33576040516060810181811067ffffffffffffffff821117610dcc57604052826004013567ffffffffffffffff8111610de25783013660238201121561060757600481013567ffffffffffffffff8111610dcc5760405191610825601f8301601f191660200184611607565b8183523660248284010111610d7757816000926024602093018386013783010152815260208101916024840135835260446040830194013584526108706001806066541614156117c8565b83514211610d1e57336000526098602052604060002060018060a01b03821660005260205260ff60406000205416600281101561073757600114610cc55760018060a01b038116938460005260996020526040600020845160005260205260ff60406000205416610c73577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156102b0576020602491604051928380926336b87bd760e11b82528a60048301525afa9081156102a457600091610c44575b5015610bd557610950859185519051903385611814565b9251913b15610b36573b156102b05760405191630b135d3f60e11b83526004830152604060248301528181519182604483015260005b838110610b1e5750506064818360008360209684010152601f80199101168101030181865afa9081156102a457600091610ad6575b506001600160e01b0319166374eca2c160e11b01610a4f575b3360005260986020526040600020826000526020526040600020600160ff19825416179055816000526099602052604060002090516000526020526040600020600160ff1982541617905560405190600182527ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4160203393a3005b60405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a490fd5b90506020813d602011610b16575b81610af160209383611607565b810103126102b557516001600160e01b031981168103610b1157836109bb565b600080fd5b3d9150610ae4565b60208282018101516064878401015285935001610986565b91610b4c91610b4491611ad5565b919091611b5b565b6001600160a01b0316146109d45760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a490fd5b60405162461bcd60e51b815260206004820152604d6024820152600080516020611d6883398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a490fd5b610c66915060203d602011610c6c575b610c5e8183611607565b810190611753565b86610939565b503d610c54565b60405162461bcd60e51b81526020600482015260366024820152600080516020611d688339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b6064820152608490fd5b60405162461bcd60e51b815260206004820152603f6024820152600080516020611d6883398151915260448201527f56533a206f70657261746f7220616c72656164792072656769737465726564006064820152608490fd5b60405162461bcd60e51b815260206004820152603e6024820152600080516020611d6883398151915260448201527f56533a206f70657261746f72207369676e6174757265206578706972656400006064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b634e487b7160e01b600052604160045260246000fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b346102ba5760003660031901126102b5576033546040516001600160a01b039091168152602090f35b346102ba5760003660031901126102b5576065546040516001600160a01b039091168152602090f35b346102ba5760003660031901126102b557610eef611a7d565b603380546001600160a01b031981169091556000906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346102ba5760003660031901126102b5576020606654604051908152f35b346102ba5760203660031901126102b55760043560ff8116809103610b115760016020911b806066541614604051908152f35b346102ba5760003660031901126102b5576065546001600160a01b0316803b156102b05760206024916040519283809263237dfb4760e11b82523360048301525afa80156102a457610fde91600091611014575b5061176b565b60001960665560405160001981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2005b61102d915060203d602011610c6c57610c5e8183611607565b82610fd8565b346102ba5760403660031901126102b55761104c6115db565b6110546115f1565b9060018060a01b0316600052609860205260406000209060018060a01b031660005260205260ff604060002054166040516002821015610737576020918152f35b346102ba5760403660031901126102b5576001600160a01b036110b66115db565b1660005260996020526040600020602435600052602052602060ff604060002054166040519015158152f35b346102ba5760003660031901126102b55760206040517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8668152f35b346102ba5760603660031901126102b5576111366115db565b61113e6115f1565b604435916000549260ff8460081c16159384809561132a575b8015611313575b156112b75760ff198116600117600055846112a5575b506065546001600160a01b03161580611293575b15611218576111da92816111ca926066556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a26118ea565b6111d26119c4565b609755611a34565b6111e057005b61ff0019600054166000557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a1005b60405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a490fd5b506001600160a01b0383161515611188565b61ffff19166101011760005584611174565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b15801561115e5750600160ff82161461115e565b50600160ff821610611157565b346102ba5760203660031901126102b557606554600435906001600160a01b0316803b156102b05760206024916040519283809263237dfb4760e11b82523360048301525afa80156102a4576113949160009161143c575061176b565b606654818116036113d157806066556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2005b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b611455915060203d602011610c6c57610c5e8183611607565b83610fd8565b346114eb5760203660031901126102b5576114746115db565b6065546001600160a01b031690813b156102b05760206004926040519384809263755b36bd60e11b82525afa9182156102a45761031b926114c7916000916114cc57506001600160a01b031633146116f4565b6118ea565b6114e5915060203d60201161029d5761028f8183611607565b846101ba565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b600435906001600160a01b0382168203610b1157565b602435906001600160a01b0382168203610b1157565b90601f8019910116810190811067ffffffffffffffff821117610dcc57604052565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b908160209103126102b557516001600160a01b0381168103610b115790565b156116fb57565b60405162461bcd60e51b815260206004820152602a60248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526939903ab73830bab9b2b960b11b6064820152608490fd5b908160209103126102b557518015158103610b115790565b1561177257565b60405162461bcd60e51b815260206004820152602860248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526739903830bab9b2b960c11b6064820152608490fd5b156117cf57565b60405162461bcd60e51b815260206004820152601960248201527f5061757361626c653a20696e64657820697320706175736564000000000000006044820152606490fd5b9290916040519260208401947fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd865260018060a01b0316604085015260018060a01b03166060840152608083015260a082015260a0815261187660c082611607565b5190206118816118b2565b9060405190602082019261190160f01b845260228301526042820152604281526118ac606282611607565b51902090565b467f0000000000000000000000000000000000000000000000000000000000000000036118df5760975490565b6118e76119c4565b90565b6001600160a01b0316801561194757606554604080516001600160a01b0383168152602081018490527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb69190a16001600160a01b03191617606555565b60405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a490fd5b6040600a602082516119d68482611607565b828152016922b4b3b2b72630bcb2b960b11b81522081519060208201927f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8668452820152466060820152306080820152608081526118ac60a082611607565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b6033546001600160a01b03163303611a9157565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b815160418103611b02575090611afe916020820151906060604084015193015160001a90611cbf565b9091565b604003611b515760406020830151920151918260ff1c91601b8301809311611b3b57611afe936001600160ff1b03169260ff1690611cbf565b634e487b7160e01b600052601160045260246000fd5b5050600090600290565b60058110156107375780611b6c5750565b600060018203611bbb5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b5060028103611c095760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b60009060038103611c645760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b6004915014611c6f57565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608490fd5b907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411611d5b5760ff1690601b82141580611d50575b611d4457602093600093608093604051938452868401526040830152606082015282805260015afa156102a4576000516001600160a01b03811615611d3b5790600090565b50600090600190565b50505050600090600490565b50601c821415611cf6565b5050505060009060039056fe4156534469726563746f72792e72656769737465724f70657261746f72546f41a26469706673582212201166ecd85e5acb204dc9a449f7b7e998e6758ea9c7abb9e58daa5248508cca6464736f6c634300081a0033"; + "0x60c0806040523461019457604051601f611f2b38819003918201601f19168301916001600160401b038311848410176101805780849260209460405283398101031261013057516001600160a01b038116810361012c576080525f5460ff8160081c166100d75760ff8082161061009d575b4660a052604051611d4990816101e2823960805181818161043801526108be015260a051816118520152f35b60ff90811916175f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a180610071565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b5f80fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fdfe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b5f3560e01c806310d67a2f146113f9578063136439dd146112d65780631794bb3c146110c157806320606b7014611087578063374823b51461103e57806349075da314610fe0578063595c6a6714610f355780635ac86ab714610f025780635c975abb14610ee5578063715018a614610e8a578063886f119514610e625780638da5cb5b14610e3a5780639926ee7d1461076a578063a1060c8814610736578063a364f4da14610601578063a98fb355146104a1578063d79aceab14610467578063df5cf72314610423578063ec76f4421461036d578063f2fde38b146102de578063f698da25146102bc5763fabc1cbc0361000e57346102b75760203660031901126102b257606554600435906001600160a01b0316803b156102ad5760206004916040519283809263755b36bd60e11b82525afa80156102a2576101c9915f91610273575b506001600160a01b03163314611691565b60665419811981160361020857806066556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a2005b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b610295915060203d60201161029b575b61028d81836115a4565b810190611672565b5f6101b8565b503d610283565b6040513d5f823e3d90fd5b61161f565b6114d8565b611488565b346102b7575f3660031901126102b25760206102d661184f565b604051908152f35b346102b75760203660031901126102b2576102f7611578565b6102ff611a1b565b6001600160a01b0381161561031957610317906119d3565b005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346102b75760203660031901126102b257600435335f52609960205260405f20815f5260205260ff60405f2054166103c457335f52609960205260405f20905f5260205260405f20600160ff198254161790555f80f35b60405162461bcd60e51b815260206004820152603160248201527f4156534469726563746f72792e63616e63656c53616c743a2063616e6e6f742060448201527018d85b98d95b081cdc195b9d081cd85b1d607a1b6064820152608490fd5b346102b7575f3660031901126102b2576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346102b7575f3660031901126102b25760206040517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd8152f35b346102b75760203660031901126102b25760043567ffffffffffffffff81116105fc57366023820112156105f75780600401359067ffffffffffffffff821161059e573660248383010111610545577fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437139082602460405192602084528260208501520160408301375f604084830101526040813394601f80199101168101030190a2005b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b6115c6565b611528565b346102b75760203660031901126102b25761061a611578565b61062b600180606654161415611765565b335f52609860205260405f2060018060a01b0382165f5260205260ff60405f2054166002811015610722576001036106b757335f8181526098602090815260408083206001600160a01b0395909516808452948252808320805460ff19169055519182529192917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191a3005b60405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f742072656769737465726564006064820152608490fd5b634e487b7160e01b5f52602160045260245ffd5b346102b75760803660031901126102b25760206102d6610754611578565b61075c61158e565b9060643591604435916117b1565b346102b75760403660031901126102b257610783611578565b6024359067ffffffffffffffff82116105fc5760606003198336030112610de957604051906060820182811067ffffffffffffffff821117610d8457604052826004013567ffffffffffffffff8111610d98578301366023820112156105f757600481013567ffffffffffffffff8111610d84576040519161080f601f8301601f1916602001846115a4565b8183523660248284010111610d2f57815f92602460209301838601378301015282526020820191602484013583526044604082019401358452610859600180606654161415611765565b83514211610cd757335f52609860205260405f2060018060a01b0383165f5260205260ff60405f205416600281101561072257600114610c7f5760018060a01b03821693845f52609960205260405f2084515f5260205260ff60405f205416610c2e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156102ad576020602491604051928380926336b87bd760e11b82528a60048301525afa9081156102a2575f91610bff575b5015610b91576109308591855190519033866117b1565b9151923b15610af2573b156102ad57602091606483926040519485938492630b135d3f60e11b84526004840152604060248401528051918291826044860152018484015e5f828201840152601f01601f19168101030181865afa9081156102a2575f91610aab575b506001600160e01b0319166374eca2c160e11b01610a24575b335f52609860205260405f20825f5260205260405f20600160ff19825416179055815f52609960205260405f2090515f5260205260405f20600160ff1982541617905560405190600182527ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4160203393a3005b60405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a490fd5b90506020813d602011610aea575b81610ac6602093836115a4565b810103126102b257516001600160e01b031981168103610ae65783610998565b5f80fd5b3d9150610ab9565b91610b0090610b0892611a73565b919091611af5565b6001600160a01b0316146109b15760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a490fd5b60405162461bcd60e51b815260206004820152604d60248201525f80516020611cf483398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a490fd5b610c21915060203d602011610c27575b610c1981836115a4565b8101906116f0565b86610919565b503d610c0f565b60405162461bcd60e51b815260206004820152603660248201525f80516020611cf48339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b6064820152608490fd5b60405162461bcd60e51b815260206004820152603f60248201525f80516020611cf483398151915260448201527f56533a206f70657261746f7220616c72656164792072656769737465726564006064820152608490fd5b60405162461bcd60e51b815260206004820152603e60248201525f80516020611cf483398151915260448201527f56533a206f70657261746f72207369676e6174757265206578706972656400006064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b346102b7575f3660031901126102b2576033546040516001600160a01b039091168152602090f35b346102b7575f3660031901126102b2576065546040516001600160a01b039091168152602090f35b346102b7575f3660031901126102b257610ea2611a1b565b603380546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346102b7575f3660031901126102b2576020606654604051908152f35b346102b75760203660031901126102b25760043560ff8116809103610ae65760016020911b806066541614604051908152f35b346102b7575f3660031901126102b2576065546001600160a01b0316803b156102ad5760206024916040519283809263237dfb4760e11b82523360048301525afa80156102a257610f8d915f91610fc1575b50611708565b5f196066556040515f1981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2005b610fda915060203d602011610c2757610c1981836115a4565b82610f87565b346102b75760403660031901126102b257610ff9611578565b61100161158e565b9060018060a01b03165f52609860205260405f209060018060a01b03165f5260205260ff60405f2054166040516002821015610722576020918152f35b346102b75760403660031901126102b2576001600160a01b0361105f611578565b165f52609960205260405f206024355f52602052602060ff60405f2054166040519015158152f35b346102b7575f3660031901126102b25760206040517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8668152f35b346102b75760603660031901126102b2576110da611578565b6110e261158e565b604435915f549260ff8460081c1615938480956112c9575b80156112b2575b156112565760ff1981166001175f5584611245575b506065546001600160a01b03161580611233575b156111b85761117c928161116c926066556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2611887565b611174611961565b6097556119d3565b61118257005b61ff00195f54165f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a1005b60405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a490fd5b506001600160a01b038316151561112a565b61ffff1916610101175f5584611116565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b1580156111015750600160ff821614611101565b50600160ff8216106110fa565b346102b75760203660031901126102b257606554600435906001600160a01b0316803b156102ad5760206024916040519283809263237dfb4760e11b82523360048301525afa80156102a257611332915f916113da5750611708565b6066548181160361136f57806066556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2005b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b6113f3915060203d602011610c2757610c1981836115a4565b83610f87565b346114885760203660031901126102b257611412611578565b6065546001600160a01b031690813b156102ad5760206004926040519384809263755b36bd60e11b82525afa9182156102a25761031792611464915f9161146957506001600160a01b03163314611691565b611887565b611482915060203d60201161029b5761028d81836115a4565b846101b8565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b600435906001600160a01b0382168203610ae657565b602435906001600160a01b0382168203610ae657565b90601f8019910116810190811067ffffffffffffffff821117610d8457604052565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b908160209103126102b257516001600160a01b0381168103610ae65790565b1561169857565b60405162461bcd60e51b815260206004820152602a60248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526939903ab73830bab9b2b960b11b6064820152608490fd5b908160209103126102b257518015158103610ae65790565b1561170f57565b60405162461bcd60e51b815260206004820152602860248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526739903830bab9b2b960c11b6064820152608490fd5b1561176c57565b60405162461bcd60e51b815260206004820152601960248201527f5061757361626c653a20696e64657820697320706175736564000000000000006044820152606490fd5b9290916040519260208401947fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd865260018060a01b0316604085015260018060a01b03166060840152608083015260a082015260a0815261181360c0826115a4565b51902061181e61184f565b9060405190602082019261190160f01b845260228301526042820152604281526118496062826115a4565b51902090565b467f00000000000000000000000000000000000000000000000000000000000000000361187c5760975490565b611884611961565b90565b6001600160a01b031680156118e457606554604080516001600160a01b0383168152602081018490527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb69190a16001600160a01b03191617606555565b60405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a490fd5b600a60206040516119736040826115a4565b828152016922b4b3b2b72630bcb2b960b11b81522060405160208101917f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866835260408201524660608201523060808201526080815261184960a0826115a4565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b6033546001600160a01b03163303611a2f57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b815160418103611a9f575090611a9b91602082015190606060408401519301515f1a90611c51565b9091565b604003611aec5760406020830151920151918260ff1c91601b8301809311611ad857611a9b936001600160ff1b03169260ff1690611c51565b634e487b7160e01b5f52601160045260245ffd5b50505f90600290565b60058110156107225780611b065750565b60018103611b535760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b60028103611ba05760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b60038103611bf85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b600414611c0157565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608490fd5b907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411611ce85760ff1690601b82141580611cdd575b611cd2576020935f93608093604051938452868401526040830152606082015282805260015afa156102a2575f516001600160a01b03811615611cca57905f90565b505f90600190565b505050505f90600490565b50601c821415611c88565b505050505f9060039056fe4156534469726563746f72792e72656769737465724f70657261746f72546f41a2646970667358221220dada447b10fbabf0403ad3e1cb6b6df4f5f506cfede15d9f8bdda94ca4e41bfd64736f6c634300081a0033"; type AVSDirectoryConstructorParams = | [signer?: Signer] diff --git a/src/avs/contracts/factories/DelegationManager__factory.ts b/src/avs/contracts/factories/DelegationManager__factory.ts index b4655d92..1ac50bfc 100644 --- a/src/avs/contracts/factories/DelegationManager__factory.ts +++ b/src/avs/contracts/factories/DelegationManager__factory.ts @@ -1662,7 +1662,7 @@ const _abi = [ ] as const; const _bytecode = - "0x610100806040523461024e57604051601f615e2e38819003918201601f19168301916001600160401b03831184841017610238578084926060946040528339810103126101e85780516001600160a01b03811681036101e3576020820151916001600160a01b03831683036101e35760400151906001600160a01b03821682036101e35760805260c05260a05260005460ff8160081c1661018e5760ff80821610610153575b4660e052604051615b92908161029c823960805181818161195201528181611bec0152818161215b0152818161250e015281816127c7015281816129f901528181612f770152818161458a015281816149d40152614b43015260a05181610f40015260c0518181816118bd01528181611ab2015281816120580152818161246a0152818161269601528181612a7c01528181612ffa0152818161451d015261491c015260e051816148820152f35b60ff90811916176000557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a1806100a5565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b600080fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b600052604160045260246000fd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fdfe6101206040526004361015610072575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b60003560e01c80630449ca39146136cb57806304a4f979146136905780630b9f487a146136545780630dd8dd02146134415780630f589e59146130b857806310d67a2f14613028578063132d496714612f65578063136439dd14612e415780631522bf0214612de35780631692836514612d9d5780631bbce09114612d5657806320606b7014612d1b57806322bf40e414612aaa57806328a573ae146129e757806329c77d4f146129ad578063334043961461218a57806339b70e38146121455780633cdeb5e0146121005780633e28391d146120c257806343377382146120875780634665bcda146120425780634fc40b6114612024578063595c6a6714611f65578063597b36da14611f305780635ac86ab714611efd5780635c975abb14611edf57806360d7faed146116c7578063635bbd10146116a357806365da1264146116615780636d70f7ae14611634578063715018a6146115d7578063778e55f3146115865780637f548071146111d4578063886f1195146111ab5780638da5cb5b1461118257806390041347146110c95780639104c3191461109a57806399be81c814610fa9578063a178848414610f6f578063b134427114610f2a578063b7f06ebe14610ef9578063bb45fef214610eac578063c448feb814610e8e578063c488375a14610e54578063c5e480db14610dae578063c94b511114610d7b578063ca661c0414610d5d578063cf80873e14610ce5578063da8be8641461090b578063eea9064b14610571578063f16172b0146104d2578063f2fde38b14610443578063f698da25146104205763fabc1cbc0361000f573461041b57602036600319011261041657606554600435906001600160a01b0316803b156104115760206004916040519283809263755b36bd60e11b82525afa80156104055761032c916000916103d6575b506001600160a01b031633146141e4565b60665419811981160361036b57806066556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a2005b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b6103f8915060203d6020116103fe575b6103f08183613b91565b8101906141c5565b3861031b565b503d6103e6565b6040513d6000823e3d90fd5b614172565b6137a3565b613753565b3461041b57600036600319011261041657602061043b61487f565b604051908152f35b3461041b5760203660031901126104165761045c61398d565b610464615199565b6001600160a01b0381161561047e5761047c90615434565b005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b3461041b576060366003190112610416576104ec33614463565b156104fa5761047c33614ddc565b60405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a490fd5b3461041b5760603660031901126104165761058a61398d565b6024356001600160401b038111610906576105a9903690600401613db1565b336000908152609a6020526040902054604435906001600160a01b0316610890576105d383614463565b15610816576105e9600180606654161415613f85565b6001600160a01b0383811660008181526099602052604090206001015490939116908115158061080c575b80610802575b6106b7575b50505033600052609a6020526040600020816bffffffffffffffffffffffff60a01b825416179055337fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d8743304600080a36106763361451b565b919060005b815181101561047c576001906106b16001600160a01b0361069c8386614136565b51166106a88388614136565b51903387615569565b0161067b565b60208101805142116107975782600052609c60205260406000208460005260205260ff6040600020541661072c576107249361071c9184600052609c6020526040600020826000526020526040600020600160ff198254161790555190848833613f00565b90519161568f565b82808061061f565b60405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608490fd5b60405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608490fd5b508333141561061a565b5081331415610614565b60405162461bcd60e51b815260206004820152604660248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a206f7060448201527f657261746f72206973206e6f74207265676973746572656420696e2045696765606482015265372630bcb2b960d11b608482015260a490fd5b60405162461bcd60e51b815260206004820152604260248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a20737460448201527f616b657220697320616c7265616479206163746976656c792064656c65676174606482015261195960f21b608482015260a490fd5b6137f3565b3461041b5760203660031901126104165761092461398d565b610935600280606654161415613f85565b6001600160a01b038082166000908152609a602052604081205490911615610c6e5761096082614463565b610c03576001600160a01b0382168015610b9857808252609a60205260408220546001600160a01b0316913382148015919082610b8f575b8015610b6e575b15610b03576040906109b08661451b565b949093610ad8575b85817ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af446768480a38152609a6020522080546001600160a01b0319169055805180610a2b575050505050610a27604051610a11602082613b91565b6000815260003681375b604051918291826139e3565b0390f35b610a3790939193613fd1565b936040926020929060005b8651811015610ac857600190610ab78751610a5d8982613b91565b83815287366020830137885190610a748a83613b91565b84825288366020840137848060a01b03610a8e858d614136565b5116610a9982614129565b52610aa48487614136565b51610aae83614129565b528787816148b4565b610ac1828b614136565b5201610a42565b50505050505050610a2790610a1b565b85817ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a8480a36109b8565b60405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608490fd5b50838152609960205260408120600101546001600160a01b0316331461099f565b50833314610998565b60405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608490fd5b60405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608490fd5b60a460405162461bcd60e51b815260206004820152604460248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20737460448201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b6084820152fd5b3461041b57602036600319011261041657610d06610d0161398d565b61451b565b604051906040820160408352835180915260206060840194019060005b818110610d3e578480610a2788878382036020850152613e92565b82516001600160a01b0316865260209586019590920191600101610d23565b3461041b57600036600319011261041657602060405162034bc08152f35b3461041b57608036600319011261041657602061043b610d9961398d565b610da16139b9565b6064359160243590614497565b3461041b57602036600319011261041657610dc761398d565b600060408051610dd681613b5b565b828152826020820152015260018060a01b031660005260996020526060604060002063ffffffff604051610e0981613b5b565b6001808060a01b0384541693848352015490826040602083019260018060a01b0385168452019260a01c16825260405193845260018060a01b03905116602084015251166040820152f35b3461041b576020366003190112610416576001600160a01b03610e7561398d565b1660005260a16020526020604060002054604051908152f35b3461041b576000366003190112610416576020609d54604051908152f35b3461041b576040366003190112610416576001600160a01b03610ecd61398d565b16600052609c6020526040600020602435600052602052602060ff604060002054166040519015158152f35b3461041b57602036600319011261041657600435600052609e602052602060ff604060002054166040519015158152f35b3461041b576000366003190112610416576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461041b576020366003190112610416576001600160a01b03610f9061398d565b16600052609f6020526020604060002054604051908152f35b3461041b576020366003190112610416576004356001600160401b03811161090657610fd9903690600401613a72565b610fe233614463565b1561101f5761101a7f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080909160405191829133958361414a565b0390a2005b60405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a490fd5b3461041b57600036600319011261041657602060405173beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08152f35b3461041b576040366003190112610416576110e261398d565b6024356001600160401b03811161090657611101903690600401613c7f565b9061110c8251613fd1565b916001600160a01b039091169060005b815181101561116c57600190836000526098602052604080600020838060a01b036111478487614136565b511690600091858060a01b0316825260205220546111658287614136565b520161111c565b60405160208082528190610a2790820187613e92565b3461041b576000366003190112610416576033546040516001600160a01b039091168152602090f35b3461041b576000366003190112610416576065546040516001600160a01b039091168152602090f35b3461041b5760a0366003190112610416576111ed61398d565b6111f56139a3565b6044356001600160401b03811161090657611214903690600401613db1565b6064356001600160401b03811161090657611233903690600401613db1565b906084356020820180514211611511576001600160a01b038087166000908152609a6020526040902054166114905761126b85614463565b1561140b576112b59060018060a01b0387169384600052609b602052600161129c604060002054935189858c614497565b9286600052609b6020520160406000205551908761568f565b6112c6600180606654161415613f85565b6001600160a01b03848116600081815260996020526040902060010154909491169081151580611401575b806113f7575b61138a575b5050506000818152609a6020526040812080546001600160a01b031916841790557fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049080a361134a8261451b565b9160005b825181101561047c576001906113846001600160a01b0361136f8387614136565b511661137b8388614136565b51908886615569565b0161134e565b60208101428151106107975782600052609c60205260406000208460005260205260ff6040600020541661072c576113ef9361071c9184600052609c6020526040600020826000526020526040600020600160ff19825416179055519084898b613f00565b8480806112fc565b50843314156112f7565b50813314156112f1565b60405162461bcd60e51b815260206004820152605160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a206f70657261746f72206973206e6f7420726567697374656064820152703932b21034b71022b4b3b2b72630bcb2b960791b608482015260a490fd5b60405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b657220697320616c726561647920616374697660648201526c195b1e4819195b1959d85d1959609a1b608482015260a490fd5b60405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a490fd5b3461041b5760403660031901126104165761159f61398d565b6115a76139a3565b6001600160a01b039182166000908152609860209081526040808320949093168252928352819020549051908152f35b3461041b576000366003190112610416576115f0615199565b603380546001600160a01b031981169091556000906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461041b57602036600319011261041657602061165761165261398d565b614463565b6040519015158152f35b3461041b576020366003190112610416576001600160a01b0361168261398d565b16600052609a602052602060018060a01b0360406000205416604051908152f35b3461041b576020366003190112610416576116bc615199565b61047c60043561547d565b3461041b576080366003190112610416576004356001600160401b03811161090657806004019060e06003198236030112611eda576024356001600160401b0381116109065761171b90369060040161394e565b919092606435928315158403611ed55761173c600480606654161415613f85565b61174b600260c954141561432a565b600260c95561176261175d3684613ce9565b614446565b80600052609e60205260ff6040600020541615611e7057608484019461179961178a87614dcb565b63ffffffff609d5491166144f8565b4310611df1576001600160a01b036117b360448701613eec565b163303611d7f5780611d06575b6000828152609e60205260409020805460ff1916905515611a1a579360a484019360c4019060005b6117f2868661406a565b90508110156119df57879061185561180984614dcb565b8261182e61182961181a8c8c61406a565b6001600160a01b039491613ec6565b613eec565b1660005260a160205261184e439163ffffffff60406000205491166144f8565b11156155f2565b8686611894611829848961188d826118818c6118876118298461188161187a8d613eec565b9d8d61406a565b90613ec6565b9861406a565b3597613ec6565b906001600160a01b031673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0810361194b5750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692833b156104115760405162387b1360e81b81526001600160a01b0390921660048301523360248301526044820152916000908390606490829084905af19182156104055760019261193a575b505b016117e8565b600061194591613b91565b89611932565b90939091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156104115760009283608492604051978895869463c608c7f360e01b86523360048701526024860152604485015260018060a01b031660648401525af1918215610405576001926119ce575b50611934565b60006119d991613b91565b896119c8565b5050505050507fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d91506020905b604051908152a1600160c955005b9391949033600052609a60205260018060a01b03604060002054169060009360a48601945b611a49868a61406a565b9050811015611cd4578890611a71611a6084614dcb565b8261182e61182961181a8c8861406a565b8587898673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac085611a9b61182961181a878b61406a565b1603611bc8575050505090611aaf90613eec565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611aeb8261188160c48c018e61406a565b3590803b15610411576040516303a041cf60e21b81526001600160a01b03851660048201526024810192909252602090829060449082906000905af190811561040557600091611b96575b506001600160a01b038084166000908152609a602052604090205460019484939291909116908d8b83611b71575b5050505050505b01611a3f565b611b8b9561188161182992611b859461406a565b91615569565b808b80808d8b611b64565b90506020813d8211611bc0575b81611bb060209383613b91565b8101031261041657516001611b36565b3d9150611ba3565b8461188160c4611c1961182984611881611c1261182983611c229a60018060a01b037f0000000000000000000000000000000000000000000000000000000000000000169e613ec6565b998d61406a565b9401809861406a565b3592803b156104115760405163c4623ea160e01b81523360048201526001600160a01b03938416602482015291909216604482015260648101929092526000908290608490829084905af180156104055760019389928d92611cc3575b508388611c90575b50505050611b6b565b611881611cb192611cab61182984611881611cba998961406a565b9461406a565b35903388615569565b868a8c83611c87565b6000611cce91613b91565b8d611c7f565b505050505050507fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d9150602090611a0c565b611d1360a486018561406a565b841490506117c05760405162461bcd60e51b81526020600482015260426024820152600080516020615b3d83398151915260448201527f645769746864726177616c3a20696e707574206c656e677468206d69736d61746064820152610c6d60f31b608482015260a490fd5b60405162461bcd60e51b81526020600482015260506024820152600080516020615b3d83398151915260448201527f645769746864726177616c3a206f6e6c7920776974686472617765722063616e60648201526f1031b7b6b83632ba329030b1ba34b7b760811b608482015260a490fd5b60405162461bcd60e51b815260206004820152605f6024820152600080516020615b3d83398151915260448201527f645769746864726177616c3a206d696e5769746864726177616c44656c61794260648201527f6c6f636b7320706572696f6420686173206e6f74207965742070617373656400608482015260a490fd5b60405162461bcd60e51b81526020600482015260436024820152600080516020615b3d83398151915260448201527f645769746864726177616c3a20616374696f6e206973206e6f7420696e20717560648201526265756560e81b608482015260a490fd5b600080fd5b613a1d565b3461041b576000366003190112610416576020606654604051908152f35b3461041b5760203660031901126104165760043560ff8116809103611ed55760016020911b806066541614604051908152f35b3461041b576020366003190112610416576004356001600160401b0381116109065761043b61175d6020923690600401613ce9565b3461041b576000366003190112610416576065546001600160a01b0316803b156104115760206024916040519283809263237dfb4760e11b82523360048301525afa801561040557611fbf91600091611ff5575b506142cd565b60001960665560405160001981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2005b612017915060203d60201161201d575b61200f8183613b91565b8101906142b5565b82611fb9565b503d612005565b3461041b5760003660031901126104165760206040516213c6808152f35b3461041b576000366003190112610416576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461041b5760003660031901126104165760206040517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b8152f35b3461041b5760203660031901126104165760206116576120e061398d565b6001600160a01b039081166000908152609a602052604090205416151590565b3461041b576020366003190112610416576001600160a01b0361212161398d565b166000526099602052602060018060a01b0360016040600020015416604051908152f35b3461041b576000366003190112610416576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461041b576080366003190112610416576004356001600160401b038111610906576121ba90369060040161394e565b9060a0526024356001600160401b038111610906576121dd90369060040161394e565b91906044356001600160401b038111610906576121fe90369060040161394e565b9390916064356001600160401b038111610906579285612224869395369060040161394e565b939092612238600480606654161415613f85565b612247600260c954141561432a565b600260c9556000955b8287101561010052610100516129a6576000610100528660051b8060a051013560e05260de1960a05136030160e05112156129a15781881015612987576122999089018961406a565b9890966122a7898786613ec6565b506122b3898289613ec6565b358015158103612980576122d061175d3660e05160a05101613ce9565b60c05260c0516101005152609e60205260ff60406101005120541615611e7057612302608060e05160a0510101614dcb565b612316439163ffffffff609d5491166144f8565b11611df15760e05160a0516001600160a01b03916123379101604001613eec565b163303611d7f57806128ff575b60c0516101005152609e6020526040610100512060ff1981541690556000146125ed57610100515b60e05160a0805161238192019081019061406a565b90508110156125a4576123e261239f608060e05160a0510101614dcb565b826123be61182961181a60a060e0518151010160e05160a0510161406a565b16610100515260a160205261184e439163ffffffff604061010051205491166144f8565b6123f160e05160a05101613eec565b90898c61243f6118298461241a6118298261188160a060e0518151010160e05160a0510161406a565b936124388261188160c060e05160a051010160e05160a0510161406a565b3595613ec6565b6001600160a01b039091169073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082036125095750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156104115760405162387b1360e81b81526001600160a01b039094166004850152336024850152604484015261010051908390606490829084905af19182156124fb576001926124e8575b505b0161236c565b610100516124f591613b91565b8c6124e0565b6040513d61010051823e3d90fd5b9093507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691823b156104115760405163c608c7f360e01b8152336004820152602481019590955260448501526001600160a01b0316606484015261010051908390608490829084905af19182156124fb57600192612591575b506124e2565b6101005161259e91613b91565b8c61258b565b50939790949850600191959296505b7fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d602060405160c0518152a1019591949093969296612250565b6101008051339052609a6020525160408120546001600160a01b03166080529799975b60e05160a0805161262592019081019061406a565b90508110156128ec5761264361239f608060e05160a0510101614dcb565b8a73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08261267861182961181a60a060e0518151010160e05160a0510161406a565b16036127b5575061268e60e05160a05101613eec565b60e05160a0517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169392916126d6918491611881910160c081019061406a565b3592803b15610411576040516303a041cf60e21b81526001600160a01b038316600482015260248101949094526101005160209185916044918391905af180156124fb576101005190612783575b61010080516001600160a01b03848116909152609a60205290516040902054600195501680612758575b5050505b01612610565b61277b92611b856118298661188160a060e0518151010160e05160a0510161406a565b8c808061274e565b506020833d82116127ad575b8161279c60209383613b91565b810103126104165760019251612724565b3d915061278f565b906127ed611829828c60018060a01b037f00000000000000000000000000000000000000000000000000000000000000001695613ec6565b9161280d6118298361188160a060e0518151010160e05160a0510161406a565b61282a8361188160c060e05160a051010160e05160a0510161406a565b3590823b156104115760405163c4623ea160e01b81523360048201526001600160a01b03958616602482015294166044850152606484015261010051908390608490829084905af19182156124fb576001926128d9575b5060805115612752576128d46128ac6118298361188160a060e0518151010160e05160a0510161406a565b6128c98361188160c060e05160a051010160e05160a0510161406a565b359033608051615569565b612752565b610100516128e691613b91565b8c612881565b50939790949850600191959296506125b3565b60e05160a0805161291492019081019061406a565b8c1490506123445760405162461bcd60e51b81526020600482015260426024820152600080516020615b3d83398151915260448201527f645769746864726177616c3a20696e707574206c656e677468206d69736d61746064820152610c6d60f31b608482015260a490fd5b6101005180fd5b634e487b7160e01b61010051526032600452602461010051fd5b614003565b600160c955005b3461041b576020366003190112610416576001600160a01b036129ce61398d565b16600052609b6020526020604060002054604051908152f35b3461041b576129f536613a9f565b90337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316148015612a78575b612a3290614243565b6001600160a01b038084166000908152609a602052604090205416612a5357005b6001600160a01b038084166000908152609a602052604090205461047c949116615569565b50337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614612a29565b3461041b5760c036600319011261041657612ac361398d565b612acb6139a3565b604435906084356001600160401b03811161090657612aee90369060040161394e565b60a4929192356001600160401b03811161090657612b1090369060040161394e565b9390926000549660ff8860081c161597888099612d0e575b8015612cf7575b15612c9b5760ff19811660011760005588612c89575b506065546001600160a01b03161580612c77575b15612bfc57612b9e612bae9288612bbe996066556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2615037565b612ba66153c4565b609755615434565b612bb960643561547d565b6151f1565b612bc457005b61ff0019600054166000557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a1005b60405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a490fd5b506001600160a01b0382161515612b59565b61ffff19166101011760005588612b45565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b158015612b2f5750600160ff821614612b2f565b50600160ff821610612b28565b3461041b5760003660031901126104165760206040517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8668152f35b3461041b57606036600319011261041657602061043b612d7461398d565b612d7c6139a3565b6001600160a01b0382166000908152609b8552604090205460443592614497565b3461041b576020366003190112610416576001600160a01b03612dbe61398d565b166000526099602052602063ffffffff60016040600020015460a01c16604051908152f35b3461041b576040366003190112610416576004356001600160401b03811161090657612e1390369060040161394e565b602435916001600160401b03831161090657612e3661047c93369060040161394e565b929091612bb9615199565b3461041b57602036600319011261041657606554600435906001600160a01b0316803b156104115760206024916040519283809263237dfb4760e11b82523360048301525afa801561040557612e9e91600091612f4657506142cd565b60665481811603612edb57806066556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2005b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b612f5f915060203d60201161201d5761200f8183613b91565b83611fb9565b3461041b57612f7336613a9f565b90337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316148015612ff6575b612fb090614243565b6001600160a01b038084166000908152609a602052604090205416612fd157005b6001600160a01b038084166000908152609a602052604090205461047c949116615111565b50337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614612fa7565b3461041b5760203660031901126104165761304161398d565b6065546001600160a01b031690813b156104115760206004926040519384809263755b36bd60e11b82525afa9182156104055761047c926130949160009161309957506001600160a01b031633146141e4565b615037565b6130b2915060203d6020116103fe576103f08183613b91565b8461031b565b3461041b5736600319016080811261041657606013611eda576064356001600160401b038111610906576130f0903690600401613a72565b336000908152609a60205260409020546001600160a01b03166133c35761311633614ddc565b60405161312281613b2a565b60608152602081019060008252613140600180606654161415613f85565b336000908152609960205260409020600101546001600160a01b031690811515806133b9575b806133b1575b6132ab575b5050336000818152609a6020526040812080546001600160a01b0319168317905590915081907fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049080a36131c43361451b565b9260005b8251811015613204576001906131fe6001600160a01b036131e98387614136565b51166131f58389614136565b51903333615569565b016131c8565b50604051836004356001600160a01b03811690819003611ed55782526024356001600160a01b03811690819003611ed55760208301526044359063ffffffff8216809203611ed5578261101a9260407f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080909501527f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e260603392a260405191829133958361414a565b825142116107975781600052609c60205260406000206000805260205260ff6040600020541661072c576133a99282600052609c6020526040600020600080526020526040600020600160ff198254161790555160405160208101917f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad8352846040830152336060830152336080830152600060a083015260c082015260c0815261335760e082613b91565b51902061339061339e61336861487f565b92604051928391602083019586909160429261190160f01b8352600283015260228201520190565b03601f198101835282613b91565b51902090519161568f565b828080613171565b50600061316c565b5081331415613166565b60405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a2063616c6c657220697320616c7265616479206163746976656c796064820152690819195b1959d85d195960b21b608482015260a490fd5b3461041b576020366003190112610416576004356001600160401b0381116109065761347190369060040161394e565b90613483600280606654161415613f85565b61348c82613fd1565b9033600052609a60205260018060a01b036040600020541660005b8481106134bc5760405180610a2786826139e3565b6134d06134ca828786614048565b8061406a565b90506134ea6134e0838887614048565b602081019061406a565b919050036135e957336001600160a01b03613511604061350b858a89614048565b01613eec565b160361357e5760019061356d84876135658461355d6135536134e061354a6134ca8588613544604061350b84848f614048565b9a614048565b9490968d614048565b9490923691613c2b565b923691613c9d565b9186336148b4565b6135778287614136565b52016134a7565b60405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a2077697468647261776572206d757374206265207374616b6572000000006064820152608490fd5b60405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608490fd5b3461041b5760a036600319011261041657602061043b61367261398d565b61367a6139a3565b906136836139b9565b6084359260643592613f00565b3461041b5760003660031901126104165760206040517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad8152f35b34613753576020366003190112610416576004356001600160401b038111610906576136fb90369060040161394e565b609d549160005b82811061371457602084604051908152f35b6001600160a01b0361372a611829838686613ec6565b1660005260a160205260406000205484811161374a575b50600101613702565b93506001613741565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b9181601f84011215613988578235916001600160401b038311613983576020808501948460051b01011161397e57565b6138f5565b61389c565b613843565b600435906001600160a01b0382168203611ed557565b602435906001600160a01b0382168203611ed557565b604435906001600160a01b0382168203611ed557565b35906001600160a01b0382168203611ed557565b602060408183019282815284518094520192019060005b818110613a075750505090565b82518452602093840193909201916001016139fa565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a207374727563742063616c6c6461746120746f6044820152661bc81cda1bdc9d60ca1b6064820152608490fd5b9181601f84011215613988578235916001600160401b038311613983576020838186019501011161397e57565b6060906003190112610416576004356001600160a01b0381168103611ed557906024356001600160a01b0381168103611ed5579060443590565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b604081019081106001600160401b03821117613b4557604052565b634e487b7160e01b600052604160045260246000fd5b606081019081106001600160401b03821117613b4557604052565b60e081019081106001600160401b03821117613b4557604052565b90601f801991011681019081106001600160401b03821117613b4557604052565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b359063ffffffff82168203611ed557565b6001600160401b038111613b455760051b60200190565b929190613c3781613c14565b93613c456040519586613b91565b602085838152019160051b810192831161397e57905b828210613c6757505050565b60208091613c74846139cf565b815201910190613c5b565b9080601f8301121561398857816020613c9a93359101613c2b565b90565b929190613ca981613c14565b93613cb76040519586613b91565b602085838152019160051b810192831161397e57905b828210613cd957505050565b8135815260209182019101613ccd565b919060e083820312613dac5760405190613d0282613b76565b8193613d0d816139cf565b8352613d1b602082016139cf565b6020840152613d2c604082016139cf565b604084015260608101356060840152613d4760808201613c03565b608084015260a08101356001600160401b038111613da75782613d6b918301613c7f565b60a084015260c0810135906001600160401b038211613da7570181601f820112156139885760c091816020613da293359101613c9d565b910152565b613bb2565b613ad9565b9190604083820312613dac5760405190613dca82613b2a565b819380356001600160401b038111613da75781019082601f83011215613988578135926001600160401b038411613b455760405190613e13601f8601601f191660200183613b91565b84825260208585010111613e3d576000602085819682809701838601378301015284520135910152565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b906020808351928381520192019060005b818110613eb05750505090565b8251845260209384019390920191600101613ea3565b9190811015613ed65760051b0190565b634e487b7160e01b600052603260045260246000fd5b356001600160a01b0381168103611ed55790565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad602082019081526001600160a01b0395861692820192909252918416606083015292909116608082015260a081019290925260c080830193909352918152613f6e60e082613b91565b519020613390613f7f61336861487f565b51902090565b15613f8c57565b60405162461bcd60e51b815260206004820152601960248201527f5061757361626c653a20696e64657820697320706175736564000000000000006044820152606490fd5b90613fdb82613c14565b613fe86040519182613b91565b8281528092613ff9601f1991613c14565b0190602036910137565b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206f6666736574000000006044820152606490fd5b9190811015613ed65760051b81013590605e19813603018212156129a1570190565b903590601e19813603018212156129a157018035906001600160401b0382116140e457602001918160051b3603831361409f57565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c64617461207461696c20746f6f2073686f72740000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206c656e677468000000006044820152606490fd5b805115613ed65760200190565b8051821015613ed65760209160051b010190565b90918060409360208452816020850152848401376000828201840152601f01601f1916010190565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b9081602091031261041657516001600160a01b0381168103611ed55790565b156141eb57565b60405162461bcd60e51b815260206004820152602a60248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526939903ab73830bab9b2b960b11b6064820152608490fd5b1561424a57565b60405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60448201527f616e616765724f72456967656e506f644d616e616765720000000000000000006064820152608490fd5b9081602091031261041657518015158103611ed55790565b156142d457565b60405162461bcd60e51b815260206004820152602860248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526739903830bab9b2b960c11b6064820152608490fd5b1561433157565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b80516001600160a01b039081168352602080830151821681850152604080840151909216918401919091526060808301519084015260808083015163ffffffff169084015260a08083015160e0918501829052805191850182905261010085019392019060005b8181106144275750505060c001519160c08183039101526020808351928381520192019060005b8181106144115750505090565b8251845260209384019390920191600101614404565b82516001600160a01b03168552602094850194909201916001016143dd565b604051613f7f816133906020820194602086526040830190614376565b6001600160a01b03168015159081614479575090565b6000818152609a60205260409020546001600160a01b031614919050565b92906040519260208401947f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b865260018060a01b0316604085015260018060a01b03166060840152608083015260a082015260a08152613f6e60c082613b91565b9190820180921161450557565b634e487b7160e01b600052601160045260246000fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610411576040516360f4062b60e01b81526001600160a01b039092166004830181905290602090839060249082905afa9182156104055760009261484b575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b15610411576000906024604051809481936394f649dd60e01b835260048301525afa908115610405576000908192614736575b506000831315614730578051600081614665575050505090604080519261460f8285613b91565b60018452614660601f1983019283366020880137859361463182519283613b91565b6001825236602083013773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac061465a8297614129565b52614129565b529190565b6001820180921161471c575061467a90613fd1565b906146858251613fd1565b9460005b82518110156146d0576001906001600160a01b036146a78286614136565b51166146b38287614136565b526146be8187614136565b516146c9828a614136565b5201614689565b509391925050815160001981019081116145055761470373beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac09184614136565b5281516000198101908111614505576146609085614136565b634e487b7160e01b81526011600452602490fd5b92909150565b91503d8082843e6147478184613b91565b8201916040818403126104165780516001600160401b03811161090657810183601f820112156139885780519061477d82613c14565b9361478b6040519586613b91565b82855260208086019360051b8301019186831161397e57602001925b82841061482757505050506020810151906001600160401b03821161090657019180601f840112156139885782516147de81613c14565b936147ec6040519586613b91565b81855260208086019260051b82010192831161397e57602001905b82821061481757505050386145e8565b8151815260209182019101614807565b83516001600160a01b0381168103614847578152602093840193016147a7565b8280fd5b9091506020813d602011614877575b8161486760209383613b91565b8101031261041657519038614587565b3d915061485a565b467f0000000000000000000000000000000000000000000000000000000000000000036148ac5760975490565b613c9a6153c4565b93949392916001600160a01b038416918215614d4757835115614cc65760005b8451811015614bf8576001600160a01b038216614bc9575b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b036149138388614136565b5116036149b2577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169061494f818a614136565b5191803b156104115760405163beffbb8960e01b81526001600160a01b038916600482015260248101939093526000908390604490829084905af1918215610405576001926149a1575b505b016148d4565b60006149ac91613b91565b38614999565b6001600160a01b03831684148015614b38575b15614a75576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169190614a018288614136565b5116614a0d828b614136565b51833b1561041157604051638c80d4e560e01b81526001600160a01b038a811660048301529290921660248301526044820152916000908390606490829084905af191821561040557600192614a64575b5061499b565b6000614a6f91613b91565b38614a5e565b60e460405162461bcd60e51b815260206004820152608460248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a2077697468647261776572206d7560648201527f73742062652073616d652061646472657373206173207374616b65722069662060848201527f746869726450617274795472616e7366657273466f7262696464656e2061726560a482015263081cd95d60e21b60c4820152fd5b506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811690614b6f8388614136565b5116813b1561041157602090602460405180948193639b4da03d60e01b835260048301525afa90811561040557600091614bab575b50156149c5565b614bc3915060203d811161201d5761200f8183613b91565b38614ba4565b614bf36001600160a01b03614bde8388614136565b5116614bea838b614136565b51908885615111565b6148ec565b506000838152609f6020526040902080549697939693955083600019811461450557600101905560405195614c2c87613b76565b86526001600160a01b03908116602087015216604085015260608401524363ffffffff16608084015260a083015260c08201527f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f9614cc0614c8c83614446565b9283600052609e6020526040600020600160ff19825416179055604051918291858352604060208401526040830190614376565b0390a190565b60405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374726174656769657320636160648201526c6e6e6f7420626520656d70747960981b608482015260a490fd5b60405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a490fd5b3563ffffffff81168103611ed55790565b6044359063ffffffff821690818303611ed5576213c6808211614f915760018060a01b03169081600052609960205263ffffffff60016040600020015460a01c1611614f0a576000908152609960205260409020600435906001600160a01b0382168203611ed55780546001600160a01b0319166001600160a01b0392831617815560010191906024359081168103611ed55782546001600160c01b0319166001600160a01b039182161760a09290921b63ffffffff60a01b169190911790915560405160608101917ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac9190614ed260046139cf565b1681526001600160a01b03614ee760246139cf565b16602082015263ffffffff614efc6044613c03565b1660408201528033930390a2565b60405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a490fd5b60405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c490fd5b6001600160a01b0316801561509457606554604080516001600160a01b0383168152602081018490527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb69190a16001600160a01b03191617606555565b60405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a490fd5b6001600160a01b03908116600081815260986020908152604080832094871683529390529190912080549194808303949392851161450557939055604080516001600160a01b0392831681529290911660208301528101919091527f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd9080606081015b0390a2565b6033546001600160a01b031633036151ad57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b9190918383036153465760005b83811061520c575050505050565b6001600160a01b03615222611829838786613ec6565b16908160005260a160205260406000205461523e828887613ec6565b359062034bc0821161529957837f0e7efa738e8b0ce6376a0c1af471655540d2e9a81647d7b09ed823018426576d9260609260019660005260a16020528160406000205560405192835260208301526040820152a1016151fe565b60405162461bcd60e51b815260206004820152607360248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a205f7769746864726177616c60648201527f44656c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544860848201527244524157414c5f44454c41595f424c4f434b5360681b60a482015260c490fd5b60405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a20696e707574206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a490fd5b6040600a602082516153d68482613b91565b828152016922b4b3b2b72630bcb2b960b11b81522081519060208201927f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866845282015246606082015230608082015260808152613f7f60a082613b91565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b62034bc081116154be577fafa003cd76f87ff9d62b35beea889920f33c0c42b8d45b74954d61d50f4b6b696040609d548151908152836020820152a1609d55565b60405162461bcd60e51b815260206004820152607160248201527f44656c65676174696f6e4d616e616765722e5f7365744d696e5769746864726160448201527f77616c44656c6179426c6f636b733a205f6d696e5769746864726177616c446560648201527f6c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544844526084820152704157414c5f44454c41595f424c4f434b5360781b60a482015260c490fd5b906151947f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c939260018060a01b031694856000526098602052604060002060018060a01b03851660005260205260406000206155c68282546144f8565b9055604080516001600160a01b0394851681529490931660208501529183019190915281906060820190565b156155f957565b60405162461bcd60e51b815260206004820152606e6024820152600080516020615b3d83398151915260448201527f645769746864726177616c3a207769746864726177616c44656c6179426c6f6360648201527f6b7320706572696f6420686173206e6f74207965742070617373656420666f7260848201526d207468697320737472617465677960901b60a482015260c490fd5b909190803b15615805576001600160a01b031690813b156104115760408051630b135d3f60e11b815260048101949094526024840152805160448401819052839160005b8281106157ed57505091816064818560008360209884010152601f801991011681010301915afa908115610405576000916157aa575b506001600160e01b0319166374eca2c160e11b0161572357565b60405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a490fd5b90506020813d6020116157e5575b816157c560209383613b91565b8101031261041657516001600160e01b031981168103611ed55738615709565b3d91506157b8565b602082820181015160648884010152869450016156d3565b906158139061581b936158aa565b92909261591a565b6001600160a01b0390811691160361582f57565b60405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a490fd5b8151604181036158d75750906158d3916020820151906060604084015193015160001a90615a94565b9091565b6040036159105760406020830151920151918260ff1c91601b8301809311614505576158d3936001600160ff1b03169260ff1690615a94565b5050600090600290565b6005811015615a7e578061592b5750565b60006001820361597a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b50600281036159c85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b60009060038103615a235760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b6004915014615a2e57565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608490fd5b634e487b7160e01b600052602160045260246000fd5b907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615b305760ff1690601b82141580615b25575b615b1957602093600093608093604051938452868401526040830152606082015282805260015afa15610405576000516001600160a01b03811615615b105790600090565b50600090600190565b50505050600090600490565b50601c821415615acb565b5050505060009060039056fe44656c65676174696f6e4d616e616765722e5f636f6d706c6574655175657565a2646970667358221220c1e5ba5a0ff9a3f5aa6639ea96acebc0095aad0753c5aadae823932723ee179b64736f6c634300081a0033"; + "0x610100806040523461024957604051601f615c8438819003918201601f19168301916001600160401b03831184841017610235578084926060946040528339810103126101e55780516001600160a01b03811681036101e1576020820151916001600160a01b03831683036101e15760400151906001600160a01b03821682036101e15760805260c05260a0525f5460ff8160081c1661018c5760ff80821610610152575b4660e0526040516159ed9081610297823960805181818161190601528181611b85015281816120ce01528181612421015281816126b2015281816128e701528181612e59015281816144310152818161485601526149c3015260a05181610f19015260c05181818161187301528181611a4e01528181611fd00152818161238e0152818161258d0152818161296801528181612eda015281816143c501526147a0015260e051816147070152f35b60ff90811916175f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a1806100a4565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b5f80fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fdfe60c06040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b5f3560e01c80630449ca391461359757806304a4f9791461355d5780630b9f487a146135215780630dd8dd02146133115780630f589e5914612f9757806310d67a2f14612f08578063132d496714612e47578063136439dd14612d245780631522bf0214612cc65780631692836514612c825780631bbce09114612c3c57806320606b7014612c0257806322bf40e41461299657806328a573ae146128d557806329c77d4f1461289d57806333404396146120fd57806339b70e38146120b95780633cdeb5e0146120765780633e28391d146120395780634337738214611fff5780634665bcda14611fbb5780634fc40b6114611f9e578063595c6a6714611ee3578063597b36da14611eae5780635ac86ab714611e7b5780635c975abb14611e5e57806360d7faed14611683578063635bbd101461165f57806365da12641461161f5780636d70f7ae146115f2578063715018a614611597578063778e55f3146115475780637f548071146111a5578063886f11951461117d5780638da5cb5b14611155578063900413471461109f5780639104c3191461107157806399be81c814610f80578063a178848414610f48578063b134427114610f04578063b7f06ebe14610ed5578063bb45fef214610e8c578063c448feb814610e6f578063c488375a14610e37578063c5e480db14610d94578063c94b511114610d61578063ca661c0414610d44578063cf80873e14610ccd578063da8be864146108f8578063eea9064b1461056c578063f16172b0146104cd578063f2fde38b1461043e578063f698da251461041c5763fabc1cbc0361000e573461041757602036600319011261041257606554600435906001600160a01b0316803b1561040d5760206004916040519283809263755b36bd60e11b82525afa801561040257610329915f916103d3575b506001600160a01b03163314614091565b60665419811981160361036857806066556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a2005b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b6103f5915060203d6020116103fb575b6103ed8183613a57565b810190614072565b5f610318565b503d6103e3565b6040513d5f823e3d90fd5b61401f565b61366c565b61361c565b34610417575f366003190112610412576020610436614704565b604051908152f35b3461041757602036600319011261041257610457613856565b61045f615010565b6001600160a01b0381161561047957610477906152a8565b005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b34610417576060366003190112610412576104e73361430e565b156104f55761047733614c57565b60405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a490fd5b3461041757606036600319011261041257610585613856565b6024356001600160401b0381116108f3576105a4903690600401613c77565b335f908152609a6020526040902054604435906001600160a01b031661087d576105cd8361430e565b15610803576105e3600180606654161415613e33565b6001600160a01b038381165f818152609960205260409020600101549093911690811515806107f9575b806107ef575b6106ac575b505050335f52609a60205260405f20816bffffffffffffffffffffffff60a01b825416179055337fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433045f80a361066c336143c3565b91905f5b8151811015610477576001906106a66001600160a01b036106918386613fe4565b511661069d8388613fe4565b519033876153dc565b01610670565b602081018051421161078457825f52609c60205260405f20845f5260205260ff60405f205416610719576107119361070991845f52609c60205260405f20825f5260205260405f20600160ff198254161790555190848833613dae565b9051916154fd565b828080610618565b60405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608490fd5b60405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608490fd5b5083331415610613565b508133141561060d565b60405162461bcd60e51b815260206004820152604660248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a206f7060448201527f657261746f72206973206e6f74207265676973746572656420696e2045696765606482015265372630bcb2b960d11b608482015260a490fd5b60405162461bcd60e51b815260206004820152604260248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a20737460448201527f616b657220697320616c7265616479206163746976656c792064656c65676174606482015261195960f21b608482015260a490fd5b6136bc565b3461041757602036600319011261041257610911613856565b610922600280606654161415613e33565b6001600160a01b038082165f908152609a60205260409020541615610c565761094a8161430e565b610beb576001600160a01b0381168015610b80575f818152609a60205260409020546001600160a01b03169033811480159081610b77575b8015610b57575b15610aec57610997846143c3565b929091610ac1575b83817ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af446765f80a35f908152609a6020526040902080546001600160a01b0319169055805180610a15575050505050610a116040516109fd602082613a57565b5f81525f3681375b604051918291826138ac565b0390f35b610a2190939193613e7f565b93604092602092905f5b8651811015610ab157600190610aa08751610a468982613a57565b83815287366020830137885190610a5d8a83613a57565b84825288366020840137848060a01b03610a77858d613fe4565b5116610a8282613fd7565b52610a8d8487613fe4565b51610a9783613fd7565b52878781614739565b610aaa828b613fe4565b5201610a2b565b50505050505050610a1190610a05565b83817ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a5f80a361099f565b60405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608490fd5b50825f52609960205260018060a01b03600160405f200154163314610989565b50823314610982565b60405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608490fd5b60405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608490fd5b60a460405162461bcd60e51b815260206004820152604460248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20737460448201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b6084820152fd5b3461041757602036600319011261041257610cee610ce9613856565b6143c3565b60405190604082016040835283518091526020606084019401905f5b818110610d25578480610a1188878382036020850152613d57565b82516001600160a01b0316865260209586019590920191600101610d0a565b34610417575f36600319011261041257602060405162034bc08152f35b34610417576080366003190112610412576020610436610d7f613856565b610d87613882565b6064359160243590614341565b3461041757602036600319011261041257610dad613856565b5f60408051610dbb81613a21565b828152826020820152015260018060a01b03165f526099602052606060405f2063ffffffff604051610dec81613a21565b6001808060a01b0384541693848352015490826040602083019260018060a01b0385168452019260a01c16825260405193845260018060a01b03905116602084015251166040820152f35b34610417576020366003190112610412576001600160a01b03610e58613856565b165f5260a1602052602060405f2054604051908152f35b34610417575f366003190112610412576020609d54604051908152f35b34610417576040366003190112610412576001600160a01b03610ead613856565b165f52609c60205260405f206024355f52602052602060ff60405f2054166040519015158152f35b34610417576020366003190112610412576004355f52609e602052602060ff60405f2054166040519015158152f35b34610417575f366003190112610412576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610417576020366003190112610412576001600160a01b03610f69613856565b165f52609f602052602060405f2054604051908152f35b34610417576020366003190112610412576004356001600160401b0381116108f357610fb090369060040161393a565b610fb93361430e565b15610ff657610ff17f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b670809091604051918291339583613ff8565b0390a2005b60405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a490fd5b34610417575f36600319011261041257602060405173beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08152f35b34610417576040366003190112610412576110b8613856565b6024356001600160401b0381116108f3576110d7903690600401613b45565b6110e18151613e7f565b6001600160a01b03909216915f5b825181101561113f575f848152609860205260409020600191906001600160a01b0361111b8387613fe4565b5116838060a01b03165f5260205260405f20546111388285613fe4565b52016110ef565b60405160208082528190610a1190820185613d57565b34610417575f366003190112610412576033546040516001600160a01b039091168152602090f35b34610417575f366003190112610412576065546040516001600160a01b039091168152602090f35b346104175760a0366003190112610412576111be613856565b6111c661386c565b6044356001600160401b0381116108f3576111e5903690600401613c77565b6064356001600160401b0381116108f357611204903690600401613c77565b9060843560208201805142116114d2576001600160a01b038087165f908152609a6020526040902054166114515761123b8561430e565b156113cc576112819060018060a01b03871693845f52609b602052600161126a60405f2054935189858c614341565b92865f52609b6020520160405f20555190876154fd565b611292600180606654161415613e33565b6001600160a01b038481165f818152609960205260409020600101549094911690811515806113c2575b806113b8575b611353575b5050505f818152609a6020526040812080546001600160a01b031916841790557fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049080a3611314826143c3565b915f5b82518110156104775760019061134d6001600160a01b036113388387613fe4565b51166113448388613fe4565b519088866153dc565b01611317565b602081014281511061078457825f52609c60205260405f20845f5260205260ff60405f205416610719576113b09361070991845f52609c60205260405f20825f5260205260405f20600160ff19825416179055519084898b613dae565b8480806112c7565b50843314156112c2565b50813314156112bc565b60405162461bcd60e51b815260206004820152605160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a206f70657261746f72206973206e6f7420726567697374656064820152703932b21034b71022b4b3b2b72630bcb2b960791b608482015260a490fd5b60405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b657220697320616c726561647920616374697660648201526c195b1e4819195b1959d85d1959609a1b608482015260a490fd5b60405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a490fd5b3461041757604036600319011261041257611560613856565b61156861386c565b6001600160a01b039182165f908152609860209081526040808320949093168252928352819020549051908152f35b34610417575f366003190112610412576115af615010565b603380546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b34610417576020366003190112610412576020611615611610613856565b61430e565b6040519015158152f35b34610417576020366003190112610412576001600160a01b03611640613856565b165f52609a602052602060018060a01b0360405f205416604051908152f35b3461041757602036600319011261041257611678615010565b6104776004356152f0565b34610417576080366003190112610412576004356001600160401b0381116108f357806004019060e06003198236030112611e59576024356001600160401b0381116108f3576116d7903690600401613817565b919092606435928315158403611e55576116f8600480606654161415613e33565b611707600260c95414156141d7565b600260c95561171e6117193684613baf565b6142f1565b805f52609e60205260ff60405f20541615611df157608484019461175361174487614c46565b63ffffffff609d5491166143a2565b4310611d73576001600160a01b0361176d60448701613d9a565b163303611d025780611c8a575b5f828152609e60205260409020805460ff19169055156119b9579360a484019360c401905f5b6117aa8686613f18565b905081101561199157879061180b6117c184614c46565b826117e66117e16117d28c8c613f18565b6001600160a01b039491613d8a565b613d9a565b165f5260a1602052611804439163ffffffff60405f205491166143a2565b1115615461565b868661184a6117e18489611843826118378c61183d6117e1846118376118308d613d9a565b9d8d613f18565b90613d8a565b98613f18565b3597613d8a565b906001600160a01b031673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081036118ff5750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692833b1561040d5760405162387b1360e81b81526001600160a01b0390921660048301523360248301526044820152915f908390606490829084905af1918215610402576001926118ef575b505b016117a0565b5f6118f991613a57565b896118e7565b90939091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561040d575f9283608492604051978895869463c608c7f360e01b86523360048701526024860152604485015260018060a01b031660648401525af191821561040257600192611981575b506118e9565b5f61198b91613a57565b8961197b565b5050505050505f8051602061599883398151915291506020905b604051908152a1600160c955005b93919490335f52609a60205260018060a01b0360405f205416905f9360a48601945b6119e5868a613f18565b9050811015611c6b578890611a0d6119fc84614c46565b826117e66117e16117d28c88613f18565b8587898673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac085611a376117e16117d2878b613f18565b1603611b61575050505090611a4b90613d9a565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611a878261183760c48c018e613f18565b3590803b1561040d576040516303a041cf60e21b81526001600160a01b03851660048201526024810192909252602090829060449082905f905af1908115610402575f91611b2f575b506001600160a01b038084165f908152609a602052604090205460019484939291909116908d8b83611b0a575b5050505050505b016119db565b611b24956118376117e192611b1e94613f18565b916153dc565b808b80808d8b611afd565b90506020813d8211611b59575b81611b4960209383613a57565b8101031261041257516001611ad0565b3d9150611b3c565b8461183760c4611bb26117e184611837611bab6117e183611bbb9a60018060a01b037f0000000000000000000000000000000000000000000000000000000000000000169e613d8a565b998d613f18565b94018098613f18565b3592803b1561040d5760405163c4623ea160e01b81523360048201526001600160a01b03938416602482015291909216604482015260648101929092525f908290608490829084905af180156104025760019389928d92611c5b575b508388611c28575b50505050611b04565b611837611c4992611c436117e184611837611c529989613f18565b94613f18565b359033886153dc565b868a8c83611c1f565b5f611c6591613a57565b8d611c17565b505050505050505f8051602061599883398151915291506020906119ab565b611c9760a4860185613f18565b8414905061177a5760405162461bcd60e51b815260206004820152604260248201525f8051602061597883398151915260448201527f645769746864726177616c3a20696e707574206c656e677468206d69736d61746064820152610c6d60f31b608482015260a490fd5b60405162461bcd60e51b815260206004820152605060248201525f8051602061597883398151915260448201527f645769746864726177616c3a206f6e6c7920776974686472617765722063616e60648201526f1031b7b6b83632ba329030b1ba34b7b760811b608482015260a490fd5b60405162461bcd60e51b815260206004820152605f60248201525f8051602061597883398151915260448201527f645769746864726177616c3a206d696e5769746864726177616c44656c61794260648201527f6c6f636b7320706572696f6420686173206e6f74207965742070617373656400608482015260a490fd5b60405162461bcd60e51b815260206004820152604360248201525f8051602061597883398151915260448201527f645769746864726177616c3a20616374696f6e206973206e6f7420696e20717560648201526265756560e81b608482015260a490fd5b5f80fd5b6138e5565b34610417575f366003190112610412576020606654604051908152f35b346104175760203660031901126104125760043560ff8116809103611e555760016020911b806066541614604051908152f35b34610417576020366003190112610412576004356001600160401b0381116108f3576104366117196020923690600401613baf565b34610417575f366003190112610412576065546001600160a01b0316803b1561040d5760206024916040519283809263237dfb4760e11b82523360048301525afa801561040257611f3b915f91611f6f575b5061417a565b5f196066556040515f1981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2005b611f91915060203d602011611f97575b611f898183613a57565b810190614162565b82611f35565b503d611f7f565b34610417575f3660031901126104125760206040516213c6808152f35b34610417575f366003190112610412576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610417575f3660031901126104125760206040517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b8152f35b34610417576020366003190112610412576020611615612057613856565b6001600160a01b039081165f908152609a602052604090205416151590565b34610417576020366003190112610412576001600160a01b03612097613856565b165f526099602052602060018060a01b03600160405f20015416604051908152f35b34610417575f366003190112610412576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610417576080366003190112610412576004356001600160401b0381116108f35761212d903690600401613817565b906080526024356001600160401b0381116108f357612150903690600401613817565b6044929192356001600160401b0381116108f357612172903690600401613817565b9190936064356001600160401b0381116108f35793612198869492953690600401613817565b9490916121ac600480606654161415613e33565b6121bb600260c95414156141d7565b600260c9555f935b81851015612896578460051b80608051013560a05260de1960805136030160a0511215612891578686101561287d576121fe90890189613f18565b96909861220c878487613d8a565b50612218878a88613d8a565b35988915158a03611e55576122366117193660a05160805101613baf565b998a5f52609e60205260ff60405f20541615611df15761225d608060a05181510101614c46565b612271439163ffffffff609d5491166143a2565b11611d735760a0516080516001600160a01b03916122929101604001613d9a565b163303611d0257806127fa575b5f8b8152609e60205260409020805460ff19169055156124e2575f5b6122d360a08051608051010160a05160805101613f18565b90508110156124ac578b906123116122f2608060a05181510101614c46565b826117e66117e16117d260a08051608051010160a05160805101613f18565b61232060a05160805101613d9a565b8b6123656117e1846123476117e18261183760a08051608051010160a05160805101613f18565b936118438261183760c060a051608051010160a05160805101613f18565b906001600160a01b031673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0810361241a5750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692833b1561040d5760405162387b1360e81b81526001600160a01b0390921660048301523360248301526044820152915f908390606490829084905af19182156104025760019261240a575b505b016122bb565b5f61241491613a57565b8d612402565b90939091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561040d575f9283608492604051978895869463c608c7f360e01b86523360048701526024860152604485015260018060a01b031660648401525af19182156104025760019261249c575b50612404565b5f6124a691613a57565b8d612496565b50949950949297600192975060205f80516020615998833981519152919792975b604051908152a10193949691959092966121c3565b335f908152609a60205260408120546001600160a01b0316999897969594939291905b61251d60a08051608051010160a05160805101613f18565b90508110156127d65761253a6122f2608060a05181510101614c46565b8c73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08261256f6117e16117d260a08051608051010160a05160805101613f18565b16036126a0575061258560a05160805101613d9a565b60a0516080517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169392916125cd918491611837910160c0810190613f18565b3592803b1561040d576040516303a041cf60e21b81526001600160a01b03831660048201526024810194909452602090849060449082905f905af18015610402575f9061266e575b6001600160a01b038281165f908152609a6020526040902054600195501680612643575b5050505b01612505565b61266692611b1e6117e18661183760a08051608051010160a05160805101613f18565b8e8080612639565b506020833d8211612698575b8161268760209383613a57565b810103126104125760019251612615565b3d915061267a565b906126d86117e1828d60018060a01b037f00000000000000000000000000000000000000000000000000000000000000001695613d8a565b6126f76117e18361183760a08051608051010160a05160805101613f18565b9060c060a051608051010191612717846118378560a05160805101613f18565b3594803b1561040d5760405163c4623ea160e01b81523360048201526001600160a01b03938416602482015291909216604482015260648101949094525f908490608490829084905af1928315610402576001936127c6575b508c8061277f575b505061263d565b6127bf916127b6846118376127a96117e18361183760a08051608051010160a05160805101613f18565b9360a05160805101613f18565b359133906153dc565b8e8c612778565b5f6127d091613a57565b8f612770565b5095949a509591975095505f805160206159988339815191526020600193996124cd565b61281260a08051608051010160a05160805101613f18565b8b14905061229f5760405162461bcd60e51b815260206004820152604260248201525f8051602061597883398151915260448201527f645769746864726177616c3a20696e707574206c656e677468206d69736d61746064820152610c6d60f31b608482015260a490fd5b634e487b7160e01b5f52603260045260245ffd5b613eb1565b600160c955005b34610417576020366003190112610412576001600160a01b036128be613856565b165f52609b602052602060405f2054604051908152f35b34610417576128e336613967565b90337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316148015612964575b612920906140f0565b6001600160a01b038084165f908152609a60205260409020541661294057005b6001600160a01b038084165f908152609a60205260409020546104779491166153dc565b50337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614612917565b346104175760c0366003190112610412576129af613856565b6129b761386c565b604435906084356001600160401b0381116108f3576129da903690600401613817565b60a4929192356001600160401b0381116108f3576129fc903690600401613817565b9390925f549660ff8860081c161597888099612bf5575b8015612bde575b15612b825760ff1981166001175f5588612b71575b506065546001600160a01b03161580612b5f575b15612ae457612a88612a989288612aa8996066556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2614eaf565b612a90615236565b6097556152a8565b612aa36064356152f0565b615068565b612aae57005b61ff00195f54165f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a1005b60405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a490fd5b506001600160a01b0382161515612a43565b61ffff1916610101175f5588612a2f565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b158015612a1a5750600160ff821614612a1a565b50600160ff821610612a13565b34610417575f3660031901126104125760206040517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8668152f35b34610417576060366003190112610412576020610436612c5a613856565b612c6261386c565b6001600160a01b0382165f908152609b8552604090205460443592614341565b34610417576020366003190112610412576001600160a01b03612ca3613856565b165f526099602052602063ffffffff600160405f20015460a01c16604051908152f35b34610417576040366003190112610412576004356001600160401b0381116108f357612cf6903690600401613817565b602435916001600160401b0383116108f357612d19610477933690600401613817565b929091612aa3615010565b3461041757602036600319011261041257606554600435906001600160a01b0316803b1561040d5760206024916040519283809263237dfb4760e11b82523360048301525afa801561040257612d80915f91612e28575061417a565b60665481811603612dbd57806066556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2005b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b612e41915060203d602011611f9757611f898183613a57565b83611f35565b3461041757612e5536613967565b90337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316148015612ed6575b612e92906140f0565b6001600160a01b038084165f908152609a602052604090205416612eb257005b6001600160a01b038084165f908152609a6020526040902054610477949116614f89565b50337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614612e89565b3461041757602036600319011261041257612f21613856565b6065546001600160a01b031690813b1561040d5760206004926040519384809263755b36bd60e11b82525afa9182156104025761047792612f73915f91612f7857506001600160a01b03163314614091565b614eaf565b612f91915060203d6020116103fb576103ed8183613a57565b84610318565b346104175736600319016080811261041257606013611e59576064356001600160401b0381116108f357612fcf90369060040161393a565b335f908152609a60205260409020546001600160a01b031661329357612ff433614c57565b604051613000816139f2565b6060815260208101905f825261301d600180606654161415613e33565b335f908152609960205260409020600101546001600160a01b03169081151580613289575b80613282575b613185575b5050335f818152609a6020526040812080546001600160a01b0319168317905590915081907fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049080a361309f336143c3565b925f5b82518110156130de576001906130d86001600160a01b036130c38387613fe4565b51166130cf8389613fe4565b519033336153dc565b016130a2565b50604051836004356001600160a01b03811690819003611e555782526024356001600160a01b03811690819003611e555760208301526044359063ffffffff8216809203611e555782610ff19260407f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080909501527f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e260603392a2604051918291339583613ff8565b8251421161078457815f52609c60205260405f205f805260205260ff60405f2054166107195761327a92825f52609c60205260405f205f805260205260405f20600160ff198254161790555160405160208101917f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad83528460408301523360608301523360808301525f60a083015260c082015260c0815261322860e082613a57565b51902061326161326f613239614704565b92604051928391602083019586909160429261190160f01b8352600283015260228201520190565b03601f198101835282613a57565b5190209051916154fd565b82808061304d565b505f613048565b5081331415613042565b60405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a2063616c6c657220697320616c7265616479206163746976656c796064820152690819195b1959d85d195960b21b608482015260a490fd5b34610417576020366003190112610412576004356001600160401b0381116108f357613341903690600401613817565b90613353600280606654161415613e33565b61335c82613e7f565b90335f52609a60205260018060a01b0360405f2054165f5b8481106133895760405180610a1186826138ac565b61339d613397828786613ef6565b80613f18565b90506133b76133ad838887613ef6565b6020810190613f18565b919050036134b657336001600160a01b036133de60406133d8858a89613ef6565b01613d9a565b160361344b5760019061343a84876134328461342a6134206133ad613417613397858861341160406133d884848f613ef6565b9a613ef6565b9490968d613ef6565b9490923691613af1565b923691613b63565b918633614739565b6134448287613fe4565b5201613374565b60405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a2077697468647261776572206d757374206265207374616b6572000000006064820152608490fd5b60405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608490fd5b346104175760a036600319011261041257602061043661353f613856565b61354761386c565b90613550613882565b6084359260643592613dae565b34610417575f3660031901126104125760206040517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad8152f35b3461361c576020366003190112610412576004356001600160401b0381116108f3576135c7903690600401613817565b609d54915f5b8281106135df57602084604051908152f35b6001600160a01b036135f56117e1838686613d8a565b165f5260a160205260405f2054848111613613575b506001016135cd565b9350600161360a565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b9181601f84011215613851578235916001600160401b03831161384c576020808501948460051b01011161384757565b6137be565b613765565b61370c565b600435906001600160a01b0382168203611e5557565b602435906001600160a01b0382168203611e5557565b604435906001600160a01b0382168203611e5557565b35906001600160a01b0382168203611e5557565b60206040818301928281528451809452019201905f5b8181106138cf5750505090565b82518452602093840193909201916001016138c2565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a207374727563742063616c6c6461746120746f6044820152661bc81cda1bdc9d60ca1b6064820152608490fd5b9181601f84011215613851578235916001600160401b03831161384c576020838186019501011161384757565b6060906003190112610412576004356001600160a01b0381168103611e5557906024356001600160a01b0381168103611e55579060443590565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b604081019081106001600160401b03821117613a0d57604052565b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b03821117613a0d57604052565b60e081019081106001600160401b03821117613a0d57604052565b90601f801991011681019081106001600160401b03821117613a0d57604052565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b359063ffffffff82168203611e5557565b6001600160401b038111613a0d5760051b60200190565b929190613afd81613ada565b93613b0b6040519586613a57565b602085838152019160051b810192831161384757905b828210613b2d57505050565b60208091613b3a84613898565b815201910190613b21565b9080601f8301121561385157816020613b6093359101613af1565b90565b929190613b6f81613ada565b93613b7d6040519586613a57565b602085838152019160051b810192831161384757905b828210613b9f57505050565b8135815260209182019101613b93565b919060e083820312613c725760405190613bc882613a3c565b8193613bd381613898565b8352613be160208201613898565b6020840152613bf260408201613898565b604084015260608101356060840152613c0d60808201613ac9565b608084015260a08101356001600160401b038111613c6d5782613c31918301613b45565b60a084015260c0810135906001600160401b038211613c6d570181601f820112156138515760c091816020613c6893359101613b63565b910152565b613a78565b6139a1565b9190604083820312613c725760405190613c90826139f2565b819380356001600160401b038111613c6d5781019082601f83011215613851578135926001600160401b038411613a0d5760405190613cd9601f8601601f191660200183613a57565b84825260208585010111613d02575f602085819682809701838601378301015284520135910152565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b90602080835192838152019201905f5b818110613d745750505090565b8251845260209384019390920191600101613d67565b919081101561287d5760051b0190565b356001600160a01b0381168103611e555790565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad602082019081526001600160a01b0395861692820192909252918416606083015292909116608082015260a081019290925260c080830193909352918152613e1c60e082613a57565b519020613261613e2d613239614704565b51902090565b15613e3a57565b60405162461bcd60e51b815260206004820152601960248201527f5061757361626c653a20696e64657820697320706175736564000000000000006044820152606490fd5b90613e8982613ada565b613e966040519182613a57565b8281528092613ea7601f1991613ada565b0190602036910137565b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206f6666736574000000006044820152606490fd5b919081101561287d5760051b81013590605e1981360301821215612891570190565b903590601e198136030182121561289157018035906001600160401b038211613f9257602001918160051b36038313613f4d57565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c64617461207461696c20746f6f2073686f72740000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206c656e677468000000006044820152606490fd5b80511561287d5760200190565b805182101561287d5760209160051b010190565b90918060409360208452816020850152848401375f828201840152601f01601f1916010190565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b9081602091031261041257516001600160a01b0381168103611e555790565b1561409857565b60405162461bcd60e51b815260206004820152602a60248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526939903ab73830bab9b2b960b11b6064820152608490fd5b156140f757565b60405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60448201527f616e616765724f72456967656e506f644d616e616765720000000000000000006064820152608490fd5b9081602091031261041257518015158103611e555790565b1561418157565b60405162461bcd60e51b815260206004820152602860248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526739903830bab9b2b960c11b6064820152608490fd5b156141de57565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b80516001600160a01b039081168352602080830151821681850152604080840151909216918401919091526060808301519084015260808083015163ffffffff169084015260a08083015160e091850182905280519185018290526101008501939201905f5b8181106142d25750505060c001519160c0818303910152602080835192838152019201905f5b8181106142bc5750505090565b82518452602093840193909201916001016142af565b82516001600160a01b0316855260209485019490920191600101614289565b604051613e2d816132616020820194602086526040830190614223565b6001600160a01b03168015159081614324575090565b5f818152609a60205260409020546001600160a01b031614919050565b92906040519260208401947f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b865260018060a01b0316604085015260018060a01b03166060840152608083015260a082015260a08152613e1c60c082613a57565b919082018092116143af57565b634e487b7160e01b5f52601160045260245ffd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561040d576040516360f4062b60e01b81526001600160a01b039092166004830181905290602090839060249082905afa918215610402575f926146d0575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561040d575f906024604051809481936394f649dd60e01b835260048301525afa908115610402575f905f926145bf575b505f8313156145b957805180614506575050509060408051926144b08285613a57565b60018452614501601f198301928336602088013785936144d282519283613a57565b6001825236602083013773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06144fb8297613fd7565b52613fd7565b529190565b600181018091116143af5761451a90613e7f565b906145258251613e7f565b945f5b825181101561456f576001906001600160a01b036145468286613fe4565b51166145528287613fe4565b5261455d8187613fe4565b51614568828a613fe4565b5201614528565b50939192505081515f1981019081116143af576145a173beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac09184613fe4565b5281515f1981019081116143af576145019085613fe4565b92909150565b9150503d805f833e6145d18183613a57565b8101906040818303126104125780516001600160401b0381116108f35781019082601f8301121561385157815161460781613ada565b926146156040519485613a57565b81845260208085019260051b8201019085821161384757602001915b8183106146b0575050506020810151906001600160401b0382116108f357019180601f8401121561385157825161466781613ada565b936146756040519586613a57565b81855260208086019260051b82010192831161384757602001905b8282106146a0575050505f61448d565b8151815260209182019101614690565b82516001600160a01b0381168103611e5557815260209283019201614631565b9091506020813d6020116146fc575b816146ec60209383613a57565b810103126104125751905f61442e565b3d91506146df565b467f0000000000000000000000000000000000000000000000000000000000000000036147315760975490565b613b60615236565b93949392916001600160a01b038416918215614bc257835115614b41575f5b8451811015614a77576001600160a01b038216614a48575b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b036147978388613fe4565b511603614834577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906147d3818a613fe4565b5191803b1561040d5760405163beffbb8960e01b81526001600160a01b038916600482015260248101939093525f908390604490829084905af191821561040257600192614824575b505b01614758565b5f61482e91613a57565b5f61481c565b6001600160a01b038316841480156149b8575b156148f5576001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691906148838288613fe4565b511661488f828b613fe4565b51833b1561040d57604051638c80d4e560e01b81526001600160a01b038a811660048301529290921660248301526044820152915f908390606490829084905af1918215610402576001926148e5575b5061481e565b5f6148ef91613a57565b5f6148df565b60e460405162461bcd60e51b815260206004820152608460248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a2077697468647261776572206d7560648201527f73742062652073616d652061646472657373206173207374616b65722069662060848201527f746869726450617274795472616e7366657273466f7262696464656e2061726560a482015263081cd95d60e21b60c4820152fd5b506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116906149ef8388613fe4565b5116813b1561040d57602090602460405180948193639b4da03d60e01b835260048301525afa908115610402575f91614a2a575b5015614847565b614a42915060203d8111611f9757611f898183613a57565b5f614a23565b614a726001600160a01b03614a5d8388613fe4565b5116614a69838b613fe4565b51908885614f89565b614770565b505f838152609f60205260409020805496979396939550835f1981146143af57600101905560405195614aa987613a3c565b86526001600160a01b03908116602087015216604085015260608401524363ffffffff16608084015260a083015260c08201527f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f9614b3b614b09836142f1565b92835f52609e60205260405f20600160ff19825416179055604051918291858352604060208401526040830190614223565b0390a190565b60405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374726174656769657320636160648201526c6e6e6f7420626520656d70747960981b608482015260a490fd5b60405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a490fd5b3563ffffffff81168103611e555790565b6044359063ffffffff821690818303611e55576213c6808211614e095760018060a01b031690815f52609960205263ffffffff600160405f20015460a01c1611614d82575f908152609960205260409020600435906001600160a01b0382168203611e555780546001600160a01b0319166001600160a01b0392831617815560010191906024359081168103611e555782546001600160c01b0319166001600160a01b039182161760a09290921b63ffffffff60a01b169190911790915560405160608101917ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac9190614d4a6004613898565b1681526001600160a01b03614d5f6024613898565b16602082015263ffffffff614d746044613ac9565b1660408201528033930390a2565b60405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a490fd5b60405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c490fd5b6001600160a01b03168015614f0c57606554604080516001600160a01b0383168152602081018490527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb69190a16001600160a01b03191617606555565b60405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a490fd5b6001600160a01b039081165f8181526098602090815260408083209487168352939052919091208054919480830394939285116143af57939055604080516001600160a01b0392831681529290911660208301528101919091527f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd9080606081015b0390a2565b6033546001600160a01b0316330361502457565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b9190918383036151b8575f5b838110615082575050505050565b6001600160a01b036150986117e1838786613d8a565b1690815f5260a160205260405f20546150b2828887613d8a565b359062034bc0821161510b57837f0e7efa738e8b0ce6376a0c1af471655540d2e9a81647d7b09ed823018426576d926060926001965f5260a16020528160405f205560405192835260208301526040820152a101615074565b60405162461bcd60e51b815260206004820152607360248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a205f7769746864726177616c60648201527f44656c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544860848201527244524157414c5f44454c41595f424c4f434b5360681b60a482015260c490fd5b60405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a20696e707574206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a490fd5b600a6020604051615248604082613a57565b828152016922b4b3b2b72630bcb2b960b11b81522060405160208101917f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8668352604082015246606082015230608082015260808152613e2d60a082613a57565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b62034bc08111615331577fafa003cd76f87ff9d62b35beea889920f33c0c42b8d45b74954d61d50f4b6b696040609d548151908152836020820152a1609d55565b60405162461bcd60e51b815260206004820152607160248201527f44656c65676174696f6e4d616e616765722e5f7365744d696e5769746864726160448201527f77616c44656c6179426c6f636b733a205f6d696e5769746864726177616c446560648201527f6c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544844526084820152704157414c5f44454c41595f424c4f434b5360781b60a482015260c490fd5b9061500b7f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c939260018060a01b031694855f52609860205260405f2060018060a01b0385165f5260205260405f206154358282546143a2565b9055604080516001600160a01b0394851681529490931660208501529183019190915281906060820190565b1561546857565b60405162461bcd60e51b815260206004820152606e60248201525f8051602061597883398151915260448201527f645769746864726177616c3a207769746864726177616c44656c6179426c6f6360648201527f6b7320706572696f6420686173206e6f74207965742070617373656420666f7260848201526d207468697320737472617465677960901b60a482015260c490fd5b803b15615652576001600160a01b031691823b1561040d5760209283926064604051809681958294630b135d3f60e11b84526004840152604060248401528051918291826044860152018484015e5f828201840152601f01601f191681010301915afa908115610402575f9161560f575b506001600160e01b0319166374eca2c160e11b0161558857565b60405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a490fd5b90506020813d60201161564a575b8161562a60209383613a57565b8101031261041257516001600160e01b031981168103611e55575f61556e565b3d915061561d565b9061566892615660916156f7565b929092615765565b6001600160a01b0390811691160361567c57565b60405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a490fd5b81516041810361572357509061571f91602082015190606060408401519301515f1a906158d5565b9091565b60400361575c5760406020830151920151918260ff1c91601b83018093116143af5761571f936001600160ff1b03169260ff16906158d5565b50505f90600290565b60058110156158c157806157765750565b600181036157c35760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b600281036158105760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b600381036158685760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b60041461587157565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608490fd5b634e487b7160e01b5f52602160045260245ffd5b907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841161596c5760ff1690601b82141580615961575b615956576020935f93608093604051938452868401526040830152606082015282805260015afa15610402575f516001600160a01b0381161561594e57905f90565b505f90600190565b505050505f90600490565b50601c82141561590c565b505050505f9060039056fe44656c65676174696f6e4d616e616765722e5f636f6d706c6574655175657565c97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1da2646970667358221220cfca47a548425704fe847a78f3d1dc84b2d2fc771bb6f6ab49da774e5eba17f564736f6c634300081a0033"; type DelegationManagerConstructorParams = | [signer?: Signer] diff --git a/src/avs/contracts/factories/ECDSAStakeRegistry__factory.ts b/src/avs/contracts/factories/ECDSAStakeRegistry__factory.ts index 57f4b494..9e174a2b 100644 --- a/src/avs/contracts/factories/ECDSAStakeRegistry__factory.ts +++ b/src/avs/contracts/factories/ECDSAStakeRegistry__factory.ts @@ -827,7 +827,7 @@ const _abi = [ ] as const; const _bytecode = - "0x60a080604052346100dc57604051601f61297e38819003918201601f19168301916001600160401b038311848410176100c65780849260209460405283398101031261007657516001600160a01b038116810361007157608052604051612854908161012a8239608051816116e40152f35b600080fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b600052604160045260246000fd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fdfe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b6000803560e01c8062cf2ab514610fb45780630dba339414610f8b5780631626ba7e14610c4e5780631703a01814610bfe5780631e4cd85e14610bd5578063314f3a4914610bbb5780633b242e4a14610b825780633d5611f61461098f57806340bf2fb7146109725780635140a548146108665780635e1042e8146108205780635ef53329146107fb578063696255be14610780578063715018a614610723578063743c31f4146106db578063857dc190146105c45780638da5cb5b1461059c578063955f2d901461054b57806398ec1ac914610520578063ab1189951461038b578063b933fa7414610322578063cdcd3581146102d7578063dec5d1f614610268578063ec7fbb31146102295763f2fde38b1461018f575061000e565b3461022457602036600319011261021f576101a861120e565b6101b0611b83565b6001600160a01b038116156101cb576101c890611db2565b80f35b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b611038565b610fe8565b503461022457602036600319011261021f5760209060ff906040906001600160a01b0361025461120e565b168152606e84522054166040519015158152f35b503461022457604036600319011261021f576004356001600160401b0381116102d25761029990369060040161145d565b602435906001600160401b0382116102d2576102cd6102bf6101c8933690600401611229565b916102c8611b83565b611ee3565b6118c0565b611088565b503461022457602036600319011261021f576020906001600160a01b036102fc61120e565b168152606a8252604090206001600160a01b039061031990611b4f565b16604051908152f35b5034610224578060031936011261021f57606c54908161035457602091505b6040516001600160e01b03919091168152f35b6000198201918211610377575061036e602091606c611910565b5054811c610341565b634e487b7160e01b81526011600452602490fd5b503461022457606036600319011261021f576103a561120e565b6044356001600160401b0381116102d2576103c490369060040161145d565b82549060ff8260081c161592838094610513575b80156104fc575b156104a05760ff198316600117855561042f928461048f575b5061040960ff865460081c16611e83565b60018060a01b03166001600160601b0360a01b60685416176068556102c8602435611bdb565b61044860ff835460081c1661044381611e83565b611e83565b61045133611db2565b6104585780f35b61ff001981541681557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a180f35b61ffff1916610101178555386103f8565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b1580156103df5750600160ff8416146103df565b50600160ff8416106103d8565b3461022457602036600319011261021f57602061054361053e61120e565b61166a565b604051908152f35b503461022457604036600319011261021f5761056561120e565b6024359063ffffffff8216809203610598576001600160a01b03168252606d602090815260409092206105439190611aac565b8280fd5b50346102245736600319011261021f576033546040516001600160a01b039091168152602090f35b5034610224578060031936011261021f57338152606e60205260ff604082205416156106cc5760655480156106b85760001901606555338152606e6020526040812060ff19815416905561061f61061a33612065565b612299565b50506068546001600160a01b0316803b156106b357818080926024604051809481936351b27a6d60e11b83523360048401525af180156106a857610693575b506068546001600160a01b0316337f31e0adfec71bccee37b6e83a90c2fedb17d8f1693fee863c4771e7bfe2aed5808380a380f35b8161069d9161117d565b61021f57803861065e565b6040513d84823e3d90fd5b6115f4565b634e487b7160e01b82526011600452602482fd5b6325ec6c1f60e01b8152600490fd5b503461022457602036600319011261021f576106f561120e565b338252606e60205260ff60408320541615610714576101c89033611dfb565b6325ec6c1f60e01b8252600482fd5b5034610224578060031936011261021f5761073c611b83565b603380546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461022457604036600319011261021f576024356004356001600160401b0382116102d2577f713ca53b88d6eb63f5b1854cb8cbdd736ec51eda225e46791aa9298b0160648f60406107da6101c8943690600401611229565b926107e3611b83565b606754908060675582519182526020820152a16118c0565b503461022457602036600319011261021f57610815611b83565b6101c8600435611bdb565b503461022457604036600319011261021f576020906001600160a01b0361084561120e565b168152606a8252604090206001600160a01b03906103199060243590611aac565b503461022457604036600319011261021f576004356001600160401b0381116102d25736602382011215610968578060040135906108a38261119e565b906108b1604051928361117d565b82825260208201906024829460051b8201019036821161096d5760248101925b82841061093957505050506024356001600160401b0381116102d2576108fb90369060040161131a565b5051156109255751805160655403610916576101c8906118c0565b63169efb5b60e11b8252600482fd5b634e487b7160e01b82526032600452602482fd5b83356001600160401b0381116109685760209161095d839260243691870101611229565b8152019301926108d1565b6110d8565b6111b5565b50346102245736600319011261021f576020606754604051908152f35b503461022457604036600319011261021f576004356001600160401b0381116102d25760606003198236030112610b7d5760405190606082018281106001600160401b03821117610b695760405280600401356001600160401b038111610b6457610a00906004369184010161131a565b8252602082019160248201358352604460408201920135825260243560018060a01b0381168103610b6057338552606e60205260ff604086205416610b51576065546000198114610b3d57906001610a819201606555338652606e60205260408620600160ff19825416179055610a7961061a33612065565b505033611dfb565b6068546001600160a01b031691823b156106b3578492610ad084809460405197889586948593639926ee7d60e01b855233600486015260406024860152516060604486015260a4850190611b5e565b9151606484015251608483015203925af18015610b3057610b20575b6068546001600160a01b0316337fa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c18380a380f35b610b299161117d565b3881610aec565b50604051903d90823e3d90fd5b634e487b7160e01b86526011600452602486fd5b6342ee68b560e01b8552600485fd5b8480fd5b61140c565b634e487b7160e01b84526041600452602484fd5b6113bb565b503461022457602036600319011261021f57602090610543906040906001600160a01b03610bae61120e565b168152606d845220611b4f565b50346102245736600319011261021f576020610543611b41565b3461022457602036600319011261021f57602061054363ffffffff610bf8611297565b16611a16565b50346102245736600319011261021f576060604051610c1c81611131565b52610c4a604051610c2c81611131565b610c34611551565b8152604051918291602083526020830190611361565b0390f35b503461022457604036600319011261021f576004356024356001600160401b0381116102d257610c8290369060040161131a565b9081518201906060836020840193031261021f5760208301516001600160401b0381116102d25783019282603f85011215610968576020840151610cc58161119e565b94610cd3604051968761117d565b8186526020808088019360051b830101019085821161096d57604001915b818310610f675750505060408101516001600160401b0381116102d257810183603f8201121561096857602081015190610d2a8261119e565b94610d38604051968761117d565b8286526020808088019460051b840101019181831161096d5760408101935b838510610ef5575050505050606001519063ffffffff8216809203610b60578351908590869480518403610ee3578315610ed45794959394438610159488935b858510610e0457505050505050610df557610db181611928565b8211610de657610dc090611a16565b11610dd757604051630b135d3f60e11b8152602090f35b63e121632f60e01b8152600490fd5b634b05a0f760e11b8352600483fd5b63e64f180f60e01b8352600483fd5b60018060a09a939495969998979a1b03610e1e89856115ca565b511695610ec557858a52606a60205260408a2086906001600160a01b0390610e47908a90611aac565b16916001600160a01b03161015610eb657610e6e9085610e678a876115ca565b519161255b565b15610ea757906001610e9a8a959493610e948960408a99809b8152606d60205220611aac565b90611647565b9701939794959697610d97565b638baa579f60e01b8952600489fd5b63ba50f91160e01b8a5260048afd5b63e64f180f60e01b8a5260048afd5b63251f56a160e21b8852600488fd5b6001621398b960e31b03198852600488fd5b84516001600160401b038111610968576020908301019083603f8301121561096857602082015190610f26826112ff565b610f33604051918261117d565b8281526040848401018610610f6257610f576020949385946040868501910161152e565b815201940193610d57565b6112aa565b82516001600160a01b0381168103610f8757815260209283019201610cf1565b8880fd5b3461022457602036600319011261021f57602061054363ffffffff610fae611297565b16611928565b5034610fe857602036600319011261021f576004356001600160401b0381116102d2576102cd6101c8913690600401611229565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b602081019081106001600160401b0382111761114c57604052565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761114c57604052565b90601f801991011681019081106001600160401b0382111761114c57604052565b6001600160401b03811161114c5760051b60200190565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b600435906001600160a01b038216820361122457565b600080fd5b9080601f83011215610968578135906112418261119e565b9261124f604051948561117d565b82845260208085019360051b82010191821161096d57602001915b8183106112775750505090565b82356001600160a01b03811681036112245781526020928301920161126a565b6004359063ffffffff8216820361122457565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b6001600160401b03811161114c57601f01601f191660200190565b81601f8201121561096857803590611331826112ff565b9261133f604051948561117d565b82845260208383010111610f6257816000926020809301838601378301015290565b6020604081840192519382815284518094520192019060005b8181106113875750505090565b825180516001600160a01b031685526020908101516001600160601b0316818601526040909401939092019160010161137a565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b9190602083820312610b7d5760405161147581611131565b80938035906001600160401b038211610b64570182601f82011215610968578035906114a08261119e565b936114ae604051958661117d565b82855260208086019360061b8301019181831161096d57602001925b8284106114d8575050505052565b604084830312610b7d57604051906114ef82611162565b84356001600160a01b03811681036112245782526020850135906001600160601b038216820361122457826020928360409501528152019301926114ca565b60005b8381106115415750506000910152565b8181015183820152602001611531565b6066549061155e8261119e565b9161156c604051938461117d565b808352606660009081526000805160206127ff833981519152602085015b8383106115975750505050565b6001602081926040516115a981611162565b8554848060a01b038116825260a01c8382015281520192019201919061158a565b80518210156115de5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b9190820180921161165457565b634e487b7160e01b600052601160045260246000fd5b611672611551565b80519092600061169a6116848461119e565b93611692604051958661117d565b80855261119e565b602084019490601f190136863760005b86518110156116dc576001906001600160a01b036116c8828a6115ca565b5151166116d582886115ca565b52016116aa565b5091939092917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169190823b156106b35760408051639004134760e01b81526001600160a01b03909216600483015260248201529251604484018190528391606483019160005b8181106118825750505091818060009403915afa908115611876576000916117e5575b506000915b84518310156117c55761178683836115ca565b51906001600160601b03602061179c86896115ca565b5101511691828102928184041490151715611654576001916117bd91611647565b920191611773565b915050612710919250046067548110156000146117df5790565b50600090565b90503d806000833e6117f7818361117d565b81019060208183031261021f578051906001600160401b0382116102d257019080601f8301121561096857815161182d8161119e565b9261183b604051948561117d565b81845260208085019260051b82010192831161096d57602001905b828210611866575050503861176e565b8151815260209182019101611856565b6040513d6000823e3d90fd5b82516001600160a01b031684528694506020938401939092019160010161174b565b9190916000838201938412911290801582169115161761165457565b906000805b83518210156118ff576001906118f7906118f16001600160a01b036118ea86896115ca565b5116612065565b906118a4565b9101906118c5565b905061190c919250612299565b5050565b80548210156115de5760005260206000200190600090565b438110156119d257606b54906000905b82821061197757505080611956575060005b6001600160e01b031690565b60001981019081116116545761196d90606b611910565b505460201c61194a565b909161198a81841860011c828516611647565b908263ffffffff61199c84606b611910565b50541611156119ae5750915b90611938565b925060018101809111156119a857634e487b7160e01b600052601160045260246000fd5b606460405162461bcd60e51b815260206004820152602060248201527f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e65646044820152fd5b438110156119d257606c54906000905b828210611a5157505080611a3a5750600090565b60001981019081116116545761196d90606c611910565b9091611a6481841860011c828516611647565b908263ffffffff611a7684606c611910565b5054161115611a885750915b90611a26565b92506001810180911115611a8257634e487b7160e01b600052601160045260246000fd5b90438110156119d2578154906000905b828210611ae757505080611ad257506000919050565b60001981019081116116545761196d91611910565b9091611afa81841860011c828516611647565b908263ffffffff611b0b8488611910565b5054161115611b1d5750915b90611abc565b92506001810180911115611b1757634e487b7160e01b600052601160045260246000fd5b606b54806119565750600090565b805480611ad257506000919050565b90602091611b778151809281855285808601910161152e565b601f01601f1916010190565b6033546001600160a01b03163303611b9757565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b6000606c5490611beb606c611b4f565b9180151580611d77575b15611c6757611c0384612677565b916000198201918211610377575091611c5d7f9324f7e5a7c0288808a634ccde44b8e979676474b22e29ee9dd569b55e791a4b9492611c45602095606c611910565b509063ffffffff82549181199060201b169116179055565b50604051908152a1565b63ffffffff4311611d2357611c7b84612677565b9060405190611c8982611162565b4363ffffffff1682526001600160e01b039092166020820190815291600160401b811015610b6957806001611cc39201606c55606c611910565b939093611d0f575051905163ffffffff90911663ffffffff19602092831b16179091557f9324f7e5a7c0288808a634ccde44b8e979676474b22e29ee9dd569b55e791a4b929091611c5d565b634e487b7160e01b81526004819052602490fd5b60405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608490fd5b506000198101818111611d9e57611d9463ffffffff91606c611910565b5054164314611bf5565b634e487b7160e01b83526011600452602483fd5b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b6001600160a01b039081166000818152606a6020526040902090929190611e2190611b4f565b6001600160a01b0390921692911690828214611e7e5780600052606a602052611e4e8360406000206123cd565b50506040519182527fd061168252f441733658f09e4d8f5b2d998ed4ef24a2bbfd6ceca52ea131500260204393a4565b505050565b15611e8a57565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b611eec816124ce565b1561203b5760405191611efe83611131565b611f06611551565b8352606654600060665580611ffd575b5060005b82518051821015611faa5781611f2f916115ca565b51606654600160401b81101561114c57600181016066556000606654821015611f965760669052815160209092015160a01b6001600160a01b0319166001600160a01b0392909216919091176000805160206127ff83398151915290910155600101611f1a565b634e487b7160e01b81526032600452602490fd5b505091611fea90611ff87f23aad4e61744ece164130aa415c1616e80136b0f0770e56589438b90b269265e93604051938493604085526040850190611361565b908382036020850152611361565b0390a1565b60666000526000805160206127ff833981519152016000805160206127ff8339815191525b81811061202f5750611f16565b60008155600101612022565b63d173577960e01b60005260046000fd5b8181039291600013801582851316918412161761165457565b6001600160a01b0381166000818152606d60205260408120909290839061208b90611b4f565b9183600052606e60205260ff60406000205416156000146122385750816120b19161204c565b9283156122325782600052606d6020526040600020600081546120d383611b4f565b92811515806121f8575b1561213d576120eb83612677565b926000198301928311610377575060409492611c457f88770dc862e47a7ed586907857eb1b75e4c5ffc8b707c7ee10eb74d6885fe59497959361212d93611910565b505b82519182526020820152a290565b63ffffffff4311611d235761215183612677565b916040519161215f83611162565b4363ffffffff1683526001600160e01b039093166020830190815292600160401b8210156121e4579061219791600182018155611910565b939093611d0f575051905160201b63ffffffff191663ffffffff919091161790557f88770dc862e47a7ed586907857eb1b75e4c5ffc8b707c7ee10eb74d6885fe59492604092909161212d565b634e487b7160e01b85526041600452602485fd5b50600019820182811161221e5761221463ffffffff9183611910565b50541643146120dd565b634e487b7160e01b84526011600452602484fd5b50505090565b905061224591935061166a565b91612250818461204c565b928315612232577f88770dc862e47a7ed586907857eb1b75e4c5ffc8b707c7ee10eb74d6885fe5949160409184600052606d60205261229281846000206123cd565b505061212f565b906122ac6122a5611b41565b92836118a4565b906000606b54906122bd606b611b4f565b91801515806123a6575b15612324576122d585612677565b916000198201918211610377575090611c456122f292606b611910565b507f86dcf86b12dfeedea74ae9300dbdaa193bcce5809369c8177ea2f4eaaa65729b60408051858152846020820152a1565b63ffffffff4311611d235761233885612677565b906040519061234682611162565b4363ffffffff1682526001600160e01b039092166020820190815291600160401b811015610b69578060016123809201606b55606b611910565b939093611d0f575051905160201b63ffffffff191663ffffffff919091161790556122f2565b506000198101818111611d9e576123c363ffffffff91606b611910565b50541643146122c7565b91909180546123db82611b4f565b91811515806124a8575b15612411576123f385612677565b9060001983019283116116545761240d92611c4591611910565b9190565b63ffffffff4311611d235761242585612677565b906040519261243384611162565b4363ffffffff1684526001600160e01b039092166020840190815291600160401b81101561114c5761246a91600182018155611910565b919091612492579151915160201b63ffffffff191663ffffffff929092169190911790559190565b634e487b7160e01b600052600060045260246000fd5b506000198201828111611654576124c463ffffffff9183611910565b50541643146123e5565b5190600080805b8451821015612543576001600160a01b036124f083876115ca565b515116906001600160a01b031681111561253257612529600191936001600160601b03602061251f868a6115ca565b5101511690611647565b910190916124d5565b63ba50f91160e01b60005260046000fd5b5091925061271014905061255657600090565b600190565b91909161256882846126e6565b60058110156126615715908161264b575b50612643576000926125b46125c285946040519283916020830195630b135d3f60e11b87526024840152604060448401526064830190611b5e565b03601f19810183528261117d565b51915afa3d1561263c573d6125d6816112ff565b906125e4604051928361117d565b81523d6000602083013e5b81612630575b816125fe575090565b905060208180518101031261021f57602001516001600160e01b031981169081900361122457630b135d3f60e11b1490565b805160201491506125f5565b60606125ef565b505050600190565b6001600160a01b03838116911614905038612579565b634e487b7160e01b600052602160045260246000fd5b6001600160e01b038111612691576001600160e01b031690565b60405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608490fd5b81516041810361271357509061270f916020820151906060604084015193015160001a90612756565b9091565b60400361274c5760406020830151920151918260ff1c91601b83018093116116545761270f936001600160ff1b03169260ff1690612756565b5050600090600290565b907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116127f25760ff1690601b821415806127e7575b6127db57602093600093608093604051938452868401526040830152606082015282805260015afa15611876576000516001600160a01b038116156127d25790600090565b50600090600190565b50505050600090600490565b50601c82141561278d565b5050505060009060039056fe46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e94354a2646970667358221220bf9b771c1ed8ae1b372153e924d4124619e09577f9575822be560dad4886565f64736f6c634300081a0033"; + "0x60a080604052346100d957604051601f61280f38819003918201601f19168301916001600160401b038311848410176100c55780849260209460405283398101031261007557516001600160a01b0381168103610071576080526040516126e890816101278239608051816116560152f35b5f80fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fdfe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b5f803560e01c8062cf2ab514610f815780630dba339414610f585780631626ba7e14610c495780631703a01814610bf95780631e4cd85e14610bd0578063314f3a4914610bb65780633b242e4a14610b7f5780633d5611f61461098c57806340bf2fb71461096f5780635140a548146108635780635e1042e81461081d5780635ef53329146107f8578063696255be1461077d578063715018a614610720578063743c31f4146106d8578063857dc190146105c25780638da5cb5b1461059a578063955f2d901461054957806398ec1ac91461051e578063ab11899514610389578063b933fa7414610321578063cdcd3581146102d6578063dec5d1f614610267578063ec7fbb31146102285763f2fde38b1461018e575061000e565b3461022357602036600319011261021e576101a76111c6565b6101af611acb565b6001600160a01b038116156101ca576101c790611cdb565b80f35b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b611006565b610fb6565b503461022357602036600319011261021e5760209060ff906040906001600160a01b036102536111c6565b168152606e84522054166040519015158152f35b503461022357604036600319011261021e576004356001600160401b0381116102d15761029890369060040161140e565b602435906001600160401b0382116102d1576102cc6102be6101c79336906004016111dc565b916102c7611acb565b611e08565b61181e565b611056565b503461022357602036600319011261021e576020906001600160a01b036102fb6111c6565b168152606a8252604090206001600160a01b039061031890611a99565b16604051908152f35b5034610223578060031936011261021e57606c54908161035357602091505b6040516001600160e01b03919091168152f35b5f198201918211610375575061036c602091606c61186d565b5054811c610340565b634e487b7160e01b81526011600452602490fd5b503461022357606036600319011261021e576103a36111c6565b6044356001600160401b0381116102d1576103c290369060040161140e565b82549060ff8260081c161592838094610511575b80156104fa575b1561049e5760ff198316600117855561042d928461048d575b5061040760ff865460081c16611da8565b60018060a01b03166001600160601b0360a01b60685416176068556102c7602435611b23565b61044660ff835460081c1661044181611da8565b611da8565b61044f33611cdb565b6104565780f35b61ff001981541681557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a180f35b61ffff19166101011785555f6103f6565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b1580156103dd5750600160ff8416146103dd565b50600160ff8416106103d6565b3461022357602036600319011261021e57602061054161053c6111c6565b6115de565b604051908152f35b503461022357604036600319011261021e576105636111c6565b6024359063ffffffff8216809203610596576001600160a01b03168252606d6020908152604090922061054191906119fc565b8280fd5b50346102235736600319011261021e576033546040516001600160a01b039091168152602090f35b5034610223578060031936011261021e57338152606e60205260ff604082205416156106c95760655480156106b5575f1901606555338152606e6020526040812060ff19815416905561061c61061733611f6d565b61216a565b50506068546001600160a01b0316803b156106b057818080926024604051809481936351b27a6d60e11b83523360048401525af180156106a557610690575b506068546001600160a01b0316337f31e0adfec71bccee37b6e83a90c2fedb17d8f1693fee863c4771e7bfe2aed5808380a380f35b8161069a91611135565b61021e57805f61065b565b6040513d84823e3d90fd5b61157e565b634e487b7160e01b82526011600452602482fd5b6325ec6c1f60e01b8152600490fd5b503461022357602036600319011261021e576106f26111c6565b338252606e60205260ff60408320541615610711576101c79033611d23565b6325ec6c1f60e01b8252600482fd5b5034610223578060031936011261021e57610739611acb565b603380546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461022357604036600319011261021e576024356004356001600160401b0382116102d1577f713ca53b88d6eb63f5b1854cb8cbdd736ec51eda225e46791aa9298b0160648f60406107d76101c79436906004016111dc565b926107e0611acb565b606754908060675582519182526020820152a161181e565b503461022357602036600319011261021e57610812611acb565b6101c7600435611b23565b503461022357604036600319011261021e576020906001600160a01b036108426111c6565b168152606a8252604090206001600160a01b039061031890602435906119fc565b503461022357604036600319011261021e576004356001600160401b0381116102d15736602382011215610965578060040135906108a082611156565b906108ae6040519283611135565b82825260208201906024829460051b8201019036821161096a5760248101925b82841061093657505050506024356001600160401b0381116102d1576108f89036906004016112cd565b5051156109225751805160655403610913576101c79061181e565b63169efb5b60e11b8252600482fd5b634e487b7160e01b82526032600452602482fd5b83356001600160401b0381116109655760209161095a8392602436918701016111dc565b8152019301926108ce565b6110a6565b61116d565b50346102235736600319011261021e576020606754604051908152f35b503461022357604036600319011261021e576004356001600160401b0381116102d15760606003198236030112610b7a57604051606081018181106001600160401b03821117610b665760405281600401356001600160401b038111610b61576109fc90600436918501016112cd565b8152602480830135602083019081526044909301356040830190815290356001600160a01b0381168103610b5d57335f52606e60205260ff60405f205416610b4e57606554905f198214610b3a576001610a7f9201606555335f52606e60205260405f20600160ff19825416179055610a7761061733611f6d565b505033611d23565b6068546001600160a01b0316803b156106b057610acb5f809460405196879586948593639926ee7d60e01b855233600486015260406024860152516060604486015260a4850190611aa7565b9151606484015251608483015203925af18015610b2f57610b1c575b506068546001600160a01b0316337fa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c18380a380f35b610b2891505f90611135565b5f80610ae7565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b6342ee68b560e01b5f5260045ffd5b5f80fd5b6113bd565b634e487b7160e01b5f52604160045260245ffd5b61136c565b3461022357602036600319011261021e576001600160a01b03610ba06111c6565b165f52606d602052602061054160405f20611a99565b34610223575f36600319011261021e576020610541611a8c565b3461022357602036600319011261021e57602061054163ffffffff610bf361124a565b1661196b565b34610223575f36600319011261021e576060604051610c17816110ff565b52610c45604051610c27816110ff565b610c2f6114df565b8152604051918291602083526020830190611313565b0390f35b3461022357604036600319011261021e576004356024356001600160401b0381116102d157610c7c9036906004016112cd565b805181016060826020830192031261021e5760208201516001600160401b0381116102d15782019181603f84011215610965576020830151610cbd81611156565b93610ccb6040519586611135565b8185526020808087019360051b830101019084821161096a57604001915b818310610f385750505060408101516001600160401b0381116102d15781019180603f8401121561096557602083015192610d2384611156565b93610d316040519586611135565b8085526020808087019260051b840101019183831161096a5760408101915b838310610ec95788888860608901519163ffffffff8316809303610b5d578051915f809582518503610eba578415610eab5743861015945f949093925b848610610df757888888610de857610da481611882565b8211610dd957610db39061196b565b11610dca57604051630b135d3f60e11b8152602090f35b63e121632f60e01b5f5260045ffd5b634b05a0f760e11b5f5260045ffd5b63e64f180f60e01b5f5260045ffd5b949793949293926001600160a01b03610e108a84611556565b511696610de857865f52606a6020528660018060a01b03610e348a60405f206119fc565b16916001600160a01b03161015610e9c57610e5b9083610e548b88611556565b51916123fb565b15610e8d576001610e8387945f985f52606d602052610e7d8a60405f206119fc565b906115d1565b9801949392610d8d565b638baa579f60e01b5f5260045ffd5b63ba50f91160e01b5f5260045ffd5b63251f56a160e21b5f5260045ffd5b631fec674760e31b5f5260045ffd5b82516001600160401b0381116109655760209083010185603f8201121561096557602081015191610ef9836112b2565b610f066040519182611135565b8381526040838501018810610f33575f602085819660408397018386015e83010152815201920191610d50565b61125d565b82516001600160a01b0381168103610b5d57815260209283019201610ce9565b3461022357602036600319011261021e57602061054163ffffffff610f7b61124a565b16611882565b34610fb657602036600319011261021e576004356001600160401b0381116102d1576102cc610fb49136906004016111dc565b005b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b602081019081106001600160401b03821117610b6657604052565b604081019081106001600160401b03821117610b6657604052565b90601f801991011681019081106001600160401b03821117610b6657604052565b6001600160401b038111610b665760051b60200190565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b600435906001600160a01b0382168203610b5d57565b9080601f83011215610965578135906111f482611156565b926112026040519485611135565b82845260208085019360051b82010191821161096a57602001915b81831061122a5750505090565b82356001600160a01b0381168103610b5d5781526020928301920161121d565b6004359063ffffffff82168203610b5d57565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b6001600160401b038111610b6657601f01601f191660200190565b81601f82011215610965578035906112e4826112b2565b926112f26040519485611135565b82845260208383010111610f3357815f926020809301838601378301015290565b602060408184019251938281528451809452019201905f5b8181106113385750505090565b825180516001600160a01b031685526020908101516001600160601b0316818601526040909401939092019160010161132b565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b9190602083820312610b7a57604051611426816110ff565b80938035906001600160401b038211610b61570182601f820112156109655780359061145182611156565b9361145f6040519586611135565b82855260208086019360061b8301019181831161096a57602001925b828410611489575050505052565b604084830312610b7a57604051906114a08261111a565b84356001600160a01b0381168103610b5d5782526020850135906001600160601b0382168203610b5d578260209283604095015281520193019261147b565b606654906114ec82611156565b916114fa6040519384611135565b80835260665f9081525f80516020612693833981519152602085015b8383106115235750505050565b6001602081926040516115358161111a565b8554848060a01b038116825260a01c83820152815201920192019190611516565b805182101561156a5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b91908201809211610b3a57565b6115e66114df565b805190925f61160d6115f784611156565b936116056040519586611135565b808552611156565b602084019490601f19013686375f5b865181101561164e576001906001600160a01b0361163a828a611556565b5151166116478288611556565b520161161c565b5091939092917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169190823b156106b05760408051639004134760e01b81526001600160a01b0390921660048301526024820152925160448401819052839160648301915f5b8181106117e1575050509181805f9403915afa908115610b2f575f91611751575b505f915b8451831015611733576116f48383611556565b51906001600160601b03602061170a8689611556565b5101511691828102928184041490151715610b3a5760019161172b916115d1565b9201916116e1565b915050612710919250046067548110155f1461174c5790565b505f90565b90503d805f833e6117628183611135565b81019060208183031261021e578051906001600160401b0382116102d157019080601f8301121561096557815161179881611156565b926117a66040519485611135565b81845260208085019260051b82010192831161096a57602001905b8282106117d1575050505f6116dd565b81518152602091820191016117c1565b82516001600160a01b03168452869450602093840193909201916001016116bc565b9190915f8382019384129112908015821691151617610b3a57565b905f805b835182101561185c576001906118549061184e6001600160a01b036118478689611556565b5116611f6d565b90611803565b910190611822565b905061186991925061216a565b5050565b805482101561156a575f5260205f2001905f90565b4381101561192757606b54905f905b8282106118ce575050806118ae57505f5b6001600160e01b031690565b5f198101908111610b3a576118c490606b61186d565b505460201c6118a2565b90916118e181841860011c8285166115d1565b908263ffffffff6118f384606b61186d565b50541611156119055750915b90611891565b925060018101809111156118ff57634e487b7160e01b5f52601160045260245ffd5b606460405162461bcd60e51b815260206004820152602060248201527f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e65646044820152fd5b4381101561192757606c54905f905b8282106119a35750508061198d57505f90565b5f198101908111610b3a576118c490606c61186d565b90916119b681841860011c8285166115d1565b908263ffffffff6119c884606c61186d565b50541611156119da5750915b9061197a565b925060018101809111156119d457634e487b7160e01b5f52601160045260245ffd5b9043811015611927578154905f905b828210611a3457505080611a2057505f919050565b5f198101908111610b3a576118c49161186d565b9091611a4781841860011c8285166115d1565b908263ffffffff611a58848861186d565b5054161115611a6a5750915b90611a0b565b92506001810180911115611a6457634e487b7160e01b5f52601160045260245ffd5b606b54806118ae57505f90565b805480611a2057505f919050565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b6033546001600160a01b03163303611adf57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b606c5490611b31606c611a99565b9082151580611cb5575b15611ba957611b4981612513565b915f198401938411610b3a57611b9f602093611b877f9324f7e5a7c0288808a634ccde44b8e979676474b22e29ee9dd569b55e791a4b96606c61186d565b509063ffffffff82549181199060201b169116179055565b50604051908152a1565b63ffffffff4311611c6157611bbd81612513565b9160405193611bcb8561111a565b4363ffffffff1685526001600160e01b039093166020850190815292600160401b811015610b6657806001611c059201606c55606c61186d565b949094611c4e5751925163ffffffff90931663ffffffff19602094851b16179093557f9324f7e5a7c0288808a634ccde44b8e979676474b22e29ee9dd569b55e791a4b92611b9f565b634e487b7160e01b5f525f60045260245ffd5b60405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608490fd5b505f198301838111610b3a57611cd163ffffffff91606c61186d565b5054164314611b3b565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b6001600160a01b039081165f818152606a6020526040902090929190611d4890611a99565b6001600160a01b0390921692911690828214611da357805f52606a602052611d738360405f20612298565b50506040519182527fd061168252f441733658f09e4d8f5b2d998ed4ef24a2bbfd6ceca52ea131500260204393a4565b505050565b15611daf57565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b611e1181612381565b15611f465760405191611e23836110ff565b611e2b6114df565b83526066545f60665580611f0c575b505f5b82518051821015611eb95781611e5291611556565b519060665491600160401b831015610b66576001830160665560665483101561156a5760665f5280516020919091015160a01b6001600160a01b0319166001600160a01b0391909116175f8051602061269383398151915290920191909155600101611e3d565b505091611ef990611f077f23aad4e61744ece164130aa415c1616e80136b0f0770e56589438b90b269265e93604051938493604085526040850190611313565b908382036020850152611313565b0390a1565b60665f525f80516020612693833981519152015f805160206126938339815191525b818110611f3b5750611e3a565b5f8155600101611f2e565b63d173577960e01b5f5260045ffd5b81810392915f138015828513169184121617610b3a57565b6001600160a01b0381165f818152606d602052604081209092908390611f9290611a99565b8094845f52606e60205260ff60405f205416155f1461210c57611fb6929350611f55565b92831561210657825f52606d60205260405f2090815492611fd683611a99565b841515806120e1575b1561203a57611fed5f612513565b945f198101908111610b3a577f88770dc862e47a7ed586907857eb1b75e4c5ffc8b707c7ee10eb74d6885fe59495611b8761202a9260409761186d565b505b82519182526020820152a290565b63ffffffff4311611c615761204e5f612513565b936040519561205c8761111a565b4363ffffffff1687526001600160e01b039095166020870190815294600160401b811015610b66576120939160018201815561186d565b959095611c4e5751935160201b63ffffffff191663ffffffff94909416939093179093557f88770dc862e47a7ed586907857eb1b75e4c5ffc8b707c7ee10eb74d6885fe5949260409261202a565b505f198501858111610b3a576120fc63ffffffff918661186d565b5054164314611fdf565b50505090565b505050612118906115de565b916121238184611f55565b928315612106577f88770dc862e47a7ed586907857eb1b75e4c5ffc8b707c7ee10eb74d6885fe59491604091845f52606d60205261216381845f20612298565b505061202c565b9061217d612176611a8c565b9283611803565b90606b5461218b606b611a99565b9080151580612272575b156121ee576121a384612513565b5f198201918211610b3a57611b876121bc92606b61186d565b507f86dcf86b12dfeedea74ae9300dbdaa193bcce5809369c8177ea2f4eaaa65729b60408051858152846020820152a1565b63ffffffff4311611c615761220284612513565b6040519161220f8361111a565b4363ffffffff1683526001600160e01b039091166020830190815290600160401b811015610b66578060016122499201606b55606b61186d565b919091611c4e579151915160201b63ffffffff191663ffffffff929092169190911790556121bc565b505f198101818111610b3a5761228e63ffffffff91606b61186d565b5054164314612195565b91909180546122a682611a99565b918115158061235c575b156122db576122be85612513565b905f198301928311610b3a576122d792611b879161186d565b9190565b63ffffffff4311611c61576122ef85612513565b90604051926122fd8461111a565b4363ffffffff1684526001600160e01b039092166020840190815291600160401b811015610b66576123349160018201815561186d565b919091611c4e579151915160201b63ffffffff191663ffffffff929092169190911790559190565b505f198201828111610b3a5761237763ffffffff918361186d565b50541643146122b0565b51905f80805b84518210156123e4576001600160a01b036123a28387611556565b515116906001600160a01b0316811115610e9c576123db600191936001600160601b0360206123d1868a611556565b51015116906115d1565b91019091612387565b509192506127101490506123f6575f90565b600190565b9190916124088284612582565b60058110156124ff571590816124e9575b506124e1575f9261245361246185946040519283916020830195630b135d3f60e11b87526024840152604060448401526064830190611aa7565b03601f198101835282611135565b51915afa3d156124da573d612475816112b2565b906124836040519283611135565b81523d5f602083013e5b816124ce575b8161249c575090565b905060208180518101031261021e57602001516001600160e01b0319811690819003610b5d57630b135d3f60e11b1490565b80516020149150612493565b606061248d565b505050600190565b6001600160a01b0383811691161490505f612419565b634e487b7160e01b5f52602160045260245ffd5b6001600160e01b03811161252d576001600160e01b031690565b60405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608490fd5b8151604181036125ae5750906125aa91602082015190606060408401519301515f1a906125f0565b9091565b6040036125e75760406020830151920151918260ff1c91601b8301809311610b3a576125aa936001600160ff1b03169260ff16906125f0565b50505f90600290565b907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116126875760ff1690601b8214158061267c575b612671576020935f93608093604051938452868401526040830152606082015282805260015afa15610b2f575f516001600160a01b0381161561266957905f90565b505f90600190565b505050505f90600490565b50601c821415612627565b505050505f9060039056fe46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e94354a2646970667358221220afd818386e982b126bce3e3bf8a998f3dd0ba6ffa50c1e8f37c83522636fbf0d64736f6c634300081a0033"; type ECDSAStakeRegistryConstructorParams = | [signer?: Signer] diff --git a/src/avs/contracts/factories/ERC20Mock__factory.ts b/src/avs/contracts/factories/ERC20Mock__factory.ts index 0b075a7b..0b213021 100644 --- a/src/avs/contracts/factories/ERC20Mock__factory.ts +++ b/src/avs/contracts/factories/ERC20Mock__factory.ts @@ -302,7 +302,7 @@ const _abi = [ ] as const; const _bytecode = - "0x608080604052346102d957610012610326565b61001a610326565b81516001600160401b0381116101e457600354600181811c911680156102cf575b60208210146101c457601f811161026a575b50602092601f821160011461020557928192936000926101fa575b50508160011b916000199060031b1c1916176003555b80516001600160401b0381116101e457600454600181811c911680156101da575b60208210146101c457601f811161015f575b50602091601f82116001146100fb579181926000926100f0575b50508160011b916000199060031b1c1916176004555b604051610a94908161034a8239f35b0151905082806100cb565b601f198216926004600052806000209160005b8581106101475750836001951061012e575b505050811b016004556100e1565b015160001960f88460031b161c19169055828080610120565b9192602060018192868501518155019401920161010e565b60046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f830160051c810191602084106101ba575b601f0160051c01905b8181106101ae57506100b1565b600081556001016101a1565b9091508190610198565b634e487b7160e01b600052602260045260246000fd5b90607f169061009f565b634e487b7160e01b600052604160045260246000fd5b015190508380610068565b601f198216936003600052806000209160005b8681106102525750836001959610610239575b505050811b0160035561007e565b015160001960f88460031b161c1916905583808061022b565b91926020600181928685015181550194019201610218565b60036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f830160051c810191602084106102c5575b601f0160051c01905b8181106102b9575061004d565b600081556001016102ac565b90915081906102a3565b90607f169061003b565b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405190602082016001600160401b038111838210176101e4576040526000825256fe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b60003560e01c806306fdde03146105bd578063095ea7b31461059757806318160ddd1461057957806323b872dd146104bb578063313ce5671461049f578063395093511461044d57806340c10f191461038857806370a082311461034e57806395d89b411461022d578063a457c2d714610186578063a9059cbb146101555763dd62ed3e0361000e573461015057604036600319011261014b5761011361077c565b61011b610797565b6001600160a01b039182166000908152600160209081526040808320949093168252928352819020549051908152f35b6106e3565b610693565b3461015057604036600319011261014b5761017b61017161077c565b60243590336108d8565b602060405160018152f35b3461015057604036600319011261014b5761019f61077c565b60243590336000526001602052604060002060018060a01b038216600052602052604060002054918083106101da5761017b920390336107d0565b60405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608490fd5b3461015057600036600319011261014b5760405160006004548060011c90600181168015610344575b6020831081146103305782855290811561031457506001146102bd575b50819003601f01601f191681019067ffffffffffffffff8211818310176102a7576102a382918260405282610733565b0390f35b634e487b7160e01b600052604160045260246000fd5b905060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b6000905b8282106102fe57506020915082010182610273565b60018160209254838588010152019101906102e9565b90506020925060ff191682840152151560051b82010182610273565b634e487b7160e01b84526022600452602484fd5b91607f1691610256565b3461015057602036600319011261014b576001600160a01b0361036f61077c565b1660005260006020526020604060002054604051908152f35b3461015057604036600319011261014b576103a161077c565b6001600160a01b03166024358115610408577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020826103e56000946002546107ad565b600255848452838252604084206103fd8282546107ad565b9055604051908152a3005b60405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606490fd5b3461015057604036600319011261014b5761017b61046961077c565b336000526001602052604060002060018060a01b038216600052602052610498604060002060243590546107ad565b90336107d0565b3461015057600036600319011261014b57602060405160128152f35b3461015057606036600319011261014b576104d461077c565b6104dc610797565b6001600160a01b0382166000908152600160208181526040808420338552909152909120549260443592918401610518575b61017b93506108d8565b8284106105345761052f8361017b950333836107d0565b61050e565b60405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b3461015057600036600319011261014b576020600254604051908152f35b3461015057604036600319011261014b5761017b6105b361077c565b60243590336107d0565b3461069357600036600319011261014b5760405160006003548060011c90600181168015610689575b6020831081146103305782855290811561031457506001146106325750819003601f01601f191681019067ffffffffffffffff8211818310176102a7576102a382918260405282610733565b905060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b6000905b82821061067357506020915082010182610273565b600181602092548385880101520191019061065e565b91607f16916105e6565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b91909160208152825180602083015260005b818110610766575060409293506000838284010152601f8019910116010190565b8060208092870101516040828601015201610745565b600435906001600160a01b038216820361079257565b600080fd5b602435906001600160a01b038216820361079257565b919082018092116107ba57565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0316908115610887576001600160a01b03169182156108375760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260018252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b6001600160a01b0316908115610a0b576001600160a01b03169182156109ba5781600052600060205260406000205481811061096657817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926020928560005260008452036040600020558460005260008252604060002061095b8282546107ad565b9055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fdfea26469706673582212204b9dc8c4844f3c63f80dcf12a7c641db17d55b4acf9e114aa986fc5b893460ee64736f6c634300081a0033"; + "0x608080604052346102c557610012610312565b61001a610312565b81516001600160401b0381116101d857600354600181811c911680156102bb575b60208210146101ba57601f8111610258575b50602092601f82116001146101f757928192935f926101ec575b50508160011b915f199060031b1c1916176003555b80516001600160401b0381116101d857600454600181811c911680156101ce575b60208210146101ba57601f8111610157575b50602091601f82116001146100f7579181925f926100ec575b50508160011b915f199060031b1c1916176004555b604051610a4a90816103358239f35b0151905082806100c8565b601f1982169260045f52805f20915f5b85811061013f57508360019510610127575b505050811b016004556100dd565b01515f1960f88460031b161c19169055828080610119565b91926020600181928685015181550194019201610107565b60045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f830160051c810191602084106101b0575b601f0160051c01905b8181106101a557506100af565b5f8155600101610198565b909150819061018f565b634e487b7160e01b5f52602260045260245ffd5b90607f169061009d565b634e487b7160e01b5f52604160045260245ffd5b015190508380610067565b601f1982169360035f52805f20915f5b8681106102405750836001959610610228575b505050811b0160035561007c565b01515f1960f88460031b161c1916905583808061021a565b91926020600181928685015181550194019201610207565b60035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f830160051c810191602084106102b1575b601f0160051c01905b8181106102a6575061004d565b5f8155600101610299565b9091508190610290565b90607f169061003b565b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405190602082016001600160401b038111838210176101d8576040525f825256fe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b5f3560e01c806306fdde03146105a6578063095ea7b31461058057806318160ddd1461056357806323b872dd146104a6578063313ce5671461048b578063395093511461043d57806340c10f191461037957806370a082311461034257806395d89b4114610227578063a457c2d714610184578063a9059cbb146101535763dd62ed3e0361000e573461014e57604036600319011261014957610112610742565b61011a61075c565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b6106c8565b610678565b3461014e5760403660031901126101495761017961016f610742565b6024359033610897565b602060405160018152f35b3461014e5760403660031901126101495761019d610742565b60243590335f52600160205260405f2060018060a01b0382165f5260205260405f2054918083106101d45761017992039033610793565b60405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608490fd5b3461014e575f366003190112610149576040515f6004548060011c90600181168015610338575b6020831081146103245782855290811561030857506001146102b3575b50819003601f01601f191681019067ffffffffffffffff82118183101761029f5761029b82918260405282610718565b0390f35b634e487b7160e01b5f52604160045260245ffd5b905060045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5f905b8282106102f25750602091508201018261026b565b60018160209254838588010152019101906102dd565b90506020925060ff191682840152151560051b8201018261026b565b634e487b7160e01b5f52602260045260245ffd5b91607f169161024e565b3461014e576020366003190112610149576001600160a01b03610363610742565b165f525f602052602060405f2054604051908152f35b3461014e57604036600319011261014957610392610742565b6001600160a01b031660243581156103f8577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020826103d55f94600254610772565b600255848452838252604084206103ed828254610772565b9055604051908152a3005b60405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606490fd5b3461014e57604036600319011261014957610179610459610742565b335f52600160205260405f2060018060a01b0382165f5260205261048460405f206024359054610772565b9033610793565b3461014e575f36600319011261014957602060405160128152f35b3461014e576060366003190112610149576104bf610742565b6104c761075c565b6001600160a01b0382165f908152600160208181526040808420338552909152909120549260443592918401610502575b6101799350610897565b82841061051e576105198361017995033383610793565b6104f8565b60405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b3461014e575f366003190112610149576020600254604051908152f35b3461014e5760403660031901126101495761017961059c610742565b6024359033610793565b34610678575f366003190112610149576040515f6003548060011c9060018116801561066e575b6020831081146103245782855290811561030857506001146106195750819003601f01601f191681019067ffffffffffffffff82118183101761029f5761029b82918260405282610718565b905060035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5f905b8282106106585750602091508201018261026b565b6001816020925483858801015201910190610643565b91607f16916105cd565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361075857565b5f80fd5b602435906001600160a01b038216820361075857565b9190820180921161077f57565b634e487b7160e01b5f52601160045260245ffd5b6001600160a01b0316908115610846576001600160a01b03169182156107f65760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591835f526001825260405f20855f5282528060405f2055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b6001600160a01b03169081156109c1576001600160a01b031691821561097057815f525f60205260405f205481811061091c57817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f525f825260405f20610911828254610772565b9055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fdfea2646970667358221220e3950316135a8c39b3d8c2bce2400942278f8c1272f2e8ffe36e036dd524035f64736f6c634300081a0033"; type ERC20MockConstructorParams = | [signer?: Signer] diff --git a/src/avs/contracts/factories/ReclaimServiceManager__factory.ts b/src/avs/contracts/factories/ReclaimServiceManager__factory.ts index 206d2995..79b29aeb 100644 --- a/src/avs/contracts/factories/ReclaimServiceManager__factory.ts +++ b/src/avs/contracts/factories/ReclaimServiceManager__factory.ts @@ -35,25 +35,6 @@ const _abi = [ ], stateMutability: "nonpayable", }, - { - type: "function", - name: "admins", - inputs: [ - { - name: "", - type: "uint256", - internalType: "uint256", - }, - ], - outputs: [ - { - name: "", - type: "address", - internalType: "address", - }, - ], - stateMutability: "view", - }, { type: "function", name: "allTaskHashes", @@ -420,16 +401,6 @@ const _abi = [ type: "address", internalType: "address", }, - { - name: "_rewardsInitiator", - type: "address", - internalType: "address", - }, - { - name: "deployer", - type: "address", - internalType: "address", - }, { name: "strategy", type: "address", @@ -439,25 +410,6 @@ const _abi = [ outputs: [], stateMutability: "nonpayable", }, - { - type: "function", - name: "isAdmin", - inputs: [ - { - name: "_admin", - type: "address", - internalType: "address", - }, - ], - outputs: [ - { - name: "", - type: "bool", - internalType: "bool", - }, - ], - stateMutability: "view", - }, { type: "function", name: "isOperatorWhitelisted", @@ -1301,7 +1253,7 @@ const _abi = [ ] as const; const _bytecode = - "0x610100806040523461024f57604051601f61555038819003918201601f19168301916001600160401b03831184841017610239578084926080946040528339810103126101e95761004f8161029c565b9061005c6020820161029c565b610074606061006d6040850161029c565b930161029c565b9260a05260805260c05260e05260005460ff8160081c166101945760ff80821610610159575b60405161529a90816102b6823960805181818161093f01528181610b6c0152818161100b01528181612a2f01528181612cda015281816130b90152614491015260a051818181610a7d01528181610b9c0152818161104201526129eb015260c05181818161027c01528181610c4301528181610f04015281816118d80152818161191a015281816119550152818161199801528181611a8201528181611ad301528181611b4f01528181611dc50152611e07015260e05181612d700152f35b60ff90811916176000557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a18061009a565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b600052604160045260246000fd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b51906001600160a01b03821682036102b057565b600080fdfe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b6000803560e01c806310d67a2f146132bc578063136439dd146131b657806314bfd6d01461318b57806316bd83c3146130865780631be785ac1461304b57806321df0da71461301f57806324d7806c14612ffc5780632d89f6fc14612fc75780632e8da82914612fa457806333cfb7b714612cbd5780633bc28c8c14612c93578063595c6a6714612be45780635ac86ab714612baf5780635c975abb14612b92578063630868dc14612b4b57806367ab980914612a5e5780636830483514612a1a5780636b3aa72e146129d6578063715018a614612979578063762655e9146122e757806384681e4614612284578063886f11951461225c5780638b00ce7c146122365780638da5cb5b1461220e57806394bb371b146121d6578063964c586d146111215780639926ee7d14610f6d578063a0169ddd14610ee0578063a20b99bf14610c05578063a364f4da14610b4c578063a551c1b814610aea578063a98fb35514610a39578063d5dba76d14610a0c578063e481af9d1461092c578063f289a7fb146108ea578063f2fde38b14610859578063f8c8765e146105d7578063fabc1cbc1461048f578063fac5bb9b14610467578063fc299dee1461043f5763fce36c7d14610240575061000e565b3461043a57602036600319011261031f576004356001600160401b038111610435576102709036906004016139dd565b919061027a614897565b7f0000000000000000000000000000000000000000000000000000000000000000825b8481106103d157506001600160a01b031690813b156103cc576040519363fce36c7d60e01b855280602486016020600488015252604485019060448160051b8701019280928690609e1983360301905b84831061032f5788808b8181808c0381838f5af180156103245761030e5750f35b8161031891613609565b61031f5780f35b61344d565b6040513d84823e3d90fd5b9091929394956043198a8203018252863590838212156103c75760208091876001940190608063ffffffff6103b38261037961036b8780614b3e565b60a0885260a0880191614b72565b95898060a01b0361038b8983016136ac565b168887015260408101356040870152836103a76060830161382d565b1660608701520161382d565b1691015298019201930191909493926102ed565b614af9565b613b63565b806104066103ed60206103e76001958a89614bd2565b01614a5b565b60406103fa848a89614bd2565b01359030903390614ce5565b61042f61041960206103e7848a89614bd2565b846040610427858b8a614bd2565b013591614d36565b0161029d565b61349d565b6133fd565b503461043a5736600319011261031f576065546040516001600160a01b039091168152602090f35b503461043a5736600319011261031f5760c9546040516001600160a01b039091168152602090f35b503461043a57602036600319011261031f57609754600435906001600160a01b0316803b156103cc5760206004916040519283809263755b36bd60e11b82525afa80156105cc576104f291849161059d575b506001600160a01b03163314613bd5565b60985419811981160361053257806098556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a280f35b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b6105bf915060203d6020116105c5575b6105b78183613609565b810190613bb6565b386104e1565b503d6105ad565b6040513d85823e3d90fd5b503461043a57608036600319011261031f576105f161367b565b6105f9613696565b506044356001600160a01b0381168103610855576064356001600160a01b03811691908290036108515783549260ff8460081c161593848095610844575b801561082d575b156107d15760ff1981166001178655846107c0575b5060ff855460081c16156107675761066a90614753565b610673306146f5565b60016060604051610683816135a2565b61070881526020810183905261012c6040820152015260ca805468ffffffffffffffffff191666012c0100000708179055600160cb5560ce54600160401b81101561075357906106de826001610702940160ce5560ce613539565b81546001600160a01b0393841660039290921b91821b9390911b1916919091179055565b6001600160601b0360a01b60c954161760c95561071c5780f35b61ff001981541681557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a180f35b634e487b7160e01b85526041600452602485fd5b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b61ffff191661010117855538610653565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b15801561063e5750600160ff82161461063e565b50600160ff821610610637565b8380fd5b8280fd5b503461043a57602036600319011261031f5761087361367b565b61087b61469d565b6001600160a01b038116156108965761089390614753565b80f35b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b503461043a5736600319011261031f57608060ca5460cb5463ffffffff60405192818116845260ff8160201c16602085015260281c1660408301526060820152f35b503461043a578060031936011261031f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103cc5781600491604051928380926302e0740360e31b82525afa9081156103245782916109ea575b5061099f8151516143b7565b915b815180518210156109d857600191906001600160a01b03906109c49083906143f6565b5151166109d182866143f6565b52016109a1565b604051806109e6868261383e565b0390f35b610a0691503d8084833e6109fe8183613609565b810190614591565b38610993565b3461043a57602036600319011261031f576020610a2f610a2a61367b565b61448f565b6040519015158152f35b503461043a57602036600319011261031f576004356001600160401b03811161043557610a6a903690600401613734565b610a7b610a76336140fe565b613fb1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103cc5782610ad98193829360405194858094819363a98fb35560e01b8352602060048401526024830190613920565b03925af180156103245761030e5750f35b503461043a57602036600319011261031f5760043560cf54811015610b4857610b1290613a66565b5080546001600160a01b031690610b2b90600101613abf565b906109e66040519283928352604060208401526040830190613920565b5080fd5b503461043a57602036600319011261031f57610b6661367b565b610b9a337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461440a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103cc576040516351b27a6d60e11b81526001600160a01b03909216600483015282919082908290602490829084905af180156103245761030e5750f35b503461043a57602036600319011261031f576004356001600160401b03811161043557610c369036906004016139dd565b610c41929192614897565b7f0000000000000000000000000000000000000000000000000000000000000000825b828110610e2b57506001600160a01b0316803b156103cc5760405191634e5cd2fd60e11b835280604484013060048601526040602486015252606483019460648260051b8501019181869060be19813603015b838310610cd8578880898181808b0381838e5af180156103245761030e5750f35b9091929394606319888203018a528535828112156103c757830190610d0e610d008380614b3e565b60c0845260c0840191614b72565b916001600160a01b03610d23602083016136ac565b1660208301526020610d386040830183614b3e565b848603604086015280865294909101938c905b808210610dfb5750505063ffffffff610d666060830161382d565b16606083015263ffffffff610d7d6080830161382d565b16608083015260a0810135601e19823603018112156103c75701906020823592016001600160401b038311610df6578236038113610df15783836020948594938460a0879660019a03910152818452848401378d838284010152601f8019910116010197019a019301919098939298610cb7565b614ab4565b614a6f565b909194604080600192838060a01b03610e138a6136ac565b16815260208901356020820152019601920190610d4b565b909291829483955b610e4b610e41858585614975565b604081019061499c565b9050871015610e9b57610e62610e41858585614975565b881015610e87576001916020610e7f928a60061b01013590614844565b960195610e33565b634e487b7160e01b86526032600452602486fd5b600192949593919650610eda90610ec481308a610ebf60206103e7898d3395614975565b614ce5565b84610ed560206103e7868a8d614975565b614d36565b01610c64565b503461043a57602036600319011261031f57610efa61367b565b610f0261469d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103cc5760405163a0169ddd60e01b81526001600160a01b03909216600483015282919082908290602490829084905af180156103245761030e5750f35b503461043a57604036600319011261031f57610f8761367b565b6024356001600160401b038111610435576060600319823603011261111c5760405191606083018381106001600160401b038211176107535760405281600401356001600160401b03811161111757610fe69060043691850101613734565b8352602083019060248301358252604460408501930135835261103260018060a01b037f000000000000000000000000000000000000000000000000000000000000000016331461440a565b61103b81614161565b156110d2577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103cc578594856110b493819560405197889687958694639926ee7d60e01b865260018060a01b0316600486015260406024860152516060604486015260a4850190613920565b9151606484015251608483015203925af180156103245761030e5750f35b60405162461bcd60e51b815260206004820152601860248201527f4f70657261746f72206e6f742077686974656c697374656400000000000000006044820152606490fd5b61362a565b613551565b503461043a57604036600319011261031f576004356001600160401b038111610435576040600319823603011261111c576040519061115f826135ee565b80600401356001600160401b03811161111757810160c0600319823603011261111c576040519061118f826135d3565b60048101356001600160401b038111611117576111b29060043691840101613881565b82526111c06024820161382d565b60208301526111d16044820161382d565b6040830152606481013560ff811681036121d257606083015260848101356001600160401b0381116111175760049082010136601f8201121561219a5780356112198161396d565b916112276040519384613609565b81835260208084019260051b8201019036821161219f5760208101925b8284106121a45750505050608083015260a4013560a082015282526024810135906001600160401b03821161111757013660238201121561219a57600481013561128d8161396d565b9161129b6040519384613609565b818352602060048185019360051b830101019036821161219f5760248101925b8284106121695750505050602082015260243563ffffffff81168103610855578151604051611308816112fa6020820194602086526040830190614236565b03601f198101835282613609565b51902063ffffffff8216845260cc6020526040842054036120fe5763ffffffff6040835101511663ffffffff421610156120c65781519182519263ffffffff6020604086015195608060018060a01b039101511692015116906040519461136e866135a2565b8552602085015260408401526001606084015260208101519160405193611394856135ee565b8452602084019283526113ac608083510151516143b7565b92855b84518110156113e457600190818060a01b036113d0826080885101516143f6565b5151166113dd82886143f6565b52016113af565b50909293815151156120915751908151926040519360208501526020845261140d604085613609565b83518060011b908082046002149015171561207d5761142b90614bf4565b9460409384519461143c8187613609565b601086526f181899199a1a9b1b9c1cb0b131b232b360811b6020870152895b87518110156115195761146e8189614c1c565b5187516001600160f81b0319916114919161148b9160f81c614871565b89614c1c565b51168160011b9082820460021483151715611505578c1a6114b2828c614c1c565b536114bd828a614c1c565b5188516001600160f81b0319916114e0916114da9160f81c614851565b8a614c1c565b51166001820180921161150557906114fe600193928e1a918c614c1c565b530161145b565b634e487b7160e01b8d52601160045260248dfd5b508795508990898151611559602282602081019b61060f60f31b8d5261154881518092602086860191016138fd565b81010301601f198101835282613609565b60018060a01b0360208601511660609584516115758882613609565b602881526020810192601f198901368537875b60148110611f7757505085518093602082019261060f60f31b8452519081602284016115b3926138fd565b810103602201601f19810184526115ca9084613609565b878683015163ffffffff166115de90614c2d565b9201516115ea90614c2d565b9286519c8d9551908160208801611600926138fd565b850190600560f91b60208301525191826021830161161d926138fd565b01602001600560f91b600182015281519182600283019160200191611641926138fd565b01600101600560f91b600182015281519182600283019160200191611665926138fd565b0160010103600101601f198101895261167e9089613609565b86515161168a906143b7565b95835b885180518210156116c957906116af6116a8826001946143f6565b518c61479c565b6116b9828b6143f6565b90838060a01b031690520161168d565b50509293858791865b8451881015611787578096815b855181101561177c576001600160a01b036116fa82886143f6565b51166001600160a01b0361170e8c8a6143f6565b51161461171d576001016116df565b5092919790965060015b1561173857600101969091956116d2565b855162461bcd60e51b815260206004820152601a60248201527f4d697373696e67206174746573746f72207369676e61747572650000000000006044820152606490fd5b509291979096611727565b91949093925063ffffffff8516825260cc602052818181205560a086510151936117af614076565b958251976117bd848a613609565b60018952845b601f1985018110611f55575060c9546001600160a01b03166117e48a6143e9565b5152600160206117f38b6143e9565b5101528551986118028a61396d565b9961180f86519b8c613609565b808b5261181e601f199161396d565b01865b818110611f32575050611835875189614871565b97865b885181101561187a57808a60206118718f946001958e61185e83898060a01b03926143f6565b511661186a83836143f6565b51526143f6565b51015201611838565b50898b87519361188a8986613609565b60018552895b601f198a018110611efa57506118a5856143e9565b51526118af614076565b60206118ba866143e9565b516001600160a01b03909216910152876118d3856143e9565b5101527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b156103cc578651639d45c28160e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115611ef0578991611ed1575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b156103cc578751634d18cc3560e01b8152906020826004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa918215611ec7578a92611ea6575b5063ffffffff8216611dc35763ffffffff9150168015611daf57611a029063ffffffff42160663ffffffff421661482a565b63ffffffff87611a11866143e9565b5101911690525b876080611a24856143e9565b51015260a0611a32846143e9565b5101875190611a418983613609565b6015825274436c61696d206372656174696f6e206f6e2041565360581b6020830152526001600160a01b0316803b156103cc57865163095ea7b360e01b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660048201526024810192909252602090829060449082908b905af18015611da557611d78575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b156103cc578585518092634e5cd2fd60e11b82526044820130600484015288602484015281518091526064830190602060648260051b86010193019185905b828210611c4c5750505090829003905081837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af18015611c4257611c2e575b506020611ba08551948286528351908784880152860190614236565b91015193601f198483030190840152835180825260208201916020808360051b83010196019287915b838310611c01578863ffffffff87167fb89b185f8ff547f2adc139e96d9ffe3ce49fac1d57931be0788b58aa670850cb898b038aa280f35b9091929396602080611c1f600193601f198682030187528b51613920565b99019301930191939290611bc9565b85611c3b91969296613609565b9385611b84565b85513d88823e3d90fd5b9295509290935060631986820301825284519060c08101918c8c82519460c085528551809152602060e08601960192915b818310611d4257505050506020818101516001600160a01b0316838201528c8201518385038e8501528051808652948201948d9291909101908f908f5b818310611d12575050505060019360209360a0848463ffffffff611d019689980151169084015263ffffffff608082015116608084015201519060a0818403910152613920565b9601920192019285938b9593611b3b565b835180516001600160a01b03168952602090810151818a01529701968f945090920191600191909101908f611cba565b835180516001600160a01b031688526020908101516001600160601b03168189015296019590920191600191909101908e611c7d565b611d999060203d602011611d9e575b611d918183613609565b810190613c34565b611ad0565b503d611d87565b86513d89823e3d90fd5b634e487b7160e01b89526012600452602489fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b156103cc578851635f90d45560e11b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa8015611e9c57611e5193611e4c928d92611e6b575b5061482a565b614206565b63ffffffff87611e60866143e9565b510191169052611a18565b611e8e91925060203d602011611e95575b611e868183613609565b81019061487b565b908d611e46565b503d611e7c565b8a513d8d823e3d90fd5b611ec091925060203d602011611e9557611e868183613609565b908a6119d0565b89513d8c823e3d90fd5b611eea915060203d602011611e9557611e868183613609565b89611952565b88513d8b823e3d90fd5b6020908a51611f08816135d3565b8a81528c838201528a8c8201528c8b8201528c60808201528a60a082015282828901015201611890565b6020908c82828a5192611f44846135ee565b8c84528c8385015201015201611821565b6020908551611f63816135ee565b878152878382015282828d010152016117c3565b806013036013811161206957600381901b906001600160fd1b038116036120695760ff81116120695760ff611fb0600182931b85614871565b161660f481901b600f60f81b169060f081169060ff16039060ff821161204157611fe3906001600160f81b0319166151e2565b600183901b91906001600160ff1b0384168403612055579061201e918c1a61200b8488614c1c565b5360f81b6001600160f81b0319166151e2565b60018201809211612041579061203a600193928c1a9186614c1c565b5301611588565b634e487b7160e01b8b52601160045260248bfd5b634e487b7160e01b8c52601160045260248cfd5b634e487b7160e01b8a52601160045260248afd5b634e487b7160e01b88526011600452602488fd5b60405162461bcd60e51b815260206004820152600d60248201526c4e6f207369676e61747572657360981b6044820152606490fd5b60405162461bcd60e51b815260206004820152601060248201526f15185cdac81a185cc8195e1c1a5c995960821b6044820152606490fd5b60405162461bcd60e51b815260206004820152603d60248201527f737570706c696564207461736b20646f6573206e6f74206d617463682074686560448201527f206f6e65207265636f7264656420696e2074686520636f6e74726163740000006064820152608490fd5b83356001600160401b03811161219a5760209161218f8392836004369288010101613734565b8152019301926112bb565b6136c0565b613984565b83356001600160401b03811161219a576020916121c783928336918701016137ce565b815201930192611244565b8580fd5b3461043a57602036600319011261031f576109e66121fa6121f561367b565b61432c565b604051918291602083526020830190613945565b503461043a5736600319011261031f576033546040516001600160a01b039091168152602090f35b503461043a5736600319011261031f57602063ffffffff60c95460a01c16604051908152f35b503461043a5736600319011261031f576097546040516001600160a01b039091168152602090f35b3461043a57602036600319011261031f576004356001600160401b038111610435576112fa6122d36122bd6109e6933690600401613881565b60405192839160208084015260408301906141b1565b604051918291602083526020830190613920565b503461043a57604036600319011261031f576004356001600160401b03811161043557612318903690600401613881565b906024356001600160401b03811161043557612338903690600401613734565b9160cb549260a0820193845110612946576080820180519091906001600160a01b031633036128ab575b505063ffffffff6060820151169063ffffffff4216918280821160001461289c5761238c9161482a565b63ffffffff8060ca5460281c16911611612857576001600160a01b036123b0614076565b16845190803b156103cc576040516323b872dd60e01b815233600482015230602482015260448101929092526020908290606490829088905af190811561284c57849161282d575b50156127ef576040519061240b826135d3565b8360a060405161241a816135d3565b606081528260208201528260408201528260608201528260808201520152604082019484865260ff606084019486865260808501976060895260a0860194888652865281602087015263ffffffff61247860ca549382851690614206565b16905260201c168094525190526040516020810190602082526124a2816112fa6040820186614236565b5190209060cf54918284116127aa576124ba8361396d565b926124c86040519485613609565b80845260cf8652857facb8d954e2cfef495862221e91bd7523613cf8808827cb33edfe4904cc51bf29602086015b83831061278c575050505082519161250d8561396d565b9461251b6040519687613609565b80865261252a601f199161396d565b01865b81811061277557505085925b85519060ff8516918210156126a857801561263d576125898161255c8487614844565b6040516020810191448352426040830152606082015260608152612581608082613609565b519020614851565b9061259482886143f6565b51916000198201918211612069576125c2906125b0838a6143f6565b516125bb828b6143f6565b52886143f6565b5081519095906125da906001600160a01b031661448f565b1561263457508051602091906001600160a01b03166125f9848a6143f6565b51520151602061260983896143f6565b51015260ff811461262057600101965b9692612539565b634e487b7160e01b87526011600452602487fd5b98915050612619565b60405162461bcd60e51b815260206004820152603760248201527f496e7465726e616c3a204665657320746f6f206c6f772e204e6f206f7065726160448201527f746f7273206c65667420746f207069636b2066726f6d2e0000000000000000006064820152608490fd5b8783888b526040516020810190602082526126ca816112fa6040820186614236565b51902063ffffffff60c95460a01c16835260cc6020526040832055600161273060c954927f07a2aac65c6401a6cbb0fa80ff456ec88725098383c7e585ee342ae74505c98b63ffffffff8560a01c16928392604051918291602083526020830190614236565b0390a20163ffffffff81116127615763ffffffff60a01b1990911660a09190911b63ffffffff60a01b161760c95580f35b634e487b7160e01b83526011600452602483fd5b6020906127806142e6565b82828a0101520161252d565b6002602060019261279c85614300565b8152019201920191906124f6565b60405162461bcd60e51b815260206004820152601e60248201527f496e7465726e616c3a204e6f7420656e6f756768206f70657261746f727300006044820152606490fd5b60405162461bcd60e51b81526020600482015260166024820152754661696c656420746f207472616e736665722066656560501b6044820152606490fd5b612846915060203d602011611d9e57611d918183613609565b386123f8565b6040513d86823e3d90fd5b60405162461bcd60e51b815260206004820152601e60248201527f526571756573742074696d657374616d7020746f6f20666172206177617900006044820152606490fd5b906128a69161482a565b61238c565b6128ce906040516020808201526128c9816112fa60408201886141b1565b61479c565b90516001600160a01b039081169116036128e9573880612362565b60405162461bcd60e51b815260206004820152602f60248201527f5369676e6572206f6620726571756573745369676e6174757265206973206e6f60448201526e3a103932b8bab2b9ba1737bbb732b960891b6064820152608490fd5b60405162461bcd60e51b815260206004820152600b60248201526a46656520746f6f206c6f7760a81b6044820152606490fd5b503461043a578060031936011261031f5761299261469d565b603380546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461043a5736600319011261031f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461043a5736600319011261031f576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461043a57608036600319011261031f57604051612a7c816135a2565b612a8461381a565b815260243560ff8116810361085557602082019081526044359163ffffffff831683036108515780604063ffffffff92019384526064356060820152612acc610a76336140fe565b511680612b37575b505160ff8116612b16575b505163ffffffff8116612af0575080f35b68ffffffff000000000060ca549160281b169068ffffffff000000000019161760ca5580f35b64ff0000000060ca549160201b169064ff0000000019161760ca5538612adf565b63ffffffff1960ca54161760ca5538612ad4565b503461043a57602036600319011261031f576004359060cd54821015612b8f576020612b768361351e565b905460405160039290921b1c6001600160a01b03168152f35b80fd5b503461043a5736600319011261031f576020609854604051908152f35b503461043a57602036600319011261031f576004359060ff8216809203612b8f5760206001831b806098541614604051908152f35b503461043a578060031936011261031f576097546001600160a01b0316803b156103cc5760206024916040519283809263237dfb4760e11b82523360048301525afa801561032457612c3d918391612c74575b50613c4c565b60001960985560405160001981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a280f35b612c8d915060203d602011611d9e57611d918183613609565b38612c37565b503461043a57602036600319011261031f57610893612cb061367b565b612cb861469d565b6146f5565b503461043a57602036600319011261031f57612cd761367b565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103cc5781600491604051928380926302e0740360e31b82525afa908115610324578291612f8a575b5080515191612d3c8361396d565b91612d4a6040519384613609565b838352612d568461396d565b602084019190601f1901368337825b858110612f625750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103cc5760408051639004134760e01b81526001600160a01b0390971660048801526024870152835160448701819052839287929091606484019190855b818110612f3d5750505082809103915afa938415612f30578194612e9e575b5080815b848110612e725750612e0e906143b7565b93815b848110612e2657604051806109e6888261383e565b612e3081836143f6565b51612e3e575b600101612e11565b91600190612e6a906001600160a01b03612e5886886143f6565b5116612e64828a6143f6565b5261468e565b929050612e36565b612e7c81876143f6565b51612e8a575b600101612dfd565b90612e9660019161468e565b919050612e82565b9093503d8085833e612eb08183613609565b81019060208183031261031f578051906001600160401b03821161043557019080601f8301121561219a578151612ee68161396d565b92612ef46040519485613609565b81845260208085019260051b82010192831161219f57602001905b828210612f20575050509238612df9565b8151815260209182019101612f0f565b50604051903d90823e3d90fd5b82516001600160a01b031684528796508a955060209384019390920191600101612dda565b600190818060a01b03612f768285516143f6565b515116612f8382886143f6565b5201612d65565b612f9e91503d8084833e6109fe8183613609565b38612d2e565b3461043a57602036600319011261031f576020610a2f612fc261367b565b614161565b503461043a57602036600319011261031f57604060209163ffffffff612feb61381a565b16815260cc83522054604051908152f35b3461043a57602036600319011261031f576020610a2f61301a61367b565b6140fe565b503461043a5736600319011261031f576020613039614076565b6040516001600160a01b039091168152f35b503461043a57604036600319011261031f5761306561367b565b60243580151581036108555761089391613081610a76336140fe565b613ff3565b503461043a57602036600319011261031f576004356001600160401b038111610435576130b79036906004016137ce565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103cc5760206024916040519283809263ec7fbb3160e01b82523360048301525afa80156105cc57600191849161316c575b501515036131275761089390613dff565b60405162461bcd60e51b815260206004820152601b60248201527f4f70657261746f72206d757374206265207468652063616c6c657200000000006044820152606490fd5b613185915060203d602011611d9e57611d918183613609565b38613116565b503461043a57602036600319011261031f576004359060ce54821015612b8f576020612b76836134ed565b503461043a57602036600319011261031f57609754600435906001600160a01b0316803b156103cc5760206024916040519283809263237dfb4760e11b82523360048301525afa80156105cc57613213918491612c745750613c4c565b6098548181160361325157806098556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a280f35b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b50346133fd57602036600319011261031f576004356001600160a01b03811690819003610b48576097546001600160a01b038116803b156103cc5760405163755b36bd60e11b8152602081600481855afa80156133f25761332e91869161059d57506001600160a01b03163314613bd5565b82156133755760407f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6918151908152846020820152a16001600160a01b0319161760975580f35b60405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a490fd5b6040513d87823e3d90fd5b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b60ce548110156135085760ce60005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b60cd548110156135085760cd60005260206000200190600090565b80548210156135085760005260206000200190600090565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b608081019081106001600160401b038211176135bd57604052565b634e487b7160e01b600052604160045260246000fd5b60c081019081106001600160401b038211176135bd57604052565b604081019081106001600160401b038211176135bd57604052565b90601f801991011681019081106001600160401b038211176135bd57604052565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b600435906001600160a01b038216820361369157565b600080fd5b602435906001600160a01b038216820361369157565b35906001600160a01b038216820361369157565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b6001600160401b0381116135bd57601f01601f191660200190565b81601f8201121561219a5760208135910161374e82613719565b9261375c6040519485613609565b828452828201116137795781600092602092838601378301015290565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b919060408382031261111c57604051906137e7826135ee565b81936137f2816136ac565b83526020810135916001600160401b038311611117576020926138159201613734565b910152565b6004359063ffffffff8216820361369157565b359063ffffffff8216820361369157565b602060408183019282815284518094520192019060005b8181106138625750505090565b82516001600160a01b0316845260209384019390920191600101613855565b91909160c08184031261111c576040519061389b826135d3565b81938135916001600160401b038311611117576138be60a0939284938301613734565b845260208101356020850152604081013560408501526138e06060820161382d565b60608501526138f1608082016136ac565b60808501520135910152565b60005b8381106139105750506000910152565b8181015183820152602001613900565b90602091613939815180928185528580860191016138fd565b601f01601f1916010190565b906040602061396a9360018060a01b0381511684520151918160208201520190613920565b90565b6001600160401b0381116135bd5760051b60200190565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b9181601f8401121561219a578235916001600160401b038311613a0d576020808501948460051b01011161219f57565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b60cf548110156135085760cf60005260206000209060011b0190600090565b90600182811c92168015613ab5575b6020831014613a9f57565b634e487b7160e01b600052602260045260246000fd5b91607f1691613a94565b9060405191826000825492613ad384613a85565b8084529360018116908115613b415750600114613afa575b50613af892500383613609565b565b90506000929192526020600020906000915b818310613b25575050906020613af89282010138613aeb565b6020919350806001915483858901015201910190918492613b0c565b905060209250613af894915060ff191682840152151560051b82010138613aeb565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b9081602091031261031f57516001600160a01b03811681036136915790565b15613bdc57565b60405162461bcd60e51b815260206004820152602a60248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526939903ab73830bab9b2b960b11b6064820152608490fd5b9081602091031261031f575180151581036136915790565b15613c5357565b60405162461bcd60e51b815260206004820152602860248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526739903830bab9b2b960c11b6064820152608490fd5b818110613cb4575050565b60008155600101613ca9565b90929192613de9576001602091818060a01b038551166001600160601b0360a01b825416178155019201519182516001600160401b0381116135bd57613d068254613a85565b601f8111613dac575b506020601f8211600114613d4a5781929394600092613d3f575b50508160011b916000199060031b1c1916179055565b015190503880613d29565b601f1982169083600052806000209160005b818110613d9457509583600195969710613d7b575b505050811b019055565b015160001960f88460031b161c19169055388080613d71565b9192602060018192868b015181550194019201613d5c565b613dd990836000526020600020601f840160051c81019160208510613ddf575b601f0160051c0190613ca9565b38613d0f565b9091508190613dcc565b634e487b7160e01b600052600060045260246000fd5b80516001600160a01b03163303613f5d5760208101515115613e865760005b60cf54811015613e6257613e3181613a66565b505482516001600160a01b03908116911614613e4f57600101613e1e565b90613e5c613af892613a66565b90613cc0565b5060cf5490600160401b8210156135bd57613e5c826001613af8940160cf55613a66565b60005b60cf54811015613f1f57613e9c81613a66565b505482516001600160a01b03908116911614613eba57600101613e89565b613ec49150613a66565b613de9578060006001925501613eda8154613a85565b9081613ee4575050565b81601f60009311600114613ef6575055565b81835260208320613f1291601f0160051c810190600101613ca9565b8082528160208120915555565b60405162461bcd60e51b815260206004820152601260248201527113dc195c985d1bdc881b9bdd08199bdd5b9960721b6044820152606490fd5b0390fd5b60405162461bcd60e51b815260206004820152602660248201527f4d657461646174612061646472657373206d757374206d61746368207468652060448201526531b0b63632b960d11b6064820152608490fd5b15613fb857565b60405162461bcd60e51b815260206004820152601360248201527221b0b63632b91034b9903737ba1030b236b4b760691b6044820152606490fd5b906140515760005b60cd54811015613f1f5761400e8161351e565b905460039190911b1c6001600160a01b039081169083161461403257600101613ffb565b61403c915061351e565b81549060018060a01b039060031b1b19169055565b60cd5490600160401b8210156135bd576106de826001613af8940160cd5560cd613539565b60c9546001600160a01b0316803b156103cc57602060049160405192838092632495a59960e01b82525afa9081156140f2576000916140b3575090565b90506020813d6020116140ea575b816140ce60209383613609565b8101031261031f57516001600160a01b03811681036136915790565b3d91506140c1565b6040513d6000823e3d90fd5b6033546001600160a01b0316331461415b5760ce549060005b82811061412657505050600090565b61412f816134ed565b905460039190911b1c6001600160a01b039081169083161461415357600101614117565b505050600190565b50600190565b61416a816140fe565b61415b5760cd549060005b82811061418457505050600090565b61418d8161351e565b905460039190911b1c6001600160a01b039081169083161461415357600101614175565b9060a0806141c8845160c0855260c0850190613920565b93602081015160208501526040810151604085015263ffffffff6060820151166060850152600180831b036080820151166080850152015191015290565b9063ffffffff8091169116019063ffffffff821161422057565b634e487b7160e01b600052601160045260246000fd5b9061424a825160c0835260c08301906141b1565b9163ffffffff602082015116602083015263ffffffff604082015116604083015260ff60608201511660608301526080810151928281036080840152835180825260208201916020808360051b8301019601926000915b8383106142b957505050505060a08091015191015290565b90919293966020806142d7600193601f198682030187528b51613945565b990193019301919392906142a1565b604051906142f3826135ee565b6060602083600081520152565b9060405161430d816135ee565b82546001600160a01b0316815291829060209061381590600101613abf565b6143346142e6565b5060cf549060005b82811061437d5760405162461bcd60e51b815260206004820152601260248201527113dc195c985d1bdc881b9bdd08199bdd5b9960721b6044820152606490fd5b61438681613a66565b50546001600160a01b038381169116146143a25760010161433c565b61396a92506143b19150613a66565b50614300565b906143c18261396d565b6143ce6040519182613609565b82815280926143df601f199161396d565b0190602036910137565b8051156135085760200190565b80518210156135085760209160051b010190565b1561441157565b60405162461bcd60e51b815260206004820152604a60248201527f4543445341536572766963654d616e61676572426173652e6f6e6c795374616b60448201527f6552656769737472793a2063616c6c6572206973206e6f7420746865207374616064820152696b65526567697374727960b01b608482015260a490fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103cc576040516398ec1ac960e01b81526001600160a01b039091166004820152602081602481855afa9081156140f25760009161455f575b50813b156103cc576020600492604051938480926340bf2fb760e01b82525afa9182156140f25760009261452b575b50101590565b9091506020813d602011614557575b8161454760209383613609565b8101031261031f57519038614525565b3d915061453a565b90506020813d602011614589575b8161457a60209383613609565b8101031261031f5751386144f6565b3d915061456d565b60208183031261031f578051906001600160401b03821161043557019060208282031261111c5760405191602083018381106001600160401b038211176135bd576040528051906001600160401b038211611117570181601f8201121561219a578051906145fe8261396d565b9261460c6040519485613609565b82845260208085019360061b8301019181831161219f57602001925b8284106146385750505050815290565b60408483031261111c576040519061464f826135ee565b84516001600160a01b03811681036136915782526020850151906001600160601b03821682036136915782602092836040950152815201930192614628565b60001981146142205760010190565b6033546001600160a01b031633036146b157565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b606554604080516001600160a01b038084168252841660208201529192917fe11cddf1816a43318ca175bbc52cd0185436e9cbead7c83acc54a73e461717e39190a16001600160a01b03166001600160a01b03199190911617606555565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b61396a9161482291603a61481a6147b38351614c2d565b9260405192839160208301957f19457468657265756d205369676e6564204d6573736167653a0a00000000000087526147f581518092602086880191016138fd565b830161480a82518093602086850191016138fd565b010103601f198101835282613609565b519020614dfc565b919091614e6c565b9063ffffffff8091169116039063ffffffff821161422057565b9190820180921161422057565b811561485b570690565b634e487b7160e01b600052601260045260246000fd5b811561485b570490565b9081602091031261031f575163ffffffff811681036136915790565b6065546001600160a01b031633036148ab57565b60405162461bcd60e51b815260206004820152605160248201527f4543445341536572766963654d616e61676572426173652e6f6e6c795265776160448201527f726473496e69746961746f723a2063616c6c6572206973206e6f7420746865206064820152703932bbb0b932399034b734ba34b0ba37b960791b608482015260a490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206f6666736574000000006044820152606490fd5b91908110156135085760051b8101359060be1981360301821215614997570190565b614930565b903590601e198136030182121561499757018035906001600160401b038211614a1657602001918160061b360383136149d157565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c64617461207461696c20746f6f2073686f72740000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206c656e677468000000006044820152606490fd5b356001600160a01b03811681036136915790565b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206c656e67746800006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c64617461206163636573732073747269646500006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206f666673657400006044820152606490fd5b9035601e19823603018112156103c75701602081359101916001600160401b038211610df6578160061b36038313610df157565b916020908281520191906000905b808210614b8d5750505090565b909192833560018060a01b0381168091036136915781526020840135906001600160601b03821680920361369157604081600193602083940152019401920190614b80565b91908110156135085760051b81013590609e1981360301821215614997570190565b90614bfe82613719565b614c0b6040519182613609565b82815280926143df601f1991613719565b908151811015613508570160200190565b8015614cc55780816000925b614cb1575080614c4883614bf4565b92915b614c5457505090565b60001982019182116142205781600a820491600a8302838104600a14841517156142205781039081116142205760ff1660300160ff81116142205760f81b6001600160f81b03191660001a90614caa9085614c1c565b5380614c4b565b91614cbd600a9161468e565b920480614c39565b50604051614cd4604082613609565b60018152600360fc1b602082015290565b6040516323b872dd60e01b60208201526001600160a01b0392831660248201529290911660448301526064820192909252613af891614d3182608481015b03601f198101845283613609565b614fe6565b6001600160a01b03811692833b156103cc57604051636eb1769f60e11b81523060048201526001600160a01b038416602482015293602090859060449082905afa9384156140f257600094614dc6575b50614d97614d3191613af895614844565b60405163095ea7b360e01b60208201526001600160a01b03909416602485015260448401528260648101614d23565b93506020843d602011614df4575b81614de160209383613609565b8101031261031f57925192614d97614d86565b3d9150614dd4565b815160418103614e29575090614e25916020820151906060604084015193015160001a9061513a565b9091565b604003614e625760406020830151920151918260ff1c91601b830180931161422057614e25936001600160ff1b03169260ff169061513a565b5050600090600290565b6005811015614fd05780614e7d5750565b600060018203614ecc5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b5060028103614f1a5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b60009060038103614f755760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b6004915014614f8057565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608490fd5b634e487b7160e01b600052602160045260246000fd5b60408051909290916001600160a01b03166150018484613609565b602083527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020840152803b156150f65760008281928260206150729796519301915af13d156150ee573d9061505682613719565b9161506386519384613609565b82523d6000602084013e615224565b8051908161507f57505050565b602080615090938301019101613c34565b156150985750565b5162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b606090615224565b835162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116151d65760ff1690601b821415806151cb575b6151bf57602093600093608093604051938452868401526040830152606082015282805260015afa156140f2576000516001600160a01b038116156151b65790600090565b50600090600190565b50505050600090600490565b50601c821415615171565b50505050600090600390565b60f81c600a8110156152095760300160ff81116142205760f81b6001600160f81b03191690565b60570160ff81116142205760f81b6001600160f81b03191690565b90919015615230575090565b8151156152405750805190602001fd5b60405162461bcd60e51b815260206004820152908190613f5990602483019061392056fea26469706673582212206a37532f698adfa346f4301fb50002c7b974da091305d128ab05d3c3044e7d8364736f6c634300081a0033"; + "0x610100806040523461024b57604051601f61530138819003918201601f19168301916001600160401b03831184841017610237578084926080946040528339810103126101e75761004f81610298565b9061005c60208201610298565b610074606061006d60408501610298565b9301610298565b9260a05260805260c05260e0525f5460ff8160081c166101925760ff80821610610158575b60405161505090816102b182396080518181816106a6015281816108ca01528181610d69015281816127a301528181612c4a01528181612fef0152614282015260a0518181816107db015281816108fa01528181610da0015261275f015260c051818181610265015281816109a101528181610c62015281816116d30152818161171501528181611750015281816117920152818161187b015281816118cc0152818161194d01528181611bb80152611bfb015260e05181612ce00152f35b60ff90811916175f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a180610099565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b51906001600160a01b03821682036102ac57565b5f80fdfe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b5f803560e01c806310d67a2f146131e4578063136439dd146130c157806316bd83c314612fbd5780631be785ac14612f8757806321df0da714612f5b5780632d89f6fc14612f265780632e8da82914612f0357806333cfb7b714612c2f5780633bc28c8c14612c04578063485cc95514612a06578063595c6a671461295b5780635ac86ab7146129285780635c975abb1461290b578063630868dc146128c957806367ab9809146127d2578063683048351461278e5780636b3aa72e1461274a578063715018a6146126ef578063762655e91461208a57806384681e4614612027578063886f119514611fff5780638b00ce7c14611fd95780638da5cb5b14611fb157806394bb371b14611f79578063964c586d14610e935780639926ee7d14610ccb578063a0169ddd14610c3e578063a20b99bf14610963578063a364f4da146108aa578063a551c1b814610848578063a98fb355146107a0578063d5dba76d14610773578063e481af9d14610693578063f289a7fb14610651578063f2fde38b146105c0578063fabc1cbc14610478578063fac5bb9b14610450578063fc299dee146104285763fce36c7d14610229575061000e565b34610423576020366003190112610308576004356001600160401b03811161041e5761025990369060040161389c565b9190610263614666565b7f0000000000000000000000000000000000000000000000000000000000000000825b8481106103ba57506001600160a01b031690813b156103b5576040519363fce36c7d60e01b855280602486016020600488015252604485019060448160051b8701019280928690609e1983360301905b8483106103185788808b8181808c0381838f5af1801561030d576102f75750f35b81610301916134dd565b6103085780f35b613387565b6040513d84823e3d90fd5b9091929394956043198a8203018252863590838212156103b05760208091876001940190608063ffffffff61039c82610362610354878061490d565b60a0885260a0880191614941565b95898060a01b03610374898301613565565b16888701526040810135604087015283610390606083016136e5565b166060870152016136e5565b1691015298019201930191909493926102d6565b6148c8565b613a19565b806103ef6103d660206103d06001958a896149a0565b0161482a565b60406103e3848a896149a0565b01359030903390614ab0565b61041861040260206103d0848a896149a0565b846040610410858b8a6149a0565b013591614b01565b01610286565b6133d7565b613337565b503461042357366003190112610308576065546040516001600160a01b039091168152602090f35b5034610423573660031901126103085760c9546040516001600160a01b039091168152602090f35b503461042357602036600319011261030857609754600435906001600160a01b0316803b156103b55760206004916040519283809263755b36bd60e11b82525afa80156105b5576104db918491610586575b506001600160a01b03163314613a8b565b60985419811981160361051b57806098556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a280f35b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b6105a8915060203d6020116105ae575b6105a081836134dd565b810190613a6c565b5f6104ca565b503d610596565b6040513d85823e3d90fd5b5034610423576020366003190112610308576105da61354f565b6105e2614380565b6001600160a01b038116156105fd576105fa90614541565b80f35b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b50346104235736600319011261030857608060ca5460cb5463ffffffff60405192818116845260ff8160201c16602085015260281c1660408301526060820152f35b50346104235780600319360112610308577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103b55781600491604051928380926302e0740360e31b82525afa90811561030d578291610751575b506107068151516141a8565b915b8151805182101561073f57600191906001600160a01b039061072b9083906141e7565b51511661073882866141e7565b5201610708565b6040518061074d86826136f6565b0390f35b61076d91503d8084833e61076581836134dd565b8101906143d8565b5f6106fa565b3461042357602036600319011261030857602061079661079161354f565b614280565b6040519015158152f35b5034610423576020366003190112610308576004356001600160401b03811161041e576107d19036906004016135ed565b6107d9614380565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103b557826108378193829360405194858094819363a98fb35560e01b83526020600484015260248301906137e0565b03925af1801561030d576102f75750f35b50346104235760203660031901126103085760043560ce548110156108a65761087090613925565b5080546001600160a01b03169061088990600101613979565b9061074d60405192839283526040602084015260408301906137e0565b5080fd5b5034610423576020366003190112610308576108c461354f565b6108f8337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146141fb565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103b5576040516351b27a6d60e11b81526001600160a01b03909216600483015282919082908290602490829084905af1801561030d576102f75750f35b5034610423576020366003190112610308576004356001600160401b03811161041e5761099490369060040161389c565b61099f929192614666565b7f0000000000000000000000000000000000000000000000000000000000000000825b828110610b8957506001600160a01b0316803b156103b55760405191634e5cd2fd60e11b835280604484013060048601526040602486015252606483019460648260051b8501019181869060be19813603015b838310610a36578880898181808b0381838e5af1801561030d576102f75750f35b9091929394606319888203018a528535828112156103b057830190610a6c610a5e838061490d565b60c0845260c0840191614941565b916001600160a01b03610a8160208301613565565b1660208301526020610a96604083018361490d565b848603604086015280865294909101938c905b808210610b595750505063ffffffff610ac4606083016136e5565b16606083015263ffffffff610adb608083016136e5565b16608083015260a0810135601e19823603018112156103b05701906020823592016001600160401b038311610b54578236038113610b4f5783836020948594938460a0879660019a03910152818452848401378d838284010152601f8019910116010197019a019301919098939298610a15565b614883565b61483e565b909194604080600192838060a01b03610b718a613565565b16815260208901356020820152019601920190610aa9565b909291829483955b610ba9610b9f858585614744565b604081019061476b565b9050871015610bf957610bc0610b9f858585614744565b881015610be5576001916020610bdd928a60061b01013590614629565b960195610b91565b634e487b7160e01b86526032600452602486fd5b600192949593919650610c3890610c2281308a610c1d60206103d0898d3395614744565b614ab0565b84610c3360206103d0868a8d614744565b614b01565b016109c2565b503461042357602036600319011261030857610c5861354f565b610c60614380565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103b55760405163a0169ddd60e01b81526001600160a01b03909216600483015282919082908290602490829084905af1801561030d576102f75750f35b503461042357604036600319011261030857610ce561354f565b6024356001600160401b03811161041e5760606003198236030112610e8e5760405191606083018381106001600160401b03821117610e7a5760405281600401356001600160401b038111610e7557610d4490600436918501016135ed565b83526020830190602483013582526044604085019301358352610d9060018060a01b037f00000000000000000000000000000000000000000000000000000000000000001633146141fb565b610d9981613f72565b15610e30577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103b557859485610e1293819560405197889687958694639926ee7d60e01b865260018060a01b0316600486015260406024860152516060604486015260a48501906137e0565b9151606484015251608483015203925af1801561030d576102f75750f35b60405162461bcd60e51b815260206004820152601860248201527f4f70657261746f72206e6f742077686974656c697374656400000000000000006044820152606490fd5b6134fe565b634e487b7160e01b85526041600452602485fd5b613427565b503461042357604036600319011261030857600435906001600160401b03821161041e5760406003198336030112610e8e5760405191610ed2836134c2565b80600401356001600160401b038111610e7557810160c06003198236030112610e8e5760405190610f02826134a7565b60048101356001600160401b038111610e7557610f259060043691840101613764565b8252610f33602482016136e5565b6020830152610f44604482016136e5565b6040830152606481013560ff81168103611f0c57606083015260848101356001600160401b038111610e755760049082010136601f82011215611f41578035610f8c8161382c565b91610f9a60405193846134dd565b81835260208084019260051b82010190368211611f465760208101925b828410611f4b5750505050608083015260a4013560a082015283526024810135906001600160401b038211610e75570136602382011215611f415760048101356110008161382c565b9161100e60405193846134dd565b818352602060048185019360051b8301010190368211611f465760248101925b828410611f10575050505060208301526024359063ffffffff82168203611f0c57825160405161107c8161106e602082019460208652604083019061402a565b03601f1981018352826134dd565b51902063ffffffff83165f5260cc60205260405f205403611ea15763ffffffff6040845101511663ffffffff42161015611e695782519182519263ffffffff6020604086015195608060018060a01b03910151169201511690604051946110e286613478565b8552602085015260408401526001606084015260208401519160405193611108856134c2565b845260208401928352611120608086510151516141a8565b925f5b845181101561115857600190818060a01b036111448260808b5101516141e7565b51511661115182886141e7565b5201611123565b50909291949381515115611e34575193845195604051966020880152602087526111836040886134dd565b86518060011b908082046002149015171561127a576111a1906149c2565b9460408051956111b182886134dd565b601087526f181899199a1a9b1b9c1cb0b131b232b360811b60208801525f5b8a5181101561128e576111e3818c6149ea565b5188516001600160f81b031991611206916112009160f81c614640565b8a6149ea565b5116908060011b918183046002148215171561127a575f1a611228838c6149ea565b53611233818d6149ea565b5189516001600160f81b031991611256916112509160f81c614636565b8b6149ea565b5116916001810180911161127a576112736001935f1a918c6149ea565b53016111d0565b634e487b7160e01b5f52601160045260245ffd5b5061060f60f31b96508860206112cb60228b86519384918183019d8e528051918291018484015e81015f838201520301601f1981018352826134dd565b60018060a01b0360208301511660609285516112e785826134dd565b602881526020810192601f1986013685375f5b60148110611d6c57505086518093602082019261060f60f31b8452518091602284015e8101602281015f905203602201601f198101845261133b90846134dd565b848783015163ffffffff1661134f906149fb565b92015161135b906149fb565b9287519c8d95518091602088015e850190600560f91b6020830152518092602183015e01602001600560f91b600182015281516020819301600283015e01600101600560f91b600182015281516020819301600283015e01600101600181015f905203600101601f19810189526113d290896134dd565b8651516113de906141a8565b955f5b8851805182101561141d57906114036113fc826001946141e7565b518c614589565b61140d828b6141e7565b90838060a01b03169052016113e1565b505093948691955f965b84518810156114df575f965f5b85518110156114d3576001600160a01b0361144f82886141e7565b51166001600160a01b036114638c8a6141e7565b51161461147257600101611434565b509291979093965060015b1561148f576001019690919592611427565b855162461bcd60e51b815260206004820152601a60248201527f4d697373696e67206174746573746f72207369676e61747572650000000000006044820152606490fd5b5092919790939661147d565b918691935063ffffffff81165f5260cc6020525f8681205560a0825101515f945b865186101561159e576001860180871161127a575b8751811015611592576001906001600160a01b03611533898b6141e7565b5116828060a01b03611545838c6141e7565b511610611553575b01611515565b818060a01b03611563898b6141e7565b5116828060a01b03611575838c6141e7565b51166115818a8c6141e7565b5261158c828b6141e7565b5261154d565b50600190950194611500565b869088866115aa613ef7565b958251976115b8848a6134dd565b600189525f5b601f1985018110611d4a575060c9546001600160a01b03166115df8a6141da565b5152600160206115ee8b6141da565b5101528551986115fd8a61382c565b9961160a86519b8c6134dd565b808b52611619601f199161382c565b015f5b818110611d27575050611630875189614640565b975f5b885181101561167557808a602061166c8f946001958e61165983898060a01b03926141e7565b511661166583836141e7565b51526141e7565b51015201611633565b50898b87519361168589866134dd565b600185525f5b601f198a018110611cef57506116a0856141da565b51526116aa613ef7565b60206116b5866141da565b516001600160a01b03909216910152876116ce856141da565b5101527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b156103b5578651639d45c28160e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115611ce5575f91611cc6575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b156103b5578751634d18cc3560e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115611cbc575f91611c9d575b5063ffffffff8116611bb6575063ffffffff168015611ba2576117fb9063ffffffff42160663ffffffff421661460f565b63ffffffff8761180a866141da565b5101911690525b5f608061181d856141da565b51015260a061182b846141da565b510187519061183a89836134dd565b6015825274436c61696d206372656174696f6e206f6e2041565360581b6020830152526001600160a01b0316803b156103b557865163095ea7b360e01b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660048201526024810192909252602090829060449082905f905af18015611b9857611b6b575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b156103b557845190634e5cd2fd60e11b8252816044810130600483015287602483015282518091526064820190602060648260051b8501019401915f905b828210611a435750505050805f9203818360018060a01b037f0000000000000000000000000000000000000000000000000000000000000000165af18015611a3957611a24575b506020611996855194828652835190878488015286019061402a565b91015193601f198483030190840152835180825260208201916020808360051b83010196019287915b8383106119f7578863ffffffff87167fb89b185f8ff547f2adc139e96d9ffe3ce49fac1d57931be0788b58aa670850cb898b038aa280f35b9091929396602080611a15600193601f198682030187528b516137e0565b990193019301919392906119bf565b611a319195505f906134dd565b5f938561197a565b85513d5f823e3d90fd5b919350919360631986820301825284519060c081019180519260c0835283518091528c602060e085019501915f915b818310611b3557505050506020818101516001600160a01b0316838201528c8201518385038e8501528051808652948201948d9291909101905f908f5b818310611b05575050505060019360209360a0848463ffffffff611af69689980151169084015263ffffffff608082015116608084015201519060a08184039101526137e0565b96019201920185939192611933565b835180516001600160a01b03168952602090810151818a01529701968f945090920191600191909101908f611aaf565b835180516001600160a01b031688526020908101516001600160601b03168189015296019590920191600191909101908e611a72565b611b8c9060203d602011611b91575b611b8481836134dd565b810190613aea565b6118c9565b503d611b7a565b86513d5f823e3d90fd5b634e487b7160e01b5f52601260045260245ffd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b156103b5578851635f90d45560e11b8152906020826004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa918215611c935791611c4391611c4894935f92611c62575b5061460f565b614010565b63ffffffff87611c57866141da565b510191169052611811565b611c8591925060203d602011611c8c575b611c7d81836134dd565b81019061464a565b908d611c3d565b503d611c73565b8a513d5f823e3d90fd5b611cb6915060203d602011611c8c57611c7d81836134dd565b8a6117ca565b89513d5f823e3d90fd5b611cdf915060203d602011611c8c57611c7d81836134dd565b8961174d565b88513d5f823e3d90fd5b6020908a51611cfd816134a7565b8a81525f838201528a8c8201525f8b8201525f60808201528a60a08201528282890101520161168b565b6020908c82828a5192611d39846134c2565b5f84525f838501520101520161161c565b6020908551611d58816134c2565b5f81525f8382015282828d010152016115be565b806013036013811161127a57600381901b906001600160fd1b0381160361127a5760ff811161127a5760ff611da5600182931b85614640565b161660f481901b600f60f81b16919060f081169060ff16039160ff831161127a57611dd9906001600160f81b031916614f98565b600182901b926001600160ff1b038316830361127a57611e12915f1a611dff85886149ea565b5360f81b6001600160f81b031916614f98565b916001810180911161127a57611e2d6001935f1a91866149ea565b53016112fa565b60405162461bcd60e51b815260206004820152600d60248201526c4e6f207369676e61747572657360981b6044820152606490fd5b60405162461bcd60e51b815260206004820152601060248201526f15185cdac81a185cc8195e1c1a5c995960821b6044820152606490fd5b60405162461bcd60e51b815260206004820152603d60248201527f737570706c696564207461736b20646f6573206e6f74206d617463682074686560448201527f206f6e65207265636f7264656420696e2074686520636f6e74726163740000006064820152608490fd5b5f80fd5b83356001600160401b038111611f4157602091611f3683928360043692880101016135ed565b81520193019261102e565b613579565b613843565b83356001600160401b038111611f4157602091611f6e8392833691870101613686565b815201930192610fb7565b346104235760203660031901126103085761074d611f9d611f9861354f565b61411e565b604051918291602083526020830190613804565b34610423575f366003190112610308576033546040516001600160a01b039091168152602090f35b34610423575f36600319011261030857602063ffffffff60c95460a01c16604051908152f35b34610423575f366003190112610308576097546040516001600160a01b039091168152602090f35b34610423576020366003190112610308576004356001600160401b03811161041e5761106e61207661206061074d933690600401613764565b6040519283916020808401526040830190613fbb565b6040519182916020835260208301906137e0565b34610423576040366003190112610308576004356001600160401b03811161041e576120ba903690600401613764565b6024356001600160401b03811161041e576120d99036906004016135ed565b9060cb549160a08201928351106126bc576080820180519091906001600160a01b03163303612621575b505063ffffffff6060820151169063ffffffff421691828082115f146126125761212c9161460f565b63ffffffff8060ca5460281c169116116125cd576001600160a01b03612150613ef7565b16835190803b156103b5576040516323b872dd60e01b81523360048201523060248201526044810192909252602090829060649082905f905af19081156125c2575f916125a3575b501561256557604051906121ab826134a7565b5f60a06040516121ba816134a7565b60608152826020820152826040820152826060820152826080820152015260408201935f855260ff60608401945f865260808501966060885260a08601945f8652865281602087015263ffffffff61221860ca549382851690614010565b16905260201c168094525190526040516020810190602082526122428161106e604082018661402a565b5190209060ce54918284116125205761225a8361382c565b9261226860405194856134dd565b8084526020840160ce5f527fd36cd1c74ef8d7326d8021b776c18fb5a5724b7f7bc93c2f42e43e10ef27d12a5f915b83831061250257505050508251916122ae8561382c565b946122bc60405196876134dd565b8086526122cb601f199161382c565b015f5b8181106124eb5750505f925b85519060ff8516918210156124345780156123c95761232a816122fd8487614629565b60405160208101914483524260408301526060820152606081526123226080826134dd565b519020614636565b9061233582886141e7565b51915f19820191821161127a5761236290612350838a6141e7565b5161235b828b6141e7565b52886141e7565b50815190959061237a906001600160a01b0316614280565b156123c057508051602091906001600160a01b0316612399848a6141e7565b5152015160206123a983896141e7565b51015260ff811461127a57600101955b95926122da565b979150506123b9565b60405162461bcd60e51b815260206004820152603760248201527f496e7465726e616c3a204665657320746f6f206c6f772e204e6f206f7065726160448201527f746f7273206c65667420746f207069636b2066726f6d2e0000000000000000006064820152608490fd5b828789526040516020810190602082526124558161106e604082018661402a565b51902063ffffffff60c95460a01c165f5260cc60205260405f205560016124bb60c954927f07a2aac65c6401a6cbb0fa80ff456ec88725098383c7e585ee342ae74505c98b63ffffffff8560a01c1692839260405191829160208352602083019061402a565b0390a20163ffffffff811161127a5763ffffffff60a01b1990911660a09190911b63ffffffff60a01b161760c955005b6020906124f66140d9565b82828a010152016122ce565b60026020600192612512856140f2565b815201920192019190612297565b60405162461bcd60e51b815260206004820152601e60248201527f496e7465726e616c3a204e6f7420656e6f756768206f70657261746f727300006044820152606490fd5b60405162461bcd60e51b81526020600482015260166024820152754661696c656420746f207472616e736665722066656560501b6044820152606490fd5b6125bc915060203d602011611b9157611b8481836134dd565b84612198565b6040513d5f823e3d90fd5b60405162461bcd60e51b815260206004820152601e60248201527f526571756573742074696d657374616d7020746f6f20666172206177617900006044820152606490fd5b9061261c9161460f565b61212c565b6126449060405160208082015261263f8161106e6040820188613fbb565b614589565b90516001600160a01b0390811691160361265f578280612103565b60405162461bcd60e51b815260206004820152602f60248201527f5369676e6572206f6620726571756573745369676e6174757265206973206e6f60448201526e3a103932b8bab2b9ba1737bbb732b960891b6064820152608490fd5b60405162461bcd60e51b815260206004820152600b60248201526a46656520746f6f206c6f7760a81b6044820152606490fd5b34610423575f36600319011261030857612707614380565b603380546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b34610423575f366003190112610308576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610423575f366003190112610308576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610423576080366003190112610308576040516127ef81613478565b6127f76136d2565b815260243560ff81168103611f0c57602082019081526044359063ffffffff82168203611f0c576040830191825263ffffffff6060840193606435855261283c614380565b5116806128b5575b505160ff8116612894575b505163ffffffff811661286b575b50518061286657005b60cb55005b68ffffffff000000000060ca549160281b169068ffffffff000000000019161760ca558161285d565b64ff0000000060ca549160201b169064ff0000000019161760ca558261284f565b63ffffffff1960ca54161760ca5583612844565b346104235760203660031901126103085760043560cd54811015611f0c576128f2602091613738565b905460405160039290921b1c6001600160a01b03168152f35b34610423575f366003190112610308576020609854604051908152f35b346104235760203660031901126103085760043560ff8116809103611f0c5760016020911b806098541614604051908152f35b34610423575f366003190112610308576097546001600160a01b0316803b156103b55760206024916040519283809263237dfb4760e11b82523360048301525afa80156125c2576129b3915f916129e7575b50613b02565b5f196098556040515f1981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2005b612a00915060203d602011611b9157611b8481836134dd565b826129ad565b3461042357604036600319011261030857612a1f61354f565b6024356001600160a01b03811690819003611f0c575f549160ff8360081c161592838094612bf7575b8015612be0575b15612b845760ff1981166001175f5583612b73575b5060ff5f5460081c1615612b1a57612a7b90614541565b612a84306144e3565b60026060604051612a9481613478565b61070881526001602082015261012c6040820152015260ca805468ffffffffffffffffff191666012c0100000708179055600260cb5560c980546001600160a01b031916919091179055612ae457005b61ff00195f54165f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a1005b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b61ffff1916610101175f5583612a64565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b158015612a4f5750600160ff821614612a4f565b50600160ff821610612a48565b3461042357602036600319011261030857612c2d612c2061354f565b612c28614380565b6144e3565b005b3461042357602036600319011261030857612c4861354f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103b5575f600491604051928380926302e0740360e31b82525afa9081156125c2575f91612ee9575b5080515190612cac8261382c565b90612cba60405192836134dd565b828252612cc68361382c565b602083019190601f19013683375f5b848110612ec15750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103b55760408051639004134760e01b81526001600160a01b0390961660048701526024860152825160448601819052859160648301915f5b818110612e9f575050509181805f9403915afa9283156125c2575f93612e0d575b505f805b838110612de15750612d7b906141a8565b925f905f5b848110612d95576040518061074d88826136f6565b612d9f81836141e7565b51612dad575b600101612d80565b91600190612dd9906001600160a01b03612dc786886141e7565b5116612dd3828a6141e7565b526144d5565b929050612da5565b612deb81866141e7565b51612df9575b600101612d6a565b90612e056001916144d5565b919050612df1565b9092503d805f833e612e1f81836134dd565b810190602081830312610308578051906001600160401b03821161041e57019080601f83011215611f41578151612e558161382c565b92612e6360405194856134dd565b81845260208085019260051b820101928311611f4657602001905b828210612e8f575050509183612d66565b8151815260209182019101612e7e565b82516001600160a01b0316845288945060209384019390920191600101612d45565b600190818060a01b03612ed58285516141e7565b515116612ee282876141e7565b5201612cd5565b612efd91503d805f833e61076581836134dd565b82612c9e565b34610423576020366003190112610308576020610796612f2161354f565b613f72565b346104235760203660031901126103085763ffffffff612f446136d2565b165f5260cc602052602060405f2054604051908152f35b34610423575f366003190112610308576020612f75613ef7565b6040516001600160a01b039091168152f35b3461042357604036600319011261030857612fa061354f565b6024358015158103611f0c57612c2d91612fb8614380565b613e57565b34610423576020366003190112610308576004356001600160401b03811161041e57612fed903690600401613686565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103b55760206024916040519283809263ec7fbb3160e01b82523360048301525afa80156125c2576001915f916130a2575b5015150361305d57612c2d90613ca9565b60405162461bcd60e51b815260206004820152601b60248201527f4f70657261746f72206d757374206265207468652063616c6c657200000000006044820152606490fd5b6130bb915060203d602011611b9157611b8481836134dd565b8361304c565b3461042357602036600319011261030857609754600435906001600160a01b0316803b156103b55760206024916040519283809263237dfb4760e11b82523360048301525afa80156125c25761311d915f916131c55750613b02565b6098548181160361315a57806098556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2005b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b6131de915060203d602011611b9157611b8481836134dd565b836129ad565b34613337576020366003190112610308576004356001600160a01b03811690819003611f0c576097546001600160a01b038116803b156103b55760405163755b36bd60e11b8152602081600481855afa80156125c257613255915f9161331857506001600160a01b03163314613a8b565b821561329b5760407f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6918151908152846020820152a16001600160a01b03191617609755005b60405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a490fd5b613331915060203d6020116105ae576105a081836134dd565b856104ca565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b608081019081106001600160401b0382111761349357604052565b634e487b7160e01b5f52604160045260245ffd5b60c081019081106001600160401b0382111761349357604052565b604081019081106001600160401b0382111761349357604052565b90601f801991011681019081106001600160401b0382111761349357604052565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b600435906001600160a01b0382168203611f0c57565b35906001600160a01b0382168203611f0c57565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b6001600160401b03811161349357601f01601f191660200190565b81601f82011215611f4157602081359101613607826135d2565b9261361560405194856134dd565b8284528282011161363157815f92602092838601378301015290565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b9190604083820312610e8e576040519061369f826134c2565b81936136aa81613565565b83526020810135916001600160401b038311610e75576020926136cd92016135ed565b910152565b6004359063ffffffff82168203611f0c57565b359063ffffffff82168203611f0c57565b60206040818301928281528451809452019201905f5b8181106137195750505090565b82516001600160a01b031684526020938401939092019160010161370c565b60cd548110156137505760cd5f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b91909160c081840312610e8e576040519061377e826134a7565b81938135916001600160401b038311610e75576137a160a09392849383016135ed565b845260208101356020850152604081013560408501526137c3606082016136e5565b60608501526137d460808201613565565b60808501520135910152565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b90604060206138299360018060a01b03815116845201519181602082015201906137e0565b90565b6001600160401b0381116134935760051b60200190565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b9181601f84011215611f41578235916001600160401b0383116138cc576020808501948460051b010111611f4657565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b60ce548110156137505760ce5f5260205f209060011b01905f90565b90600182811c9216801561396f575b602083101461395b57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691613950565b9060405191825f82549261398c84613941565b80845293600181169081156139f757506001146139b3575b506139b1925003836134dd565b565b90505f9291925260205f20905f915b8183106139db5750509060206139b1928201015f6139a4565b60209193508060019154838589010152019101909184926139c2565b9050602092506139b194915060ff191682840152151560051b8201015f6139a4565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b9081602091031261030857516001600160a01b0381168103611f0c5790565b15613a9257565b60405162461bcd60e51b815260206004820152602a60248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526939903ab73830bab9b2b960b11b6064820152608490fd5b9081602091031261030857518015158103611f0c5790565b15613b0957565b60405162461bcd60e51b815260206004820152602860248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526739903830bab9b2b960c11b6064820152608490fd5b818110613b6a575050565b5f8155600101613b5f565b90929192613c96576001602091818060a01b038551166001600160601b0360a01b825416178155019201519182516001600160401b03811161349357613bbb8254613941565b601f8111613c5b575b506020601f8211600114613bfd57819293945f92613bf2575b50508160011b915f199060031b1c1916179055565b015190505f80613bdd565b601f19821690835f52805f20915f5b818110613c4357509583600195969710613c2b575b505050811b019055565b01515f1960f88460031b161c191690555f8080613c21565b9192602060018192868b015181550194019201613c0c565b613c8690835f5260205f20601f840160051c81019160208510613c8c575b601f0160051c0190613b5f565b5f613bc4565b9091508190613c79565b634e487b7160e01b5f525f60045260245ffd5b80516001600160a01b03163303613e035760208101515115613d2f575f5b60ce54811015613d0b57613cda81613925565b505482516001600160a01b03908116911614613cf857600101613cc7565b90613d056139b192613925565b90613b75565b5060ce5490600160401b82101561349357613d058260016139b1940160ce55613925565b5f5b60ce54811015613dc557613d4481613925565b505482516001600160a01b03908116911614613d6257600101613d31565b613d6c9150613925565b613c9657805f6001925501613d818154613941565b9081613d8b575050565b81601f5f9311600114613d9c575055565b81835260208320613db891601f0160051c810190600101613b5f565b8082528160208120915555565b60405162461bcd60e51b815260206004820152601260248201527113dc195c985d1bdc881b9bdd08199bdd5b9960721b6044820152606490fd5b0390fd5b60405162461bcd60e51b815260206004820152602660248201527f4d657461646174612061646472657373206d757374206d61746368207468652060448201526531b0b63632b960d11b6064820152608490fd5b90613eb4575f5b60cd54811015613dc557613e7181613738565b905460039190911b1c6001600160a01b0390811690831614613e9557600101613e5e565b613e9f9150613738565b81549060018060a01b039060031b1b19169055565b60cd54600160401b81101561349357806001613ed3920160cd55613738565b81546001600160a01b0393841660039290921b91821b9390911b1916919091179055565b60c9546001600160a01b0316803b156103b557602060049160405192838092632495a59960e01b82525afa9081156125c2575f91613f33575090565b90506020813d602011613f6a575b81613f4e602093836134dd565b8101031261030857516001600160a01b0381168103611f0c5790565b3d9150613f41565b60cd54905f5b828110613f86575050505f90565b613f8f81613738565b905460039190911b1c6001600160a01b0390811690831614613fb357600101613f78565b505050600190565b9060a080613fd2845160c0855260c08501906137e0565b93602081015160208501526040810151604085015263ffffffff6060820151166060850152600180831b036080820151166080850152015191015290565b9063ffffffff8091169116019063ffffffff821161127a57565b9061403e825160c0835260c0830190613fbb565b9163ffffffff602082015116602083015263ffffffff604082015116604083015260ff60608201511660608301526080810151928281036080840152835180825260208201916020808360051b8301019601925f915b8383106140ac57505050505060a08091015191015290565b90919293966020806140ca600193601f198682030187528b51613804565b99019301930191939290614094565b604051906140e6826134c2565b60606020835f81520152565b906040516140ff816134c2565b82546001600160a01b031681529182906020906136cd90600101613979565b6141266140d9565b5060ce54905f5b82811061416e5760405162461bcd60e51b815260206004820152601260248201527113dc195c985d1bdc881b9bdd08199bdd5b9960721b6044820152606490fd5b61417781613925565b50546001600160a01b038381169116146141935760010161412d565b61382992506141a29150613925565b506140f2565b906141b28261382c565b6141bf60405191826134dd565b82815280926141d0601f199161382c565b0190602036910137565b8051156137505760200190565b80518210156137505760209160051b010190565b1561420257565b60405162461bcd60e51b815260206004820152604a60248201527f4543445341536572766963654d616e61676572426173652e6f6e6c795374616b60448201527f6552656769737472793a2063616c6c6572206973206e6f7420746865207374616064820152696b65526567697374727960b01b608482015260a490fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103b5576040516398ec1ac960e01b81526001600160a01b039091166004820152602081602481855afa9081156125c2575f9161434e575b50813b156103b5576020600492604051938480926340bf2fb760e01b82525afa9182156125c2575f9261431a575b50101590565b9091506020813d602011614346575b81614336602093836134dd565b810103126103085751905f614314565b3d9150614329565b90506020813d602011614378575b81614369602093836134dd565b8101031261030857515f6142e6565b3d915061435c565b6033546001600160a01b0316330361439457565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b602081830312610308578051906001600160401b03821161041e570190602082820312610e8e5760405191602083018381106001600160401b03821117613493576040528051906001600160401b038211610e75570181601f82011215611f41578051906144458261382c565b9261445360405194856134dd565b82845260208085019360061b83010191818311611f4657602001925b82841061447f5750505050815290565b604084830312610e8e5760405190614496826134c2565b84516001600160a01b0381168103611f0c5782526020850151906001600160601b0382168203611f0c578260209283604095015281520193019261446f565b5f19811461127a5760010190565b606554604080516001600160a01b038084168252841660208201529192917fe11cddf1816a43318ca175bbc52cd0185436e9cbead7c83acc54a73e461717e39190a16001600160a01b03166001600160a01b03199190911617606555565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b613829916146079160206145ff6145a083516149fb565b92603a60405193849281808501977f19457468657265756d205369676e6564204d6573736167653a0a00000000000089528051918291018587015e8401908382015f8152815193849201905e01015f815203601f1981018352826134dd565b519020614bc6565b919091614c34565b9063ffffffff8091169116039063ffffffff821161127a57565b9190820180921161127a57565b8115611ba2570690565b8115611ba2570490565b90816020910312610308575163ffffffff81168103611f0c5790565b6065546001600160a01b0316330361467a57565b60405162461bcd60e51b815260206004820152605160248201527f4543445341536572766963654d616e61676572426173652e6f6e6c795265776160448201527f726473496e69746961746f723a2063616c6c6572206973206e6f7420746865206064820152703932bbb0b932399034b734ba34b0ba37b960791b608482015260a490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206f6666736574000000006044820152606490fd5b91908110156137505760051b8101359060be1981360301821215614766570190565b6146ff565b903590601e198136030182121561476657018035906001600160401b0382116147e557602001918160061b360383136147a057565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c64617461207461696c20746f6f2073686f72740000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206c656e677468000000006044820152606490fd5b356001600160a01b0381168103611f0c5790565b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206c656e67746800006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c64617461206163636573732073747269646500006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206f666673657400006044820152606490fd5b9035601e19823603018112156103b05701602081359101916001600160401b038211610b54578160061b36038313610b4f57565b916020908281520191905f905b80821061495b5750505090565b909192833560018060a01b038116809103611f0c5781526020840135906001600160601b038216809203611f0c5760408160019360208394015201940192019061494e565b91908110156137505760051b81013590609e1981360301821215614766570190565b906149cc826135d2565b6149d960405191826134dd565b82815280926141d0601f19916135d2565b908151811015613750570160200190565b8015614a905780815f925b614a7c575080614a15836149c2565b92915b614a2157505090565b5f19820191821161127a5781600a820491600a8302838104600a148415171561127a57810390811161127a5760ff1660300160ff811161127a5760f81b6001600160f81b0319165f1a90614a7590856149ea565b5380614a18565b91614a88600a916144d5565b920480614a06565b50604051614a9f6040826134dd565b60018152600360fc1b602082015290565b6040516323b872dd60e01b60208201526001600160a01b03928316602482015292909116604483015260648201929092526139b191614afc82608481015b03601f1981018452836134dd565b614da4565b6001600160a01b03811692833b156103b557604051636eb1769f60e11b81523060048201526001600160a01b038416602482015293602090859060449082905afa9384156125c2575f94614b90575b50614b61614afc916139b195614629565b60405163095ea7b360e01b60208201526001600160a01b03909416602485015260448401528260648101614aee565b93506020843d602011614bbe575b81614bab602093836134dd565b8101031261030857925192614b61614b50565b3d9150614b9e565b815160418103614bf2575090614bee91602082015190606060408401519301515f1a90614ef6565b9091565b604003614c2b5760406020830151920151918260ff1c91601b830180931161127a57614bee936001600160ff1b03169260ff1690614ef6565b50505f90600290565b6005811015614d905780614c455750565b60018103614c925760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b60028103614cdf5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b60038103614d375760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b600414614d4057565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608490fd5b634e487b7160e01b5f52602160045260245ffd5b60408051909290916001600160a01b0316614dbf84846134dd565b602083527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020840152803b15614eb2575f828192826020614e2e9796519301915af13d15614eaa573d90614e13826135d2565b91614e20865193846134dd565b82523d5f602084013e614fda565b80519081614e3b57505050565b602080614e4c938301019101613aea565b15614e545750565b5162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b606090614fda565b835162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411614f8d5760ff1690601b82141580614f82575b614f77576020935f93608093604051938452868401526040830152606082015282805260015afa156125c2575f516001600160a01b03811615614f6f57905f90565b505f90600190565b505050505f90600490565b50601c821415614f2d565b505050505f90600390565b60f81c600a811015614fbf5760300160ff811161127a5760f81b6001600160f81b03191690565b60570160ff811161127a5760f81b6001600160f81b03191690565b90919015614fe6575090565b815115614ff65750805190602001fd5b60405162461bcd60e51b815260206004820152908190613dff9060248301906137e056fea2646970667358221220765534608bc17f5638eba37dd7a514c65dadea90fee0a6296cc805fb2394137664736f6c634300081a0033"; type ReclaimServiceManagerConstructorParams = | [signer?: Signer] diff --git a/src/avs/contracts/factories/RewardsCoordinator__factory.ts b/src/avs/contracts/factories/RewardsCoordinator__factory.ts index 2318c86f..af965b4b 100644 --- a/src/avs/contracts/factories/RewardsCoordinator__factory.ts +++ b/src/avs/contracts/factories/RewardsCoordinator__factory.ts @@ -2094,7 +2094,7 @@ const _abi = [ ] as const; const _bytecode = - "0x61018080604052346103c757604051601f61552238819003918201601f19168301916001600160401b038311848410176103b15780849260e094604052833981010312610361578051906001600160a01b038216820361035c5760208101516001600160a01b038116810361035c5761007a60408301610414565b61008660608401610414565b9061009360808501610414565b926100ac60c06100a560a08801610414565b9601610414565b9563ffffffff831680156103465763ffffffff81818a1606166102b5576201518063ffffffff91061661022457610120526101405260805260a05260c05260e0526101005260005460ff8160081c166101cf5760ff80821610610194575b46610160526040516150fc908161042682396080518181816114bb01526148ca015260a0518181816117f0015261488f015260c051818181610b89015261490e015260e05181818161050f01526137040152610100518181816107030152614a5a01526101205181611c26015261014051818181610bc3015261494c015261016051816132120152f35b60ff90811916176000557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a18061010a565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b60405162461bcd60e51b815260206004820152605760248201527f52657761726473436f6f7264696e61746f723a2043414c43554c4154494f4e5f60448201527f494e54455256414c5f5345434f4e4453206d7573742062652061206d756c746960648201527f706c65206f6620534e415053484f545f434144454e4345000000000000000000608482015260a490fd5b60405162461bcd60e51b815260206004820152606060248201527f52657761726473436f6f7264696e61746f723a2047454e455349535f5245574160448201527f5244535f54494d455354414d50206d7573742062652061206d756c7469706c6560648201527f206f662043414c43554c4154494f4e5f494e54455256414c5f5345434f4e4453608482015260a490fd5b634e487b7160e01b600052601260045260246000fd5b600080fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b600052604160045260246000fd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b519063ffffffff8216820361035c5756fe60806040526004361061215c5760003560e01c806218572c1461039b57806304a0c502146103965780630e9a53cf146103915780630eb383451461038c57806310d67a2f14610387578063131433b414610382578063136439dd1461037d578063149bc872146103785780632b9f64a41461037357806336af41fa1461036e57806337838ed01461036957806339b70e38146103645780633a8c07861461035f5780633ccc861d1461035a5780633efe1db6146103555780634596021c146103505780634b9439601461034b5780634d18cc351461034657806358baaa3e14610341578063595c6a671461033c5780635ac86ab7146103375780635c975abb146103325780635e9d83481461032d57806363f6a798146103285780636d21117e14610323578063715018a61461031e5780637b8f8b0514610319578063863cb9a914610314578063865c69531461030f578063886f11951461030a5780638da5cb5b146103055780639104c319146103005780639be3d4e4146102fb5780639cb9a5fa146102f65780639d45c281146102f1578063a0169ddd146102ec578063a50a1d9c146102e7578063aebd8bae146102e2578063b3dbb0e0146102dd578063bb7e451f146102d8578063bf21a8aa146102d3578063c46db606146102ce578063d4540a55146102c9578063dcbb03b3146102c4578063de02e503146102bf578063e063f81f146102ba578063e810ce21146102b5578063ea4d3c9b146102b0578063ed71e6a2146102ab578063f2fde38b146102a6578063f698da25146102a1578063f8cd84481461029c578063f96abf2e14610297578063fabc1cbc14610292578063fbf1e2c11461028d578063fce36c7d146102885763ff9f6cce0361215c57612046565b611f4a565b611f21565b611eb6565b611d77565b611d53565b611d38565b611ca7565b611c55565b611c10565b611be4565b611b73565b611b48565b611991565b611866565b611814565b6117d3565b611796565b611608565b6115b6565b611586565b6114df565b61149e565b61132d565b6112f0565b6112c1565b611298565b61126f565b61120c565b6111df565b6111c1565b611164565b611112565b6110ed565b61108d565b61106f565b61103c565b610fdb565b610fae565b610f87565b610f05565b610e66565b610cb4565b610c28565b610bf2565b610bad565b610b6c565b610a0c565b610854565b610828565b610727565b6106e6565b610635565b61059c565b610533565b6104f2565b6104a6565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b6001600160a01b038116036104a157565b600080fd5b346104ed5760203660031901126104e8576004356104c381610490565b60018060a01b031660005260d1602052602060ff604060002054166040519015158152f35b6103f0565b6103a0565b346104ed5760003660031901126104e857602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346104ed5760003660031901126104e85761058e61054f61233b565b6040519182918291909160608060808301948051845263ffffffff602082015116602085015263ffffffff604082015116604085015201511515910152565b0390f35b801515036104a157565b346104ed5760403660031901126104e8576004356105b981610490565b602435906105c682610592565b6105ce61340d565b60018060a01b03168060005260d160205260ff60406000205416151582151590827f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c600080a460005260d160205260406000209060ff801983541691151516179055600080f35b346104ed5760203660031901126104e85760043561065281610490565b6065546001600160a01b031690813b156106e15760206004926040519384809263755b36bd60e11b82525afa9182156106dc576106ab926106a6916000916106ad575b506001600160a01b03163314612444565b613465565b005b6106cf915060203d6020116106d5575b6106c78183612210565b810190612420565b38610695565b503d6106bd565b612438565b6123cd565b346104ed5760003660031901126104e857602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346104ed5760203660031901126104e8576065546001600160a01b0316600435813b156106e15760206024926040519384809263237dfb4760e11b82523360048301525afa9182156106dc576106ab926107899160009161078e575b506124b8565b612515565b6107b0915060203d6020116107b6575b6107a88183612210565b8101906124a3565b38610783565b503d61079e565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a207374727563742063616c6c6461746120746f6044820152661bc81cda1bdc9d60ca1b6064820152608490fd5b604090600319011261082357600490565b6107bd565b346104ed5760403660031901126104e857602061084c61084736610812565b6125ca565b604051908152f35b346104ed5760203660031901126104e85760043561087181610490565b60018060a01b031660005260cc602052602060018060a01b0360406000205416604051908152f35b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b9181601f84011215610980578235916001600160401b038311610927576020808501948460051b01011161092257565b610899565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b60206003198201126104e857600435906001600160401b038211610a0757610a03916004016108f2565b9091565b610440565b346104ed57610a1a366109d9565b90610a32610a2c600280606654161490565b15612614565b3360005260d1602052610a4c60ff60406000205416612660565b610a5b600260975414156126ec565b600260975560005b828110610a74576106ab6001609755565b80610b66610a856001938686612807565b33600090815260ce60205260409020546040516020810190610abb81610aad86863387612a10565b03601f198101835282612210565b51902090610ac883613692565b33600090815260d060205260409020610afe90610af19084905b90600052602052604060002090565b805460ff19166001179055565b610b0781612a34565b33600090815260ce60205260409020556040517f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf270482339180610b488782612a5d565b0390a46040610b59602083016125c0565b91013590309033906137a8565b01610a63565b346104ed5760003660031901126104e857602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346104ed5760003660031901126104e8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346104ed5760003660031901126104e857602063ffffffff60cb5460a01c16604051908152f35b90816101009103126108235790565b346104ed5760403660031901126104e8576004356001600160401b038111610a0757610c5b610c92913690600401610c19565b60243590610c6882610490565b610c79610a2c600480606654161490565b610c88600260975414156126ec565b6002609755613938565b6001609755005b63ffffffff8116036104a157565b3590610cb282610c99565b565b346104ed5760403660031901126104e857602435600435610cd482610c99565b610ce5610a2c600880606654161490565b60cb5491610cfd336001600160a01b03851614612a6e565b63ffffffff81169263ffffffff8160c01c16841115610de75763ffffffff7fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd0891610d48428710612ad7565b610dcd610d75610d6d610d6060ca5463ffffffff1690565b9360a01c63ffffffff1690565b844216612b67565b94610da8610d81612231565b88815263ffffffff8316602082015263ffffffff8816604082015260006060820152612b81565b60cb805463ffffffff60c01b191660c09290921b63ffffffff60c01b16919091179055565b60405163ffffffff9094168452169180602081015b0390a4005b60405162461bcd60e51b815260206004820152604b60248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a206e60448201527f657720726f6f74206d75737420626520666f72206e657765722063616c63756c60648201526a185d1959081c195c9a5bd960aa1b608482015260a490fd5b346104ed5760403660031901126104e8576004356001600160401b038111610a0757610e969036906004016108f2565b60243591610ea383610490565b610eb4610a2c600480606654161490565b610ec3600260975414156126ec565b60026097553681900360fe19019260005b83811015610c92578060051b8301359085821215610f0057610efa836001938601613938565b01610ed4565b612738565b346104ed5760203660031901126104e857600435610f2281610490565b60018060a01b031660005260d560205261058e610f72604060002063ffffffff60405191610f4f836121d5565b5461ffff8116835261ffff8160101c16602084015260201c166040820152613afb565b60405161ffff90911681529081906020820190565b346104ed5760003660031901126104e857602063ffffffff60cb5460c01c16604051908152f35b346104ed5760203660031901126104e8576106ab600435610fce81610c99565b610fd661340d565b613b32565b346104ed5760003660031901126104e8576065546001600160a01b0316803b156106e15760206024916040519283809263237dfb4760e11b82523360048301525afa80156106dc576110349160009161078e57506124b8565b6106ab612c6a565b346104ed5760203660031901126104e85760043560ff81168091036104a15760016020911b806066541614604051908152f35b346104ed5760003660031901126104e8576020606654604051908152f35b346104ed5760203660031901126104e8576004356001600160401b038111610a07576110c06110e2913690600401610c19565b6110dc6110d682356110d181610c99565b6122ba565b506122fa565b90613d82565b602060405160018152f35b346104ed5760003660031901126104e857602061ffff60cb5460e01c16604051908152f35b346104ed5760403660031901126104e85760043561112f81610490565b6024359060018060a01b031660005260cf602052604060002090600052602052602060ff604060002054166040519015158152f35b346104ed5760003660031901126104e85761117d61340d565b603380546001600160a01b031981169091556000906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346104ed5760003660031901126104e857602060ca54604051908152f35b346104ed5760203660031901126104e8576106ab6004356111ff81610490565b61120761340d565b613efa565b346104ed5760403660031901126104e857602061126660043561122e81610490565b6024359061123b82610490565b60018060a01b031660005260cd835260406000209060018060a01b0316600052602052604060002090565b54604051908152f35b346104ed5760003660031901126104e8576065546040516001600160a01b039091168152602090f35b346104ed5760003660031901126104e8576033546040516001600160a01b039091168152602090f35b346104ed5760003660031901126104e857602060405173beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08152f35b346104ed5760003660031901126104e857611309612240565b5060ca5460001981019081116113285761054f6110d661058e926122ba565b612265565b346104ed5760403660031901126104e85760043561134a81610490565b6024356001600160401b038111610a07576113699036906004016108f2565b919061137c610a2c602080606654161490565b61138b600260975414156126ec565b60026097556001600160a01b038216916113a6338414612caa565b60005b8481106113ba576106ab6001609755565b806114986113cb6001938887612d39565b6001600160a01b038516600090815260ce60205260409020549060405160208101906113fd81610aad85878c87612ea1565b5190208861140a836141de565b9361142e610af184610ae28c60018060a01b031660005260d3602052604060002090565b61143781612a34565b6001600160a01b038a16600090815260ce60205260409020557ffc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e06040518061148187339583612ec5565b0390a4309061149360203392016125c0565b6137a8565b016113a9565b346104ed5760003660031901126104e857602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346104ed5760203660031901126104e8576004356114fc81610490565b33600081815260cc6020526040812080546001600160a01b039485166001600160a01b03198216811790925590931691907fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca3129080a4005b6024359061ffff821682036104a157565b60a4359061ffff821682036104a157565b6044359061ffff821682036104a157565b346104ed5760203660031901126104e85760043561ffff811681036104a1576106ab906115b161340d565b6142f5565b346104ed5760403660031901126104e8576004356115d381610490565b6024359060018060a01b031660005260d2602052604060002090600052602052602060ff604060002054166040519015158152f35b346104ed5760403660031901126104e85760043561162581610490565b61162d611553565b9061163f610a2c608080606654161490565b6001600160a01b0381169133839003611721578061168661271061ffff7fd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f7494161115612edc565b60cb546116a39060a01c63ffffffff165b63ffffffff4216612b67565b926116f984836116f46116d86116d36116ce8760018060a01b031660005260d5602052604060002090565b612c36565b613afb565b6001600160a01b03909516600090815260d56020526040902090565b614350565b6040805163ffffffff95909516855261ffff91821660208601529116908301523391606090a3005b60405162461bcd60e51b815260206004820152604160248201527f52657761726473436f6f7264696e61746f722e7365744f70657261746f72504960448201527f53706c69743a2063616c6c6572206973206e6f7420746865206f70657261746f6064820152603960f91b608482015260a490fd5b346104ed5760203660031901126104e8576004356117b381610490565b60018060a01b031660005260ce6020526020604060002054604051908152f35b346104ed5760003660031901126104e857602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346104ed5760403660031901126104e85760043561183181610490565b6024359060018060a01b031660005260d0602052604060002090600052602052602060ff604060002054166040519015158152f35b346104ed5760c03660031901126104e85760043561188381610490565b61190560243561189281610490565b6044356064356118a181610490565b608435916118ae83610c99565b6118b6611564565b93600054966118e96118d36118cf8a60ff9060081c1690565b1590565b8099819a611983575b8115611963575b50612f59565b876118fc600160ff196000541617600055565b61194a57612fbc565b61190b57005b61191b61ff001960005416600055565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1005b61195e61010061ff00196000541617600055565b612fbc565b303b15915081611975575b50386118e3565b60ff1660011490503861196e565b600160ff82161091506118dc565b346104ed5760603660031901126104e8576004356119ae81610490565b6024356119ba81610490565b6119c2611575565b6119d3610a2c604080606654161490565b6001600160a01b0383169133839003611ad257817f48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae693491611a1e61271061ffff611a65961611156130c5565b611a9886836116f484611a65611a7c6116d36116ce84611a4a61169760cb5463ffffffff9060a01c1690565b9d8e9960018060a01b031660005260d4602052604060002090565b9060018060a01b0316600052602052604060002090565b6001600160a01b03909c16600090815260d46020526040902090565b6040805163ffffffff95909516855261ffff968716602086015291909516908301526001600160a01b039093169233918060608101610de2565b60405162461bcd60e51b815260206004820152604260248201527f52657761726473436f6f7264696e61746f722e7365744f70657261746f72415660448201527f5353706c69743a2063616c6c6572206973206e6f7420746865206f706572617460648201526137b960f11b608482015260a490fd5b346104ed5760203660031901126104e85761058e61054f6110d6600435611b6d612240565b506122ba565b346104ed5760403660031901126104e85761058e610f72611bd2600435611b9981610490565b60243590611ba682610490565b60018060a01b031660005260d460205260406000209060018060a01b0316600052602052604060002090565b63ffffffff60405191610f4f836121d5565b346104ed5760203660031901126104e8576020611c0260043561315c565b63ffffffff60405191168152f35b346104ed5760003660031901126104e8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346104ed5760403660031901126104e857600435611c7281610490565b6024359060018060a01b031660005260d3602052604060002090600052602052602060ff604060002054166040519015158152f35b346104ed5760203660031901126104e857600435611cc481610490565b611ccc61340d565b6001600160a01b03811615611ce4576106ab90613eb1565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346104ed5760003660031901126104e857602061084c61320f565b346104ed5760403660031901126104e857602061084c611d7236610812565b613244565b346104ed5760203660031901126104e857600435611d9481610c99565b611da5610a2c600880606654161490565b611dba60018060a01b0360cb54163314612a6e565b60ca549063ffffffff811691821015611e57576001611ddb611e30926122ba565b5001611e1d611e16611e0d8354611e01611dfc6118cf8360ff9060401c1690565b61328b565b60201c63ffffffff1690565b63ffffffff1690565b42106132f5565b805460ff60401b1916600160401b179055565b7fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e600080a2005b60405162461bcd60e51b815260206004820152603160248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152700d2dcecc2d8d2c840e4dedee892dcc8caf607b1b6064820152608490fd5b346104ed5760203660031901126104e8576065546001600160a01b0316600435813b156106e15760206004926040519384809263755b36bd60e11b82525afa9182156106dc576106ab92611f1c916000916106ad57506001600160a01b03163314612444565b613360565b346104ed5760003660031901126104e85760cb546040516001600160a01b039091168152602090f35b346104ed57611f58366109d9565b90611f6a610a2c600180606654161490565b611f79600260975414156126ec565b600260975560005b828110611f92576106ab6001609755565b80612040611fa36001938686612807565b33600090815260ce60205260409020546040516020810190611fcb81610aad86863387612a10565b51902090611fd883613692565b33600090815260cf60205260409020611ff690610af1908490610ae2565b611fff81612a34565b33600090815260ce60205260409020556040517f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e6281339180610b488782612a5d565b01611f81565b346104ed57612054366109d9565b90612066610a2c601080606654161490565b3360005260d160205261208060ff60406000205416612660565b61208f600260975414156126ec565b600260975560005b8281106120a8576106ab6001609755565b806121566120b96001938686612807565b33600090815260ce602052604090205460405160208101906120e181610aad86863387612a10565b519020906120ee83613692565b33600090815260d26020526040902061210c90610af1908490610ae2565b61211581612a34565b33600090815260ce60205260409020556040517f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b339180610b488782612a5d565b01612097565b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b634e487b7160e01b600052604160045260246000fd5b606081019081106001600160401b038211176121f057604052565b6121bf565b608081019081106001600160401b038211176121f057604052565b90601f801991011681019081106001600160401b038211176121f057604052565b60405190610cb2608083612210565b6040519061224d826121f5565b60006060838281528260208201528260408201520152565b634e487b7160e01b600052601160045260246000fd5b8015611328576000190190565b60001981019190821161132857565b9190820391821161132857565b634e487b7160e01b600052603260045260246000fd5b60ca548110156122d95760ca60005260206000209060011b0190600090565b6122a4565b80548210156122d95760005260206000209060011b0190600090565b90604051612307816121f5565b606060ff6001839580548552015463ffffffff8116602085015263ffffffff8160201c16604085015260401c161515910152565b612343612240565b5060ca54805b6123725750612356612231565b6000815260006020820152600060408201526000606082015290565b6123816110d66110d183612288565b906123926118cf6060840151151590565b806123b0575b6123ac576123a6915061227b565b80612349565b5090565b506123c5611e0d604084015163ffffffff1690565b421015612398565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b908160209103126104e8575161243581610490565b90565b6040513d6000823e3d90fd5b1561244b57565b60405162461bcd60e51b815260206004820152602a60248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526939903ab73830bab9b2b960b11b6064820152608490fd5b908160209103126104e8575161243581610592565b156124bf57565b60405162461bcd60e51b815260206004820152602860248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526739903830bab9b2b960c11b6064820152608490fd5b6066548181160361255557606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d90602090a2565b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b3561243581610490565b60208135916125d883610490565b0135604051906020820192600084526001600160601b03199060601b16602183015260358201526035815261260e605582612210565b51902090565b1561261b57565b60405162461bcd60e51b815260206004820152601960248201527f5061757361626c653a20696e64657820697320706175736564000000000000006044820152606490fd5b1561266757565b60405162461bcd60e51b815260206004820152605160248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f60448201527f7420612076616c69642063726561746552657761726473466f72416c6c53756260648201527036b4b9b9b4b7b71039bab136b4ba3a32b960791b608482015260a490fd5b156126f357565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206f6666736574000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206c656e677468000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527f43616c6c64617461207461696c20746f6f2073686f72740000000000000000006044820152606490fd5b91908110156122d95760051b81013590609e1981360301821215610f00570190565b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206c656e67746800006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c64617461206163636573732073747269646500006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206f666673657400006044820152606490fd5b9035601e19823603018112156129365701602081359101916001600160401b038211612931578160061b3603831361292c57565b61286e565b612829565b6128b3565b916020908281520191906000905b8082106129565750505090565b909192833561296481610490565b6001600160a01b0316815260208401356001600160601b03811691908290036104a157604081600193602083940152019401920190612949565b90608063ffffffff816129c26129b486806128f8565b60a0875260a087019161293b565b9460208101356129d181610490565b6001600160a01b03166020860152604081810135908601528260608201356129f881610c99565b1660608601520135612a0981610c99565b1691015290565b612435939260609260018060a01b031682526020820152816040820152019061299e565b906001820180921161132857565b906020820180921161132857565b9190820180921161132857565b90602061243592818152019061299e565b15612a7557565b60405162461bcd60e51b815260206004820152603460248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f6044820152733a103a3432903932bbb0b93239aab83230ba32b960611b6064820152608490fd5b15612ade57565b60405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a207260448201527f65776172647343616c63756c6174696f6e456e6454696d657374616d702063616064820152746e6e6f7420626520696e207468652066757475726560581b608482015260a490fd5b9063ffffffff8091169116019063ffffffff821161132857565b60ca54600160401b8110156121f057806001612ba2920160ca5560ca6122de565b919091612c205760606001610cb29383518155019163ffffffff60208201511663ffffffff19845416178355612bff63ffffffff604083015116849067ffffffff0000000082549160201b169067ffffffff000000001916179055565b0151815460ff60401b191690151560401b68ff000000000000000016179055565b634e487b7160e01b600052600060045260246000fd5b90604051612c43816121d5565b604063ffffffff82945461ffff8116845261ffff8160101c16602085015260201c16910152565b60001960665560405160001981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2565b3561243581610c99565b15612cb157565b60405162461bcd60e51b815260206004820152605460248201527f52657761726473436f6f7264696e61746f722e6372656174654f70657261746f60448201527f724469726563746564415653526577617264735375626d697373696f6e3a2063606482015273616c6c6572206973206e6f74207468652041565360601b608482015260a490fd5b91908110156122d95760051b8101359060be1981360301821215610f00570190565b9035601e19823603018112156129365701602081359101916001600160401b03821161293157813603831361292c57565b908060209392818452848401376000828201840152601f01601f1916010190565b9190612dca612dbc84806128f8565b60c0845260c084019161293b565b906020840135612dd981610490565b6001600160a01b0316602082810191909152612df860408601866128f8565b8385036040850152808552939091019260005b818110612e6d57505050612e5f84612e39612e2c6060612435979801610ca7565b63ffffffff166060850152565b612e55612e4860808301610ca7565b63ffffffff166080850152565b60a0810190612d5b565b9160a0818503910152612d8c565b9091936040806001928735612e8181610490565b848060a01b03168152602088013560208201520195019101919091612e0b565b612435939260609260018060a01b0316825260208201528160408201520190612dad565b604090612435939281528160208201520190612dad565b15612ee357565b60405162461bcd60e51b815260206004820152604260248201527f52657761726473436f6f7264696e61746f722e7365744f70657261746f72504960448201527f53706c69743a2073706c6974206d757374206265203c3d203130303030206269606482015261707360f01b608482015260a490fd5b15612f6057565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b929493919094612fca6143f6565b60c9556065546001600160a01b031615806130b3575b15613038576112076115b194613033610cb29885613000610fd697606655565b60405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d90602090a2613465565b613eb1565b60405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a490fd5b506001600160a01b0386161515612fe0565b156130cc57565b60405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e7365744f70657261746f72415660448201527f5353706c69743a2073706c6974206d757374206265203c3d203130303030206260648201526269707360e81b608482015260a490fd5b63ffffffff6000199116019063ffffffff821161132857565b63ffffffff60ca54165b63ffffffff81166131dc5760405162461bcd60e51b815260206004820152603760248201527f52657761726473436f6f7264696e61746f722e676574526f6f74496e6465784660448201527f726f6d486173683a20726f6f74206e6f7420666f756e640000000000000000006064820152608490fd5b816131e96110d183613143565b5054146132055763ffffffff1680156113285760001901613166565b6124359150613143565b467f00000000000000000000000000000000000000000000000000000000000000000361323c5760c95490565b6124356143f6565b602081359161325283610490565b0135604051906020820192600160f81b84526001600160601b03199060601b16602183015260358201526035815261260e605582612210565b1561329257565b60405162461bcd60e51b815260206004820152603560248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152741c9bdbdd08185b1c9958591e48191a5cd8589b1959605a1b6064820152608490fd5b156132fc57565b60405162461bcd60e51b815260206004820152603660248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152751c9bdbdd08185b1c9958591e481858dd1a5d985d195960521b6064820152608490fd5b6066541981198116036133a257606681905560405190815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602090a2565b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b6033546001600160a01b0316330361342157565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b6001600160a01b038116156134d657606554604080516001600160a01b0392831681529183166020830152610cb292917f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb69190a160018060a01b03166001600160601b0360a01b6065541617606555565b60405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a490fd5b903590601e1981360301821215610f0057018035906001600160401b03821161358d57602001918160061b3603831361358857565b6127c2565b61277d565b1561359957565b60405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f76616c69646174655265776160448201527f7264735375626d697373696f6e3a20616d6f756e7420746f6f206c61726765006064820152608490fd5b1561360b57565b60405162461bcd60e51b815260206004820152605360248201527f52657761726473436f6f7264696e61746f722e5f76616c69646174655265776160448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152726f2066617220696e207468652066757475726560681b608482015260a490fd5b60406136c9916136a28180613553565b939060608301948535906136b582610c99565b6080850135926136c484610c99565b61486a565b0135801561373357610cb2916136f46f4b3b4ca85a86c47a098a223fffffffff6136f9931115613592565b612ca0565b63ffffffff61372a817f00000000000000000000000000000000000000000000000000000000000000001642612a50565b91161115613604565b60405162461bcd60e51b815260206004820152604160248201527f52657761726473436f6f7264696e61746f722e5f76616c69646174655265776160448201527f7264735375626d697373696f6e3a20616d6f756e742063616e6e6f74206265206064820152600360fc1b608482015260a490fd5b6040516323b872dd60e01b60208201526001600160a01b039283166024820152929091166044830152606480830193909352918152610cb2916137ec608483612210565b614ae1565b156137f857565b60405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063616c6c6572206973206e6f742076616c696420636c61696d6572000000006064820152608490fd5b903590601e1981360301821215610f0057018035906001600160401b03821161358d57602001918160051b3603831361358857565b91908110156122d95760061b0190565b156138af57565b60405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063756d756c61746976654561726e696e6773206d75737420626520677420746064820152741a185b8818dd5b5d5b185d1a5d9950db185a5b5959605a1b608482015260a490fd5b906139486110d66110d184612ca0565b906139538284613d82565b61395f606084016125c0565b9361398c61397f8660018060a01b031660005260cc602052604060002090565b546001600160a01b031690565b6001600160a01b03811615613af4575b90936001600160a01b03909116916139b53384146137f1565b6001600160a01b0386169160005b6139d060a0830183613863565b9050811015613aea57806139f36001926139ed60e0860186613553565b90613898565b86867f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce318c613a55613a368260018060a01b031660005260cd602052604060002090565b613a3f876125c0565b60018060a01b0316600052602052604060002090565b54613a9b613a92613a76602089013593613a708186116138a8565b84612297565b6001600160a01b03909416600090815260cd6020526040902090565b613a3f886125c0565b55613aaf818a613aaa886125c0565b614bb6565b613aba8c51956125c0565b604080519687526001600160a01b0391909116602087015285015260a086901b869003881693606090a4016139c3565b5050505050509050565b508461399c565b604081015163ffffffff169081613b1b57505061ffff60cb5460e01c1690565b61ffff914210613b2d57602001511690565b511690565b60cb54907faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b36040805163ffffffff8560a01c16815263ffffffff84166020820152a163ffffffff60a01b1990911660a09190911b63ffffffff60a01b161760cb55565b15613b9c57565b60405162461bcd60e51b8152602060048201526030602482015260008051602061504783398151915260448201526f1c9bdbdd081a5cc8191a5cd8589b195960821b6064820152608490fd5b15613bef57565b60405162461bcd60e51b815260206004820152603660248201526000805160206150478339815191526044820152751c9bdbdd081b9bdd081858dd1a5d985d1959081e595d60521b6064820152608490fd5b15613c4857565b60405162461bcd60e51b815260206004820152604c602482015260008051602061504783398151915260448201527f746f6b656e496e646963657320616e6420746f6b656e50726f6f6673206c656e60648201526b0cee8d040dad2e6dac2e8c6d60a31b608482015260a490fd5b15613cbd57565b60405162461bcd60e51b815260206004820152604a602482015260008051602061504783398151915260448201527f746f6b656e5472656550726f6f667320616e64206c6561766573206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a490fd5b903590601e1981360301821215610f0057018035906001600160401b03821161358d5760200191813603831361358857565b91908110156122d95760051b0190565b908210156122d957610a039160051b810190613d29565b919091613d9d613d986118cf6060860151151590565b613b95565b613dbc613db4611e0d604086015163ffffffff1690565b421015613be8565b60a0810190613dcb8282613863565b9050613de860c0830191613ddf8385613863565b91905014613c41565b613e38613df58284613863565b969050613e1360e0850197613e0a8987613553565b91905014613cb6565b51613e2060208501612ca0565b613e2d6040860186613d29565b916060870193614c7d565b60808201359260005b613e4b8285613863565b9050811015613ea85780613ea2856139ed8a613e9b85613e9281613e8c8c8f6136f460019d8f613e8090613e8694508d613863565b90613d5b565b98613863565b90613d6b565b9490938c613553565b928a614dad565b01613e41565b50505050509050565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b60cb546001600160a01b0391821691829082167f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb600080a36001600160a01b0319161760cb55565b15613f4957565b60405162461bcd60e51b8152602060048201526054602482015260008051602061508783398151915260448201527f61746f724469726563746564526577617264735375626d697373696f6e3a206e6064820152731bc81bdc195c985d1bdc9cc81c995dd85c99195960621b608482015260a490fd5b15613fc657565b60405162461bcd60e51b815260206004820152605b6024820152600080516020615087833981519152604482015260008051602061506783398151915260648201527f70657261746f722063616e6e6f74206265203020616464726573730000000000608482015260a490fd5b1561403a57565b60405162461bcd60e51b81526020600482015260786024820152600080516020615087833981519152604482015260008051602061506783398151915260648201527f70657261746f7273206d75737420626520696e20617363656e64696e67206f7260848201527f64657220746f2068616e646c65206475706c696361746573000000000000000060a482015260c490fd5b156140d457565b60405162461bcd60e51b81526020600482015260616024820152600080516020615087833981519152604482015260008051602061506783398151915260648201527f70657261746f722072657761726420616d6f756e742063616e6e6f74206265206084820152600360fc1b60a482015260c490fd5b1561415257565b60405162461bcd60e51b81526020600482015260766024820152600080516020615087833981519152604482015260008051602061506783398151915260648201527f70657261746f722d64697265637465642072657761726473207375626d697373608482015275696f6e206973206e6f7420726574726f61637469766560501b60a482015260c490fd5b906141e98280613553565b909261421060608201946141fc86612ca0565b608084019461420a86612ca0565b9261486a565b604081019061422b6142228383613553565b90501515613f42565b6000938493845b61423c8585613553565b90508710156142c0576142b860019161429961425c8a6139ed8a8a613553565b9861427f61427861426c8c6125c0565b6001600160a01b031690565b1515613fbf565b61428b61426c8b6125c0565b90858060a01b031610614033565b60206142a4896125c0565b980135906142b38215156140cd565b612a50565b960195614232565b955091509461243593506142e792506142db6142e191612ca0565b91612ca0565b90612b67565b63ffffffff4291161061414b565b60cb54907fe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e6040805161ffff8560e01c16815261ffff84166020820152a161ffff60e01b1990911660e09190911b61ffff60e01b161760cb55565b610cb29291815463ffffffff8160201c168042101561439e575b5050815467ffffffffffff0000191660109190911b63ffff0000161760209290921b67ffffffff0000000016919091179055565b6143c2575060cb54825461ffff191660e09190911c61ffff161782555b388061436a565b825461ffff191660109190911c61ffff161782556143bb565b6001600160401b0381116121f057601f01601f191660200190565b6040600a602082516144088482612210565b828152016922b4b3b2b72630bcb2b960b11b81522081519060208201927f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86684528201524660608201523060808201526080815261260e60a082612210565b1561446d57565b60405162461bcd60e51b815260206004820152604660248201526000805160206150a783398151915260448201527f6f6e526577617264735375626d697373696f6e3a206e6f207374726174656769606482015265195cc81cd95d60d21b608482015260a490fd5b156144dc57565b60405162461bcd60e51b815260206004820152605a60248201526000805160206150a783398151915260448201527f6f6e526577617264735375626d697373696f6e3a206475726174696f6e20657860648201527f6365656473204d41585f524557415244535f4455524154494f4e000000000000608482015260a490fd5b9063ffffffff169081156145735763ffffffff160690565b634e487b7160e01b600052601260045260246000fd5b1561459057565b60405162461bcd60e51b815260206004820152607060248201526000805160206150a783398151915260448201527f6f6e526577617264735375626d697373696f6e3a206475726174696f6e206d7560648201527f73742062652061206d756c7469706c65206f662043414c43554c4154494f4e5f60848201526f494e54455256414c5f5345434f4e445360801b60a482015260c490fd5b1561462f57565b60405162461bcd60e51b815260206004820152607660248201526000805160206150a783398151915260448201527f6f6e526577617264735375626d697373696f6e3a20737461727454696d65737460648201527f616d70206d7573742062652061206d756c7469706c65206f662043414c43554c6084820152754154494f4e5f494e54455256414c5f5345434f4e445360501b60a482015260c490fd5b156146d457565b60405162461bcd60e51b815260206004820152605760248201526000805160206150a783398151915260448201527f6f6e526577617264735375626d697373696f6e3a20737461727454696d65737460648201527f616d7020746f6f2066617220696e207468652070617374000000000000000000608482015260a490fd5b1561475a57565b60405162461bcd60e51b815260206004820152605060248201526000805160206150a783398151915260448201527f6f6e526577617264735375626d697373696f6e3a20696e76616c69642073747260648201526f185d1959de4818dbdb9cda59195c995960821b608482015260a490fd5b156147d357565b60405162461bcd60e51b815260206004820152606f60248201526000805160206150a783398151915260448201527f6f6e526577617264735375626d697373696f6e3a20737472617465676965732060648201527f6d75737420626520696e20617363656e64696e67206f7264657220746f20686160848201526e6e646c65206475706c69636174657360881b60a482015260c490fd5b92916149036148fd611e0d61494a9495614885871515614466565b6148bd63ffffffff7f00000000000000000000000000000000000000000000000000000000000000001663ffffffff831611156144d5565b6148f763ffffffff6148f07f0000000000000000000000000000000000000000000000000000000000000000809461455b565b1615614589565b8461455b565b15614628565b63ffffffff614934817f00000000000000000000000000000000000000000000000000000000000000001642612297565b9116809111159081614a51575b509291926146cd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691600090815b818310614988575050505050565b61499b614996848487613898565b6125c0565b90853b156106e15760405163198f077960e21b81526001600160a01b03831660048201526020816024818a5afa9283156106dc57600193614a0592600091614a33575b508015614a0d575b6149ef90614753565b838060a01b03168092848060a01b0316106147cc565b92019161497a565b5060a084901b849003811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0146149e6565b614a4b915060203d81116107b6576107a88183612210565b386149de565b905063ffffffff7f000000000000000000000000000000000000000000000000000000000000000016111538614941565b15614a8957565b60405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b6040805192916001600160a01b031690614afb8185612210565b602084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020850152813b15614b7357506000828192826020614b4e9796519301915af1614b48614f9f565b90614fcf565b805180614b59575050565b81602080614b6e93610cb295010191016124a3565b614a82565b5162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b60405163a9059cbb60e01b60208201526001600160a01b039092166024830152604480830193909352918152610cb2916137ec606483612210565b929192614bfd826143db565b91614c0b6040519384612210565b829481845281830111614c28578281602093846000960137010152565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b9063ffffffff9094939294169260018360051c1b841015614d3657614cb594614ca8614cb0926125ca565b933691614bf1565b614eb5565b15614cbc57565b60405162461bcd60e51b815260206004820152604660248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e657220636c61696d60648201526510383937b7b360d11b608482015260a490fd5b60405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e65724c656166496e6064820152620c8caf60eb1b608482015260a490fd5b9063ffffffff9094939294169260018360051c1b841015614e4a57614dd894614ca8614cb092613244565b15614ddf57565b60405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e20636c61696d2070726f6f66006064820152608490fd5b60405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e4c656166496e646578000000006064820152608490fd5b93909291601f855116614f205791906020925b85518411614f175760018316614efb5760005282850151602052614ef460406000209260011c93612a42565b9291614ec8565b83860151600052602052614ef460406000209260011c93612a42565b92509350501490565b60405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a490fd5b3d15614fca573d90614fb0826143db565b91614fbe6040519384612210565b82523d6000602084013e565b606090565b90919015614fdb575090565b815115614feb5750805190602001fd5b6040519062461bcd60e51b8252602060048301528181519182602483015260005b83811061502e5750508160006044809484010152601f80199101168101030190fd5b6020828201810151604487840101528593500161500c56fe52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2061746f724469726563746564526577617264735375626d697373696f6e3a206f52657761726473436f6f7264696e61746f722e5f76616c69646174654f70657252657761726473436f6f7264696e61746f722e5f76616c6964617465436f6d6da2646970667358221220fd153cb31a057eeed1466a91f80fff18d437f1e0e2cbe4dbcc4ebaee34d0428364736f6c634300081a0033"; + "0x61018080604052346103c057604051601f61544838819003918201601f19168301916001600160401b038311848410176103ac5780849260e09460405283398101031261035c578051906001600160a01b03821682036103585760208101516001600160a01b03811681036103585761007a6040830161040d565b6100866060840161040d565b906100936080850161040d565b926100ac60c06100a560a0880161040d565b960161040d565b9563ffffffff831680156103445763ffffffff81818a1606166102b3576201518063ffffffff91061661022257610120526101405260805260a05260c05260e052610100525f5460ff8160081c166101cd5760ff80821610610193575b4661016052604051615029908161041f8239608051818181611480015261481e015260a0518181816117aa01526147e3015260c051818181610b6f0152614862015260e05181818161050a01526136780152610100518181816106f501526149ac01526101205181611bcb015261014051818181610ba801526148a0015261016051816131860152f35b60ff90811916175f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a180610109565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b60405162461bcd60e51b815260206004820152605760248201527f52657761726473436f6f7264696e61746f723a2043414c43554c4154494f4e5f60448201527f494e54455256414c5f5345434f4e4453206d7573742062652061206d756c746960648201527f706c65206f6620534e415053484f545f434144454e4345000000000000000000608482015260a490fd5b60405162461bcd60e51b815260206004820152606060248201527f52657761726473436f6f7264696e61746f723a2047454e455349535f5245574160448201527f5244535f54494d455354414d50206d7573742062652061206d756c7469706c6560648201527f206f662043414c43554c4154494f4e5f494e54455256414c5f5345434f4e4453608482015260a490fd5b634e487b7160e01b5f52601260045260245ffd5b5f80fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b519063ffffffff821682036103585756fe6080604052600436106120ef575f3560e01c806218572c1461039a57806304a0c502146103955780630e9a53cf146103905780630eb383451461038b57806310d67a2f14610386578063131433b414610381578063136439dd1461037c578063149bc872146103775780632b9f64a41461037257806336af41fa1461036d57806337838ed01461036857806339b70e38146103635780633a8c07861461035e5780633ccc861d146103595780633efe1db6146103545780634596021c1461034f5780634b9439601461034a5780634d18cc351461034557806358baaa3e14610340578063595c6a671461033b5780635ac86ab7146103365780635c975abb146103315780635e9d83481461032c57806363f6a798146103275780636d21117e14610322578063715018a61461031d5780637b8f8b0514610318578063863cb9a914610313578063865c69531461030e578063886f1195146103095780638da5cb5b146103045780639104c319146102ff5780639be3d4e4146102fa5780639cb9a5fa146102f55780639d45c281146102f0578063a0169ddd146102eb578063a50a1d9c146102e6578063aebd8bae146102e1578063b3dbb0e0146102dc578063bb7e451f146102d7578063bf21a8aa146102d2578063c46db606146102cd578063d4540a55146102c8578063dcbb03b3146102c3578063de02e503146102be578063e063f81f146102b9578063e810ce21146102b4578063ea4d3c9b146102af578063ed71e6a2146102aa578063f2fde38b146102a5578063f698da25146102a0578063f8cd84481461029b578063f96abf2e14610296578063fabc1cbc14610291578063fbf1e2c11461028c578063fce36c7d146102875763ff9f6cce036120ef57611fdf565b611ee7565b611ebf565b611e55565b611d17565b611cf3565b611cd9565b611c48565b611bfa565b611bb6565b611b8a565b611b1d565b611af2565b611940565b61181c565b6117ce565b61178e565b611753565b6115c8565b61157a565b61154a565b6114a4565b611464565b6112f8565b6112bd565b61128f565b611267565b61123f565b6111e0565b6111b3565b611196565b61113b565b6110ed565b6110c9565b611069565b61104c565b611019565b610fba565b610f8d565b610f67565b610ee7565b610e49565b610c98565b610c0c565b610bd7565b610b93565b610b53565b6109fb565b610845565b610819565b610719565b6106d9565b610629565b610596565b61052e565b6104ee565b6104a4565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b6001600160a01b038116036104a057565b5f80fd5b346104e95760203660031901126104e4576004356104c18161048f565b60018060a01b03165f5260d1602052602060ff60405f2054166040519015158152f35b6103ef565b61039f565b346104e9575f3660031901126104e457602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346104e9575f3660031901126104e4576105886105496122bf565b6040519182918291909160608060808301948051845263ffffffff602082015116602085015263ffffffff604082015116604085015201511515910152565b0390f35b801515036104a057565b346104e95760403660031901126104e4576004356105b38161048f565b602435906105c08261058c565b6105c8613381565b60018060a01b0316805f5260d160205260ff60405f205416151582151590827f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c5f80a45f5260d160205260405f209060ff8019835416911515161790555f80f35b346104e95760203660031901126104e4576004356106468161048f565b6065546001600160a01b031690813b156106d45760206004926040519384809263755b36bd60e11b82525afa9182156106cf5761069e92610699915f916106a0575b506001600160a01b031633146123c3565b6133d9565b005b6106c2915060203d6020116106c8575b6106ba81836121a1565b8101906123a0565b5f610688565b503d6106b0565b6123b8565b61234d565b346104e9575f3660031901126104e457602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346104e95760203660031901126104e4576065546001600160a01b0316600435813b156106d45760206024926040519384809263237dfb4760e11b82523360048301525afa9182156106cf5761069e9261077a915f9161077f575b50612437565b612494565b6107a1915060203d6020116107a7575b61079981836121a1565b810190612422565b5f610774565b503d61078f565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a207374727563742063616c6c6461746120746f6044820152661bc81cda1bdc9d60ca1b6064820152608490fd5b604090600319011261081457600490565b6107ae565b346104e95760403660031901126104e457602061083d61083836610803565b612549565b604051908152f35b346104e95760203660031901126104e4576004356108628161048f565b60018060a01b03165f5260cc602052602060018060a01b0360405f205416604051908152f35b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b9181601f8401121561096f578235916001600160401b038311610916576020808501948460051b01011161091157565b610888565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b60206003198201126104e457600435906001600160401b0382116109f6576109f2916004016108e1565b9091565b61043f565b346104e957610a09366109c8565b90610a21610a1b600280606654161490565b15612592565b335f5260d1602052610a3960ff60405f2054166125de565b610a486002609754141561266a565b60026097555f5b828110610a605761069e6001609755565b80610b4d610a716001938686612785565b335f90815260ce60205260409020546040516020810190610aa681610a988686338761298d565b03601f1981018352826121a1565b51902090610ab383613606565b335f90815260d060205260409020610ae690610ad99084905b905f5260205260405f2090565b805460ff19166001179055565b610aef816129b1565b335f90815260ce60205260409020556040517f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf270482339180610b2f87826129da565b0390a46040610b406020830161253f565b910135903090339061371c565b01610a4f565b346104e9575f3660031901126104e457602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346104e9575f3660031901126104e4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346104e9575f3660031901126104e457602063ffffffff60cb5460a01c16604051908152f35b90816101009103126108145790565b346104e95760403660031901126104e4576004356001600160401b0381116109f657610c3f610c76913690600401610bfd565b60243590610c4c8261048f565b610c5d610a1b600480606654161490565b610c6c6002609754141561266a565b60026097556138ac565b6001609755005b63ffffffff8116036104a057565b3590610c9682610c7d565b565b346104e95760403660031901126104e457602435600435610cb882610c7d565b610cc9610a1b600880606654161490565b60cb5491610ce1336001600160a01b038516146129eb565b63ffffffff81169263ffffffff8160c01c16841115610dca5763ffffffff7fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd0891610d2c428710612a54565b610db0610d59610d51610d4460ca5463ffffffff1690565b9360a01c63ffffffff1690565b844216612ae4565b94610d8b610d656121c2565b88815263ffffffff8316602082015263ffffffff881660408201525f6060820152612afe565b60cb805463ffffffff60c01b191660c09290921b63ffffffff60c01b16919091179055565b60405163ffffffff9094168452169180602081015b0390a4005b60405162461bcd60e51b815260206004820152604b60248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a206e60448201527f657720726f6f74206d75737420626520666f72206e657765722063616c63756c60648201526a185d1959081c195c9a5bd960aa1b608482015260a490fd5b346104e95760403660031901126104e4576004356001600160401b0381116109f657610e799036906004016108e1565b60243591610e868361048f565b610e97610a1b600480606654161490565b610ea66002609754141561266a565b60026097553681900360fe1901925f5b83811015610c76578060051b8301359085821215610ee257610edc8360019386016138ac565b01610eb6565b6126b6565b346104e95760203660031901126104e457600435610f048161048f565b60018060a01b03165f5260d5602052610588610f5260405f2063ffffffff60405191610f2f83612166565b5461ffff8116835261ffff8160101c16602084015260201c166040820152613a67565b60405161ffff90911681529081906020820190565b346104e9575f3660031901126104e457602063ffffffff60cb5460c01c16604051908152f35b346104e95760203660031901126104e45761069e600435610fad81610c7d565b610fb5613381565b613a9e565b346104e9575f3660031901126104e4576065546001600160a01b0316803b156106d45760206024916040519283809263237dfb4760e11b82523360048301525afa80156106cf57611011915f9161077f5750612437565b61069e612be4565b346104e95760203660031901126104e45760043560ff81168091036104a05760016020911b806066541614604051908152f35b346104e9575f3660031901126104e4576020606654604051908152f35b346104e95760203660031901126104e4576004356001600160401b0381116109f65761109c6110be913690600401610bfd565b6110b86110b282356110ad81610c7d565b612244565b5061227e565b90613cea565b602060405160018152f35b346104e9575f3660031901126104e457602061ffff60cb5460e01c16604051908152f35b346104e95760403660031901126104e45760043561110a8161048f565b6024359060018060a01b03165f5260cf60205260405f20905f52602052602060ff60405f2054166040519015158152f35b346104e9575f3660031901126104e457611153613381565b603380546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346104e9575f3660031901126104e457602060ca54604051908152f35b346104e95760203660031901126104e45761069e6004356111d38161048f565b6111db613381565b613e60565b346104e95760403660031901126104e45760206112366004356112028161048f565b6024359061120f8261048f565b60018060a01b03165f5260cd835260405f209060018060a01b03165f5260205260405f2090565b54604051908152f35b346104e9575f3660031901126104e4576065546040516001600160a01b039091168152602090f35b346104e9575f3660031901126104e4576033546040516001600160a01b039091168152602090f35b346104e9575f3660031901126104e457602060405173beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08152f35b346104e9575f3660031901126104e4576112d56121d1565b5060ca545f1981019081116112f3576105496110b261058892612244565b6121f5565b346104e95760403660031901126104e4576004356113158161048f565b6024356001600160401b0381116109f6576113349036906004016108e1565b9190611347610a1b602080606654161490565b6113566002609754141561266a565b60026097556001600160a01b03821691611371338414612c22565b5f5b8481106113845761069e6001609755565b8061145e6113956001938887612cb1565b6001600160a01b0385165f90815260ce60205260409020549060405160208101906113c681610a9885878c87612e17565b519020886113d38361413a565b936113f5610ad984610acc8c60018060a01b03165f5260d360205260405f2090565b6113fe816129b1565b6001600160a01b038a165f90815260ce60205260409020557ffc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e06040518061144787339583612e3b565b0390a43090611459602033920161253f565b61371c565b01611373565b346104e9575f3660031901126104e457602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346104e95760203660031901126104e4576004356114c18161048f565b335f81815260cc6020526040812080546001600160a01b039485166001600160a01b03198216811790925590931691907fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca3129080a4005b6024359061ffff821682036104a057565b60a4359061ffff821682036104a057565b6044359061ffff821682036104a057565b346104e95760203660031901126104e45760043561ffff811681036104a05761069e90611575613381565b614250565b346104e95760403660031901126104e4576004356115978161048f565b6024359060018060a01b03165f5260d260205260405f20905f52602052602060ff60405f2054166040519015158152f35b346104e95760403660031901126104e4576004356115e58161048f565b6115ed611517565b906115ff610a1b608080606654161490565b6001600160a01b03811691338390036116de578061164661271061ffff7fd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f7494161115612e52565b60cb546116639060a01c63ffffffff165b63ffffffff4216612ae4565b926116b684836116b161169661169161168c8760018060a01b03165f5260d560205260405f2090565b612bb0565b613a67565b6001600160a01b039095165f90815260d56020526040902090565b6142ab565b6040805163ffffffff95909516855261ffff91821660208601529116908301523391606090a3005b60405162461bcd60e51b815260206004820152604160248201527f52657761726473436f6f7264696e61746f722e7365744f70657261746f72504960448201527f53706c69743a2063616c6c6572206973206e6f7420746865206f70657261746f6064820152603960f91b608482015260a490fd5b346104e95760203660031901126104e4576004356117708161048f565b60018060a01b03165f5260ce602052602060405f2054604051908152f35b346104e9575f3660031901126104e457602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346104e95760403660031901126104e4576004356117eb8161048f565b6024359060018060a01b03165f5260d060205260405f20905f52602052602060ff60405f2054166040519015158152f35b346104e95760c03660031901126104e4576004356118398161048f565b6118b86024356118488161048f565b6044356064356118578161048f565b6084359161186483610c7d565b61186c611528565b935f549661189e6118886118848a60ff9060081c1690565b1590565b8099819a611932575b8115611912575b50612ecf565b876118af600160ff195f5416175f55565b6118fb57612f32565b6118be57005b6118cc61ff00195f54165f55565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1005b61190d61010061ff00195f5416175f55565b612f32565b303b15915081611924575b505f611898565b60ff1660011490505f61191d565b600160ff8216109150611891565b346104e95760603660031901126104e45760043561195d8161048f565b6024356119698161048f565b611971611539565b611982610a1b604080606654161490565b6001600160a01b0383169133839003611a7c57817f48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934916119cd61271061ffff611a129616111561303b565b611a4286836116b184611a12611a2761169161168c846119f961165760cb5463ffffffff9060a01c1690565b9d8e9960018060a01b03165f5260d460205260405f2090565b9060018060a01b03165f5260205260405f2090565b6001600160a01b03909c165f90815260d46020526040902090565b6040805163ffffffff95909516855261ffff968716602086015291909516908301526001600160a01b039093169233918060608101610dc5565b60405162461bcd60e51b815260206004820152604260248201527f52657761726473436f6f7264696e61746f722e7365744f70657261746f72415660448201527f5353706c69743a2063616c6c6572206973206e6f7420746865206f706572617460648201526137b960f11b608482015260a490fd5b346104e95760203660031901126104e4576105886105496110b2600435611b176121d1565b50612244565b346104e95760403660031901126104e457610588610f52611b78600435611b438161048f565b60243590611b508261048f565b60018060a01b03165f5260d460205260405f209060018060a01b03165f5260205260405f2090565b63ffffffff60405191610f2f83612166565b346104e95760203660031901126104e4576020611ba86004356130d1565b63ffffffff60405191168152f35b346104e9575f3660031901126104e4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346104e95760403660031901126104e457600435611c178161048f565b6024359060018060a01b03165f5260d360205260405f20905f52602052602060ff60405f2054166040519015158152f35b346104e95760203660031901126104e457600435611c658161048f565b611c6d613381565b6001600160a01b03811615611c855761069e90613e18565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346104e9575f3660031901126104e457602061083d613183565b346104e95760403660031901126104e457602061083d611d1236610803565b6131b8565b346104e95760203660031901126104e457600435611d3481610c7d565b611d45610a1b600880606654161490565b611d5a60018060a01b0360cb541633146129eb565b60ca549063ffffffff811691821015611df6576001611d7b611dd092612244565b5001611dbd611db6611dad8354611da1611d9c6118848360ff9060401c1690565b6131ff565b60201c63ffffffff1690565b63ffffffff1690565b4210613269565b805460ff60401b1916600160401b179055565b7fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e5f80a2005b60405162461bcd60e51b815260206004820152603160248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152700d2dcecc2d8d2c840e4dedee892dcc8caf607b1b6064820152608490fd5b346104e95760203660031901126104e4576065546001600160a01b0316600435813b156106d45760206004926040519384809263755b36bd60e11b82525afa9182156106cf5761069e92611eba915f916106a057506001600160a01b031633146123c3565b6132d4565b346104e9575f3660031901126104e45760cb546040516001600160a01b039091168152602090f35b346104e957611ef5366109c8565b90611f07610a1b600180606654161490565b611f166002609754141561266a565b60026097555f5b828110611f2e5761069e6001609755565b80611fd9611f3f6001938686612785565b335f90815260ce60205260409020546040516020810190611f6681610a988686338761298d565b51902090611f7383613606565b335f90815260cf60205260409020611f9090610ad9908490610acc565b611f99816129b1565b335f90815260ce60205260409020556040517f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e6281339180610b2f87826129da565b01611f1d565b346104e957611fed366109c8565b90611fff610a1b601080606654161490565b335f5260d160205261201760ff60405f2054166125de565b6120266002609754141561266a565b60026097555f5b82811061203e5761069e6001609755565b806120e961204f6001938686612785565b335f90815260ce6020526040902054604051602081019061207681610a988686338761298d565b5190209061208383613606565b335f90815260d2602052604090206120a090610ad9908490610acc565b6120a9816129b1565b335f90815260ce60205260409020556040517f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b339180610b2f87826129da565b0161202d565b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b0382111761218157604052565b612152565b608081019081106001600160401b0382111761218157604052565b90601f801991011681019081106001600160401b0382111761218157604052565b60405190610c966080836121a1565b604051906121de82612186565b5f6060838281528260208201528260408201520152565b634e487b7160e01b5f52601160045260245ffd5b80156112f3575f190190565b5f198101919082116112f357565b919082039182116112f357565b634e487b7160e01b5f52603260045260245ffd5b60ca548110156122605760ca5f5260205f209060011b01905f90565b612230565b8054821015612260575f5260205f209060011b01905f90565b9060405161228b81612186565b606060ff6001839580548552015463ffffffff8116602085015263ffffffff8160201c16604085015260401c161515910152565b6122c76121d1565b5060ca54805b6122f257506122da6121c2565b5f81525f60208201525f60408201525f606082015290565b6123016110b26110ad83612215565b906123126118846060840151151590565b80612330575b61232c576123269150612209565b806122cd565b5090565b50612345611dad604084015163ffffffff1690565b421015612318565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b908160209103126104e457516123b58161048f565b90565b6040513d5f823e3d90fd5b156123ca57565b60405162461bcd60e51b815260206004820152602a60248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526939903ab73830bab9b2b960b11b6064820152608490fd5b908160209103126104e457516123b58161058c565b1561243e57565b60405162461bcd60e51b815260206004820152602860248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526739903830bab9b2b960c11b6064820152608490fd5b606654818116036124d457606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d90602090a2565b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b356123b58161048f565b60208135916125578361048f565b01356040519060208201925f84526001600160601b03199060601b16602183015260358201526035815261258c6055826121a1565b51902090565b1561259957565b60405162461bcd60e51b815260206004820152601960248201527f5061757361626c653a20696e64657820697320706175736564000000000000006044820152606490fd5b156125e557565b60405162461bcd60e51b815260206004820152605160248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f60448201527f7420612076616c69642063726561746552657761726473466f72416c6c53756260648201527036b4b9b9b4b7b71039bab136b4ba3a32b960791b608482015260a490fd5b1561267157565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206f6666736574000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206c656e677468000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527f43616c6c64617461207461696c20746f6f2073686f72740000000000000000006044820152606490fd5b91908110156122605760051b81013590609e1981360301821215610ee2570190565b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206c656e67746800006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c64617461206163636573732073747269646500006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206f666673657400006044820152606490fd5b9035601e19823603018112156128b45701602081359101916001600160401b0382116128af578160061b360383136128aa57565b6127ec565b6127a7565b612831565b916020908281520191905f905b8082106128d35750505090565b90919283356128e18161048f565b6001600160a01b0316815260208401356001600160601b03811691908290036104a0576040816001936020839401520194019201906128c6565b90608063ffffffff8161293f6129318680612876565b60a0875260a08701916128b9565b94602081013561294e8161048f565b6001600160a01b031660208601526040818101359086015282606082013561297581610c7d565b166060860152013561298681610c7d565b1691015290565b6123b5939260609260018060a01b031682526020820152816040820152019061291b565b90600182018092116112f357565b90602082018092116112f357565b919082018092116112f357565b9060206123b592818152019061291b565b156129f257565b60405162461bcd60e51b815260206004820152603460248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f6044820152733a103a3432903932bbb0b93239aab83230ba32b960611b6064820152608490fd5b15612a5b57565b60405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a207260448201527f65776172647343616c63756c6174696f6e456e6454696d657374616d702063616064820152746e6e6f7420626520696e207468652066757475726560581b608482015260a490fd5b9063ffffffff8091169116019063ffffffff82116112f357565b60ca54600160401b81101561218157806001612b1f920160ca5560ca612265565b919091612b9d5760606001610c969383518155019163ffffffff60208201511663ffffffff19845416178355612b7c63ffffffff604083015116849067ffffffff0000000082549160201b169067ffffffff000000001916179055565b0151815460ff60401b191690151560401b68ff000000000000000016179055565b634e487b7160e01b5f525f60045260245ffd5b90604051612bbd81612166565b604063ffffffff82945461ffff8116845261ffff8160101c16602085015260201c16910152565b5f196066556040515f1981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2565b356123b581610c7d565b15612c2957565b60405162461bcd60e51b815260206004820152605460248201527f52657761726473436f6f7264696e61746f722e6372656174654f70657261746f60448201527f724469726563746564415653526577617264735375626d697373696f6e3a2063606482015273616c6c6572206973206e6f74207468652041565360601b608482015260a490fd5b91908110156122605760051b8101359060be1981360301821215610ee2570190565b9035601e19823603018112156128b45701602081359101916001600160401b0382116128af5781360383136128aa57565b908060209392818452848401375f828201840152601f01601f1916010190565b9190612d41612d338480612876565b60c0845260c08401916128b9565b906020840135612d508161048f565b6001600160a01b0316602082810191909152612d6f6040860186612876565b838503604085015280855293909101925f5b818110612de357505050612dd584612daf612da260606123b5979801610c8b565b63ffffffff166060850152565b612dcb612dbe60808301610c8b565b63ffffffff166080850152565b60a0810190612cd3565b9160a0818503910152612d04565b9091936040806001928735612df78161048f565b848060a01b03168152602088013560208201520195019101919091612d81565b6123b5939260609260018060a01b0316825260208201528160408201520190612d24565b6040906123b5939281528160208201520190612d24565b15612e5957565b60405162461bcd60e51b815260206004820152604260248201527f52657761726473436f6f7264696e61746f722e7365744f70657261746f72504960448201527f53706c69743a2073706c6974206d757374206265203c3d203130303030206269606482015261707360f01b608482015260a490fd5b15612ed657565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b929493919094612f40614351565b60c9556065546001600160a01b03161580613029575b15612fae576111db61157594612fa9610c969885612f76610fb597606655565b60405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d90602090a26133d9565b613e18565b60405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a490fd5b506001600160a01b0386161515612f56565b1561304257565b60405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e7365744f70657261746f72415660448201527f5353706c69743a2073706c6974206d757374206265203c3d203130303030206260648201526269707360e81b608482015260a490fd5b63ffffffff5f199116019063ffffffff82116112f357565b63ffffffff60ca54165b63ffffffff81166131515760405162461bcd60e51b815260206004820152603760248201527f52657761726473436f6f7264696e61746f722e676574526f6f74496e6465784660448201527f726f6d486173683a20726f6f74206e6f7420666f756e640000000000000000006064820152608490fd5b8161315e6110ad836130b9565b5054146131795763ffffffff1680156112f3575f19016130db565b6123b591506130b9565b467f0000000000000000000000000000000000000000000000000000000000000000036131b05760c95490565b6123b5614351565b60208135916131c68361048f565b0135604051906020820192600160f81b84526001600160601b03199060601b16602183015260358201526035815261258c6055826121a1565b1561320657565b60405162461bcd60e51b815260206004820152603560248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152741c9bdbdd08185b1c9958591e48191a5cd8589b1959605a1b6064820152608490fd5b1561327057565b60405162461bcd60e51b815260206004820152603660248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152751c9bdbdd08185b1c9958591e481858dd1a5d985d195960521b6064820152608490fd5b60665419811981160361331657606681905560405190815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602090a2565b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b6033546001600160a01b0316330361339557565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b6001600160a01b0381161561344a57606554604080516001600160a01b0392831681529183166020830152610c9692917f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb69190a160018060a01b03166001600160601b0360a01b6065541617606555565b60405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a490fd5b903590601e1981360301821215610ee257018035906001600160401b03821161350157602001918160061b360383136134fc57565b612740565b6126fb565b1561350d57565b60405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f76616c69646174655265776160448201527f7264735375626d697373696f6e3a20616d6f756e7420746f6f206c61726765006064820152608490fd5b1561357f57565b60405162461bcd60e51b815260206004820152605360248201527f52657761726473436f6f7264696e61746f722e5f76616c69646174655265776160448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152726f2066617220696e207468652066757475726560681b608482015260a490fd5b604061363d9161361681806134c7565b9390606083019485359061362982610c7d565b60808501359261363884610c7d565b6147be565b013580156136a757610c96916136686f4b3b4ca85a86c47a098a223fffffffff61366d931115613506565b612c18565b63ffffffff61369e817f000000000000000000000000000000000000000000000000000000000000000016426129cd565b91161115613578565b60405162461bcd60e51b815260206004820152604160248201527f52657761726473436f6f7264696e61746f722e5f76616c69646174655265776160448201527f7264735375626d697373696f6e3a20616d6f756e742063616e6e6f74206265206064820152600360fc1b608482015260a490fd5b6040516323b872dd60e01b60208201526001600160a01b039283166024820152929091166044830152606480830193909352918152610c96916137606084836121a1565b614a33565b1561376c57565b60405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063616c6c6572206973206e6f742076616c696420636c61696d6572000000006064820152608490fd5b903590601e1981360301821215610ee257018035906001600160401b03821161350157602001918160051b360383136134fc57565b91908110156122605760061b0190565b1561382357565b60405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063756d756c61746976654561726e696e6773206d75737420626520677420746064820152741a185b8818dd5b5d5b185d1a5d9950db185a5b5959605a1b608482015260a490fd5b906138bc6110b26110ad84612c18565b906138c78284613cea565b6138d36060840161253f565b936138fe6138f18660018060a01b03165f5260cc60205260405f2090565b546001600160a01b031690565b6001600160a01b03811615613a60575b90936001600160a01b0390911691613927338414613765565b6001600160a01b038616915f5b61394160a08301836137d7565b9050811015613a56578061396460019261395e60e08601866134c7565b9061380c565b86867f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce318c6139c26139a58260018060a01b03165f5260cd60205260405f2090565b6139ae8761253f565b60018060a01b03165f5260205260405f2090565b54613a076139fe6139e36020890135936139dd81861161381c565b84612223565b6001600160a01b039094165f90815260cd6020526040902090565b6139ae8861253f565b55613a1b818a613a168861253f565b614b05565b613a268c519561253f565b604080519687526001600160a01b0391909116602087015285015260a086901b869003881693606090a401613934565b5050505050509050565b508461390e565b604081015163ffffffff169081613a8757505061ffff60cb5460e01c1690565b61ffff914210613a9957602001511690565b511690565b60cb54907faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b36040805163ffffffff8560a01c16815263ffffffff84166020820152a163ffffffff60a01b1990911660a09190911b63ffffffff60a01b161760cb55565b15613b0857565b60405162461bcd60e51b815260206004820152603060248201525f80516020614f7483398151915260448201526f1c9bdbdd081a5cc8191a5cd8589b195960821b6064820152608490fd5b15613b5a57565b60405162461bcd60e51b815260206004820152603660248201525f80516020614f748339815191526044820152751c9bdbdd081b9bdd081858dd1a5d985d1959081e595d60521b6064820152608490fd5b15613bb257565b60405162461bcd60e51b815260206004820152604c60248201525f80516020614f7483398151915260448201527f746f6b656e496e646963657320616e6420746f6b656e50726f6f6673206c656e60648201526b0cee8d040dad2e6dac2e8c6d60a31b608482015260a490fd5b15613c2657565b60405162461bcd60e51b815260206004820152604a60248201525f80516020614f7483398151915260448201527f746f6b656e5472656550726f6f667320616e64206c6561766573206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a490fd5b903590601e1981360301821215610ee257018035906001600160401b038211613501576020019181360383136134fc57565b91908110156122605760051b0190565b90821015612260576109f29160051b810190613c91565b919091613d05613d006118846060860151151590565b613b01565b613d24613d1c611dad604086015163ffffffff1690565b421015613b53565b60a0810190613d3382826137d7565b9050613d5060c0830191613d4783856137d7565b91905014613bab565b613da0613d5d82846137d7565b969050613d7b60e0850197613d7289876134c7565b91905014613c1f565b51613d8860208501612c18565b613d956040860186613c91565b916060870193614bcb565b6080820135925f5b613db282856137d7565b9050811015613e0f5780613e098561395e8a613e0285613df981613df38c8f61366860019d8f613de790613ded94508d6137d7565b90613cc3565b986137d7565b90613cd3565b9490938c6134c7565b928a614cfb565b01613da8565b50505050509050565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b60cb546001600160a01b0391821691829082167f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb5f80a36001600160a01b0319161760cb55565b15613eae57565b60405162461bcd60e51b815260206004820152605460248201525f80516020614fb483398151915260448201527f61746f724469726563746564526577617264735375626d697373696f6e3a206e6064820152731bc81bdc195c985d1bdc9cc81c995dd85c99195960621b608482015260a490fd5b15613f2a57565b60405162461bcd60e51b815260206004820152605b60248201525f80516020614fb483398151915260448201525f80516020614f9483398151915260648201527f70657261746f722063616e6e6f74206265203020616464726573730000000000608482015260a490fd5b15613f9c57565b60405162461bcd60e51b815260206004820152607860248201525f80516020614fb483398151915260448201525f80516020614f9483398151915260648201527f70657261746f7273206d75737420626520696e20617363656e64696e67206f7260848201527f64657220746f2068616e646c65206475706c696361746573000000000000000060a482015260c490fd5b1561403457565b60405162461bcd60e51b815260206004820152606160248201525f80516020614fb483398151915260448201525f80516020614f9483398151915260648201527f70657261746f722072657761726420616d6f756e742063616e6e6f74206265206084820152600360fc1b60a482015260c490fd5b156140b057565b60405162461bcd60e51b815260206004820152607660248201525f80516020614fb483398151915260448201525f80516020614f9483398151915260648201527f70657261746f722d64697265637465642072657761726473207375626d697373608482015275696f6e206973206e6f7420726574726f61637469766560501b60a482015260c490fd5b9061414582806134c7565b909261416c606082019461415886612c18565b608084019461416686612c18565b926147be565b604081019061418761417e83836134c7565b90501515613ea7565b5f938493845b61419785856134c7565b905087101561421b576142136001916141f46141b78a61395e8a8a6134c7565b986141da6141d36141c78c61253f565b6001600160a01b031690565b1515613f23565b6141e66141c78b61253f565b90858060a01b031610613f95565b60206141ff8961253f565b9801359061420e82151561402d565b6129cd565b96019561418d565b95509150946123b59350614242925061423661423c91612c18565b91612c18565b90612ae4565b63ffffffff429116106140a9565b60cb54907fe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e6040805161ffff8560e01c16815261ffff84166020820152a161ffff60e01b1990911660e09190911b61ffff60e01b161760cb55565b610c969291815463ffffffff8160201c16804210156142f9575b5050815467ffffffffffff0000191660109190911b63ffff0000161760209290921b67ffffffff0000000016919091179055565b61431d575060cb54825461ffff191660e09190911c61ffff161782555b5f806142c5565b825461ffff191660109190911c61ffff16178255614316565b6001600160401b03811161218157601f01601f191660200190565b600a60206040516143636040826121a1565b828152016922b4b3b2b72630bcb2b960b11b81522060405160208101917f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866835260408201524660608201523060808201526080815261258c60a0826121a1565b156143ca57565b60405162461bcd60e51b815260206004820152604660248201525f80516020614fd483398151915260448201527f6f6e526577617264735375626d697373696f6e3a206e6f207374726174656769606482015265195cc81cd95d60d21b608482015260a490fd5b1561443857565b60405162461bcd60e51b815260206004820152605a60248201525f80516020614fd483398151915260448201527f6f6e526577617264735375626d697373696f6e3a206475726174696f6e20657860648201527f6365656473204d41585f524557415244535f4455524154494f4e000000000000608482015260a490fd5b9063ffffffff169081156144ce5763ffffffff160690565b634e487b7160e01b5f52601260045260245ffd5b156144e957565b60405162461bcd60e51b815260206004820152607060248201525f80516020614fd483398151915260448201527f6f6e526577617264735375626d697373696f6e3a206475726174696f6e206d7560648201527f73742062652061206d756c7469706c65206f662043414c43554c4154494f4e5f60848201526f494e54455256414c5f5345434f4e445360801b60a482015260c490fd5b1561458757565b60405162461bcd60e51b815260206004820152607660248201525f80516020614fd483398151915260448201527f6f6e526577617264735375626d697373696f6e3a20737461727454696d65737460648201527f616d70206d7573742062652061206d756c7469706c65206f662043414c43554c6084820152754154494f4e5f494e54455256414c5f5345434f4e445360501b60a482015260c490fd5b1561462b57565b60405162461bcd60e51b815260206004820152605760248201525f80516020614fd483398151915260448201527f6f6e526577617264735375626d697373696f6e3a20737461727454696d65737460648201527f616d7020746f6f2066617220696e207468652070617374000000000000000000608482015260a490fd5b156146b057565b60405162461bcd60e51b815260206004820152605060248201525f80516020614fd483398151915260448201527f6f6e526577617264735375626d697373696f6e3a20696e76616c69642073747260648201526f185d1959de4818dbdb9cda59195c995960821b608482015260a490fd5b1561472857565b60405162461bcd60e51b815260206004820152606f60248201525f80516020614fd483398151915260448201527f6f6e526577617264735375626d697373696f6e3a20737472617465676965732060648201527f6d75737420626520696e20617363656e64696e67206f7264657220746f20686160848201526e6e646c65206475706c69636174657360881b60a482015260c490fd5b9291614857614851611dad61489e94956147d98715156143c3565b61481163ffffffff7f00000000000000000000000000000000000000000000000000000000000000001663ffffffff83161115614431565b61484b63ffffffff6148447f000000000000000000000000000000000000000000000000000000000000000080946144b6565b16156144e2565b846144b6565b15614580565b63ffffffff614888817f00000000000000000000000000000000000000000000000000000000000000001642612223565b91168091111590816149a3575b50929192614624565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316915f90815b8183106148db575050505050565b6148ee6148e984848761380c565b61253f565b90853b156106d45760405163198f077960e21b81526001600160a01b03831660048201526020816024818a5afa9283156106cf57600193614957925f91614985575b50801561495f575b614941906146a9565b838060a01b03168092848060a01b031610614721565b9201916148cd565b5060a084901b849003811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014614938565b61499d915060203d81116107a75761079981836121a1565b5f614930565b905063ffffffff7f00000000000000000000000000000000000000000000000000000000000000001611155f614895565b156149db57565b60405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b60018060a01b03169060405190614a4b6040836121a1565b602082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020830152823b15614ac0575f81614a9b948260208195519301915af1614a95614ee9565b90614f18565b805180614aa6575050565b81602080614abb93610c969501019101612422565b6149d4565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b60405163a9059cbb60e01b60208201526001600160a01b039092166024830152604480830193909352918152610c96916137606064836121a1565b929192614b4c82614336565b91614b5a60405193846121a1565b829481845281830111614b76578281602093845f960137010152565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b9063ffffffff9094939294169260018360051c1b841015614c8457614c0394614bf6614bfe92612549565b933691614b40565b614e03565b15614c0a57565b60405162461bcd60e51b815260206004820152604660248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e657220636c61696d60648201526510383937b7b360d11b608482015260a490fd5b60405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e65724c656166496e6064820152620c8caf60eb1b608482015260a490fd5b9063ffffffff9094939294169260018360051c1b841015614d9857614d2694614bf6614bfe926131b8565b15614d2d57565b60405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e20636c61696d2070726f6f66006064820152608490fd5b60405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e4c656166496e646578000000006064820152608490fd5b93909291601f855116614e6a5791906020925b85518411614e615760018316614e47575f5282850151602052614e4060405f209260011c936129bf565b9291614e16565b838601515f52602052614e4060405f209260011c936129bf565b92509350501490565b60405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a490fd5b3d15614f13573d90614efa82614336565b91614f0860405193846121a1565b82523d5f602084013e565b606090565b90919015614f24575090565b815115614f345750805190602001fd5b604460209160405192839162461bcd60e51b83528160048401528051918291826024860152018484015e5f828201840152601f01601f19168101030190fdfe52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2061746f724469726563746564526577617264735375626d697373696f6e3a206f52657761726473436f6f7264696e61746f722e5f76616c69646174654f70657252657761726473436f6f7264696e61746f722e5f76616c6964617465436f6d6da26469706673582212202687d895e89c31be7e74a79f21e76d31f3d052cbc01c4950d791497f5adeb8ac64736f6c634300081a0033"; type RewardsCoordinatorConstructorParams = | [signer?: Signer] diff --git a/src/avs/tests/test.operator.ts b/src/avs/tests/test.operator.ts index 9f2f7e7a..f62d94be 100644 --- a/src/avs/tests/test.operator.ts +++ b/src/avs/tests/test.operator.ts @@ -140,7 +140,7 @@ describe('Operators', () => { await op() throw new Error('Should have thrown an error') } catch(err) { - expect(err.message).toMatch(/Caller is not admin/) + expect(err.message).toMatch(/caller is not the owner/) } } }) @@ -282,6 +282,8 @@ describe('Operators', () => { const operatorAddress = await contracts.wallet!.address await sendGasToAddress(operatorAddress) + console.log('owner ', await contracts.contract.owner()) + await contracts.contract.whitelistAddressAsOperator( operatorAddress, true diff --git a/src/avs/tests/utils.ts b/src/avs/tests/utils.ts index e7526d2c..b7f718f8 100644 --- a/src/avs/tests/utils.ts +++ b/src/avs/tests/utils.ts @@ -7,11 +7,7 @@ export async function runFreshChain() { throw new Error('PRIVATE_KEY environment variable is required') } - const task = spawn( - 'npm', - ['run', 'start:chain'], - { env: process.env } - ) + const task = spawn('npm', ['run', 'start:chain'], { env: process.env }) task.stderr.pipe(process.stderr) await new Promise((resolve, reject) => { task.stdout.on('data', (data) => { diff --git a/src/avs/utils/contracts.ts b/src/avs/utils/contracts.ts index c160dc42..f2ab4397 100644 --- a/src/avs/utils/contracts.ts +++ b/src/avs/utils/contracts.ts @@ -1,7 +1,8 @@ import { ethers } from 'ethers' import { CHAIN_CONFIGS, PRIVATE_KEY, SELECTED_CHAIN_ID } from 'src/avs/config' -import { AVSDirectory__factory, DelegationManager__factory, ECDSAStakeRegistry__factory, ERC20Mock__factory, ReclaimServiceManager__factory, RewardsCoordinator__factory } from 'src/avs/contracts' +import { AVSDirectory__factory, DelegationManager__factory, ECDSAStakeRegistry__factory, ERC20Mock__factory, ProxyAdmin__factory, ReclaimServiceManager__factory, RewardsCoordinator__factory } from 'src/avs/contracts' import { ChainConfig } from 'src/avs/types' +import { ReclaimServiceManagerInterface } from '../contracts/ReclaimServiceManager' export type Contracts = ReturnType @@ -28,6 +29,7 @@ export function initialiseContracts( contractAddress, delegationManagerAddress, rewardsCoordinatorAddress, + proxyAdminAddress, }: ChainConfig, privateKey: string | undefined = PRIVATE_KEY ) { @@ -41,6 +43,8 @@ export function initialiseContracts( wallet || provider ) + console.log('wallet ', wallet?.address) + return { provider, wallet, @@ -65,6 +69,11 @@ export function initialiseContracts( rewardsCoordinatorAddress, wallet || provider ), + // eslint-disable-next-line camelcase + proxyAdmin: ProxyAdmin__factory.connect( + proxyAdminAddress, + wallet || provider + ), // tokens tokens: { async getDefault() { @@ -75,4 +84,13 @@ export function initialiseContracts( } } } -} \ No newline at end of file +} + +// export function makeAdminCallOnReclaimContract( +// fn: keyof ReclaimServiceManagerInterface['functions'], +// args: any[], +// chainId = SELECTED_CHAIN_ID! +// ) { +// const { contract, proxyAdmin } = getContracts(chainId) +// proxyAdmin.callStatic. +// } \ No newline at end of file From 0ea893bf4943bedbdfe349b820bba603a14bab15 Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Mon, 7 Apr 2025 19:40:13 +0530 Subject: [PATCH 14/26] chore: remove eigen core --- .gitmodules | 4 ---- avs/contracts/lib/eigenlayer-middleware | 1 - 2 files changed, 5 deletions(-) delete mode 160000 avs/contracts/lib/eigenlayer-middleware diff --git a/.gitmodules b/.gitmodules index 181c1b95..03aaa09a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,7 +1,3 @@ [submodule "avs/contracts/lib/forge-std"] path = avs/contracts/lib/forge-std url = https://github.com/foundry-rs/forge-std -[submodule "avs/contracts/lib/eigenlayer-middleware"] - path = avs/contracts/lib/eigenlayer-middleware - url = https://github.com/layr-Labs/eigenlayer-middleware - branch = mainnet \ No newline at end of file diff --git a/avs/contracts/lib/eigenlayer-middleware b/avs/contracts/lib/eigenlayer-middleware deleted file mode 160000 index fe583437..00000000 --- a/avs/contracts/lib/eigenlayer-middleware +++ /dev/null @@ -1 +0,0 @@ -Subproject commit fe5834371caed60c1d26ab62b5519b0cbdcb42fa From d06743934fee0de67556f2fc2064c216e07e884f Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Mon, 7 Apr 2025 19:55:56 +0530 Subject: [PATCH 15/26] chore: update eigen contracts --- .gitmodules | 4 ++++ avs/contracts/lib/eigenlayer-middleware | 1 + avs/contracts/lib/forge-std | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) create mode 160000 avs/contracts/lib/eigenlayer-middleware diff --git a/.gitmodules b/.gitmodules index 03aaa09a..b6cf5a88 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,7 @@ [submodule "avs/contracts/lib/forge-std"] path = avs/contracts/lib/forge-std url = https://github.com/foundry-rs/forge-std +[submodule "avs/contracts/lib/eigenlayer-middleware"] + path = avs/contracts/lib/eigenlayer-middleware + url = https://github.com/layr-Labs/eigenlayer-middleware + branch = dev diff --git a/avs/contracts/lib/eigenlayer-middleware b/avs/contracts/lib/eigenlayer-middleware new file mode 160000 index 00000000..486210d5 --- /dev/null +++ b/avs/contracts/lib/eigenlayer-middleware @@ -0,0 +1 @@ +Subproject commit 486210d5026f7b81060efe1fe9be0c57624fcecf diff --git a/avs/contracts/lib/forge-std b/avs/contracts/lib/forge-std index bf909b22..33539934 160000 --- a/avs/contracts/lib/forge-std +++ b/avs/contracts/lib/forge-std @@ -1 +1 @@ -Subproject commit bf909b22fa55e244796dfa920c9639fdffa1c545 +Subproject commit 3353993420c6e488a2914ce02d88174e80ad80f8 From a4862cd3c5ab2ed4909dd6c7a510845f0aaa25f8 Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Mon, 7 Apr 2025 20:27:04 +0530 Subject: [PATCH 16/26] feat: deployable eigen core --- .gitmodules | 4 +- avs/contracts/config/core/31337.json | 39 +++- avs/contracts/foundry.toml | 6 +- avs/contracts/lib/eigenlayer-middleware | 2 +- .../script/DeployEigenLayerCore.s.sol | 17 +- .../script/deployments/core/31337.json | 1 + .../script/utils/CoreDeploymentLib.sol | 219 +++++++++++------- .../script/utils/UpgradeableProxyLib.sol | 13 +- 8 files changed, 181 insertions(+), 120 deletions(-) create mode 100644 avs/contracts/script/deployments/core/31337.json diff --git a/.gitmodules b/.gitmodules index b6cf5a88..5965d9a1 100644 --- a/.gitmodules +++ b/.gitmodules @@ -3,5 +3,5 @@ url = https://github.com/foundry-rs/forge-std [submodule "avs/contracts/lib/eigenlayer-middleware"] path = avs/contracts/lib/eigenlayer-middleware - url = https://github.com/layr-Labs/eigenlayer-middleware - branch = dev + url = https://github.com/layr-labs/eigenlayer-middleware + branch = 4d63f27247587607beb67f96fdabec4b2c1321ef diff --git a/avs/contracts/config/core/31337.json b/avs/contracts/config/core/31337.json index 3b623c19..03582931 100644 --- a/avs/contracts/config/core/31337.json +++ b/avs/contracts/config/core/31337.json @@ -1,26 +1,45 @@ { "strategyManager": { "init_paused_status": 0, - "init_withdrawal_delay_blocks": 50400 + "initial_owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "initial_strategy_whitelister": "0x959922be3caee4b8cd9a407cc3ac1c251c2007b1", + "init_withdrawal_delay_blocks": 1 }, - "delegation": { + "delegationManager": { "init_paused_status": 0, - "init_withdrawal_delay_blocks": 50400 - }, - "slasher": { - "init_paused_status": 0 + "init_withdrawal_delay_blocks": 1, + "initial_owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "min_withdrawal_delay_blocks": 50400 }, "eigenPodManager": { - "init_paused_status": 0 + "init_paused_status": 0, + "initial_owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + }, + "allocationManager": { + "init_paused_status": 0, + "initial_owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "deallocation_delay": 0, + "allocation_configuration_delay": 0 + }, + "strategyFactory": { + "init_paused_status": 0, + "initial_owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + }, + "avsDirectory": { + "init_paused_status": 0, + "initial_owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" }, "rewardsCoordinator": { "init_paused_status": 0, + "initial_owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "rewards_updater": "0x14dC79964da2C08b23698B3D3cc7Ca32193d9955", + "activation_delay": 0, + "default_split_bips": 1000, + "calculation_interval_seconds": 86400, "MAX_REWARDS_DURATION": 864000, - "MAX_RETROACTIVE_LENGTH": 86400, + "MAX_RETROACTIVE_LENGTH": 432000, "MAX_FUTURE_LENGTH": 86400, "GENESIS_REWARDS_TIMESTAMP": 1672531200, - "activation_delay": 0, - "calculation_interval_seconds": 86400, "global_operator_commission_bips": 1000 } } \ No newline at end of file diff --git a/avs/contracts/foundry.toml b/avs/contracts/foundry.toml index 0af8370d..28806250 100644 --- a/avs/contracts/foundry.toml +++ b/avs/contracts/foundry.toml @@ -8,9 +8,9 @@ remappings = [ "@eigenlayer/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/", "@eigenlayer-scripts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/script/", "@eigenlayer-middleware/=lib/eigenlayer-middleware/", - "@openzeppelin/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts/", - "@openzeppelin-upgrades/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable/", - "forge-std/=lib/forge-std/src/" + "@openzeppelin/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/", + "@openzeppelin-upgrades/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/", + "forge-std/=lib/forge-std/src/", ] gas_reports = ["*"] diff --git a/avs/contracts/lib/eigenlayer-middleware b/avs/contracts/lib/eigenlayer-middleware index 486210d5..4d63f272 160000 --- a/avs/contracts/lib/eigenlayer-middleware +++ b/avs/contracts/lib/eigenlayer-middleware @@ -1 +1 @@ -Subproject commit 486210d5026f7b81060efe1fe9be0c57624fcecf +Subproject commit 4d63f27247587607beb67f96fdabec4b2c1321ef diff --git a/avs/contracts/script/DeployEigenLayerCore.s.sol b/avs/contracts/script/DeployEigenLayerCore.s.sol index 18dbd9aa..daf8811b 100644 --- a/avs/contracts/script/DeployEigenLayerCore.s.sol +++ b/avs/contracts/script/DeployEigenLayerCore.s.sol @@ -2,15 +2,11 @@ pragma solidity ^0.8.12; import {Script} from "forge-std/Script.sol"; - +import {console2} from "forge-std/console2.sol"; import {CoreDeploymentLib} from "./utils/CoreDeploymentLib.sol"; import {UpgradeableProxyLib} from "./utils/UpgradeableProxyLib.sol"; -import {IRewardsCoordinator} from "@eigenlayer/contracts/interfaces/IRewardsCoordinator.sol"; - -import "forge-std/Test.sol"; - -contract DeployEigenlayerCore is Script, Test { +contract DeployEigenlayerCore is Script { using CoreDeploymentLib for *; using UpgradeableProxyLib for address; @@ -26,13 +22,12 @@ contract DeployEigenlayerCore is Script, Test { function run() external { vm.startBroadcast(deployer); - //set the rewards updater to the deployer address for payment flow + configData = CoreDeploymentLib.readDeploymentConfigValues("config/core/", block.chainid); - configData.rewardsCoordinator.updater = deployer; proxyAdmin = UpgradeableProxyLib.deployProxyAdmin(); - deploymentData = CoreDeploymentLib.deployContracts(proxyAdmin, configData); + deploymentData = CoreDeploymentLib.deployContracts(deployer, proxyAdmin, configData); vm.stopBroadcast(); - string memory deploymentPath = "deployments/core/"; + string memory deploymentPath = "script/deployments/core/"; CoreDeploymentLib.writeDeploymentJson(deploymentPath, block.chainid, deploymentData); } -} +} \ No newline at end of file diff --git a/avs/contracts/script/deployments/core/31337.json b/avs/contracts/script/deployments/core/31337.json new file mode 100644 index 00000000..e42cb29c --- /dev/null +++ b/avs/contracts/script/deployments/core/31337.json @@ -0,0 +1 @@ +{"lastUpdate":{"timestamp":"1744037748","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x4ed7c70f96b99c776995fb64377f0d4ab3b0e1c1","avsDirectory":"0x610178da211fef7d417bc0e6fed39f05609ad788","avsDirectoryImpl":"0xa85233c63b9ee964add6f2cffe00fd84eb32338f","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x4a679253410272dd5232b3ff7cf5dbb88f295319","eigenPodManager":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManagerImpl":"0xc5a5c42992decbae36851359345fe25997f5c42d","strategyFactory":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","rewardsCoordinator":"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0","pauserRegistry":"0x0b306bf915c4d645ff596e518faf3f9669b97016","strategyBeacon":"0x84ea74d481ee0a5332c457a4d796187f6ba67feb","allocationManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","permissionController":"0x59b670e9fa9d0a427751af201d676719a970857b"}} \ No newline at end of file diff --git a/avs/contracts/script/utils/CoreDeploymentLib.sol b/avs/contracts/script/utils/CoreDeploymentLib.sol index 3c073df6..f6e2d842 100644 --- a/avs/contracts/script/utils/CoreDeploymentLib.sol +++ b/avs/contracts/script/utils/CoreDeploymentLib.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; +pragma solidity ^0.8.12; import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; @@ -7,12 +7,15 @@ import {UpgradeableBeacon} from "@openzeppelin/contracts/proxy/beacon/Upgradeabl import {console2} from "forge-std/Test.sol"; import {Vm} from "forge-std/Vm.sol"; import {stdJson} from "forge-std/StdJson.sol"; +import {IPermissionController} from "@eigenlayer/contracts/interfaces/IPermissionController.sol"; +import {PermissionController} from "@eigenlayer/contracts/permissions/PermissionController.sol"; import {DelegationManager} from "@eigenlayer/contracts/core/DelegationManager.sol"; +import {AllocationManager} from "@eigenlayer/contracts/core/AllocationManager.sol"; import {StrategyManager} from "@eigenlayer/contracts/core/StrategyManager.sol"; import {AVSDirectory} from "@eigenlayer/contracts/core/AVSDirectory.sol"; -import {Slasher} from "@eigenlayer/contracts/core/Slasher.sol"; import {EigenPodManager} from "@eigenlayer/contracts/pods/EigenPodManager.sol"; import {RewardsCoordinator} from "@eigenlayer/contracts/core/RewardsCoordinator.sol"; +import {IRewardsCoordinatorTypes} from "@eigenlayer/contracts/interfaces/IRewardsCoordinator.sol"; import {StrategyBase} from "@eigenlayer/contracts/strategies/StrategyBase.sol"; import {EigenPod} from "@eigenlayer/contracts/pods/EigenPod.sol"; import {IETHPOSDeposit} from "@eigenlayer/contracts/interfaces/IETHPOSDeposit.sol"; @@ -20,17 +23,16 @@ import {StrategyBaseTVLLimits} from "@eigenlayer/contracts/strategies/StrategyBa import {PauserRegistry} from "@eigenlayer/contracts/permissions/PauserRegistry.sol"; import {IStrategy} from "@eigenlayer/contracts/interfaces/IStrategy.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {ISignatureUtils} from "@eigenlayer/contracts/interfaces/ISignatureUtils.sol"; +import {ISignatureUtilsMixin} from "@eigenlayer/contracts/interfaces/ISignatureUtilsMixin.sol"; import {IDelegationManager} from "@eigenlayer/contracts/interfaces/IDelegationManager.sol"; import {IBeacon} from "@openzeppelin/contracts/proxy/beacon/IBeacon.sol"; import {IStrategyManager} from "@eigenlayer/contracts/interfaces/IStrategyManager.sol"; -import {ISlasher} from "@eigenlayer/contracts/interfaces/ISlasher.sol"; import {IEigenPodManager} from "@eigenlayer/contracts/interfaces/IEigenPodManager.sol"; import {IAVSDirectory} from "@eigenlayer/contracts/interfaces/IAVSDirectory.sol"; import {IPauserRegistry} from "@eigenlayer/contracts/interfaces/IPauserRegistry.sol"; import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; import {StrategyFactory} from "@eigenlayer/contracts/strategies/StrategyFactory.sol"; - +import {IAllocationManager} from "@eigenlayer/contracts/interfaces/IAllocationManager.sol"; import {UpgradeableProxyLib} from "./UpgradeableProxyLib.sol"; library CoreDeploymentLib { @@ -38,6 +40,7 @@ library CoreDeploymentLib { using Strings for *; using UpgradeableProxyLib for address; + string internal constant EIGENLAYER_VERSION = "v1.4.0-testnet-holesky"; Vm internal constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); struct StrategyManagerConfig { @@ -45,10 +48,6 @@ library CoreDeploymentLib { uint256 initWithdrawalDelayBlocks; } - struct SlasherConfig { - uint256 initPausedStatus; - } - struct DelegationManagerConfig { uint256 initPausedStatus; uint256 withdrawalDelayBlocks; @@ -64,7 +63,6 @@ library CoreDeploymentLib { uint256 maxRetroactiveLength; uint256 maxFutureLength; uint256 genesisRewardsTimestamp; - // will be deployer address updater; uint256 activationDelay; uint256 calculationIntervalSeconds; @@ -80,15 +78,16 @@ library CoreDeploymentLib { address avsDirectory; address strategyManager; address eigenPodManager; + address allocationManager; address rewardsCoordinator; address eigenPodBeacon; address pauserRegistry; address strategyFactory; address strategyBeacon; - address initialOwner; + address permissionController; } - function deployContracts(address proxyAdmin, DeploymentConfigData memory configData) + function deployContracts(address deployer, address proxyAdmin, DeploymentConfigData memory configData) internal returns (DeploymentData memory) { @@ -97,29 +96,65 @@ library CoreDeploymentLib { result.delegationManager = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); result.avsDirectory = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); result.strategyManager = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); - result.eigenPodManager = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); + result.allocationManager = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); + result.avsDirectory = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); result.rewardsCoordinator = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); result.eigenPodBeacon = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); - result.pauserRegistry = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); + result.pauserRegistry = address( + new PauserRegistry( + new address[](0), // Empty array for pausers + proxyAdmin // ProxyAdmin as the unpauser + ) + ); result.strategyFactory = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); + result.eigenPodManager = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); + result.permissionController = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); // Deploy the implementation contracts, using the proxy contracts as inputs address delegationManagerImpl = address( new DelegationManager( - IStrategyManager(result.strategyManager), ISlasher(address(0)), IEigenPodManager(result.eigenPodManager) + IStrategyManager(result.strategyManager), + IEigenPodManager(result.eigenPodManager), + IAllocationManager(result.allocationManager), + IPauserRegistry(result.pauserRegistry), + IPermissionController(result.permissionController), + uint32(0), // TODO: check minWithdrawalDelay + EIGENLAYER_VERSION + ) + ); + address permissionControllerImpl = address(new PermissionController(EIGENLAYER_VERSION)); + + address avsDirectoryImpl = address( + new AVSDirectory( + IDelegationManager(result.delegationManager), + IPauserRegistry(result.pauserRegistry), // _DEALLOCATION_DELAY: 17.5 days in seconds), + EIGENLAYER_VERSION ) ); - address avsDirectoryImpl = address(new AVSDirectory(IDelegationManager(result.delegationManager))); address strategyManagerImpl = address( new StrategyManager( - IDelegationManager(result.delegationManager), - IEigenPodManager(result.eigenPodManager), - ISlasher(address(0)) + IDelegationManager(result.delegationManager), IPauserRegistry(result.pauserRegistry), EIGENLAYER_VERSION ) ); - address strategyFactoryImpl = address(new StrategyFactory(IStrategyManager(result.strategyManager))); + address strategyFactoryImpl = address( + new StrategyFactory( + IStrategyManager(result.strategyManager), IPauserRegistry(result.pauserRegistry), EIGENLAYER_VERSION + ) + ); + + address allocationManagerImpl = address( + new AllocationManager( + IDelegationManager(result.delegationManager), + IPauserRegistry(result.pauserRegistry), + IPermissionController(result.permissionController), + // IAVSDirectory(result.avsDirectory), + uint32(0), // _DEALLOCATION_DELAY + uint32(0), // _ALLOCATION_CONFIGURATION_DELAY + EIGENLAYER_VERSION + ) + ); address ethPOSDeposit; if (block.chainid == 1) { @@ -134,44 +169,50 @@ library CoreDeploymentLib { new EigenPodManager( IETHPOSDeposit(ethPOSDeposit), IBeacon(result.eigenPodBeacon), - IStrategyManager(result.strategyManager), - ISlasher(address(0)), - IDelegationManager(result.delegationManager) + IDelegationManager(result.delegationManager), + IPauserRegistry(result.pauserRegistry), + EIGENLAYER_VERSION ) ); /// TODO: Get actual values uint32 CALCULATION_INTERVAL_SECONDS = 1 days; - uint32 MAX_REWARDS_DURATION = 1 days; - uint32 MAX_RETROACTIVE_LENGTH = 1 days; - uint32 MAX_FUTURE_LENGTH = 2 days; - uint32 GENESIS_REWARDS_TIMESTAMP = 0; - address rewardsCoordinatorImpl = address( - new RewardsCoordinator( - IDelegationManager(result.delegationManager), - IStrategyManager(result.strategyManager), - CALCULATION_INTERVAL_SECONDS, - MAX_REWARDS_DURATION, - MAX_RETROACTIVE_LENGTH, - MAX_FUTURE_LENGTH, - GENESIS_REWARDS_TIMESTAMP - ) + uint32 MAX_REWARDS_DURATION = uint32(configData.rewardsCoordinator.maxRewardsDuration); + uint32 MAX_RETROACTIVE_LENGTH = uint32(configData.rewardsCoordinator.maxRetroactiveLength); + uint32 MAX_FUTURE_LENGTH = 1 days; + uint32 GENESIS_REWARDS_TIMESTAMP = 10 days; + IRewardsCoordinatorTypes.RewardsCoordinatorConstructorParams memory rewardsCoordinatorParams = + IRewardsCoordinatorTypes.RewardsCoordinatorConstructorParams( + IDelegationManager(result.delegationManager), + IStrategyManager(result.strategyManager), + IAllocationManager(result.allocationManager), + IPauserRegistry(result.pauserRegistry), + IPermissionController(result.permissionController), + CALCULATION_INTERVAL_SECONDS, + MAX_REWARDS_DURATION, + MAX_RETROACTIVE_LENGTH, + MAX_FUTURE_LENGTH, + GENESIS_REWARDS_TIMESTAMP, + EIGENLAYER_VERSION ); + address rewardsCoordinatorImpl = address(new RewardsCoordinator(rewardsCoordinatorParams)); - /// TODO: Get actual genesis time uint64 GENESIS_TIME = 1_564_000; - address eigenPodImpl = - address(new EigenPod(IETHPOSDeposit(ethPOSDeposit), IEigenPodManager(result.eigenPodManager), GENESIS_TIME)); - address eigenPodBeaconImpl = address(new UpgradeableBeacon(eigenPodImpl)); - address baseStrategyImpl = address(new StrategyBase(IStrategyManager(result.strategyManager))); - /// TODO: PauserRegistry isn't upgradeable - address pauserRegistryImpl = address( - new PauserRegistry( - new address[](0), // Empty array for pausers - proxyAdmin // ProxyAdmin as the unpauser + address eigenPodImpl = address( + new EigenPod( + IETHPOSDeposit(ethPOSDeposit), + IEigenPodManager(result.eigenPodManager), + GENESIS_TIME, + EIGENLAYER_VERSION + ) + ); + address baseStrategyImpl = address( + new StrategyBase( + IStrategyManager(result.strategyManager), IPauserRegistry(result.pauserRegistry), EIGENLAYER_VERSION ) ); + /// TODO: PauserRegistry isn't upgradeable // Deploy and configure the strategy beacon result.strategyBeacon = address(new UpgradeableBeacon(baseStrategyImpl)); @@ -182,11 +223,8 @@ library CoreDeploymentLib { DelegationManager.initialize, ( proxyAdmin, // initialOwner - IPauserRegistry(result.pauserRegistry), // _pauserRegistry - configData.delegationManager.initPausedStatus, // initialPausedStatus - configData.delegationManager.withdrawalDelayBlocks, // _minWithdrawalDelayBlocks - new IStrategy[](0), // _strategies (empty array for now) - new uint256[](0) // _withdrawalDelayBlocks (empty array for now) + // IPauserRegistry(result.pauserRegistry), // _pauserRegistry + configData.delegationManager.initPausedStatus // initialPausedStatus ) ); UpgradeableProxyLib.upgradeAndCall(result.delegationManager, delegationManagerImpl, upgradeCall); @@ -197,18 +235,20 @@ library CoreDeploymentLib { ( proxyAdmin, // initialOwner result.strategyFactory, // initialStrategyWhitelister - IPauserRegistry(result.pauserRegistry), // _pauserRegistry + // IPauserRegistry(result.pauserRegistry), // _pauserRegistry configData.strategyManager.initPausedStatus // initialPausedStatus ) ); + UpgradeableProxyLib.upgradeAndCall(result.strategyManager, strategyManagerImpl, upgradeCall); + UpgradeableProxyLib.upgrade(result.permissionController, permissionControllerImpl); // Upgrade StrategyFactory contract upgradeCall = abi.encodeCall( StrategyFactory.initialize, ( proxyAdmin, // initialOwner - IPauserRegistry(result.pauserRegistry), // _pauserRegistry + // IPauserRegistry(result.pauserRegistry), // _pauserRegistry configData.strategyFactory.initPausedStatus, // initialPausedStatus IBeacon(result.strategyBeacon) ) @@ -220,7 +260,7 @@ library CoreDeploymentLib { EigenPodManager.initialize, ( proxyAdmin, // initialOwner - IPauserRegistry(result.pauserRegistry), // _pauserRegistry + // IPauserRegistry(result.pauserRegistry), // _pauserRegistry configData.eigenPodManager.initPausedStatus // initialPausedStatus ) ); @@ -231,7 +271,7 @@ library CoreDeploymentLib { AVSDirectory.initialize, ( proxyAdmin, // initialOwner - IPauserRegistry(result.pauserRegistry), // _pauserRegistry + // IPauserRegistry(result.pauserRegistry), // _pauserRegistry 0 // TODO: AVS Missing configinitialPausedStatus ) ); @@ -241,10 +281,11 @@ library CoreDeploymentLib { upgradeCall = abi.encodeCall( RewardsCoordinator.initialize, ( - proxyAdmin, // initialOwner - IPauserRegistry(result.pauserRegistry), // _pauserRegistry + deployer, // initialOwner + // IPauserRegistry(result.pauserRegistry), // _pauserRegistry configData.rewardsCoordinator.initPausedStatus, // initialPausedStatus - configData.rewardsCoordinator.updater, + /// TODO: is there a setter and is this expected? + deployer, // rewards updater uint32(configData.rewardsCoordinator.activationDelay), // _activationDelay uint16(configData.rewardsCoordinator.globalOperatorCommissionBips) // _globalCommissionBips ) @@ -259,13 +300,24 @@ library CoreDeploymentLib { ); UpgradeableProxyLib.upgradeAndCall(result.eigenPodBeacon, eigenPodImpl, upgradeCall); + // Upgrade AllocationManager contract + upgradeCall = abi.encodeCall( + AllocationManager.initialize, + // TODO: Double check this + ( + deployer, // initialOwner + // IPauserRegistry(result.pauserRegistry), // _pauserRegistry + configData.delegationManager.initPausedStatus // initialPausedStatus + ) + ); + UpgradeableProxyLib.upgradeAndCall(result.allocationManager, allocationManagerImpl, upgradeCall); + return result; } struct DeploymentConfigData { StrategyManagerConfig strategyManager; DelegationManagerConfig delegationManager; - SlasherConfig slasher; EigenPodManagerConfig eigenPodManager; RewardsCoordinatorConfig rewardsCoordinator; StrategyFactoryConfig strategyFactory; @@ -274,12 +326,11 @@ library CoreDeploymentLib { function readDeploymentConfigValues(string memory directoryPath, string memory fileName) internal - view returns (DeploymentConfigData memory) { string memory pathToFile = string.concat(directoryPath, fileName); - require(vm.exists(pathToFile), "CoreDeployment: Deployment config file does not exist"); + require(vm.exists(pathToFile), "Deployment file does not exist"); string memory json = vm.readFile(pathToFile); @@ -289,18 +340,13 @@ library CoreDeploymentLib { data.strategyManager.initPausedStatus = json.readUint(".strategyManager.init_paused_status"); data.strategyManager.initWithdrawalDelayBlocks = uint32(json.readUint(".strategyManager.init_withdrawal_delay_blocks")); - // slasher config end + // StrategyManager config end // DelegationManager config start - data.delegationManager.initPausedStatus = json.readUint(".delegation.init_paused_status"); - data.delegationManager.withdrawalDelayBlocks = json.readUint(".delegation.init_withdrawal_delay_blocks"); + data.delegationManager.initPausedStatus = json.readUint(".delegationManager.init_paused_status"); + data.delegationManager.withdrawalDelayBlocks = json.readUint(".delegationManager.init_withdrawal_delay_blocks"); // DelegationManager config end - // Slasher config start - data.slasher.initPausedStatus = json.readUint(".slasher.init_paused_status"); - - // Slasher config end - // EigenPodManager config start data.eigenPodManager.initPausedStatus = json.readUint(".eigenPodManager.init_paused_status"); // EigenPodManager config end @@ -311,6 +357,7 @@ library CoreDeploymentLib { data.rewardsCoordinator.maxRetroactiveLength = json.readUint(".rewardsCoordinator.MAX_RETROACTIVE_LENGTH"); data.rewardsCoordinator.maxFutureLength = json.readUint(".rewardsCoordinator.MAX_FUTURE_LENGTH"); data.rewardsCoordinator.genesisRewardsTimestamp = json.readUint(".rewardsCoordinator.GENESIS_REWARDS_TIMESTAMP"); + data.rewardsCoordinator.updater = json.readAddress(".rewardsCoordinator.rewards_updater"); data.rewardsCoordinator.activationDelay = json.readUint(".rewardsCoordinator.activation_delay"); data.rewardsCoordinator.calculationIntervalSeconds = json.readUint(".rewardsCoordinator.calculation_interval_seconds"); @@ -323,28 +370,19 @@ library CoreDeploymentLib { function readDeploymentConfigValues(string memory directoryPath, uint256 chainId) internal - view returns (DeploymentConfigData memory) { return readDeploymentConfigValues(directoryPath, string.concat(vm.toString(chainId), ".json")); } - function readDeploymentJson(string memory directoryPath, uint256 chainId) - internal - view - returns (DeploymentData memory) - { + function readDeploymentJson(string memory directoryPath, uint256 chainId) public returns (DeploymentData memory) { return readDeploymentJson(directoryPath, string.concat(vm.toString(chainId), ".json")); } - function readDeploymentJson(string memory path, string memory fileName) - internal - view - returns (DeploymentData memory) - { + function readDeploymentJson(string memory path, string memory fileName) internal returns (DeploymentData memory) { string memory pathToFile = string.concat(path, fileName); - require(vm.exists(pathToFile), "CoreDeployment: Deployment file does not exist"); + require(vm.exists(pathToFile), "Deployment file does not exist"); string memory json = vm.readFile(pathToFile); @@ -355,7 +393,8 @@ library CoreDeploymentLib { data.delegationManager = json.readAddress(".addresses.delegation"); data.avsDirectory = json.readAddress(".addresses.avsDirectory"); data.rewardsCoordinator = json.readAddress(".addresses.rewardsCoordinator"); - data.initialOwner = json.readAddress(".addresses.proxyAdmin"); + data.allocationManager = json.readAddress(".addresses.allocationManager"); + data.permissionController = json.readAddress(".addresses.permissionController"); return data; } @@ -422,13 +461,17 @@ library CoreDeploymentLib { data.eigenPodManager.getImplementation().toHexString(), '","strategyFactory":"', data.strategyFactory.toHexString(), - '","strategyFactoryImpl":"', - data.strategyFactory.getImplementation().toHexString(), - '","strategyBeacon":"', - data.strategyBeacon.toHexString(), '","rewardsCoordinator":"', data.rewardsCoordinator.toHexString(), + '","pauserRegistry":"', + data.pauserRegistry.toHexString(), + '","strategyBeacon":"', + data.strategyBeacon.toHexString(), + '","allocationManager":"', + data.allocationManager.toHexString(), + '","permissionController":"', + data.permissionController.toHexString(), '"}' ); } -} +} \ No newline at end of file diff --git a/avs/contracts/script/utils/UpgradeableProxyLib.sol b/avs/contracts/script/utils/UpgradeableProxyLib.sol index 9d8a4f0f..809d8d8d 100644 --- a/avs/contracts/script/utils/UpgradeableProxyLib.sol +++ b/avs/contracts/script/utils/UpgradeableProxyLib.sol @@ -1,9 +1,12 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; +pragma solidity ^0.8.12; import {Vm} from "forge-std/Vm.sol"; import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; -import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import { + TransparentUpgradeableProxy, + ITransparentUpgradeableProxy +} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import {EmptyContract} from "@eigenlayer/test/mocks/EmptyContract.sol"; library UpgradeableProxyLib { @@ -23,12 +26,12 @@ library UpgradeableProxyLib { function upgrade(address proxy, address impl) internal { ProxyAdmin admin = getProxyAdmin(proxy); - admin.upgrade(TransparentUpgradeableProxy(payable(proxy)), impl); + admin.upgrade(ITransparentUpgradeableProxy(payable(proxy)), impl); } function upgradeAndCall(address proxy, address impl, bytes memory initData) internal { ProxyAdmin admin = getProxyAdmin(proxy); - admin.upgradeAndCall(TransparentUpgradeableProxy(payable(proxy)), impl, initData); + admin.upgradeAndCall(ITransparentUpgradeableProxy(payable(proxy)), impl, initData); } function getImplementation(address proxy) internal view returns (address) { @@ -40,4 +43,4 @@ library UpgradeableProxyLib { bytes32 value = vm.load(proxy, ADMIN_SLOT); return ProxyAdmin(address(uint160(uint256(value)))); } -} +} \ No newline at end of file From 58286b800c6a847f589a1dbd14e9e2a0fc298738 Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Tue, 13 May 2025 09:10:41 +0530 Subject: [PATCH 17/26] refactor: reclaim task manager --- avs/contracts/reclaim.json | 13 + avs/contracts/script/ReclaimDeployer.s.sol | 150 ++++--- .../script/deployments/core/31337.json | 2 +- .../script/deployments/reclaim/31337.json | 1 + avs/contracts/script/utils/FundOperator.sol | 12 + .../script/utils/ReclaimDeploymentLib.sol | 356 +++++++++++++--- ...iceManager.sol => IReclaimTaskManager.sol} | 15 +- avs/contracts/src/ReclaimServiceManager.sol | 383 ++---------------- avs/contracts/src/ReclaimTaskManager.sol | 372 +++++++++++++++++ avs/contracts/src/test/ContractsRegistry.sol | 42 ++ 10 files changed, 879 insertions(+), 467 deletions(-) create mode 100644 avs/contracts/reclaim.json create mode 100644 avs/contracts/script/deployments/reclaim/31337.json create mode 100644 avs/contracts/script/utils/FundOperator.sol rename avs/contracts/src/{IReclaimServiceManager.sol => IReclaimTaskManager.sol} (89%) create mode 100644 avs/contracts/src/ReclaimTaskManager.sol create mode 100644 avs/contracts/src/test/ContractsRegistry.sol diff --git a/avs/contracts/reclaim.json b/avs/contracts/reclaim.json new file mode 100644 index 00000000..e5870004 --- /dev/null +++ b/avs/contracts/reclaim.json @@ -0,0 +1,13 @@ +{ + "num_quorums": 1, + "operator_params": [10000,15000,100], + "operator_addr": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "operator_2_addr":"0x0b065a0423f076a340f37e16e1ce22e23d66caf2", + "contracts_registry_addr": "0x5FbDB2315678afecb367f032d93F642f64180aa3", + "task_generator_addr": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + "aggregator_addr":"0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "rewards_owner_addr": "0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f", + "rewards_initiator_addr": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", + "rewards_owner_key": "0xdbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97", + "rewards_initiator_key": "0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6" +} \ No newline at end of file diff --git a/avs/contracts/script/ReclaimDeployer.s.sol b/avs/contracts/script/ReclaimDeployer.s.sol index b725eb40..f5023fd7 100644 --- a/avs/contracts/script/ReclaimDeployer.s.sol +++ b/avs/contracts/script/ReclaimDeployer.s.sol @@ -1,79 +1,121 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; +pragma solidity ^0.8.9; -import {Script} from "forge-std/Script.sol"; -import {console2} from "forge-std/Test.sol"; -import {ReclaimDeploymentLib} from "./utils/ReclaimDeploymentLib.sol"; import {CoreDeploymentLib} from "./utils/CoreDeploymentLib.sol"; -import {UpgradeableProxyLib} from "./utils/UpgradeableProxyLib.sol"; -import {StrategyBase} from "@eigenlayer/contracts/strategies/StrategyBase.sol"; -import {ERC20Mock} from "../src/ERC20Mock.sol"; -import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import {StrategyFactory} from "@eigenlayer/contracts/strategies/StrategyFactory.sol"; -import {StrategyManager} from "@eigenlayer/contracts/core/StrategyManager.sol"; -import {IRewardsCoordinator} from "@eigenlayer/contracts/interfaces/IRewardsCoordinator.sol"; -import { - Quorum, - StrategyParams, - IStrategy -} from "@eigenlayer-middleware/src/interfaces/IECDSAStakeRegistryEventsAndErrors.sol"; +import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import "@eigenlayer/contracts/permissions/PauserRegistry.sol"; + +import {IDelegationManager} from "@eigenlayer/contracts/interfaces/IDelegationManager.sol"; +import {IAVSDirectory} from "@eigenlayer/contracts/interfaces/IAVSDirectory.sol"; +import {IStrategyManager, IStrategy} from "@eigenlayer/contracts/interfaces/IStrategyManager.sol"; +import {StrategyBaseTVLLimits} from "@eigenlayer/contracts/strategies/StrategyBaseTVLLimits.sol"; +import "@eigenlayer/test/mocks/EmptyContract.sol"; + +import "@eigenlayer-middleware/src/RegistryCoordinator.sol" as regcoord; +import {IBLSApkRegistry, IIndexRegistry, IStakeRegistry} from "@eigenlayer-middleware/src/RegistryCoordinator.sol"; +import {BLSApkRegistry} from "@eigenlayer-middleware/src/BLSApkRegistry.sol"; +import {IndexRegistry} from "@eigenlayer-middleware/src/IndexRegistry.sol"; +import {StakeRegistry} from "@eigenlayer-middleware/src/StakeRegistry.sol"; +import "@eigenlayer-middleware/src/OperatorStateRetriever.sol"; + +import {ReclaimServiceManager, IServiceManager} from "../src/ReclaimServiceManager.sol"; +import {ReclaimTaskManager} from "../src/ReclaimTaskManager.sol"; +import {IReclaimTaskManager} from "../src/IReclaimTaskManager.sol"; +import "../src/ERC20Mock.sol"; import "forge-std/Test.sol"; +import "forge-std/Script.sol"; +import "forge-std/StdJson.sol"; +import "forge-std/console.sol"; +import {StrategyFactory} from "@eigenlayer/contracts/strategies/StrategyFactory.sol"; -contract ReclaimDeployer is Script, Test { - using CoreDeploymentLib for *; - using UpgradeableProxyLib for address; +import {ContractsRegistry} from "../src/test/ContractsRegistry.sol"; +import {ReclaimDeploymentLib} from "../script/utils/ReclaimDeploymentLib.sol"; +import {UpgradeableProxyLib} from "./utils/UpgradeableProxyLib.sol"; + +import {FundOperator} from "./utils/FundOperator.sol"; +// # To deploy and verify our contract +// forge script script/ReclaimDeployer.s.sol:ReclaimDeployer --rpc-url $RPC_URL --private-key $PRIVATE_KEY --broadcast -vvvv + +contract ReclaimDeployer is Script { + // DEPLOYMENT CONSTANTS + uint256 public constant QUORUM_THRESHOLD_PERCENTAGE = 100; + uint32 public constant TASK_RESPONSE_WINDOW_BLOCK = 30; + uint32 public constant TASK_DURATION_BLOCKS = 0; + address public AGGREGATOR_ADDR; + address public TASK_GENERATOR_ADDR; + address public CONTRACTS_REGISTRY_ADDR; + address public OPERATOR_ADDR; + address public OPERATOR_2_ADDR; + ContractsRegistry contractsRegistry; + + StrategyBaseTVLLimits public erc20MockStrategy; + + address public rewardscoordinator; + + regcoord.RegistryCoordinator public registryCoordinator; + regcoord.IRegistryCoordinator public registryCoordinatorImplementation; + + IBLSApkRegistry public blsApkRegistry; + IBLSApkRegistry public blsApkRegistryImplementation; + IIndexRegistry public indexRegistry; + IIndexRegistry public indexRegistryImplementation; + + IStakeRegistry public stakeRegistry; + IStakeRegistry public stakeRegistryImplementation; + + OperatorStateRetriever public operatorStateRetriever; + + ReclaimServiceManager public serviceManager; + IServiceManager public serviceManagerImplementation; + + CoreDeploymentLib.DeploymentData internal configData; + IStrategy strategy; address private deployer; + ERC20Mock public erc20Mock; + ReclaimDeploymentLib.DeploymentData deployment; + + using UpgradeableProxyLib for address; + address proxyAdmin; - address rewardsOwner; - address rewardsInitiator; - IStrategy reclaimStrategy; - CoreDeploymentLib.DeploymentData coreDeployment; - ReclaimDeploymentLib.DeploymentData reclaimDeployment; - ReclaimDeploymentLib.DeploymentConfigData reclaimConfig; - Quorum internal quorum; - ERC20Mock token; function setUp() public virtual { deployer = vm.rememberKey(vm.envUint("PRIVATE_KEY")); vm.label(deployer, "Deployer"); - - reclaimConfig = ReclaimDeploymentLib.readDeploymentConfigValues("config/reclaim/", block.chainid); - - coreDeployment = CoreDeploymentLib.readDeploymentJson("deployments/core/", block.chainid); } function run() external { + // Eigenlayer contracts vm.startBroadcast(deployer); - rewardsOwner = reclaimConfig.rewardsOwner; - rewardsInitiator = reclaimConfig.rewardsInitiator; - - token = new ERC20Mock(); - reclaimStrategy = IStrategy(StrategyFactory(coreDeployment.strategyFactory).deployNewStrategy(token)); - - quorum.strategies.push(StrategyParams({strategy: reclaimStrategy, multiplier: 10_000})); + ReclaimDeploymentLib.SetupConfig memory isConfig = + ReclaimDeploymentLib.readSetupConfigJson("reclaim"); + configData = CoreDeploymentLib.readDeploymentJson("script/deployments/core/", block.chainid); + + erc20Mock = new ERC20Mock(); + FundOperator.fund_operator(address(erc20Mock), isConfig.operator_addr, 15000e18); + FundOperator.fund_operator(address(erc20Mock), isConfig.operator_2_addr, 30000e18); + console.log(isConfig.operator_2_addr); + (bool s,) = isConfig.operator_2_addr.call{value: 0.1 ether}(""); + require(s); + strategy = IStrategy(StrategyFactory(configData.strategyFactory).deployNewStrategy(erc20Mock)); + rewardscoordinator = configData.rewardsCoordinator; proxyAdmin = UpgradeableProxyLib.deployProxyAdmin(); + require(address(strategy) != address(0)); + deployment = ReclaimDeploymentLib.deployContracts( + proxyAdmin, configData, address(strategy), isConfig, msg.sender + ); + console.log("instantSlasher", deployment.slasher); - reclaimDeployment = - ReclaimDeploymentLib.deployContracts(proxyAdmin, coreDeployment, quorum, deployer, address(reclaimStrategy)); + FundOperator.fund_operator( + address(erc20Mock), deployment.serviceManager, 1e18 + ); + deployment.token = address(erc20Mock); - reclaimDeployment.strategy = address(reclaimStrategy); - reclaimDeployment.token = address(token); + ReclaimDeploymentLib.writeDeploymentJson(deployment); vm.stopBroadcast(); - verifyDeployment(); - ReclaimDeploymentLib.writeDeploymentJson(reclaimDeployment); - } - - function verifyDeployment() internal view { - require(reclaimDeployment.stakeRegistry != address(0), "StakeRegistry address cannot be zero"); - require(reclaimDeployment.reclaimServiceManager != address(0), "ReclaimServiceManager address cannot be zero"); - require(reclaimDeployment.strategy != address(0), "Strategy address cannot be zero"); - require(proxyAdmin != address(0), "ProxyAdmin address cannot be zero"); - require(coreDeployment.delegationManager != address(0), "DelegationManager address cannot be zero"); - require(coreDeployment.avsDirectory != address(0), "AVSDirectory address cannot be zero"); } -} +} \ No newline at end of file diff --git a/avs/contracts/script/deployments/core/31337.json b/avs/contracts/script/deployments/core/31337.json index e42cb29c..682b13ef 100644 --- a/avs/contracts/script/deployments/core/31337.json +++ b/avs/contracts/script/deployments/core/31337.json @@ -1 +1 @@ -{"lastUpdate":{"timestamp":"1744037748","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x4ed7c70f96b99c776995fb64377f0d4ab3b0e1c1","avsDirectory":"0x610178da211fef7d417bc0e6fed39f05609ad788","avsDirectoryImpl":"0xa85233c63b9ee964add6f2cffe00fd84eb32338f","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x4a679253410272dd5232b3ff7cf5dbb88f295319","eigenPodManager":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManagerImpl":"0xc5a5c42992decbae36851359345fe25997f5c42d","strategyFactory":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","rewardsCoordinator":"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0","pauserRegistry":"0x0b306bf915c4d645ff596e518faf3f9669b97016","strategyBeacon":"0x84ea74d481ee0a5332c457a4d796187f6ba67feb","allocationManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","permissionController":"0x59b670e9fa9d0a427751af201d676719a970857b"}} \ No newline at end of file +{"lastUpdate":{"timestamp":"1747107081","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x4ed7c70f96b99c776995fb64377f0d4ab3b0e1c1","avsDirectory":"0x610178da211fef7d417bc0e6fed39f05609ad788","avsDirectoryImpl":"0xa85233c63b9ee964add6f2cffe00fd84eb32338f","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x4a679253410272dd5232b3ff7cf5dbb88f295319","eigenPodManager":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManagerImpl":"0xc5a5c42992decbae36851359345fe25997f5c42d","strategyFactory":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","rewardsCoordinator":"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0","pauserRegistry":"0x0b306bf915c4d645ff596e518faf3f9669b97016","strategyBeacon":"0x84ea74d481ee0a5332c457a4d796187f6ba67feb","allocationManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","permissionController":"0x59b670e9fa9d0a427751af201d676719a970857b"}} \ No newline at end of file diff --git a/avs/contracts/script/deployments/reclaim/31337.json b/avs/contracts/script/deployments/reclaim/31337.json new file mode 100644 index 00000000..6f7d93bb --- /dev/null +++ b/avs/contracts/script/deployments/reclaim/31337.json @@ -0,0 +1 @@ +{"lastUpdate":{"timestamp":"1747107084","block_number":"19"},"addresses":{"proxyAdmin":"0x809d550fca64d94bd9f66e60752a544199cfac3d","ReclaimServiceManager":"0x1291be112d480055dafd8a610b7d1e203891c274","serviceManagerImpl":"0x8198f5d8f8cffe8f9c413d98a0a55aeb8ab9fbb7","ReclaimTaskManager":"0x82e01223d51eb87e16a03e24687edf0f294da6f1","registryCoordinator":"0x7969c5ed335650692bc04293b07f5bf2e7a673c0","blsapkRegistry":"0xc351628eb244ec633d5f21fbd6621e1a683b1181","indexRegistry":"0xcbeaf3bde82155f56486fb5a1072cb8baaf547cc","stakeRegistry":"0xb7278a61aa25c888815afc32ad3cc52ff24fe575","operatorStateRetriever":"0x5081a39b8a5f0e35a8d959395a630b68b74dd30f","strategy":"0x2b961e3959b79326a8e7f64ef0d2d825707669b5","pauserRegistry":"0x0000000000000000000000000000000000000000","token":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","instantSlasher":"0x922d6956c99e12dfeb3224dea977d0939758a1fe"}} \ No newline at end of file diff --git a/avs/contracts/script/utils/FundOperator.sol b/avs/contracts/script/utils/FundOperator.sol new file mode 100644 index 00000000..2c70000c --- /dev/null +++ b/avs/contracts/script/utils/FundOperator.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.12; + +import {ERC20Mock} from "../../src/ERC20Mock.sol"; + +library FundOperator { + function fund_operator(address erc20, address operator, uint256 amount) internal { + ERC20Mock erc20_contract = ERC20Mock(erc20); + + erc20_contract.mint(operator, amount); + } +} \ No newline at end of file diff --git a/avs/contracts/script/utils/ReclaimDeploymentLib.sol b/avs/contracts/script/utils/ReclaimDeploymentLib.sol index e3f7af0d..85843798 100644 --- a/avs/contracts/script/utils/ReclaimDeploymentLib.sol +++ b/avs/contracts/script/utils/ReclaimDeploymentLib.sol @@ -1,32 +1,81 @@ // SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.0; +pragma solidity ^0.8.12; +import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import {Script} from "forge-std/Script.sol"; import {console2} from "forge-std/Test.sol"; import {Vm} from "forge-std/Vm.sol"; import {stdJson} from "forge-std/StdJson.sol"; -import {ECDSAStakeRegistry} from "@eigenlayer-middleware/src/unaudited/ECDSAStakeRegistry.sol"; -import {ReclaimServiceManager} from "../../src/ReclaimServiceManager.sol"; +import {IAVSDirectory} from "@eigenlayer/contracts/interfaces/IAVSDirectory.sol"; +import {ISocketRegistry, SocketRegistry} from "@eigenlayer-middleware/src/SocketRegistry.sol"; +import { + ISlashingRegistryCoordinator, + ISlashingRegistryCoordinatorTypes +} from "@eigenlayer-middleware/src/interfaces/ISlashingRegistryCoordinator.sol"; +import {SlashingRegistryCoordinator} from "@eigenlayer-middleware/src/SlashingRegistryCoordinator.sol"; +import {IPermissionController} from "@eigenlayer/contracts/interfaces/IPermissionController.sol"; +import { + ReclaimServiceManager, + IServiceManager +} from "../../src/ReclaimServiceManager.sol"; +import {IReclaimTaskManager, ReclaimTaskManager} from "../../src/ReclaimTaskManager.sol"; import {IDelegationManager} from "@eigenlayer/contracts/interfaces/IDelegationManager.sol"; -import {Quorum} from "@eigenlayer-middleware/src/interfaces/IECDSAStakeRegistryEventsAndErrors.sol"; +// import {Quorum} from "@eigenlayer-middleware/src/interfaces/IECDSAStakeRegistryEventsAndErrors.sol"; import {UpgradeableProxyLib} from "./UpgradeableProxyLib.sol"; import {CoreDeploymentLib} from "./CoreDeploymentLib.sol"; import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; +import {BLSApkRegistry} from "@eigenlayer-middleware/src/BLSApkRegistry.sol"; +import {IndexRegistry} from "@eigenlayer-middleware/src/IndexRegistry.sol"; +import {InstantSlasher} from "@eigenlayer-middleware/src/slashers/InstantSlasher.sol"; +import {StakeRegistry} from "@eigenlayer-middleware/src/StakeRegistry.sol"; +// import {SocketRegistry} from "@eigenlayer-middleware/src/SocketRegistry.sol"; // todo: socket registry not available +import {IAllocationManager} from "@eigenlayer/contracts/interfaces/IAllocationManager.sol"; +import {IStrategy} from "@eigenlayer/contracts/interfaces/IStrategyManager.sol"; +import {CoreDeploymentLib} from "./CoreDeploymentLib.sol"; +import {IRewardsCoordinator} from "@eigenlayer/contracts/interfaces/IRewardsCoordinator.sol"; + +import { + IBLSApkRegistry, IIndexRegistry, IStakeRegistry +} from +// ISocketRegistry +"@eigenlayer-middleware/src/SlashingRegistryCoordinator.sol"; +import {IStakeRegistryTypes} from "@eigenlayer-middleware/src/interfaces/IStakeRegistry.sol"; + +import {PauserRegistry, IPauserRegistry} from "@eigenlayer/contracts/permissions/PauserRegistry.sol"; +import {OperatorStateRetriever} from "@eigenlayer-middleware/src/OperatorStateRetriever.sol"; library ReclaimDeploymentLib { using stdJson for *; using Strings for *; using UpgradeableProxyLib for address; + string internal constant MIDDLEWARE_VERSION = "v1.4.0-testnet-holesky"; Vm internal constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); struct DeploymentData { - address reclaimServiceManager; + address serviceManager; + address taskManager; + address slashingRegistryCoordinator; + address operatorStateRetriever; + address blsapkRegistry; + address indexRegistry; address stakeRegistry; + address socketRegistry; address strategy; + address pauserRegistry; address token; + address slasher; } - struct DeploymentConfigData { + struct SetupConfig { + uint256 numQuorums; + uint256[] operatorParams; + address operator_addr; + address operator_2_addr; + address contracts_registry_addr; + address task_generator_addr; + address aggregator_addr; address rewardsOwner; address rewardsInitiator; uint256 rewardsOwnerKey; @@ -36,64 +85,224 @@ library ReclaimDeploymentLib { function deployContracts( address proxyAdmin, CoreDeploymentLib.DeploymentData memory core, - Quorum memory quorum, - address contractOwner, - address strategy + address strategy, + SetupConfig memory setupConfig, + address admin ) internal returns (DeploymentData memory) { + /// read EL deployment address + CoreDeploymentLib.DeploymentData memory coredata = + readCoreDeploymentJson("script/deployments/core/", block.chainid); + address avsdirectory = coredata.avsDirectory; + DeploymentData memory result; // First, deploy upgradeable proxy contracts that will point to the implementations. - result.reclaimServiceManager = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); + result.serviceManager = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); result.stakeRegistry = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); + result.taskManager = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); + result.slashingRegistryCoordinator = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); + result.blsapkRegistry = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); + result.indexRegistry = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); + result.socketRegistry = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); + result.slasher = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); + OperatorStateRetriever operatorStateRetriever = new OperatorStateRetriever(); + result.strategy = strategy; + result.operatorStateRetriever = address(operatorStateRetriever); // Deploy the implementation contracts, using the proxy contracts as inputs - address stakeRegistryImpl = address(new ECDSAStakeRegistry(IDelegationManager(core.delegationManager))); - address reclaimServiceManagerImpl = address( - new ReclaimServiceManager( - core.avsDirectory, result.stakeRegistry, core.rewardsCoordinator, core.delegationManager + address stakeRegistryImpl = address( + new StakeRegistry( + ISlashingRegistryCoordinator(result.slashingRegistryCoordinator), + IDelegationManager(core.delegationManager), + IAVSDirectory(core.avsDirectory), + IAllocationManager(core.allocationManager) + ) + ); + + address blsApkRegistryImpl = + address(new BLSApkRegistry(ISlashingRegistryCoordinator(result.slashingRegistryCoordinator))); + address indexRegistryimpl = + address(new IndexRegistry(ISlashingRegistryCoordinator(result.slashingRegistryCoordinator))); + address instantSlasherImpl = address( + new InstantSlasher( + IAllocationManager(core.allocationManager), + ISlashingRegistryCoordinator(result.slashingRegistryCoordinator), + result.taskManager + ) + ); + + address slashingRegistryCoordinatorImpl = address( + new SlashingRegistryCoordinator( + IStakeRegistry(result.stakeRegistry), + IBLSApkRegistry(result.blsapkRegistry), + IIndexRegistry(result.indexRegistry), + ISocketRegistry(result.socketRegistry), + IAllocationManager(core.allocationManager), + IPauserRegistry(coredata.pauserRegistry), + MIDDLEWARE_VERSION ) ); - // Upgrade contracts - bytes memory upgradeCall = - abi.encodeCall(ECDSAStakeRegistry.initialize, (result.reclaimServiceManager, 0, quorum)); - UpgradeableProxyLib.upgradeAndCall(result.stakeRegistry, stakeRegistryImpl, upgradeCall); - upgradeCall = abi.encodeCall(ReclaimServiceManager.initialize, (contractOwner, strategy)); - UpgradeableProxyLib.upgradeAndCall(result.reclaimServiceManager, reclaimServiceManagerImpl, upgradeCall); + + address[] memory pausers = new address[](2); + pausers[0] = admin; + pausers[1] = admin; + PauserRegistry pausercontract = new PauserRegistry(pausers, admin); + + IStrategy[] memory deployedStrategyArray = new IStrategy[](1); + deployedStrategyArray[0] = IStrategy(strategy); + uint256 numStrategies = deployedStrategyArray.length; + + uint256 numQuorums = setupConfig.numQuorums; + ISlashingRegistryCoordinatorTypes.OperatorSetParam[] memory quorumsOperatorSetParams = + new ISlashingRegistryCoordinatorTypes.OperatorSetParam[](numQuorums); + uint256[] memory operator_params = setupConfig.operatorParams; + + for (uint256 i = 0; i < numQuorums; i++) { + quorumsOperatorSetParams[i] = ISlashingRegistryCoordinatorTypes.OperatorSetParam({ + maxOperatorCount: uint32(operator_params[i]), + kickBIPsOfOperatorStake: uint16(operator_params[i + 1]), + kickBIPsOfTotalStake: uint16(operator_params[i + 2]) + }); + } + // // set to 0 for every quorum + IStakeRegistryTypes.StrategyParams[][] memory quorumsStrategyParams = + new IStakeRegistryTypes.StrategyParams[][](numQuorums); + for (uint256 i = 0; i < numQuorums; i++) { + quorumsStrategyParams[i] = new IStakeRegistryTypes.StrategyParams[](numStrategies); + for (uint256 j = 0; j < numStrategies; j++) { + quorumsStrategyParams[i][j] = IStakeRegistryTypes.StrategyParams({ + strategy: deployedStrategyArray[j], + // setting this to 1 ether since the divisor is also 1 ether + // therefore this allows an operator to register with even just 1 token + // see https://github.com/Layr-Labs/eigenlayer-middleware/blob/m2-mainnet/src/StakeRegistry.sol#L484 + // weight += uint96(sharesAmount * strategyAndMultiplier.multiplier / WEIGHTING_DIVISOR); + multiplier: 1 ether + }); + } + } + + IStakeRegistryTypes.StakeType[] memory stake_type = new IStakeRegistryTypes.StakeType[](1); + stake_type[0] = IStakeRegistryTypes.StakeType.TOTAL_SLASHABLE; + uint32[] memory look_ahead_period = new uint32[](1); + look_ahead_period[0] = 0; + bytes memory upgradeCall = abi.encodeCall( + SlashingRegistryCoordinator.initialize, (admin, admin, admin, 0, result.serviceManager) + ); + + UpgradeableProxyLib.upgrade(result.stakeRegistry, stakeRegistryImpl); + UpgradeableProxyLib.upgrade(result.blsapkRegistry, blsApkRegistryImpl); + UpgradeableProxyLib.upgrade(result.indexRegistry, indexRegistryimpl); + UpgradeableProxyLib.upgradeAndCall( + result.slashingRegistryCoordinator, slashingRegistryCoordinatorImpl, upgradeCall + ); + + ReclaimServiceManager serviceManagerImpl = new ReclaimServiceManager( + (IAVSDirectory(avsdirectory)), + ISlashingRegistryCoordinator(result.slashingRegistryCoordinator), + IStakeRegistry(result.stakeRegistry), + core.rewardsCoordinator, + IAllocationManager(core.allocationManager), + IPermissionController(core.permissionController), + IReclaimTaskManager(result.taskManager) + ); + + ReclaimTaskManager taskManagerImpl = new ReclaimTaskManager( + IStakeRegistry(result.stakeRegistry), + IRewardsCoordinator(core.rewardsCoordinator), + IPauserRegistry(address(pausercontract)) + ); + bytes memory servicemanagerupgradecall = + abi.encodeCall(ReclaimServiceManager.initialize, (admin, admin)); + UpgradeableProxyLib.upgradeAndCall( + result.serviceManager, + address(serviceManagerImpl), + servicemanagerupgradecall + ); + + console2.log(result.serviceManager); + bytes memory taskmanagerupgradecall = abi.encodeCall( + ReclaimTaskManager.initialize, + ( + admin, + address(0) + // setupConfig.aggregator_addr, + // setupConfig.task_generator_addr, + // core.allocationManager, + // result.slasher, + // result.serviceManager + ) + ); + UpgradeableProxyLib.upgradeAndCall( + result.taskManager, address(taskManagerImpl), (taskmanagerupgradecall) + ); + + UpgradeableProxyLib.upgrade(result.slasher, instantSlasherImpl); + + address socketRegistryImpl = + address(new SocketRegistry(ISlashingRegistryCoordinator(result.slashingRegistryCoordinator))); + UpgradeableProxyLib.upgrade(result.socketRegistry, socketRegistryImpl); + + verify_deployment(result); return result; } - function readDeploymentJson(uint256 chainId) internal view returns (DeploymentData memory) { - return readDeploymentJson("deployments/", chainId); + function readDeploymentJson(uint256 chainId) internal returns (DeploymentData memory) { + return readDeploymentJson("script/deployments/reclaim/", chainId); + } + + function readSetupConfigJson(string memory directoryPath) + internal view + returns (SetupConfig memory) + { + string memory fileName = string.concat(directoryPath, ".json"); + require(vm.exists(fileName), "Deployment file does not exist"); + string memory json = vm.readFile(fileName); + + SetupConfig memory data; + data.numQuorums = json.readUint(".num_quorums"); + data.operatorParams = json.readUintArray(".operator_params"); + data.aggregator_addr = json.readAddress(".aggregator_addr"); + data.contracts_registry_addr = json.readAddress(".contracts_registry_addr"); + data.operator_addr = json.readAddress(".operator_addr"); + data.task_generator_addr = json.readAddress(".task_generator_addr"); + data.operator_2_addr = json.readAddress(".operator_2_addr"); + data.rewardsInitiator = json.readAddress(".rewards_initiator_addr"); + data.rewardsOwner = json.readAddress(".rewards_owner_addr"); + data.rewardsInitiatorKey = json.readUint(".rewards_initiator_key"); + data.rewardsOwnerKey = json.readUint(".rewards_owner_key"); + return data; } function readDeploymentJson(string memory directoryPath, uint256 chainId) internal - view returns (DeploymentData memory) { string memory fileName = string.concat(directoryPath, vm.toString(chainId), ".json"); - require(vm.exists(fileName), "ReclaimDeployment: Deployment file does not exist"); + require(vm.exists(fileName), "Deployment file does not exist"); string memory json = vm.readFile(fileName); DeploymentData memory data; - /// TODO: 2 Step for reading deployment json. Read to the core and the AVS data - data.reclaimServiceManager = json.readAddress(".addresses.reclaimServiceManager"); + data.serviceManager = json.readAddress(".addresses.ReclaimServiceManager"); + data.taskManager = json.readAddress(".addresses.ReclaimTaskManager"); + data.slashingRegistryCoordinator = json.readAddress(".addresses.registryCoordinator"); + data.operatorStateRetriever = json.readAddress(".addresses.operatorStateRetriever"); data.stakeRegistry = json.readAddress(".addresses.stakeRegistry"); data.strategy = json.readAddress(".addresses.strategy"); data.token = json.readAddress(".addresses.token"); + data.slasher = json.readAddress(".addresses.instantSlasher"); return data; } /// write to default output path function writeDeploymentJson(DeploymentData memory data) internal { - writeDeploymentJson("deployments/reclaim/", block.chainid, data); + writeDeploymentJson("script/deployments/reclaim/", block.chainid, data); } function writeDeploymentJson(string memory outputPath, uint256 chainId, DeploymentData memory data) internal { - address proxyAdmin = address(UpgradeableProxyLib.getProxyAdmin(data.reclaimServiceManager)); + address proxyAdmin = address(UpgradeableProxyLib.getProxyAdmin(data.serviceManager)); string memory deploymentData = _generateDeploymentJson(data, proxyAdmin); @@ -106,33 +315,6 @@ library ReclaimDeploymentLib { console2.log("Deployment artifacts written to:", fileName); } - function readDeploymentConfigValues(string memory directoryPath, string memory fileName) - internal - view - returns (DeploymentConfigData memory) - { - string memory pathToFile = string.concat(directoryPath, fileName); - - require(vm.exists(pathToFile), "ReclaimDeployment: Deployment Config file does not exist"); - - string memory json = vm.readFile(pathToFile); - - DeploymentConfigData memory data; - data.rewardsOwner = json.readAddress(".addresses.rewardsOwner"); - data.rewardsInitiator = json.readAddress(".addresses.rewardsInitiator"); - data.rewardsOwnerKey = json.readUint(".keys.rewardsOwner"); - data.rewardsInitiatorKey = json.readUint(".keys.rewardsInitiator"); - return data; - } - - function readDeploymentConfigValues(string memory directoryPath, uint256 chainId) - internal - view - returns (DeploymentConfigData memory) - { - return readDeploymentConfigValues(directoryPath, string.concat(vm.toString(chainId), ".json")); - } - function _generateDeploymentJson(DeploymentData memory data, address proxyAdmin) private view @@ -157,19 +339,69 @@ library ReclaimDeploymentLib { return string.concat( '{"proxyAdmin":"', proxyAdmin.toHexString(), - '","reclaimServiceManager":"', - data.reclaimServiceManager.toHexString(), - '","reclaimServiceManagerImpl":"', - data.reclaimServiceManager.getImplementation().toHexString(), + '","ReclaimServiceManager":"', + data.serviceManager.toHexString(), + '","serviceManagerImpl":"', + data.serviceManager.getImplementation().toHexString(), + '","ReclaimTaskManager":"', + data.taskManager.toHexString(), + '","registryCoordinator":"', + data.slashingRegistryCoordinator.toHexString(), + '","blsapkRegistry":"', + data.blsapkRegistry.toHexString(), + '","indexRegistry":"', + data.indexRegistry.toHexString(), '","stakeRegistry":"', data.stakeRegistry.toHexString(), - '","stakeRegistryImpl":"', - data.stakeRegistry.getImplementation().toHexString(), + '","operatorStateRetriever":"', + data.operatorStateRetriever.toHexString(), '","strategy":"', data.strategy.toHexString(), + '","pauserRegistry":"', + data.pauserRegistry.toHexString(), '","token":"', data.token.toHexString(), + '","instantSlasher":"', + data.slasher.toHexString(), '"}' ); } -} + + function readCoreDeploymentJson(string memory directoryPath, uint256 chainId) + internal + returns (CoreDeploymentLib.DeploymentData memory) + { + return readCoreDeploymentJson(directoryPath, string.concat(vm.toString(chainId), ".json")); + } + + function readCoreDeploymentJson(string memory path, string memory fileName) + internal + returns (CoreDeploymentLib.DeploymentData memory) + { + string memory pathToFile = string.concat(path, fileName); + + require(vm.exists(pathToFile), "Deployment file does not exist"); + + string memory json = vm.readFile(pathToFile); + + CoreDeploymentLib.DeploymentData memory data; + data.strategyFactory = json.readAddress(".addresses.strategyFactory"); + data.strategyManager = json.readAddress(".addresses.strategyManager"); + data.eigenPodManager = json.readAddress(".addresses.eigenPodManager"); + data.delegationManager = json.readAddress(".addresses.delegation"); + data.avsDirectory = json.readAddress(".addresses.avsDirectory"); + data.pauserRegistry = json.readAddress(".addresses.pauserRegistry"); + + return data; + } + + function verify_deployment(DeploymentData memory result) internal view { + IBLSApkRegistry blsapkregistry = + ISlashingRegistryCoordinator(result.slashingRegistryCoordinator).blsApkRegistry(); + require(address(blsapkregistry) != address(0)); + IStakeRegistry stakeregistry = ISlashingRegistryCoordinator(result.slashingRegistryCoordinator).stakeRegistry(); + require(address(stakeregistry) != address(0)); + IDelegationManager delegationmanager = IStakeRegistry(address(stakeregistry)).delegation(); + require(address(delegationmanager) != address(0)); + } +} \ No newline at end of file diff --git a/avs/contracts/src/IReclaimServiceManager.sol b/avs/contracts/src/IReclaimTaskManager.sol similarity index 89% rename from avs/contracts/src/IReclaimServiceManager.sol rename to avs/contracts/src/IReclaimTaskManager.sol index b053f187..d8e23755 100644 --- a/avs/contracts/src/IReclaimServiceManager.sol +++ b/avs/contracts/src/IReclaimTaskManager.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.9; -interface IReclaimServiceManager { +interface IReclaimTaskManager { // EVENTS event NewTaskCreated(uint32 indexed taskIndex, Task task); @@ -38,7 +38,7 @@ interface IReclaimServiceManager { uint256 fee; } - struct Operator { + struct ReclaimOperator { /** * ETH address */ @@ -64,7 +64,7 @@ interface IReclaimServiceManager { /** * Operators selected for the task. */ - Operator[] operators; + ReclaimOperator[] operators; /** * Total fee paid for the task. */ @@ -113,14 +113,6 @@ interface IReclaimServiceManager { // 0 values, empty strings are ignored -- essentially // all falsey values are ignored. function updateTaskCreationMetadata(TaskCreationMetadata memory metadata) external; - - function whitelistAddressAsOperator(address operator, bool isWhitelisted) external; - - // NOTE: this function is called by the operator - // updating their metadata. - // pass empty data to remove operator - function updateOperatorMetadata(OperatorMetadata memory metadata) external; - /** * Create a new task. * @param request ClaimRequest @@ -129,7 +121,6 @@ interface IReclaimServiceManager { * the request.owner */ function createNewTask(ClaimRequest memory request, bytes memory requestSignature) external; - // NOTE: this function is called by the user // once they have aggregated all the responses // to the task. diff --git a/avs/contracts/src/ReclaimServiceManager.sol b/avs/contracts/src/ReclaimServiceManager.sol index 6c0ca5ed..31906d68 100644 --- a/avs/contracts/src/ReclaimServiceManager.sol +++ b/avs/contracts/src/ReclaimServiceManager.sol @@ -1,346 +1,53 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.9; -import "@eigenlayer/contracts/libraries/BytesLib.sol"; -import "@eigenlayer/contracts/core/DelegationManager.sol"; -import {ECDSAServiceManagerBase} from "@eigenlayer-middleware/src/unaudited/ECDSAServiceManagerBase.sol"; -import {ECDSAStakeRegistry} from "@eigenlayer-middleware/src/unaudited/ECDSAStakeRegistry.sol"; -import "@openzeppelin-upgrades/contracts/utils/cryptography/ECDSAUpgradeable.sol"; -import "@eigenlayer/contracts/permissions/Pausable.sol"; -import {IRegistryCoordinator} from "@eigenlayer-middleware/src/interfaces/IRegistryCoordinator.sol"; -import {IStrategy} from "@eigenlayer/contracts/interfaces/IStrategy.sol"; +import "./IReclaimTaskManager.sol"; +import "@eigenlayer-middleware/src/ServiceManagerBase.sol"; +import {IAllocationManager, IAllocationManagerTypes} from "@eigenlayer/contracts/interfaces/IAllocationManager.sol"; import {IRewardsCoordinator} from "@eigenlayer/contracts/interfaces/IRewardsCoordinator.sol"; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import "./IReclaimServiceManager.sol"; -import "./utils/Random.sol"; -import "./utils/Claims.sol"; +import {ISlashingRegistryCoordinator} from "@eigenlayer-middleware/src/interfaces/ISlashingRegistryCoordinator.sol"; + /** * @title Primary entrypoint for procuring services from Reclaim. + * @author Layr Labs, Inc. */ - -contract ReclaimServiceManager is ECDSAServiceManagerBase, IReclaimServiceManager, Pausable { - using BytesLib for bytes; - using ECDSAUpgradeable for bytes32; - - address public defaultStrategy; - - /* STORAGE */ - // The latest task index - uint32 public latestTaskNum; - /** - * Default task creation metadata. - */ - TaskCreationMetadata public taskCreationMetadata; - - // mapping of task indices to all tasks hashes - // when a task is created, task hash is stored here, - // and responses need to pass the actual task, - // which is hashed onchain and checked against this mapping - // Note: I'm guessing task hashes are stored to reduce gas costs - mapping(uint32 => bytes32) public allTaskHashes; - - /** - * Operators whitelisted to respond to tasks. - */ - address[] public whitelistedOperators; - - OperatorMetadata[] public registeredOperators; - - /* MODIFIERS */ - modifier onlyOperator() { - require(ECDSAStakeRegistry(stakeRegistry).operatorRegistered(msg.sender) == true, "Operator must be the caller"); - _; - } - - constructor(address _avsDirectory, address _stakeRegistry, address _rewardsCoordinator, address _delegationManager) - ECDSAServiceManagerBase(_avsDirectory, _stakeRegistry, _rewardsCoordinator, _delegationManager) - {} - - function initialize(address initialOwner, address strategy) external initializer { - __ServiceManagerBase_init(initialOwner, address(this)); - taskCreationMetadata = TaskCreationMetadata( - // 30m - 30 * 60, - // 1m - 1, - // 5m - 5 * 60, - // spend a little bit - 2 - ); - defaultStrategy = strategy; - } - - /* FUNCTIONS */ - - function updateAVSMetadataURI(string memory _metadataURI) external virtual override onlyOwner { - _updateAVSMetadataURI(_metadataURI); - } - - function updateTaskCreationMetadata(TaskCreationMetadata memory newMetadata) external onlyOwner { - if (newMetadata.maxTaskLifetimeS != 0) { - taskCreationMetadata.maxTaskLifetimeS = newMetadata.maxTaskLifetimeS; - } - - if (newMetadata.minSignaturesPerTask != 0) { - taskCreationMetadata.minSignaturesPerTask = newMetadata.minSignaturesPerTask; - } - - if (newMetadata.maxTaskCreationDelayS != 0) { - taskCreationMetadata.maxTaskCreationDelayS = newMetadata.maxTaskCreationDelayS; - } - - if (newMetadata.minFee != 0) { - taskCreationMetadata.minFee = newMetadata.minFee; - } - } - - function whitelistAddressAsOperator(address operator, bool isWhitelisted) external onlyOwner { - if (isWhitelisted) { - whitelistedOperators.push(operator); - return; - } - - for (uint256 i = 0; i < whitelistedOperators.length; i++) { - if (whitelistedOperators[i] == operator) { - delete whitelistedOperators[i]; - return; - } - } - - revert("Operator not found"); - } - - function registerOperatorToAVS( - address operator, - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature - ) external virtual override onlyStakeRegistry { - require(isOperatorWhitelisted(operator), "Operator not whitelisted"); - _registerOperatorToAVS(operator, operatorSignature); - } - - function updateOperatorMetadata(OperatorMetadata memory metadata) external onlyOperator { - require(metadata.addr == msg.sender, "Metadata address must match the caller"); - - bool isEmpty = bytes(metadata.url).length == 0; - if (isEmpty) { - for (uint256 i = 0; i < registeredOperators.length; i++) { - if (registeredOperators[i].addr == metadata.addr) { - delete registeredOperators[i]; - return; - } - } - - revert("Operator not found"); - } - - // update operator metadata - for (uint256 i = 0; i < registeredOperators.length; i++) { - if (registeredOperators[i].addr == metadata.addr) { - registeredOperators[i] = metadata; - return; - } - } - - registeredOperators.push(metadata); - } - - function getMetadataForOperator(address operator) external view returns (OperatorMetadata memory) { - for (uint256 i = 0; i < registeredOperators.length; i++) { - if (registeredOperators[i].addr == operator) { - return registeredOperators[i]; - } - } - - revert("Operator not found"); - } - - // NOTE: this function creates new task, assigns it a taskId - function createNewTask(ClaimRequest memory request, bytes memory requestSignature) external { - require(taskCreationMetadata.minFee <= request.fee, "Fee too low"); - - if (request.owner != msg.sender) { - bytes memory encodedReq = abi.encode(request); - address signer = Claims.verifySignature(encodedReq, requestSignature); - require(signer == request.owner, "Signer of requestSignature is not request.owner"); - } - - uint32 diff = _absDiff(request.requestedAt, uint32(block.timestamp)); - require(diff <= taskCreationMetadata.maxTaskCreationDelayS, "Request timestamp too far away"); - - IERC20 token = getToken(); - require(token.transferFrom(msg.sender, address(this), request.fee), "Failed to transfer fee"); - - // create a new task struct - Task memory newTask; - newTask.request = request; - newTask.createdAt = uint32(block.timestamp); - newTask.expiresAt = uint32(newTask.createdAt + taskCreationMetadata.maxTaskLifetimeS); - newTask.minimumSignatures = taskCreationMetadata.minSignaturesPerTask; - newTask.feePaid = request.fee; - - // hash before picking operators -- we'll use this - // as the seed for randomness - bytes32 preOpHash = keccak256(abi.encode(newTask)); - newTask.operators = _pickRandomOperators(taskCreationMetadata.minSignaturesPerTask, uint256(preOpHash)); - // store hash of task onchain, emit event, and increase taskNum - allTaskHashes[latestTaskNum] = keccak256(abi.encode(newTask)); - emit NewTaskCreated(latestTaskNum, newTask); - latestTaskNum = latestTaskNum + 1; - } - - function taskCompleted(CompletedTask memory completedTask, uint32 referenceTaskIndex) external { - // check that the task is valid, hasn't been responsed yet, - // and is being responded in time - require( - keccak256(abi.encode(completedTask.task)) == allTaskHashes[referenceTaskIndex], - "supplied task does not match the one recorded in the contract" - ); - - require(completedTask.task.expiresAt > uint32(block.timestamp), "Task has expired"); - - Claims.SignedClaim memory signedClaim = Claims.SignedClaim( - Claims.CompleteClaimData( - completedTask.task.request.claimHash, completedTask.task.request.owner, completedTask.task.createdAt, 1 - ), - completedTask.signatures - ); - - address[] memory operatorAddrs = new address[](completedTask.task.operators.length); - for (uint256 i = 0; i < operatorAddrs.length; i++) { - operatorAddrs[i] = completedTask.task.operators[i].addr; - } - - Claims.assertValidSignedClaim(signedClaim, operatorAddrs); - - // remove so it cannot be claimed again - delete allTaskHashes[referenceTaskIndex]; - - // distribute reward - _distributeReward(operatorAddrs, completedTask.task.feePaid); - - emit TaskCompleted(referenceTaskIndex, completedTask); - } - - // HELPER - - function _distributeReward(address[] memory operatorAddrs, uint256 reward) internal { - _sortAddresses(operatorAddrs); - // distribute reward - IRewardsCoordinator coordinator = IRewardsCoordinator(rewardsCoordinator); - IERC20 token = getToken(); - - IRewardsCoordinator.StrategyAndMultiplier[] memory strats = new IRewardsCoordinator.StrategyAndMultiplier[](1); - strats[0].strategy = IStrategy(defaultStrategy); - strats[0].multiplier = 1; - - IRewardsCoordinator.OperatorReward[] memory ops = new IRewardsCoordinator.OperatorReward[](operatorAddrs.length); - uint256 perOpReward = reward / operatorAddrs.length; - for (uint256 i = 0; i < operatorAddrs.length; i++) { - ops[i].operator = operatorAddrs[i]; - ops[i].amount = perOpReward; - } - - IRewardsCoordinator.OperatorDirectedRewardsSubmission[] memory subs = - new IRewardsCoordinator.OperatorDirectedRewardsSubmission[](1); - subs[0].strategiesAndMultipliers = strats; - subs[0].token = getToken(); - subs[0].operatorRewards = ops; - - // taken from hello-world example - uint32 calcIntervalS = coordinator.CALCULATION_INTERVAL_SECONDS(); - uint32 endStamp = coordinator.currRewardsCalculationEndTimestamp(); - if (endStamp == 0) { - subs[0].startTimestamp = uint32(block.timestamp) - (uint32(block.timestamp) % calcIntervalS); - } else { - subs[0].startTimestamp = endStamp - coordinator.MAX_REWARDS_DURATION() + calcIntervalS; - } - - // taken from hello-world example - subs[0].duration = 0; - subs[0].description = "Claim creation on AVS"; - - // call directly on rewardscoordinator, as this contract has already - // received the fees - token.approve(rewardsCoordinator, reward); - coordinator.createOperatorDirectedAVSRewardsSubmission(address(this), subs); - } - - function encodeClaimRequest(ClaimRequest memory request) public pure returns (bytes memory) { - return abi.encode(request); - } - - function getToken() public view returns (IERC20) { - return IStrategy(defaultStrategy).underlyingToken(); - } - - // for a whitelist to count -- operator must be whitelisted - function isOperatorWhitelisted(address operator) public view returns (bool) { - for (uint256 i = 0; i < whitelistedOperators.length; i++) { - if (whitelistedOperators[i] == operator) { - return true; - } - } - - return false; - } - - function operatorHasMinimumWeight(address operator) public view returns (bool) { - uint256 opWeight = ECDSAStakeRegistry(stakeRegistry).getOperatorWeight(operator); - uint256 minWeight = ECDSAStakeRegistry(stakeRegistry).minimumWeight(); - return opWeight >= minWeight; - } - - /** - * @dev Pick a random set of operators from the available list - * @param count number of operators to pick - * @param seed Seed to use for randomness - * @return Array of the selected operators - */ - function _pickRandomOperators(uint8 count, uint256 seed) internal view returns (Operator[] memory) { - require(count <= registeredOperators.length, "Internal: Not enough operators"); - OperatorMetadata[] memory temp = registeredOperators; - uint256 left = temp.length; - - Operator[] memory output = new Operator[](count); - for (uint8 i = 0; i < output.length;) { - require(left > 0, "Internal: Fees too low. No operators left to pick from."); - uint256 idx = Random.random(seed + i) % left; - OperatorMetadata memory item = temp[idx]; - // we've utilised operator at index "idx" - // we of course don't want to pick the same operator twice - // so we remove it from the list of operators - // and reduce the number of operators left to pick from - // since solidity doesn't support "pop()" in memory arrays - // we swap the last element with the element we want to remove - temp[idx] = temp[left - 1]; - left -= 1; - - if (!operatorHasMinimumWeight(item.addr)) { - continue; - } - - output[i].addr = item.addr; - output[i].url = item.url; - i++; - } - - return output; - } - - function _sortAddresses(address[] memory addresses) internal pure { - for (uint256 i = 0; i < addresses.length; i++) { - for (uint256 j = i + 1; j < addresses.length; j++) { - if (addresses[i] > addresses[j]) { - address temp = addresses[i]; - addresses[i] = addresses[j]; - addresses[j] = temp; - } - } - } - } - - function _absDiff(uint32 a, uint32 b) internal pure returns (uint32) { - return a > b ? a - b : b - a; - } +contract ReclaimServiceManager is ServiceManagerBase { + IReclaimTaskManager public immutable taskManager; + + /// @notice when applied to a function, ensures that the function is only callable by the `registryCoordinator`. + modifier onlyTaskManager() { + require( + msg.sender == address(taskManager), + "onlyTaskManager: not from credible squaring task manager" + ); + _; + } + + constructor( + IAVSDirectory _avsDirectory, + ISlashingRegistryCoordinator _slashingRegistryCoordinator, + IStakeRegistry _stakeRegistry, + address rewards_coordinator, + IAllocationManager allocationManager, + IPermissionController _permissionController, + IReclaimTaskManager _taskManager + ) + ServiceManagerBase( + _avsDirectory, + IRewardsCoordinator(rewards_coordinator), + _slashingRegistryCoordinator, + _stakeRegistry, + _permissionController, + allocationManager + ) + { + taskManager = _taskManager; + } + + function initialize( + address initialOwner, + address rewardsInitiator + ) external initializer { + __ServiceManagerBase_init(initialOwner, rewardsInitiator); + } } diff --git a/avs/contracts/src/ReclaimTaskManager.sol b/avs/contracts/src/ReclaimTaskManager.sol new file mode 100644 index 00000000..3ae18c8f --- /dev/null +++ b/avs/contracts/src/ReclaimTaskManager.sol @@ -0,0 +1,372 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.9; + +import "@eigenlayer/contracts/core/DelegationManager.sol"; +import {ECDSAServiceManagerBase} from "@eigenlayer-middleware/src/unaudited/ECDSAServiceManagerBase.sol"; +import {IStakeRegistry} from "@eigenlayer-middleware/src/interfaces/IStakeRegistry.sol"; +import "@openzeppelin-upgrades/contracts/utils/cryptography/ECDSAUpgradeable.sol"; +import {OperatorStateRetriever} from "@eigenlayer-middleware/src/OperatorStateRetriever.sol"; +import "@eigenlayer/contracts/permissions/Pausable.sol"; +import {IRegistryCoordinator} from "@eigenlayer-middleware/src/interfaces/IRegistryCoordinator.sol"; +import {IStrategy} from "@eigenlayer/contracts/interfaces/IStrategy.sol"; +import {IRewardsCoordinator} from "@eigenlayer/contracts/interfaces/IRewardsCoordinator.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "./IReclaimTaskManager.sol"; +import "./utils/Random.sol"; +import "./utils/Claims.sol"; + +/** + * @title Primary entrypoint for procuring services from Reclaim. + */ + +contract ReclaimTaskManager is + Initializable, + Pausable, + OwnableUpgradeable, + OperatorStateRetriever, + IReclaimTaskManager +{ + using ECDSAUpgradeable for bytes32; + + address public defaultStrategy; + IRewardsCoordinator public rewardsCoordinator; + IStakeRegistry public stakeRegistry; + + /* STORAGE */ + // The latest task index + uint32 public latestTaskNum; + /** + * Default task creation metadata. + */ + TaskCreationMetadata public taskCreationMetadata; + + // mapping of task indices to all tasks hashes + // when a task is created, task hash is stored here, + // and responses need to pass the actual task, + // which is hashed onchain and checked against this mapping + // Note: I'm guessing task hashes are stored to reduce gas costs + mapping(uint32 => bytes32) public allTaskHashes; + + constructor( + IStakeRegistry _stakeRegistry, + IRewardsCoordinator _rewardsCoordinator, + IPauserRegistry _pauserRegistry + ) Pausable(_pauserRegistry) { + rewardsCoordinator = _rewardsCoordinator; + stakeRegistry = _stakeRegistry; + } + + function setRewardsCoordinator(IRewardsCoordinator _rewardsCoordinator) external onlyOwner { + rewardsCoordinator = _rewardsCoordinator; + } + + function setStakeRegistry(IStakeRegistry _stakeRegistry) external onlyOwner { + stakeRegistry = _stakeRegistry; + } + + function initialize( + address initialOwner, + address strategy + ) external initializer { + taskCreationMetadata = TaskCreationMetadata( + // 30m + 30 * 60, + // 1m + 1, + // 5m + 5 * 60, + // spend a little bit + 2 + ); + defaultStrategy = strategy; + } + + /* FUNCTIONS */ + + function updateTaskCreationMetadata( + TaskCreationMetadata memory newMetadata + ) external onlyOwner { + if (newMetadata.maxTaskLifetimeS != 0) { + taskCreationMetadata.maxTaskLifetimeS = newMetadata + .maxTaskLifetimeS; + } + + if (newMetadata.minSignaturesPerTask != 0) { + taskCreationMetadata.minSignaturesPerTask = newMetadata + .minSignaturesPerTask; + } + + if (newMetadata.maxTaskCreationDelayS != 0) { + taskCreationMetadata.maxTaskCreationDelayS = newMetadata + .maxTaskCreationDelayS; + } + + if (newMetadata.minFee != 0) { + taskCreationMetadata.minFee = newMetadata.minFee; + } + } + + // NOTE: this function creates new task, assigns it a taskId + function createNewTask( + ClaimRequest memory request, + bytes memory requestSignature + ) external { + require(taskCreationMetadata.minFee <= request.fee, "Fee too low"); + + if (request.owner != msg.sender) { + bytes memory encodedReq = abi.encode(request); + address signer = Claims.verifySignature( + encodedReq, + requestSignature + ); + require( + signer == request.owner, + "Signer of requestSignature is not request.owner" + ); + } + + uint32 diff = _absDiff(request.requestedAt, uint32(block.timestamp)); + require( + diff <= taskCreationMetadata.maxTaskCreationDelayS, + "Request timestamp too far away" + ); + + IERC20 token = getToken(); + require( + token.transferFrom(msg.sender, address(this), request.fee), + "Failed to transfer fee" + ); + + // create a new task struct + Task memory newTask; + newTask.request = request; + newTask.createdAt = uint32(block.timestamp); + newTask.expiresAt = uint32( + newTask.createdAt + taskCreationMetadata.maxTaskLifetimeS + ); + newTask.minimumSignatures = taskCreationMetadata.minSignaturesPerTask; + newTask.feePaid = request.fee; + + // hash before picking operators -- we'll use this + // as the seed for randomness + bytes32 preOpHash = keccak256(abi.encode(newTask)); + newTask.operators = _pickRandomOperators( + taskCreationMetadata.minSignaturesPerTask, + uint256(preOpHash) + ); + // store hash of task onchain, emit event, and increase taskNum + allTaskHashes[latestTaskNum] = keccak256(abi.encode(newTask)); + emit NewTaskCreated(latestTaskNum, newTask); + latestTaskNum = latestTaskNum + 1; + } + + function taskCompleted( + CompletedTask memory completedTask, + uint32 referenceTaskIndex + ) external { + // check that the task is valid, hasn't been responsed yet, + // and is being responded in time + require( + keccak256(abi.encode(completedTask.task)) == + allTaskHashes[referenceTaskIndex], + "supplied task does not match the one recorded in the contract" + ); + + require( + completedTask.task.expiresAt > uint32(block.timestamp), + "Task has expired" + ); + + Claims.SignedClaim memory signedClaim = Claims.SignedClaim( + Claims.CompleteClaimData( + completedTask.task.request.claimHash, + completedTask.task.request.owner, + completedTask.task.createdAt, + 1 + ), + completedTask.signatures + ); + + address[] memory operatorAddrs = new address[]( + completedTask.task.operators.length + ); + for (uint256 i = 0; i < operatorAddrs.length; i++) { + operatorAddrs[i] = completedTask.task.operators[i].addr; + } + + Claims.assertValidSignedClaim(signedClaim, operatorAddrs); + + // remove so it cannot be claimed again + delete allTaskHashes[referenceTaskIndex]; + + // distribute reward + _distributeReward(operatorAddrs, completedTask.task.feePaid); + + emit TaskCompleted(referenceTaskIndex, completedTask); + } + + // HELPER + + function _distributeReward( + address[] memory operatorAddrs, + uint256 reward + ) internal { + _sortAddresses(operatorAddrs); + // distribute reward + IRewardsCoordinator coordinator = IRewardsCoordinator( + rewardsCoordinator + ); + IERC20 token = getToken(); + + IRewardsCoordinator.StrategyAndMultiplier[] + memory strats = new IRewardsCoordinator.StrategyAndMultiplier[](1); + strats[0].strategy = IStrategy(defaultStrategy); + strats[0].multiplier = 1; + + IRewardsCoordinator.OperatorReward[] + memory ops = new IRewardsCoordinator.OperatorReward[]( + operatorAddrs.length + ); + uint256 perOpReward = reward / operatorAddrs.length; + for (uint256 i = 0; i < operatorAddrs.length; i++) { + ops[i].operator = operatorAddrs[i]; + ops[i].amount = perOpReward; + } + + IRewardsCoordinator.OperatorDirectedRewardsSubmission[] + memory subs = new IRewardsCoordinator.OperatorDirectedRewardsSubmission[]( + 1 + ); + subs[0].strategiesAndMultipliers = strats; + subs[0].token = getToken(); + subs[0].operatorRewards = ops; + + // taken from hello-world example + uint32 calcIntervalS = coordinator.CALCULATION_INTERVAL_SECONDS(); + uint32 endStamp = coordinator.currRewardsCalculationEndTimestamp(); + if (endStamp == 0) { + subs[0].startTimestamp = + uint32(block.timestamp) - + (uint32(block.timestamp) % calcIntervalS); + } else { + subs[0].startTimestamp = + endStamp - + coordinator.MAX_REWARDS_DURATION() + + calcIntervalS; + } + + // taken from hello-world example + subs[0].duration = 0; + subs[0].description = "Claim creation on AVS"; + + // call directly on rewardscoordinator, as this contract has already + // received the fees + token.approve(address(rewardsCoordinator), reward); + coordinator.createOperatorDirectedAVSRewardsSubmission( + address(this), + subs + ); + } + + function encodeClaimRequest( + ClaimRequest memory request + ) public pure returns (bytes memory) { + return abi.encode(request); + } + + function getToken() public view returns (IERC20) { + return IStrategy(defaultStrategy).underlyingToken(); + } + + function operatorHasMinimumWeight( + address operator + ) public view returns (bool) { + // uint256 opWeight = ECDSAStakeRegistry(stakeRegistry).getOperatorWeight( + // operator + // ); + // uint256 minWeight = ECDSAStakeRegistry(stakeRegistry).minimumWeight(); + // return opWeight >= minWeight; + return true; + } + + /** + * @dev Pick a random set of operators from the available list + * @param count number of operators to pick + * @param seed Seed to use for randomness + * @return Array of the selected operators + */ + function _pickRandomOperators( + uint8 count, + uint256 seed + ) internal view returns (ReclaimOperator[] memory) { + OperatorMetadata[] memory registeredOperators = _getRegisteredOperators(); + require( + count <= registeredOperators.length, + "Internal: Not enough operators" + ); + OperatorMetadata[] memory temp = registeredOperators; + uint256 left = temp.length; + + ReclaimOperator[] memory output = new ReclaimOperator[](count); + for (uint8 i = 0; i < output.length; ) { + require( + left > 0, + "Internal: Fees too low. No operators left to pick from." + ); + uint256 idx = Random.random(seed + i) % left; + OperatorMetadata memory item = temp[idx]; + // we've utilised operator at index "idx" + // we of course don't want to pick the same operator twice + // so we remove it from the list of operators + // and reduce the number of operators left to pick from + // since solidity doesn't support "pop()" in memory arrays + // we swap the last element with the element we want to remove + temp[idx] = temp[left - 1]; + left -= 1; + + if (!operatorHasMinimumWeight(item.addr)) { + continue; + } + + output[i].addr = item.addr; + output[i].url = item.url; + i++; + } + + return output; + } + + function _getRegisteredOperators() internal view returns (OperatorMetadata[] memory) { + OperatorMetadata[] memory operators = new OperatorMetadata[](0); + revert("Not implemented"); + return operators; + } + + function getTaskCreationMetadata() + external + view + returns (TaskCreationMetadata memory) + { + return taskCreationMetadata; + } + + function getLatestTaskNum() external view returns (uint32) { + return latestTaskNum; + } + + function _sortAddresses(address[] memory addresses) internal pure { + for (uint256 i = 0; i < addresses.length; i++) { + for (uint256 j = i + 1; j < addresses.length; j++) { + if (addresses[i] > addresses[j]) { + address temp = addresses[i]; + addresses[i] = addresses[j]; + addresses[j] = temp; + } + } + } + } + + function _absDiff(uint32 a, uint32 b) internal pure returns (uint32) { + return a > b ? a - b : b - a; + } +} diff --git a/avs/contracts/src/test/ContractsRegistry.sol b/avs/contracts/src/test/ContractsRegistry.sol new file mode 100644 index 00000000..5ab177c1 --- /dev/null +++ b/avs/contracts/src/test/ContractsRegistry.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.12; + +// ContractsRegistry store the address of all the contracts deployed for eigenlayer and avss +// It is used for testing purpose only, so that we can retrieve the addresses without having to store them in a json file +// This way integration testing against an anvil chain (started with a saved db) is self-contained +// ASSUMPTION: right now we deploy this contract as the first deployment (nonce=0) using the first anvil address +// 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 to make sure it's always at the address 0x5FbDB2315678afecb367f032d93F642f64180aa3 +// forge create src/ContractsRegistry.sol:ContractsRegistry --rpc-url $RPC_URL --private-key $PRIVATE_KEY +contract ContractsRegistry { + mapping(string => address) public contracts; + mapping(uint256 => string) public contractNames; + uint256 public contractCount; + + mapping(bytes32 => BlockAndTimestamp) public anvil_test; + + struct BlockAndTimestamp { + uint256 timestamp; + uint256 block_number; + int256 index; + } + + function registerContract(string memory name, address _contract) public { + // we treat redeploys as a bug since this is only meant to be used for testing. + // If new contracts need to be deployed just start from a fresh anvil state. + require(contracts[name] == address(0), "contract already registered"); + contracts[name] = _contract; + contractNames[contractCount] = name; + contractCount++; + } + + function store_test(string memory test_name, int256 index, uint256 timestamp, uint256 block_number) public { + require(anvil_test[keccak256(abi.encodePacked(test_name, index))].timestamp == 0); + anvil_test[keccak256(abi.encodePacked(test_name))] = + BlockAndTimestamp({timestamp: timestamp, block_number: block_number, index: index}); + } + + function get_test_values(string memory test_name, int256 index) public view returns (uint256, uint256, int256) { + BlockAndTimestamp memory test_details = anvil_test[keccak256(abi.encodePacked(test_name, index))]; + return (test_details.timestamp, test_details.block_number, test_details.index); + } +} \ No newline at end of file From 183fe15e742cd4dd394b9eea96b2367adf115188 Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Tue, 13 May 2025 19:50:27 +0530 Subject: [PATCH 18/26] feat: operator set deployment --- .../script/deployments/core/31337.json | 2 +- .../script/deployments/reclaim/31337.json | 2 +- .../script/utils/ReclaimDeploymentLib.sol | 98 +- avs/contracts/src/ReclaimServiceManager.sol | 65 +- .../ReclaimSlashingRegistryCoordinator.sol | 50 + avs/utils/contract-data-gen.sh | 5 +- src/avs/config.ts | 4 +- src/avs/contracts/AVSDirectory.ts | 209 +- src/avs/contracts/DelegationManager.ts | 1549 ++++++------ src/avs/contracts/ECDSAStakeRegistry.ts | 349 +-- src/avs/contracts/ReclaimServiceManager.ts | 1056 ++------ .../ReclaimSlashingRegistryCoordinator.ts | 2216 +++++++++++++++++ src/avs/contracts/ReclaimTaskManager.ts | 1326 ++++++++++ src/avs/contracts/RewardsCoordinator.ts | 780 ++++-- src/avs/contracts/SocketRegistry.ts | 204 ++ .../factories/AVSDirectory__factory.ts | 185 +- .../factories/DelegationManager__factory.ts | 1256 ++++++---- .../factories/ECDSAStakeRegistry__factory.ts | 91 +- .../contracts/factories/ERC20Mock__factory.ts | 2 +- .../ReclaimServiceManager__factory.ts | 948 ++----- ...aimSlashingRegistryCoordinator__factory.ts | 1795 +++++++++++++ .../factories/ReclaimTaskManager__factory.ts | 1207 +++++++++ .../factories/RewardsCoordinator__factory.ts | 908 +++++-- .../factories/SocketRegistry__factory.ts | 155 ++ src/avs/contracts/factories/index.ts | 3 + src/avs/contracts/index.ts | 6 + src/avs/tests/test.operator.ts | 2 +- src/avs/types/index.ts | 3 +- src/avs/utils/contracts.ts | 9 +- src/avs/utils/register.ts | 38 +- 30 files changed, 10753 insertions(+), 3770 deletions(-) create mode 100644 avs/contracts/src/ReclaimSlashingRegistryCoordinator.sol create mode 100644 src/avs/contracts/ReclaimSlashingRegistryCoordinator.ts create mode 100644 src/avs/contracts/ReclaimTaskManager.ts create mode 100644 src/avs/contracts/SocketRegistry.ts create mode 100644 src/avs/contracts/factories/ReclaimSlashingRegistryCoordinator__factory.ts create mode 100644 src/avs/contracts/factories/ReclaimTaskManager__factory.ts create mode 100644 src/avs/contracts/factories/SocketRegistry__factory.ts diff --git a/avs/contracts/script/deployments/core/31337.json b/avs/contracts/script/deployments/core/31337.json index 682b13ef..9a4429c7 100644 --- a/avs/contracts/script/deployments/core/31337.json +++ b/avs/contracts/script/deployments/core/31337.json @@ -1 +1 @@ -{"lastUpdate":{"timestamp":"1747107081","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x4ed7c70f96b99c776995fb64377f0d4ab3b0e1c1","avsDirectory":"0x610178da211fef7d417bc0e6fed39f05609ad788","avsDirectoryImpl":"0xa85233c63b9ee964add6f2cffe00fd84eb32338f","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x4a679253410272dd5232b3ff7cf5dbb88f295319","eigenPodManager":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManagerImpl":"0xc5a5c42992decbae36851359345fe25997f5c42d","strategyFactory":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","rewardsCoordinator":"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0","pauserRegistry":"0x0b306bf915c4d645ff596e518faf3f9669b97016","strategyBeacon":"0x84ea74d481ee0a5332c457a4d796187f6ba67feb","allocationManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","permissionController":"0x59b670e9fa9d0a427751af201d676719a970857b"}} \ No newline at end of file +{"lastUpdate":{"timestamp":"1747145944","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x4ed7c70f96b99c776995fb64377f0d4ab3b0e1c1","avsDirectory":"0x610178da211fef7d417bc0e6fed39f05609ad788","avsDirectoryImpl":"0xa85233c63b9ee964add6f2cffe00fd84eb32338f","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x4a679253410272dd5232b3ff7cf5dbb88f295319","eigenPodManager":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManagerImpl":"0xc5a5c42992decbae36851359345fe25997f5c42d","strategyFactory":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","rewardsCoordinator":"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0","pauserRegistry":"0x0b306bf915c4d645ff596e518faf3f9669b97016","strategyBeacon":"0x84ea74d481ee0a5332c457a4d796187f6ba67feb","allocationManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","permissionController":"0x59b670e9fa9d0a427751af201d676719a970857b"}} \ No newline at end of file diff --git a/avs/contracts/script/deployments/reclaim/31337.json b/avs/contracts/script/deployments/reclaim/31337.json index 6f7d93bb..5ec4e77e 100644 --- a/avs/contracts/script/deployments/reclaim/31337.json +++ b/avs/contracts/script/deployments/reclaim/31337.json @@ -1 +1 @@ -{"lastUpdate":{"timestamp":"1747107084","block_number":"19"},"addresses":{"proxyAdmin":"0x809d550fca64d94bd9f66e60752a544199cfac3d","ReclaimServiceManager":"0x1291be112d480055dafd8a610b7d1e203891c274","serviceManagerImpl":"0x8198f5d8f8cffe8f9c413d98a0a55aeb8ab9fbb7","ReclaimTaskManager":"0x82e01223d51eb87e16a03e24687edf0f294da6f1","registryCoordinator":"0x7969c5ed335650692bc04293b07f5bf2e7a673c0","blsapkRegistry":"0xc351628eb244ec633d5f21fbd6621e1a683b1181","indexRegistry":"0xcbeaf3bde82155f56486fb5a1072cb8baaf547cc","stakeRegistry":"0xb7278a61aa25c888815afc32ad3cc52ff24fe575","operatorStateRetriever":"0x5081a39b8a5f0e35a8d959395a630b68b74dd30f","strategy":"0x2b961e3959b79326a8e7f64ef0d2d825707669b5","pauserRegistry":"0x0000000000000000000000000000000000000000","token":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","instantSlasher":"0x922d6956c99e12dfeb3224dea977d0939758a1fe"}} \ No newline at end of file +{"lastUpdate":{"timestamp":"1747145951","block_number":"26"},"addresses":{"proxyAdmin":"0x809d550fca64d94bd9f66e60752a544199cfac3d","serviceManager":"0x1291be112d480055dafd8a610b7d1e203891c274","serviceManagerImpl":"0x8198f5d8f8cffe8f9c413d98a0a55aeb8ab9fbb7","taskManager":"0x82e01223d51eb87e16a03e24687edf0f294da6f1","registryCoordinator":"0x7969c5ed335650692bc04293b07f5bf2e7a673c0","blsapkRegistry":"0xc351628eb244ec633d5f21fbd6621e1a683b1181","indexRegistry":"0xcbeaf3bde82155f56486fb5a1072cb8baaf547cc","stakeRegistry":"0xb7278a61aa25c888815afc32ad3cc52ff24fe575","operatorStateRetriever":"0x5081a39b8a5f0e35a8d959395a630b68b74dd30f","strategy":"0x2b961e3959b79326a8e7f64ef0d2d825707669b5","pauserRegistry":"0x0000000000000000000000000000000000000000","token":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","instantSlasher":"0x922d6956c99e12dfeb3224dea977d0939758a1fe","socketRegistry":"0xb0d4afd8879ed9f52b28595d31b441d079b2ca07"}} \ No newline at end of file diff --git a/avs/contracts/script/utils/ReclaimDeploymentLib.sol b/avs/contracts/script/utils/ReclaimDeploymentLib.sol index 85843798..660c9363 100644 --- a/avs/contracts/script/utils/ReclaimDeploymentLib.sol +++ b/avs/contracts/script/utils/ReclaimDeploymentLib.sol @@ -14,7 +14,9 @@ import { ISlashingRegistryCoordinatorTypes } from "@eigenlayer-middleware/src/interfaces/ISlashingRegistryCoordinator.sol"; import {SlashingRegistryCoordinator} from "@eigenlayer-middleware/src/SlashingRegistryCoordinator.sol"; +import {ReclaimSlashingRegistryCoordinator} from "../../src/ReclaimSlashingRegistryCoordinator.sol"; import {IPermissionController} from "@eigenlayer/contracts/interfaces/IPermissionController.sol"; +import {IAVSRegistrar} from "@eigenlayer/contracts/interfaces/IAVSRegistrar.sol"; import { ReclaimServiceManager, IServiceManager @@ -131,7 +133,7 @@ library ReclaimDeploymentLib { ); address slashingRegistryCoordinatorImpl = address( - new SlashingRegistryCoordinator( + new ReclaimSlashingRegistryCoordinator( IStakeRegistry(result.stakeRegistry), IBLSApkRegistry(result.blsapkRegistry), IIndexRegistry(result.indexRegistry), @@ -151,41 +153,13 @@ library ReclaimDeploymentLib { deployedStrategyArray[0] = IStrategy(strategy); uint256 numStrategies = deployedStrategyArray.length; - uint256 numQuorums = setupConfig.numQuorums; - ISlashingRegistryCoordinatorTypes.OperatorSetParam[] memory quorumsOperatorSetParams = - new ISlashingRegistryCoordinatorTypes.OperatorSetParam[](numQuorums); - uint256[] memory operator_params = setupConfig.operatorParams; - - for (uint256 i = 0; i < numQuorums; i++) { - quorumsOperatorSetParams[i] = ISlashingRegistryCoordinatorTypes.OperatorSetParam({ - maxOperatorCount: uint32(operator_params[i]), - kickBIPsOfOperatorStake: uint16(operator_params[i + 1]), - kickBIPsOfTotalStake: uint16(operator_params[i + 2]) - }); - } - // // set to 0 for every quorum - IStakeRegistryTypes.StrategyParams[][] memory quorumsStrategyParams = - new IStakeRegistryTypes.StrategyParams[][](numQuorums); - for (uint256 i = 0; i < numQuorums; i++) { - quorumsStrategyParams[i] = new IStakeRegistryTypes.StrategyParams[](numStrategies); - for (uint256 j = 0; j < numStrategies; j++) { - quorumsStrategyParams[i][j] = IStakeRegistryTypes.StrategyParams({ - strategy: deployedStrategyArray[j], - // setting this to 1 ether since the divisor is also 1 ether - // therefore this allows an operator to register with even just 1 token - // see https://github.com/Layr-Labs/eigenlayer-middleware/blob/m2-mainnet/src/StakeRegistry.sol#L484 - // weight += uint96(sharesAmount * strategyAndMultiplier.multiplier / WEIGHTING_DIVISOR); - multiplier: 1 ether - }); - } - } - IStakeRegistryTypes.StakeType[] memory stake_type = new IStakeRegistryTypes.StakeType[](1); stake_type[0] = IStakeRegistryTypes.StakeType.TOTAL_SLASHABLE; uint32[] memory look_ahead_period = new uint32[](1); look_ahead_period[0] = 0; bytes memory upgradeCall = abi.encodeCall( - SlashingRegistryCoordinator.initialize, (admin, admin, admin, 0, result.serviceManager) + SlashingRegistryCoordinator.initialize, + (admin, admin, admin, 0, result.serviceManager) ); UpgradeableProxyLib.upgrade(result.stakeRegistry, stakeRegistryImpl); @@ -218,18 +192,9 @@ library ReclaimDeploymentLib { servicemanagerupgradecall ); - console2.log(result.serviceManager); bytes memory taskmanagerupgradecall = abi.encodeCall( ReclaimTaskManager.initialize, - ( - admin, - address(0) - // setupConfig.aggregator_addr, - // setupConfig.task_generator_addr, - // core.allocationManager, - // result.slasher, - // result.serviceManager - ) + (admin, address(0)) ); UpgradeableProxyLib.upgradeAndCall( result.taskManager, address(taskManagerImpl), (taskmanagerupgradecall) @@ -241,6 +206,44 @@ library ReclaimDeploymentLib { address(new SocketRegistry(ISlashingRegistryCoordinator(result.slashingRegistryCoordinator))); UpgradeableProxyLib.upgrade(result.socketRegistry, socketRegistryImpl); + // create operator set + uint256 numQuorums = setupConfig.numQuorums; + ISlashingRegistryCoordinatorTypes.OperatorSetParam[] memory quorumsOperatorSetParams = + new ISlashingRegistryCoordinatorTypes.OperatorSetParam[](numQuorums); + uint256[] memory operator_params = setupConfig.operatorParams; + + for (uint256 i = 0; i < numQuorums; i++) { + quorumsOperatorSetParams[i] = ISlashingRegistryCoordinatorTypes.OperatorSetParam({ + maxOperatorCount: uint32(operator_params[i]), + kickBIPsOfOperatorStake: uint16(operator_params[i + 1]), + kickBIPsOfTotalStake: uint16(operator_params[i + 2]) + }); + } + // set to 0 for every quorum + IStakeRegistryTypes.StrategyParams[][] memory quorumsStrategyParams = + new IStakeRegistryTypes.StrategyParams[][](numQuorums); + for (uint256 i = 0; i < numQuorums; i++) { + quorumsStrategyParams[i] = new IStakeRegistryTypes.StrategyParams[](numStrategies); + for (uint256 j = 0; j < numStrategies; j++) { + quorumsStrategyParams[i][j] = IStakeRegistryTypes.StrategyParams({ + strategy: deployedStrategyArray[j], + // setting this to 1 ether since the divisor is also 1 ether + // therefore this allows an operator to register with even just 1 token + // see https://github.com/Layr-Labs/eigenlayer-middleware/blob/m2-mainnet/src/StakeRegistry.sol#L484 + // weight += uint96(sharesAmount * strategyAndMultiplier.multiplier / WEIGHTING_DIVISOR); + multiplier: 1 ether + }); + } + } + + for(uint256 i = 0; i < numQuorums; i++) { + ISlashingRegistryCoordinator(result.slashingRegistryCoordinator).createTotalDelegatedStakeQuorum( + quorumsOperatorSetParams[i], + 100, + quorumsStrategyParams[i] + ); + } + verify_deployment(result); return result; @@ -274,7 +277,7 @@ library ReclaimDeploymentLib { } function readDeploymentJson(string memory directoryPath, uint256 chainId) - internal + internal view returns (DeploymentData memory) { string memory fileName = string.concat(directoryPath, vm.toString(chainId), ".json"); @@ -284,14 +287,15 @@ library ReclaimDeploymentLib { string memory json = vm.readFile(fileName); DeploymentData memory data; - data.serviceManager = json.readAddress(".addresses.ReclaimServiceManager"); - data.taskManager = json.readAddress(".addresses.ReclaimTaskManager"); + data.serviceManager = json.readAddress(".addresses.serviceManager"); + data.taskManager = json.readAddress(".addresses.taskManager"); data.slashingRegistryCoordinator = json.readAddress(".addresses.registryCoordinator"); data.operatorStateRetriever = json.readAddress(".addresses.operatorStateRetriever"); data.stakeRegistry = json.readAddress(".addresses.stakeRegistry"); data.strategy = json.readAddress(".addresses.strategy"); data.token = json.readAddress(".addresses.token"); data.slasher = json.readAddress(".addresses.instantSlasher"); + data.socketRegistry = json.readAddress(".addresses.socketRegistry"); return data; } @@ -339,11 +343,11 @@ library ReclaimDeploymentLib { return string.concat( '{"proxyAdmin":"', proxyAdmin.toHexString(), - '","ReclaimServiceManager":"', + '","serviceManager":"', data.serviceManager.toHexString(), '","serviceManagerImpl":"', data.serviceManager.getImplementation().toHexString(), - '","ReclaimTaskManager":"', + '","taskManager":"', data.taskManager.toHexString(), '","registryCoordinator":"', data.slashingRegistryCoordinator.toHexString(), @@ -363,6 +367,8 @@ library ReclaimDeploymentLib { data.token.toHexString(), '","instantSlasher":"', data.slasher.toHexString(), + '","socketRegistry":"', + data.socketRegistry.toHexString(), '"}' ); } diff --git a/avs/contracts/src/ReclaimServiceManager.sol b/avs/contracts/src/ReclaimServiceManager.sol index 31906d68..999c83bf 100644 --- a/avs/contracts/src/ReclaimServiceManager.sol +++ b/avs/contracts/src/ReclaimServiceManager.sol @@ -13,12 +13,16 @@ import {ISlashingRegistryCoordinator} from "@eigenlayer-middleware/src/interface */ contract ReclaimServiceManager is ServiceManagerBase { IReclaimTaskManager public immutable taskManager; + ISlashingRegistryCoordinator public immutable slashingRegistryCoordinator; - /// @notice when applied to a function, ensures that the function is only callable by the `registryCoordinator`. + address[] public whitelistedOperators; + + /// @notice when applied to a function, ensures that the function + // is only callable by the `registryCoordinator`. modifier onlyTaskManager() { require( msg.sender == address(taskManager), - "onlyTaskManager: not from credible squaring task manager" + "onlyTaskManager: not from reclaim task manager" ); _; } @@ -42,6 +46,7 @@ contract ReclaimServiceManager is ServiceManagerBase { ) { taskManager = _taskManager; + slashingRegistryCoordinator = _slashingRegistryCoordinator; } function initialize( @@ -49,5 +54,61 @@ contract ReclaimServiceManager is ServiceManagerBase { address rewardsInitiator ) external initializer { __ServiceManagerBase_init(initialOwner, rewardsInitiator); + whitelistedOperators = new address[](0); + _allocationManager.setAVSRegistrar( + address(this), slashingRegistryCoordinator + ); + _allocationManager.updateAVSMetadataURI( + address(this), + "TODO" + ); + + _permissionController.setAppointee( + address(this), + address(slashingRegistryCoordinator), + address(_allocationManager), + IAllocationManager.createOperatorSets.selector + ); + } + + function addOperatorToWhitelist( + address operator + ) external onlyOwner { + require( + !isOperatorWhitelisted(operator), + "addOperatorToWhitelist: operator already whitelisted" + ); + + whitelistedOperators.push(operator); + } + + function removeOperatorFromWhitelist( + address operator + ) external onlyOwner { + require( + isOperatorWhitelisted(operator), + "removeOperatorFromWhitelist: operator not whitelisted" + ); + + for (uint256 i = 0; i < whitelistedOperators.length; i++) { + if (whitelistedOperators[i] == operator) { + whitelistedOperators[i] = whitelistedOperators[ + whitelistedOperators.length - 1 + ]; + whitelistedOperators.pop(); + break; + } + } + } + + function isOperatorWhitelisted( + address operator + ) public view returns (bool) { + for (uint256 i = 0; i < whitelistedOperators.length; i++) { + if (whitelistedOperators[i] == operator) { + return true; + } + } + return false; } } diff --git a/avs/contracts/src/ReclaimSlashingRegistryCoordinator.sol b/avs/contracts/src/ReclaimSlashingRegistryCoordinator.sol new file mode 100644 index 00000000..0217696c --- /dev/null +++ b/avs/contracts/src/ReclaimSlashingRegistryCoordinator.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.9; + +import {SlashingRegistryCoordinator} from "@eigenlayer-middleware/src/SlashingRegistryCoordinator.sol"; +import { IStakeRegistry } from "@eigenlayer-middleware/src/interfaces/IStakeRegistry.sol"; +import { IBLSApkRegistry } from "@eigenlayer-middleware/src/interfaces/IBLSApkRegistry.sol"; +import { IIndexRegistry } from "@eigenlayer-middleware/src/interfaces/IIndexRegistry.sol"; +import { ISocketRegistry } from "@eigenlayer-middleware/src/interfaces/ISocketRegistry.sol"; +import { IAllocationManager } from "@eigenlayer/contracts/interfaces/IAllocationManager.sol"; +import { IPauserRegistry } from "@eigenlayer/contracts/interfaces/IPauserRegistry.sol"; +import { ReclaimServiceManager } from "./ReclaimServiceManager.sol"; + +contract ReclaimSlashingRegistryCoordinator is SlashingRegistryCoordinator { + + constructor( + IStakeRegistry _stakeRegistry, + IBLSApkRegistry _blsApkRegistry, + IIndexRegistry _indexRegistry, + ISocketRegistry _socketRegistry, + IAllocationManager _allocationManager, + IPauserRegistry _pauserRegistry, + string memory _version + ) + SlashingRegistryCoordinator( + _stakeRegistry, + _blsApkRegistry, + _indexRegistry, + _socketRegistry, + _allocationManager, + _pauserRegistry, + _version + ) {} + + /// @dev Hook to allow for any pre-register logic in `_registerOperator` + function _beforeRegisterOperator( + address operator, + bytes32 operatorId, + bytes memory quorumNumbers, + uint192 currentBitmap + ) internal virtual override { + super._beforeRegisterOperator( + operator, operatorId, quorumNumbers, currentBitmap + ); + + require( + ReclaimServiceManager(avs).isOperatorWhitelisted(operator), + "ReclaimSlashingRegistryCoordinator: operator not whitelisted" + ); + } +} \ No newline at end of file diff --git a/avs/utils/contract-data-gen.sh b/avs/utils/contract-data-gen.sh index 0e496afa..0b3c0555 100644 --- a/avs/utils/contract-data-gen.sh +++ b/avs/utils/contract-data-gen.sh @@ -2,8 +2,11 @@ rm -rf src/avs/contracts mkdir -p src/avs/contracts typechain -- --target ethers-v5 --out-dir src/avs/contracts \ avs/contracts/out/ReclaimServiceManager.sol/*.json \ + avs/contracts/out/ReclaimTaskManager.sol/*.json \ + avs/contracts/out/ReclaimSlashingRegistryCoordinator.sol/*.json \ avs/contracts/out/AVSDirectory.sol/*.json \ avs/contracts/out/DelegationManager.sol/*.json \ avs/contracts/out/ECDSAStakeRegistry.sol/*.json \ avs/contracts/out/ERC20Mock.sol/*.json \ - avs/contracts/out/RewardsCoordinator.sol/*.json \ No newline at end of file + avs/contracts/out/RewardsCoordinator.sol/*.json \ + avs/contracts/out/SocketRegistry.sol/*.json \ \ No newline at end of file diff --git a/src/avs/config.ts b/src/avs/config.ts index 5f0aaaff..3e94a029 100644 --- a/src/avs/config.ts +++ b/src/avs/config.ts @@ -4,11 +4,12 @@ import { getEnvVariable } from 'src/utils/env' export const CHAIN_CONFIGS: { [key: string]: ChainConfig } = { '31337': { rpcUrl: 'http://localhost:8545', - contractAddress: '0x998abeb3e57409262ae5b751f60747921b33613e', + contractAddress: '0x1291be112d480055dafd8a610b7d1e203891c274', delegationManagerAddress: '0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0', stakeRegistryAddress: '0x4826533b4897376654bb4d4ad88b7fafd0c98528', avsDirectoryAddress: '0xdc64a140aa3e981100a9beca4e685f962f0cf6c9', rewardsCoordinatorAddress: '0x610178da211fef7d417bc0e6fed39f05609ad788', + slashingCoordinatorAddress: '0x7969c5ed335650692bc04293b07f5bf2e7a673c0' }, '17000': { rpcUrl: getEnvVariable('RPC_URL') || 'https://rpc.holesky.ethpandaops.io', @@ -17,6 +18,7 @@ export const CHAIN_CONFIGS: { [key: string]: ChainConfig } = { stakeRegistryAddress: '0xDa11C9Da04Ab02C4AF9374B27A5E727944D3E1dD', avsDirectoryAddress: '0x055733000064333CaDDbC92763c58BF0192fFeBf', rewardsCoordinatorAddress: '', + slashingCoordinatorAddress: '' } } diff --git a/src/avs/contracts/AVSDirectory.ts b/src/avs/contracts/AVSDirectory.ts index f82c20be..2307cce2 100644 --- a/src/avs/contracts/AVSDirectory.ts +++ b/src/avs/contracts/AVSDirectory.ts @@ -26,7 +26,7 @@ import type { OnEvent, } from "./common"; -export declare namespace ISignatureUtils { +export declare namespace ISignatureUtilsMixinTypes { export type SignatureWithSaltAndExpiryStruct = { signature: BytesLike; salt: BytesLike; @@ -42,15 +42,16 @@ export declare namespace ISignatureUtils { export interface AVSDirectoryInterface extends utils.Interface { functions: { - "DOMAIN_TYPEHASH()": FunctionFragment; "OPERATOR_AVS_REGISTRATION_TYPEHASH()": FunctionFragment; + "OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH()": FunctionFragment; + "OPERATOR_SET_REGISTRATION_TYPEHASH()": FunctionFragment; "avsOperatorStatus(address,address)": FunctionFragment; "calculateOperatorAVSRegistrationDigestHash(address,address,bytes32,uint256)": FunctionFragment; "cancelSalt(bytes32)": FunctionFragment; "delegation()": FunctionFragment; "deregisterOperatorFromAVS(address)": FunctionFragment; "domainSeparator()": FunctionFragment; - "initialize(address,address,uint256)": FunctionFragment; + "initialize(address,uint256)": FunctionFragment; "operatorSaltIsSpent(address,bytes32)": FunctionFragment; "owner()": FunctionFragment; "pause(uint256)": FunctionFragment; @@ -60,16 +61,17 @@ export interface AVSDirectoryInterface extends utils.Interface { "pauserRegistry()": FunctionFragment; "registerOperatorToAVS(address,(bytes,bytes32,uint256))": FunctionFragment; "renounceOwnership()": FunctionFragment; - "setPauserRegistry(address)": FunctionFragment; "transferOwnership(address)": FunctionFragment; "unpause(uint256)": FunctionFragment; "updateAVSMetadataURI(string)": FunctionFragment; + "version()": FunctionFragment; }; getFunction( nameOrSignatureOrTopic: - | "DOMAIN_TYPEHASH" | "OPERATOR_AVS_REGISTRATION_TYPEHASH" + | "OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH" + | "OPERATOR_SET_REGISTRATION_TYPEHASH" | "avsOperatorStatus" | "calculateOperatorAVSRegistrationDigestHash" | "cancelSalt" @@ -86,18 +88,22 @@ export interface AVSDirectoryInterface extends utils.Interface { | "pauserRegistry" | "registerOperatorToAVS" | "renounceOwnership" - | "setPauserRegistry" | "transferOwnership" | "unpause" | "updateAVSMetadataURI" + | "version" ): FunctionFragment; encodeFunctionData( - functionFragment: "DOMAIN_TYPEHASH", + functionFragment: "OPERATOR_AVS_REGISTRATION_TYPEHASH", values?: undefined ): string; encodeFunctionData( - functionFragment: "OPERATOR_AVS_REGISTRATION_TYPEHASH", + functionFragment: "OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "OPERATOR_SET_REGISTRATION_TYPEHASH", values?: undefined ): string; encodeFunctionData( @@ -126,7 +132,7 @@ export interface AVSDirectoryInterface extends utils.Interface { ): string; encodeFunctionData( functionFragment: "initialize", - values: [string, string, BigNumberish] + values: [string, BigNumberish] ): string; encodeFunctionData( functionFragment: "operatorSaltIsSpent", @@ -146,16 +152,12 @@ export interface AVSDirectoryInterface extends utils.Interface { ): string; encodeFunctionData( functionFragment: "registerOperatorToAVS", - values: [string, ISignatureUtils.SignatureWithSaltAndExpiryStruct] + values: [string, ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiryStruct] ): string; encodeFunctionData( functionFragment: "renounceOwnership", values?: undefined ): string; - encodeFunctionData( - functionFragment: "setPauserRegistry", - values: [string] - ): string; encodeFunctionData( functionFragment: "transferOwnership", values: [string] @@ -168,13 +170,18 @@ export interface AVSDirectoryInterface extends utils.Interface { functionFragment: "updateAVSMetadataURI", values: [string] ): string; + encodeFunctionData(functionFragment: "version", values?: undefined): string; decodeFunctionResult( - functionFragment: "DOMAIN_TYPEHASH", + functionFragment: "OPERATOR_AVS_REGISTRATION_TYPEHASH", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "OPERATOR_AVS_REGISTRATION_TYPEHASH", + functionFragment: "OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "OPERATOR_SET_REGISTRATION_TYPEHASH", data: BytesLike ): Result; decodeFunctionResult( @@ -220,10 +227,6 @@ export interface AVSDirectoryInterface extends utils.Interface { functionFragment: "renounceOwnership", data: BytesLike ): Result; - decodeFunctionResult( - functionFragment: "setPauserRegistry", - data: BytesLike - ): Result; decodeFunctionResult( functionFragment: "transferOwnership", data: BytesLike @@ -233,6 +236,7 @@ export interface AVSDirectoryInterface extends utils.Interface { functionFragment: "updateAVSMetadataURI", data: BytesLike ): Result; + decodeFunctionResult(functionFragment: "version", data: BytesLike): Result; events: { "AVSMetadataURIUpdated(address,string)": EventFragment; @@ -240,7 +244,6 @@ export interface AVSDirectoryInterface extends utils.Interface { "OperatorAVSRegistrationStatusUpdated(address,address,uint8)": EventFragment; "OwnershipTransferred(address,address)": EventFragment; "Paused(address,uint256)": EventFragment; - "PauserRegistrySet(address,address)": EventFragment; "Unpaused(address,uint256)": EventFragment; }; @@ -251,7 +254,6 @@ export interface AVSDirectoryInterface extends utils.Interface { ): EventFragment; getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; getEvent(nameOrSignatureOrTopic: "Paused"): EventFragment; - getEvent(nameOrSignatureOrTopic: "PauserRegistrySet"): EventFragment; getEvent(nameOrSignatureOrTopic: "Unpaused"): EventFragment; } @@ -307,18 +309,6 @@ export type PausedEvent = TypedEvent<[string, BigNumber], PausedEventObject>; export type PausedEventFilter = TypedEventFilter; -export interface PauserRegistrySetEventObject { - pauserRegistry: string; - newPauserRegistry: string; -} -export type PauserRegistrySetEvent = TypedEvent< - [string, string], - PauserRegistrySetEventObject ->; - -export type PauserRegistrySetEventFilter = - TypedEventFilter; - export interface UnpausedEventObject { account: string; newPausedStatus: BigNumber; @@ -357,15 +347,21 @@ export interface AVSDirectory extends BaseContract { removeListener: OnEvent; functions: { - DOMAIN_TYPEHASH(overrides?: CallOverrides): Promise<[string]>; - OPERATOR_AVS_REGISTRATION_TYPEHASH( overrides?: CallOverrides ): Promise<[string]>; + OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH( + overrides?: CallOverrides + ): Promise<[string]>; + + OPERATOR_SET_REGISTRATION_TYPEHASH( + overrides?: CallOverrides + ): Promise<[string]>; + avsOperatorStatus( - arg0: string, - arg1: string, + avs: string, + operator: string, overrides?: CallOverrides ): Promise<[number]>; @@ -393,16 +389,15 @@ export interface AVSDirectory extends BaseContract { initialize( initialOwner: string, - _pauserRegistry: string, initialPausedStatus: BigNumberish, overrides?: Overrides & { from?: string } ): Promise; operatorSaltIsSpent( - arg0: string, - arg1: BytesLike, + operator: string, + salt: BytesLike, overrides?: CallOverrides - ): Promise<[boolean]>; + ): Promise<[boolean] & { isSpent: boolean }>; owner(overrides?: CallOverrides): Promise<[string]>; @@ -426,7 +421,7 @@ export interface AVSDirectory extends BaseContract { registerOperatorToAVS( operator: string, - operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, + operatorSignature: ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiryStruct, overrides?: Overrides & { from?: string } ): Promise; @@ -434,11 +429,6 @@ export interface AVSDirectory extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; - setPauserRegistry( - newPauserRegistry: string, - overrides?: Overrides & { from?: string } - ): Promise; - transferOwnership( newOwner: string, overrides?: Overrides & { from?: string } @@ -453,17 +443,25 @@ export interface AVSDirectory extends BaseContract { metadataURI: string, overrides?: Overrides & { from?: string } ): Promise; - }; - DOMAIN_TYPEHASH(overrides?: CallOverrides): Promise; + version(overrides?: CallOverrides): Promise<[string]>; + }; OPERATOR_AVS_REGISTRATION_TYPEHASH( overrides?: CallOverrides ): Promise; + OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH( + overrides?: CallOverrides + ): Promise; + + OPERATOR_SET_REGISTRATION_TYPEHASH( + overrides?: CallOverrides + ): Promise; + avsOperatorStatus( - arg0: string, - arg1: string, + avs: string, + operator: string, overrides?: CallOverrides ): Promise; @@ -491,14 +489,13 @@ export interface AVSDirectory extends BaseContract { initialize( initialOwner: string, - _pauserRegistry: string, initialPausedStatus: BigNumberish, overrides?: Overrides & { from?: string } ): Promise; operatorSaltIsSpent( - arg0: string, - arg1: BytesLike, + operator: string, + salt: BytesLike, overrides?: CallOverrides ): Promise; @@ -524,7 +521,7 @@ export interface AVSDirectory extends BaseContract { registerOperatorToAVS( operator: string, - operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, + operatorSignature: ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiryStruct, overrides?: Overrides & { from?: string } ): Promise; @@ -532,11 +529,6 @@ export interface AVSDirectory extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; - setPauserRegistry( - newPauserRegistry: string, - overrides?: Overrides & { from?: string } - ): Promise; - transferOwnership( newOwner: string, overrides?: Overrides & { from?: string } @@ -552,16 +544,24 @@ export interface AVSDirectory extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; - callStatic: { - DOMAIN_TYPEHASH(overrides?: CallOverrides): Promise; + version(overrides?: CallOverrides): Promise; + callStatic: { OPERATOR_AVS_REGISTRATION_TYPEHASH( overrides?: CallOverrides ): Promise; + OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH( + overrides?: CallOverrides + ): Promise; + + OPERATOR_SET_REGISTRATION_TYPEHASH( + overrides?: CallOverrides + ): Promise; + avsOperatorStatus( - arg0: string, - arg1: string, + avs: string, + operator: string, overrides?: CallOverrides ): Promise; @@ -586,14 +586,13 @@ export interface AVSDirectory extends BaseContract { initialize( initialOwner: string, - _pauserRegistry: string, initialPausedStatus: BigNumberish, overrides?: CallOverrides ): Promise; operatorSaltIsSpent( - arg0: string, - arg1: BytesLike, + operator: string, + salt: BytesLike, overrides?: CallOverrides ): Promise; @@ -617,17 +616,12 @@ export interface AVSDirectory extends BaseContract { registerOperatorToAVS( operator: string, - operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, + operatorSignature: ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiryStruct, overrides?: CallOverrides ): Promise; renounceOwnership(overrides?: CallOverrides): Promise; - setPauserRegistry( - newPauserRegistry: string, - overrides?: CallOverrides - ): Promise; - transferOwnership( newOwner: string, overrides?: CallOverrides @@ -642,6 +636,8 @@ export interface AVSDirectory extends BaseContract { metadataURI: string, overrides?: CallOverrides ): Promise; + + version(overrides?: CallOverrides): Promise; }; filters: { @@ -683,15 +679,6 @@ export interface AVSDirectory extends BaseContract { ): PausedEventFilter; Paused(account?: string | null, newPausedStatus?: null): PausedEventFilter; - "PauserRegistrySet(address,address)"( - pauserRegistry?: null, - newPauserRegistry?: null - ): PauserRegistrySetEventFilter; - PauserRegistrySet( - pauserRegistry?: null, - newPauserRegistry?: null - ): PauserRegistrySetEventFilter; - "Unpaused(address,uint256)"( account?: string | null, newPausedStatus?: null @@ -703,15 +690,21 @@ export interface AVSDirectory extends BaseContract { }; estimateGas: { - DOMAIN_TYPEHASH(overrides?: CallOverrides): Promise; - OPERATOR_AVS_REGISTRATION_TYPEHASH( overrides?: CallOverrides ): Promise; + OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH( + overrides?: CallOverrides + ): Promise; + + OPERATOR_SET_REGISTRATION_TYPEHASH( + overrides?: CallOverrides + ): Promise; + avsOperatorStatus( - arg0: string, - arg1: string, + avs: string, + operator: string, overrides?: CallOverrides ): Promise; @@ -739,14 +732,13 @@ export interface AVSDirectory extends BaseContract { initialize( initialOwner: string, - _pauserRegistry: string, initialPausedStatus: BigNumberish, overrides?: Overrides & { from?: string } ): Promise; operatorSaltIsSpent( - arg0: string, - arg1: BytesLike, + operator: string, + salt: BytesLike, overrides?: CallOverrides ): Promise; @@ -770,7 +762,7 @@ export interface AVSDirectory extends BaseContract { registerOperatorToAVS( operator: string, - operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, + operatorSignature: ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiryStruct, overrides?: Overrides & { from?: string } ): Promise; @@ -778,11 +770,6 @@ export interface AVSDirectory extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; - setPauserRegistry( - newPauserRegistry: string, - overrides?: Overrides & { from?: string } - ): Promise; - transferOwnership( newOwner: string, overrides?: Overrides & { from?: string } @@ -797,18 +784,26 @@ export interface AVSDirectory extends BaseContract { metadataURI: string, overrides?: Overrides & { from?: string } ): Promise; + + version(overrides?: CallOverrides): Promise; }; populateTransaction: { - DOMAIN_TYPEHASH(overrides?: CallOverrides): Promise; - OPERATOR_AVS_REGISTRATION_TYPEHASH( overrides?: CallOverrides ): Promise; + OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH( + overrides?: CallOverrides + ): Promise; + + OPERATOR_SET_REGISTRATION_TYPEHASH( + overrides?: CallOverrides + ): Promise; + avsOperatorStatus( - arg0: string, - arg1: string, + avs: string, + operator: string, overrides?: CallOverrides ): Promise; @@ -836,14 +831,13 @@ export interface AVSDirectory extends BaseContract { initialize( initialOwner: string, - _pauserRegistry: string, initialPausedStatus: BigNumberish, overrides?: Overrides & { from?: string } ): Promise; operatorSaltIsSpent( - arg0: string, - arg1: BytesLike, + operator: string, + salt: BytesLike, overrides?: CallOverrides ): Promise; @@ -869,7 +863,7 @@ export interface AVSDirectory extends BaseContract { registerOperatorToAVS( operator: string, - operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, + operatorSignature: ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiryStruct, overrides?: Overrides & { from?: string } ): Promise; @@ -877,11 +871,6 @@ export interface AVSDirectory extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; - setPauserRegistry( - newPauserRegistry: string, - overrides?: Overrides & { from?: string } - ): Promise; - transferOwnership( newOwner: string, overrides?: Overrides & { from?: string } @@ -896,5 +885,7 @@ export interface AVSDirectory extends BaseContract { metadataURI: string, overrides?: Overrides & { from?: string } ): Promise; + + version(overrides?: CallOverrides): Promise; }; } diff --git a/src/avs/contracts/DelegationManager.ts b/src/avs/contracts/DelegationManager.ts index 591f62d9..c1ce7783 100644 --- a/src/avs/contracts/DelegationManager.ts +++ b/src/avs/contracts/DelegationManager.ts @@ -26,7 +26,7 @@ import type { OnEvent, } from "./common"; -export declare namespace IDelegationManager { +export declare namespace IDelegationManagerTypes { export type WithdrawalStruct = { staker: string; delegatedTo: string; @@ -34,7 +34,7 @@ export declare namespace IDelegationManager { nonce: BigNumberish; startBlock: BigNumberish; strategies: string[]; - shares: BigNumberish[]; + scaledShares: BigNumberish[]; }; export type WithdrawalStructOutput = [ @@ -52,35 +52,27 @@ export declare namespace IDelegationManager { nonce: BigNumber; startBlock: number; strategies: string[]; - shares: BigNumber[]; - }; - - export type OperatorDetailsStruct = { - __deprecated_earningsReceiver: string; - delegationApprover: string; - stakerOptOutWindowBlocks: BigNumberish; - }; - - export type OperatorDetailsStructOutput = [string, string, number] & { - __deprecated_earningsReceiver: string; - delegationApprover: string; - stakerOptOutWindowBlocks: number; + scaledShares: BigNumber[]; }; export type QueuedWithdrawalParamsStruct = { strategies: string[]; - shares: BigNumberish[]; - withdrawer: string; + depositShares: BigNumberish[]; + __deprecated_withdrawer: string; }; export type QueuedWithdrawalParamsStructOutput = [ string[], BigNumber[], string - ] & { strategies: string[]; shares: BigNumber[]; withdrawer: string }; + ] & { + strategies: string[]; + depositShares: BigNumber[]; + __deprecated_withdrawer: string; + }; } -export declare namespace ISignatureUtils { +export declare namespace ISignatureUtilsMixinTypes { export type SignatureWithExpiryStruct = { signature: BytesLike; expiry: BigNumberish; @@ -95,36 +87,36 @@ export declare namespace ISignatureUtils { export interface DelegationManagerInterface extends utils.Interface { functions: { "DELEGATION_APPROVAL_TYPEHASH()": FunctionFragment; - "DOMAIN_TYPEHASH()": FunctionFragment; - "MAX_STAKER_OPT_OUT_WINDOW_BLOCKS()": FunctionFragment; - "MAX_WITHDRAWAL_DELAY_BLOCKS()": FunctionFragment; - "STAKER_DELEGATION_TYPEHASH()": FunctionFragment; + "allocationManager()": FunctionFragment; "beaconChainETHStrategy()": FunctionFragment; - "calculateCurrentStakerDelegationDigestHash(address,address,uint256)": FunctionFragment; "calculateDelegationApprovalDigestHash(address,address,address,bytes32,uint256)": FunctionFragment; - "calculateStakerDelegationDigestHash(address,uint256,address,uint256)": FunctionFragment; "calculateWithdrawalRoot((address,address,address,uint256,uint32,address[],uint256[]))": FunctionFragment; - "completeQueuedWithdrawal((address,address,address,uint256,uint32,address[],uint256[]),address[],uint256,bool)": FunctionFragment; - "completeQueuedWithdrawals((address,address,address,uint256,uint32,address[],uint256[])[],address[][],uint256[],bool[])": FunctionFragment; + "completeQueuedWithdrawal((address,address,address,uint256,uint32,address[],uint256[]),address[],bool)": FunctionFragment; + "completeQueuedWithdrawals((address,address,address,uint256,uint32,address[],uint256[])[],address[][],bool[])": FunctionFragment; + "convertToDepositShares(address,address[],uint256[])": FunctionFragment; "cumulativeWithdrawalsQueued(address)": FunctionFragment; - "decreaseDelegatedShares(address,address,uint256)": FunctionFragment; + "decreaseDelegatedShares(address,uint256,uint64)": FunctionFragment; "delegateTo(address,(bytes,uint256),bytes32)": FunctionFragment; - "delegateToBySignature(address,address,(bytes,uint256),(bytes,uint256),bytes32)": FunctionFragment; "delegatedTo(address)": FunctionFragment; "delegationApprover(address)": FunctionFragment; "delegationApproverSaltIsSpent(address,bytes32)": FunctionFragment; + "depositScalingFactor(address,address)": FunctionFragment; "domainSeparator()": FunctionFragment; "eigenPodManager()": FunctionFragment; - "getDelegatableShares(address)": FunctionFragment; + "getDepositedShares(address)": FunctionFragment; "getOperatorShares(address,address[])": FunctionFragment; - "getWithdrawalDelay(address[])": FunctionFragment; - "increaseDelegatedShares(address,address,uint256)": FunctionFragment; - "initialize(address,address,uint256,uint256,address[],uint256[])": FunctionFragment; + "getOperatorsShares(address[],address[])": FunctionFragment; + "getQueuedWithdrawal(bytes32)": FunctionFragment; + "getQueuedWithdrawalRoots(address)": FunctionFragment; + "getQueuedWithdrawals(address)": FunctionFragment; + "getSlashableSharesInQueue(address,address)": FunctionFragment; + "getWithdrawableShares(address,address[])": FunctionFragment; + "increaseDelegatedShares(address,address,uint256,uint256)": FunctionFragment; + "initialize(address,uint256)": FunctionFragment; "isDelegated(address)": FunctionFragment; "isOperator(address)": FunctionFragment; "minWithdrawalDelayBlocks()": FunctionFragment; - "modifyOperatorDetails((address,address,uint32))": FunctionFragment; - "operatorDetails(address)": FunctionFragment; + "modifyOperatorDetails(address,address)": FunctionFragment; "operatorShares(address,address)": FunctionFragment; "owner()": FunctionFragment; "pause(uint256)": FunctionFragment; @@ -133,56 +125,54 @@ export interface DelegationManagerInterface extends utils.Interface { "paused()": FunctionFragment; "pauserRegistry()": FunctionFragment; "pendingWithdrawals(bytes32)": FunctionFragment; + "permissionController()": FunctionFragment; "queueWithdrawals((address[],uint256[],address)[])": FunctionFragment; - "registerAsOperator((address,address,uint32),string)": FunctionFragment; + "queuedWithdrawals(bytes32)": FunctionFragment; + "redelegate(address,(bytes,uint256),bytes32)": FunctionFragment; + "registerAsOperator(address,uint32,string)": FunctionFragment; "renounceOwnership()": FunctionFragment; - "setMinWithdrawalDelayBlocks(uint256)": FunctionFragment; - "setPauserRegistry(address)": FunctionFragment; - "setStrategyWithdrawalDelayBlocks(address[],uint256[])": FunctionFragment; - "slasher()": FunctionFragment; - "stakerNonce(address)": FunctionFragment; - "stakerOptOutWindowBlocks(address)": FunctionFragment; + "slashOperatorShares(address,address,uint64,uint64)": FunctionFragment; "strategyManager()": FunctionFragment; - "strategyWithdrawalDelayBlocks(address)": FunctionFragment; "transferOwnership(address)": FunctionFragment; "undelegate(address)": FunctionFragment; "unpause(uint256)": FunctionFragment; - "updateOperatorMetadataURI(string)": FunctionFragment; + "updateOperatorMetadataURI(address,string)": FunctionFragment; + "version()": FunctionFragment; }; getFunction( nameOrSignatureOrTopic: | "DELEGATION_APPROVAL_TYPEHASH" - | "DOMAIN_TYPEHASH" - | "MAX_STAKER_OPT_OUT_WINDOW_BLOCKS" - | "MAX_WITHDRAWAL_DELAY_BLOCKS" - | "STAKER_DELEGATION_TYPEHASH" + | "allocationManager" | "beaconChainETHStrategy" - | "calculateCurrentStakerDelegationDigestHash" | "calculateDelegationApprovalDigestHash" - | "calculateStakerDelegationDigestHash" | "calculateWithdrawalRoot" | "completeQueuedWithdrawal" | "completeQueuedWithdrawals" + | "convertToDepositShares" | "cumulativeWithdrawalsQueued" | "decreaseDelegatedShares" | "delegateTo" - | "delegateToBySignature" | "delegatedTo" | "delegationApprover" | "delegationApproverSaltIsSpent" + | "depositScalingFactor" | "domainSeparator" | "eigenPodManager" - | "getDelegatableShares" + | "getDepositedShares" | "getOperatorShares" - | "getWithdrawalDelay" + | "getOperatorsShares" + | "getQueuedWithdrawal" + | "getQueuedWithdrawalRoots" + | "getQueuedWithdrawals" + | "getSlashableSharesInQueue" + | "getWithdrawableShares" | "increaseDelegatedShares" | "initialize" | "isDelegated" | "isOperator" | "minWithdrawalDelayBlocks" | "modifyOperatorDetails" - | "operatorDetails" | "operatorShares" | "owner" | "pause" @@ -191,21 +181,19 @@ export interface DelegationManagerInterface extends utils.Interface { | "paused()" | "pauserRegistry" | "pendingWithdrawals" + | "permissionController" | "queueWithdrawals" + | "queuedWithdrawals" + | "redelegate" | "registerAsOperator" | "renounceOwnership" - | "setMinWithdrawalDelayBlocks" - | "setPauserRegistry" - | "setStrategyWithdrawalDelayBlocks" - | "slasher" - | "stakerNonce" - | "stakerOptOutWindowBlocks" + | "slashOperatorShares" | "strategyManager" - | "strategyWithdrawalDelayBlocks" | "transferOwnership" | "undelegate" | "unpause" | "updateOperatorMetadataURI" + | "version" ): FunctionFragment; encodeFunctionData( @@ -213,58 +201,32 @@ export interface DelegationManagerInterface extends utils.Interface { values?: undefined ): string; encodeFunctionData( - functionFragment: "DOMAIN_TYPEHASH", - values?: undefined - ): string; - encodeFunctionData( - functionFragment: "MAX_STAKER_OPT_OUT_WINDOW_BLOCKS", - values?: undefined - ): string; - encodeFunctionData( - functionFragment: "MAX_WITHDRAWAL_DELAY_BLOCKS", - values?: undefined - ): string; - encodeFunctionData( - functionFragment: "STAKER_DELEGATION_TYPEHASH", + functionFragment: "allocationManager", values?: undefined ): string; encodeFunctionData( functionFragment: "beaconChainETHStrategy", values?: undefined ): string; - encodeFunctionData( - functionFragment: "calculateCurrentStakerDelegationDigestHash", - values: [string, string, BigNumberish] - ): string; encodeFunctionData( functionFragment: "calculateDelegationApprovalDigestHash", values: [string, string, string, BytesLike, BigNumberish] ): string; - encodeFunctionData( - functionFragment: "calculateStakerDelegationDigestHash", - values: [string, BigNumberish, string, BigNumberish] - ): string; encodeFunctionData( functionFragment: "calculateWithdrawalRoot", - values: [IDelegationManager.WithdrawalStruct] + values: [IDelegationManagerTypes.WithdrawalStruct] ): string; encodeFunctionData( functionFragment: "completeQueuedWithdrawal", - values: [ - IDelegationManager.WithdrawalStruct, - string[], - BigNumberish, - boolean - ] + values: [IDelegationManagerTypes.WithdrawalStruct, string[], boolean] ): string; encodeFunctionData( functionFragment: "completeQueuedWithdrawals", - values: [ - IDelegationManager.WithdrawalStruct[], - string[][], - BigNumberish[], - boolean[] - ] + values: [IDelegationManagerTypes.WithdrawalStruct[], string[][], boolean[]] + ): string; + encodeFunctionData( + functionFragment: "convertToDepositShares", + values: [string, string[], BigNumberish[]] ): string; encodeFunctionData( functionFragment: "cumulativeWithdrawalsQueued", @@ -272,19 +234,13 @@ export interface DelegationManagerInterface extends utils.Interface { ): string; encodeFunctionData( functionFragment: "decreaseDelegatedShares", - values: [string, string, BigNumberish] + values: [string, BigNumberish, BigNumberish] ): string; encodeFunctionData( functionFragment: "delegateTo", - values: [string, ISignatureUtils.SignatureWithExpiryStruct, BytesLike] - ): string; - encodeFunctionData( - functionFragment: "delegateToBySignature", values: [ string, - string, - ISignatureUtils.SignatureWithExpiryStruct, - ISignatureUtils.SignatureWithExpiryStruct, + ISignatureUtilsMixinTypes.SignatureWithExpiryStruct, BytesLike ] ): string; @@ -297,6 +253,10 @@ export interface DelegationManagerInterface extends utils.Interface { functionFragment: "delegationApproverSaltIsSpent", values: [string, BytesLike] ): string; + encodeFunctionData( + functionFragment: "depositScalingFactor", + values: [string, string] + ): string; encodeFunctionData( functionFragment: "domainSeparator", values?: undefined @@ -306,7 +266,7 @@ export interface DelegationManagerInterface extends utils.Interface { values?: undefined ): string; encodeFunctionData( - functionFragment: "getDelegatableShares", + functionFragment: "getDepositedShares", values: [string] ): string; encodeFunctionData( @@ -314,23 +274,36 @@ export interface DelegationManagerInterface extends utils.Interface { values: [string, string[]] ): string; encodeFunctionData( - functionFragment: "getWithdrawalDelay", - values: [string[]] + functionFragment: "getOperatorsShares", + values: [string[], string[]] + ): string; + encodeFunctionData( + functionFragment: "getQueuedWithdrawal", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "getQueuedWithdrawalRoots", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "getQueuedWithdrawals", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "getSlashableSharesInQueue", + values: [string, string] + ): string; + encodeFunctionData( + functionFragment: "getWithdrawableShares", + values: [string, string[]] ): string; encodeFunctionData( functionFragment: "increaseDelegatedShares", - values: [string, string, BigNumberish] + values: [string, string, BigNumberish, BigNumberish] ): string; encodeFunctionData( functionFragment: "initialize", - values: [ - string, - string, - BigNumberish, - BigNumberish, - string[], - BigNumberish[] - ] + values: [string, BigNumberish] ): string; encodeFunctionData(functionFragment: "isDelegated", values: [string]): string; encodeFunctionData(functionFragment: "isOperator", values: [string]): string; @@ -340,11 +313,7 @@ export interface DelegationManagerInterface extends utils.Interface { ): string; encodeFunctionData( functionFragment: "modifyOperatorDetails", - values: [IDelegationManager.OperatorDetailsStruct] - ): string; - encodeFunctionData( - functionFragment: "operatorDetails", - values: [string] + values: [string, string] ): string; encodeFunctionData( functionFragment: "operatorShares", @@ -367,43 +336,41 @@ export interface DelegationManagerInterface extends utils.Interface { values: [BytesLike] ): string; encodeFunctionData( - functionFragment: "queueWithdrawals", - values: [IDelegationManager.QueuedWithdrawalParamsStruct[]] + functionFragment: "permissionController", + values?: undefined ): string; encodeFunctionData( - functionFragment: "registerAsOperator", - values: [IDelegationManager.OperatorDetailsStruct, string] + functionFragment: "queueWithdrawals", + values: [IDelegationManagerTypes.QueuedWithdrawalParamsStruct[]] ): string; encodeFunctionData( - functionFragment: "renounceOwnership", - values?: undefined + functionFragment: "queuedWithdrawals", + values: [BytesLike] ): string; encodeFunctionData( - functionFragment: "setMinWithdrawalDelayBlocks", - values: [BigNumberish] + functionFragment: "redelegate", + values: [ + string, + ISignatureUtilsMixinTypes.SignatureWithExpiryStruct, + BytesLike + ] ): string; encodeFunctionData( - functionFragment: "setPauserRegistry", - values: [string] + functionFragment: "registerAsOperator", + values: [string, BigNumberish, string] ): string; encodeFunctionData( - functionFragment: "setStrategyWithdrawalDelayBlocks", - values: [string[], BigNumberish[]] + functionFragment: "renounceOwnership", + values?: undefined ): string; - encodeFunctionData(functionFragment: "slasher", values?: undefined): string; - encodeFunctionData(functionFragment: "stakerNonce", values: [string]): string; encodeFunctionData( - functionFragment: "stakerOptOutWindowBlocks", - values: [string] + functionFragment: "slashOperatorShares", + values: [string, string, BigNumberish, BigNumberish] ): string; encodeFunctionData( functionFragment: "strategyManager", values?: undefined ): string; - encodeFunctionData( - functionFragment: "strategyWithdrawalDelayBlocks", - values: [string] - ): string; encodeFunctionData( functionFragment: "transferOwnership", values: [string] @@ -415,100 +382,105 @@ export interface DelegationManagerInterface extends utils.Interface { ): string; encodeFunctionData( functionFragment: "updateOperatorMetadataURI", - values: [string] + values: [string, string] ): string; + encodeFunctionData(functionFragment: "version", values?: undefined): string; decodeFunctionResult( functionFragment: "DELEGATION_APPROVAL_TYPEHASH", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "DOMAIN_TYPEHASH", + functionFragment: "allocationManager", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "MAX_STAKER_OPT_OUT_WINDOW_BLOCKS", + functionFragment: "beaconChainETHStrategy", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "MAX_WITHDRAWAL_DELAY_BLOCKS", + functionFragment: "calculateDelegationApprovalDigestHash", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "STAKER_DELEGATION_TYPEHASH", + functionFragment: "calculateWithdrawalRoot", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "beaconChainETHStrategy", + functionFragment: "completeQueuedWithdrawal", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "calculateCurrentStakerDelegationDigestHash", + functionFragment: "completeQueuedWithdrawals", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "calculateDelegationApprovalDigestHash", + functionFragment: "convertToDepositShares", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "calculateStakerDelegationDigestHash", + functionFragment: "cumulativeWithdrawalsQueued", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "calculateWithdrawalRoot", + functionFragment: "decreaseDelegatedShares", data: BytesLike ): Result; + decodeFunctionResult(functionFragment: "delegateTo", data: BytesLike): Result; decodeFunctionResult( - functionFragment: "completeQueuedWithdrawal", + functionFragment: "delegatedTo", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "completeQueuedWithdrawals", + functionFragment: "delegationApprover", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "cumulativeWithdrawalsQueued", + functionFragment: "delegationApproverSaltIsSpent", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "decreaseDelegatedShares", + functionFragment: "depositScalingFactor", data: BytesLike ): Result; - decodeFunctionResult(functionFragment: "delegateTo", data: BytesLike): Result; decodeFunctionResult( - functionFragment: "delegateToBySignature", + functionFragment: "domainSeparator", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "delegatedTo", + functionFragment: "eigenPodManager", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "delegationApprover", + functionFragment: "getDepositedShares", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "delegationApproverSaltIsSpent", + functionFragment: "getOperatorShares", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "domainSeparator", + functionFragment: "getOperatorsShares", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "eigenPodManager", + functionFragment: "getQueuedWithdrawal", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "getDelegatableShares", + functionFragment: "getQueuedWithdrawalRoots", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "getOperatorShares", + functionFragment: "getQueuedWithdrawals", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getSlashableSharesInQueue", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "getWithdrawalDelay", + functionFragment: "getWithdrawableShares", data: BytesLike ): Result; decodeFunctionResult( @@ -529,10 +501,6 @@ export interface DelegationManagerInterface extends utils.Interface { functionFragment: "modifyOperatorDetails", data: BytesLike ): Result; - decodeFunctionResult( - functionFragment: "operatorDetails", - data: BytesLike - ): Result; decodeFunctionResult( functionFragment: "operatorShares", data: BytesLike @@ -554,46 +522,34 @@ export interface DelegationManagerInterface extends utils.Interface { data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "queueWithdrawals", - data: BytesLike - ): Result; - decodeFunctionResult( - functionFragment: "registerAsOperator", - data: BytesLike - ): Result; - decodeFunctionResult( - functionFragment: "renounceOwnership", + functionFragment: "permissionController", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "setMinWithdrawalDelayBlocks", + functionFragment: "queueWithdrawals", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "setPauserRegistry", + functionFragment: "queuedWithdrawals", data: BytesLike ): Result; + decodeFunctionResult(functionFragment: "redelegate", data: BytesLike): Result; decodeFunctionResult( - functionFragment: "setStrategyWithdrawalDelayBlocks", + functionFragment: "registerAsOperator", data: BytesLike ): Result; - decodeFunctionResult(functionFragment: "slasher", data: BytesLike): Result; decodeFunctionResult( - functionFragment: "stakerNonce", + functionFragment: "renounceOwnership", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "stakerOptOutWindowBlocks", + functionFragment: "slashOperatorShares", data: BytesLike ): Result; decodeFunctionResult( functionFragment: "strategyManager", data: BytesLike ): Result; - decodeFunctionResult( - functionFragment: "strategyWithdrawalDelayBlocks", - data: BytesLike - ): Result; decodeFunctionResult( functionFragment: "transferOwnership", data: BytesLike @@ -604,80 +560,80 @@ export interface DelegationManagerInterface extends utils.Interface { functionFragment: "updateOperatorMetadataURI", data: BytesLike ): Result; + decodeFunctionResult(functionFragment: "version", data: BytesLike): Result; events: { + "DelegationApproverUpdated(address,address)": EventFragment; + "DepositScalingFactorUpdated(address,address,uint256)": EventFragment; "Initialized(uint8)": EventFragment; - "MinWithdrawalDelayBlocksSet(uint256,uint256)": EventFragment; - "OperatorDetailsModified(address,(address,address,uint32))": EventFragment; "OperatorMetadataURIUpdated(address,string)": EventFragment; - "OperatorRegistered(address,(address,address,uint32))": EventFragment; + "OperatorRegistered(address,address)": EventFragment; "OperatorSharesDecreased(address,address,address,uint256)": EventFragment; "OperatorSharesIncreased(address,address,address,uint256)": EventFragment; + "OperatorSharesSlashed(address,address,uint256)": EventFragment; "OwnershipTransferred(address,address)": EventFragment; "Paused(address,uint256)": EventFragment; - "PauserRegistrySet(address,address)": EventFragment; + "SlashingWithdrawalCompleted(bytes32)": EventFragment; + "SlashingWithdrawalQueued(bytes32,(address,address,address,uint256,uint32,address[],uint256[]),uint256[])": EventFragment; "StakerDelegated(address,address)": EventFragment; "StakerForceUndelegated(address,address)": EventFragment; "StakerUndelegated(address,address)": EventFragment; - "StrategyWithdrawalDelayBlocksSet(address,uint256,uint256)": EventFragment; "Unpaused(address,uint256)": EventFragment; - "WithdrawalCompleted(bytes32)": EventFragment; - "WithdrawalQueued(bytes32,(address,address,address,uint256,uint32,address[],uint256[]))": EventFragment; }; - getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; + getEvent(nameOrSignatureOrTopic: "DelegationApproverUpdated"): EventFragment; getEvent( - nameOrSignatureOrTopic: "MinWithdrawalDelayBlocksSet" + nameOrSignatureOrTopic: "DepositScalingFactorUpdated" ): EventFragment; - getEvent(nameOrSignatureOrTopic: "OperatorDetailsModified"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; getEvent(nameOrSignatureOrTopic: "OperatorMetadataURIUpdated"): EventFragment; getEvent(nameOrSignatureOrTopic: "OperatorRegistered"): EventFragment; getEvent(nameOrSignatureOrTopic: "OperatorSharesDecreased"): EventFragment; getEvent(nameOrSignatureOrTopic: "OperatorSharesIncreased"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OperatorSharesSlashed"): EventFragment; getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; getEvent(nameOrSignatureOrTopic: "Paused"): EventFragment; - getEvent(nameOrSignatureOrTopic: "PauserRegistrySet"): EventFragment; + getEvent( + nameOrSignatureOrTopic: "SlashingWithdrawalCompleted" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "SlashingWithdrawalQueued"): EventFragment; getEvent(nameOrSignatureOrTopic: "StakerDelegated"): EventFragment; getEvent(nameOrSignatureOrTopic: "StakerForceUndelegated"): EventFragment; getEvent(nameOrSignatureOrTopic: "StakerUndelegated"): EventFragment; - getEvent( - nameOrSignatureOrTopic: "StrategyWithdrawalDelayBlocksSet" - ): EventFragment; getEvent(nameOrSignatureOrTopic: "Unpaused"): EventFragment; - getEvent(nameOrSignatureOrTopic: "WithdrawalCompleted"): EventFragment; - getEvent(nameOrSignatureOrTopic: "WithdrawalQueued"): EventFragment; } -export interface InitializedEventObject { - version: number; +export interface DelegationApproverUpdatedEventObject { + operator: string; + newDelegationApprover: string; } -export type InitializedEvent = TypedEvent<[number], InitializedEventObject>; +export type DelegationApproverUpdatedEvent = TypedEvent< + [string, string], + DelegationApproverUpdatedEventObject +>; -export type InitializedEventFilter = TypedEventFilter; +export type DelegationApproverUpdatedEventFilter = + TypedEventFilter; -export interface MinWithdrawalDelayBlocksSetEventObject { - previousValue: BigNumber; - newValue: BigNumber; +export interface DepositScalingFactorUpdatedEventObject { + staker: string; + strategy: string; + newDepositScalingFactor: BigNumber; } -export type MinWithdrawalDelayBlocksSetEvent = TypedEvent< - [BigNumber, BigNumber], - MinWithdrawalDelayBlocksSetEventObject +export type DepositScalingFactorUpdatedEvent = TypedEvent< + [string, string, BigNumber], + DepositScalingFactorUpdatedEventObject >; -export type MinWithdrawalDelayBlocksSetEventFilter = - TypedEventFilter; +export type DepositScalingFactorUpdatedEventFilter = + TypedEventFilter; -export interface OperatorDetailsModifiedEventObject { - operator: string; - newOperatorDetails: IDelegationManager.OperatorDetailsStructOutput; +export interface InitializedEventObject { + version: number; } -export type OperatorDetailsModifiedEvent = TypedEvent< - [string, IDelegationManager.OperatorDetailsStructOutput], - OperatorDetailsModifiedEventObject ->; +export type InitializedEvent = TypedEvent<[number], InitializedEventObject>; -export type OperatorDetailsModifiedEventFilter = - TypedEventFilter; +export type InitializedEventFilter = TypedEventFilter; export interface OperatorMetadataURIUpdatedEventObject { operator: string; @@ -693,10 +649,10 @@ export type OperatorMetadataURIUpdatedEventFilter = export interface OperatorRegisteredEventObject { operator: string; - operatorDetails: IDelegationManager.OperatorDetailsStructOutput; + delegationApprover: string; } export type OperatorRegisteredEvent = TypedEvent< - [string, IDelegationManager.OperatorDetailsStructOutput], + [string, string], OperatorRegisteredEventObject >; @@ -731,6 +687,19 @@ export type OperatorSharesIncreasedEvent = TypedEvent< export type OperatorSharesIncreasedEventFilter = TypedEventFilter; +export interface OperatorSharesSlashedEventObject { + operator: string; + strategy: string; + totalSlashedShares: BigNumber; +} +export type OperatorSharesSlashedEvent = TypedEvent< + [string, string, BigNumber], + OperatorSharesSlashedEventObject +>; + +export type OperatorSharesSlashedEventFilter = + TypedEventFilter; + export interface OwnershipTransferredEventObject { previousOwner: string; newOwner: string; @@ -751,17 +720,29 @@ export type PausedEvent = TypedEvent<[string, BigNumber], PausedEventObject>; export type PausedEventFilter = TypedEventFilter; -export interface PauserRegistrySetEventObject { - pauserRegistry: string; - newPauserRegistry: string; +export interface SlashingWithdrawalCompletedEventObject { + withdrawalRoot: string; } -export type PauserRegistrySetEvent = TypedEvent< - [string, string], - PauserRegistrySetEventObject +export type SlashingWithdrawalCompletedEvent = TypedEvent< + [string], + SlashingWithdrawalCompletedEventObject +>; + +export type SlashingWithdrawalCompletedEventFilter = + TypedEventFilter; + +export interface SlashingWithdrawalQueuedEventObject { + withdrawalRoot: string; + withdrawal: IDelegationManagerTypes.WithdrawalStructOutput; + sharesToWithdraw: BigNumber[]; +} +export type SlashingWithdrawalQueuedEvent = TypedEvent< + [string, IDelegationManagerTypes.WithdrawalStructOutput, BigNumber[]], + SlashingWithdrawalQueuedEventObject >; -export type PauserRegistrySetEventFilter = - TypedEventFilter; +export type SlashingWithdrawalQueuedEventFilter = + TypedEventFilter; export interface StakerDelegatedEventObject { staker: string; @@ -798,19 +779,6 @@ export type StakerUndelegatedEvent = TypedEvent< export type StakerUndelegatedEventFilter = TypedEventFilter; -export interface StrategyWithdrawalDelayBlocksSetEventObject { - strategy: string; - previousValue: BigNumber; - newValue: BigNumber; -} -export type StrategyWithdrawalDelayBlocksSetEvent = TypedEvent< - [string, BigNumber, BigNumber], - StrategyWithdrawalDelayBlocksSetEventObject ->; - -export type StrategyWithdrawalDelayBlocksSetEventFilter = - TypedEventFilter; - export interface UnpausedEventObject { account: string; newPausedStatus: BigNumber; @@ -822,29 +790,6 @@ export type UnpausedEvent = TypedEvent< export type UnpausedEventFilter = TypedEventFilter; -export interface WithdrawalCompletedEventObject { - withdrawalRoot: string; -} -export type WithdrawalCompletedEvent = TypedEvent< - [string], - WithdrawalCompletedEventObject ->; - -export type WithdrawalCompletedEventFilter = - TypedEventFilter; - -export interface WithdrawalQueuedEventObject { - withdrawalRoot: string; - withdrawal: IDelegationManager.WithdrawalStructOutput; -} -export type WithdrawalQueuedEvent = TypedEvent< - [string, IDelegationManager.WithdrawalStructOutput], - WithdrawalQueuedEventObject ->; - -export type WithdrawalQueuedEventFilter = - TypedEventFilter; - export interface DelegationManager extends BaseContract { connect(signerOrProvider: Signer | Provider | string): this; attach(addressOrName: string): this; @@ -874,94 +819,68 @@ export interface DelegationManager extends BaseContract { functions: { DELEGATION_APPROVAL_TYPEHASH(overrides?: CallOverrides): Promise<[string]>; - DOMAIN_TYPEHASH(overrides?: CallOverrides): Promise<[string]>; - - MAX_STAKER_OPT_OUT_WINDOW_BLOCKS( - overrides?: CallOverrides - ): Promise<[BigNumber]>; - - MAX_WITHDRAWAL_DELAY_BLOCKS( - overrides?: CallOverrides - ): Promise<[BigNumber]>; - - STAKER_DELEGATION_TYPEHASH(overrides?: CallOverrides): Promise<[string]>; + allocationManager(overrides?: CallOverrides): Promise<[string]>; beaconChainETHStrategy(overrides?: CallOverrides): Promise<[string]>; - calculateCurrentStakerDelegationDigestHash( - staker: string, - operator: string, - expiry: BigNumberish, - overrides?: CallOverrides - ): Promise<[string]>; - calculateDelegationApprovalDigestHash( staker: string, operator: string, - _delegationApprover: string, + approver: string, approverSalt: BytesLike, expiry: BigNumberish, overrides?: CallOverrides ): Promise<[string]>; - calculateStakerDelegationDigestHash( - staker: string, - _stakerNonce: BigNumberish, - operator: string, - expiry: BigNumberish, - overrides?: CallOverrides - ): Promise<[string]>; - calculateWithdrawalRoot( - withdrawal: IDelegationManager.WithdrawalStruct, + withdrawal: IDelegationManagerTypes.WithdrawalStruct, overrides?: CallOverrides ): Promise<[string]>; completeQueuedWithdrawal( - withdrawal: IDelegationManager.WithdrawalStruct, + withdrawal: IDelegationManagerTypes.WithdrawalStruct, tokens: string[], - middlewareTimesIndex: BigNumberish, receiveAsTokens: boolean, overrides?: Overrides & { from?: string } ): Promise; completeQueuedWithdrawals( - withdrawals: IDelegationManager.WithdrawalStruct[], + withdrawals: IDelegationManagerTypes.WithdrawalStruct[], tokens: string[][], - middlewareTimesIndexes: BigNumberish[], receiveAsTokens: boolean[], overrides?: Overrides & { from?: string } ): Promise; + convertToDepositShares( + staker: string, + strategies: string[], + withdrawableShares: BigNumberish[], + overrides?: CallOverrides + ): Promise<[BigNumber[]]>; + cumulativeWithdrawalsQueued( - arg0: string, + staker: string, overrides?: CallOverrides - ): Promise<[BigNumber]>; + ): Promise<[BigNumber] & { totalQueued: BigNumber }>; decreaseDelegatedShares( staker: string, - strategy: string, - shares: BigNumberish, + curDepositShares: BigNumberish, + beaconChainSlashingFactorDecrease: BigNumberish, overrides?: Overrides & { from?: string } ): Promise; delegateTo( operator: string, - approverSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, + approverSignatureAndExpiry: ISignatureUtilsMixinTypes.SignatureWithExpiryStruct, approverSalt: BytesLike, overrides?: Overrides & { from?: string } ): Promise; - delegateToBySignature( + delegatedTo( staker: string, - operator: string, - stakerSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, - approverSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, - approverSalt: BytesLike, - overrides?: Overrides & { from?: string } - ): Promise; - - delegatedTo(arg0: string, overrides?: CallOverrides): Promise<[string]>; + overrides?: CallOverrides + ): Promise<[string] & { operator: string }>; delegationApprover( operator: string, @@ -969,16 +888,22 @@ export interface DelegationManager extends BaseContract { ): Promise<[string]>; delegationApproverSaltIsSpent( - arg0: string, - arg1: BytesLike, + delegationApprover: string, + salt: BytesLike, overrides?: CallOverrides - ): Promise<[boolean]>; + ): Promise<[boolean] & { spent: boolean }>; + + depositScalingFactor( + staker: string, + strategy: string, + overrides?: CallOverrides + ): Promise<[BigNumber]>; domainSeparator(overrides?: CallOverrides): Promise<[string]>; eigenPodManager(overrides?: CallOverrides): Promise<[string]>; - getDelegatableShares( + getDepositedShares( staker: string, overrides?: CallOverrides ): Promise<[string[], BigNumber[]]>; @@ -989,25 +914,65 @@ export interface DelegationManager extends BaseContract { overrides?: CallOverrides ): Promise<[BigNumber[]]>; - getWithdrawalDelay( + getOperatorsShares( + operators: string[], strategies: string[], overrides?: CallOverrides + ): Promise<[BigNumber[][]]>; + + getQueuedWithdrawal( + withdrawalRoot: BytesLike, + overrides?: CallOverrides + ): Promise< + [IDelegationManagerTypes.WithdrawalStructOutput, BigNumber[]] & { + withdrawal: IDelegationManagerTypes.WithdrawalStructOutput; + shares: BigNumber[]; + } + >; + + getQueuedWithdrawalRoots( + staker: string, + overrides?: CallOverrides + ): Promise<[string[]]>; + + getQueuedWithdrawals( + staker: string, + overrides?: CallOverrides + ): Promise< + [IDelegationManagerTypes.WithdrawalStructOutput[], BigNumber[][]] & { + withdrawals: IDelegationManagerTypes.WithdrawalStructOutput[]; + shares: BigNumber[][]; + } + >; + + getSlashableSharesInQueue( + operator: string, + strategy: string, + overrides?: CallOverrides ): Promise<[BigNumber]>; + getWithdrawableShares( + staker: string, + strategies: string[], + overrides?: CallOverrides + ): Promise< + [BigNumber[], BigNumber[]] & { + withdrawableShares: BigNumber[]; + depositShares: BigNumber[]; + } + >; + increaseDelegatedShares( staker: string, strategy: string, - shares: BigNumberish, + prevDepositShares: BigNumberish, + addedShares: BigNumberish, overrides?: Overrides & { from?: string } ): Promise; initialize( initialOwner: string, - _pauserRegistry: string, initialPausedStatus: BigNumberish, - _minWithdrawalDelayBlocks: BigNumberish, - _strategies: string[], - _withdrawalDelayBlocks: BigNumberish[], overrides?: Overrides & { from?: string } ): Promise; @@ -1015,23 +980,19 @@ export interface DelegationManager extends BaseContract { isOperator(operator: string, overrides?: CallOverrides): Promise<[boolean]>; - minWithdrawalDelayBlocks(overrides?: CallOverrides): Promise<[BigNumber]>; + minWithdrawalDelayBlocks(overrides?: CallOverrides): Promise<[number]>; modifyOperatorDetails( - newOperatorDetails: IDelegationManager.OperatorDetailsStruct, + operator: string, + newDelegationApprover: string, overrides?: Overrides & { from?: string } ): Promise; - operatorDetails( - operator: string, - overrides?: CallOverrides - ): Promise<[IDelegationManager.OperatorDetailsStructOutput]>; - operatorShares( - arg0: string, - arg1: string, + operator: string, + strategy: string, overrides?: CallOverrides - ): Promise<[BigNumber]>; + ): Promise<[BigNumber] & { shares: BigNumber }>; owner(overrides?: CallOverrides): Promise<[string]>; @@ -1054,17 +1015,36 @@ export interface DelegationManager extends BaseContract { pauserRegistry(overrides?: CallOverrides): Promise<[string]>; pendingWithdrawals( - arg0: BytesLike, + withdrawalRoot: BytesLike, overrides?: CallOverrides - ): Promise<[boolean]>; + ): Promise<[boolean] & { pending: boolean }>; + + permissionController(overrides?: CallOverrides): Promise<[string]>; queueWithdrawals( - queuedWithdrawalParams: IDelegationManager.QueuedWithdrawalParamsStruct[], + params: IDelegationManagerTypes.QueuedWithdrawalParamsStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + queuedWithdrawals( + withdrawalRoot: BytesLike, + overrides?: CallOverrides + ): Promise< + [IDelegationManagerTypes.WithdrawalStructOutput] & { + withdrawal: IDelegationManagerTypes.WithdrawalStructOutput; + } + >; + + redelegate( + newOperator: string, + newOperatorApproverSig: ISignatureUtilsMixinTypes.SignatureWithExpiryStruct, + approverSalt: BytesLike, overrides?: Overrides & { from?: string } ): Promise; registerAsOperator( - registeringOperatorDetails: IDelegationManager.OperatorDetailsStruct, + initDelegationApprover: string, + allocationDelay: BigNumberish, metadataURI: string, overrides?: Overrides & { from?: string } ): Promise; @@ -1073,40 +1053,18 @@ export interface DelegationManager extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; - setMinWithdrawalDelayBlocks( - newMinWithdrawalDelayBlocks: BigNumberish, + slashOperatorShares( + operator: string, + strategy: string, + prevMaxMagnitude: BigNumberish, + newMaxMagnitude: BigNumberish, overrides?: Overrides & { from?: string } ): Promise; - setPauserRegistry( - newPauserRegistry: string, - overrides?: Overrides & { from?: string } - ): Promise; - - setStrategyWithdrawalDelayBlocks( - strategies: string[], - withdrawalDelayBlocks: BigNumberish[], - overrides?: Overrides & { from?: string } - ): Promise; - - slasher(overrides?: CallOverrides): Promise<[string]>; - - stakerNonce(arg0: string, overrides?: CallOverrides): Promise<[BigNumber]>; - - stakerOptOutWindowBlocks( - operator: string, - overrides?: CallOverrides - ): Promise<[BigNumber]>; - - strategyManager(overrides?: CallOverrides): Promise<[string]>; - - strategyWithdrawalDelayBlocks( - arg0: string, - overrides?: CallOverrides - ): Promise<[BigNumber]>; - - transferOwnership( - newOwner: string, + strategyManager(overrides?: CallOverrides): Promise<[string]>; + + transferOwnership( + newOwner: string, overrides?: Overrides & { from?: string } ): Promise; @@ -1121,99 +1079,75 @@ export interface DelegationManager extends BaseContract { ): Promise; updateOperatorMetadataURI( + operator: string, metadataURI: string, overrides?: Overrides & { from?: string } ): Promise; + + version(overrides?: CallOverrides): Promise<[string]>; }; DELEGATION_APPROVAL_TYPEHASH(overrides?: CallOverrides): Promise; - DOMAIN_TYPEHASH(overrides?: CallOverrides): Promise; - - MAX_STAKER_OPT_OUT_WINDOW_BLOCKS( - overrides?: CallOverrides - ): Promise; - - MAX_WITHDRAWAL_DELAY_BLOCKS(overrides?: CallOverrides): Promise; - - STAKER_DELEGATION_TYPEHASH(overrides?: CallOverrides): Promise; + allocationManager(overrides?: CallOverrides): Promise; beaconChainETHStrategy(overrides?: CallOverrides): Promise; - calculateCurrentStakerDelegationDigestHash( - staker: string, - operator: string, - expiry: BigNumberish, - overrides?: CallOverrides - ): Promise; - calculateDelegationApprovalDigestHash( staker: string, operator: string, - _delegationApprover: string, + approver: string, approverSalt: BytesLike, expiry: BigNumberish, overrides?: CallOverrides ): Promise; - calculateStakerDelegationDigestHash( - staker: string, - _stakerNonce: BigNumberish, - operator: string, - expiry: BigNumberish, - overrides?: CallOverrides - ): Promise; - calculateWithdrawalRoot( - withdrawal: IDelegationManager.WithdrawalStruct, + withdrawal: IDelegationManagerTypes.WithdrawalStruct, overrides?: CallOverrides ): Promise; completeQueuedWithdrawal( - withdrawal: IDelegationManager.WithdrawalStruct, + withdrawal: IDelegationManagerTypes.WithdrawalStruct, tokens: string[], - middlewareTimesIndex: BigNumberish, receiveAsTokens: boolean, overrides?: Overrides & { from?: string } ): Promise; completeQueuedWithdrawals( - withdrawals: IDelegationManager.WithdrawalStruct[], + withdrawals: IDelegationManagerTypes.WithdrawalStruct[], tokens: string[][], - middlewareTimesIndexes: BigNumberish[], receiveAsTokens: boolean[], overrides?: Overrides & { from?: string } ): Promise; + convertToDepositShares( + staker: string, + strategies: string[], + withdrawableShares: BigNumberish[], + overrides?: CallOverrides + ): Promise; + cumulativeWithdrawalsQueued( - arg0: string, + staker: string, overrides?: CallOverrides ): Promise; decreaseDelegatedShares( staker: string, - strategy: string, - shares: BigNumberish, + curDepositShares: BigNumberish, + beaconChainSlashingFactorDecrease: BigNumberish, overrides?: Overrides & { from?: string } ): Promise; delegateTo( operator: string, - approverSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, - approverSalt: BytesLike, - overrides?: Overrides & { from?: string } - ): Promise; - - delegateToBySignature( - staker: string, - operator: string, - stakerSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, - approverSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, + approverSignatureAndExpiry: ISignatureUtilsMixinTypes.SignatureWithExpiryStruct, approverSalt: BytesLike, overrides?: Overrides & { from?: string } ): Promise; - delegatedTo(arg0: string, overrides?: CallOverrides): Promise; + delegatedTo(staker: string, overrides?: CallOverrides): Promise; delegationApprover( operator: string, @@ -1221,16 +1155,22 @@ export interface DelegationManager extends BaseContract { ): Promise; delegationApproverSaltIsSpent( - arg0: string, - arg1: BytesLike, + delegationApprover: string, + salt: BytesLike, overrides?: CallOverrides ): Promise; + depositScalingFactor( + staker: string, + strategy: string, + overrides?: CallOverrides + ): Promise; + domainSeparator(overrides?: CallOverrides): Promise; eigenPodManager(overrides?: CallOverrides): Promise; - getDelegatableShares( + getDepositedShares( staker: string, overrides?: CallOverrides ): Promise<[string[], BigNumber[]]>; @@ -1241,25 +1181,65 @@ export interface DelegationManager extends BaseContract { overrides?: CallOverrides ): Promise; - getWithdrawalDelay( + getOperatorsShares( + operators: string[], strategies: string[], overrides?: CallOverrides + ): Promise; + + getQueuedWithdrawal( + withdrawalRoot: BytesLike, + overrides?: CallOverrides + ): Promise< + [IDelegationManagerTypes.WithdrawalStructOutput, BigNumber[]] & { + withdrawal: IDelegationManagerTypes.WithdrawalStructOutput; + shares: BigNumber[]; + } + >; + + getQueuedWithdrawalRoots( + staker: string, + overrides?: CallOverrides + ): Promise; + + getQueuedWithdrawals( + staker: string, + overrides?: CallOverrides + ): Promise< + [IDelegationManagerTypes.WithdrawalStructOutput[], BigNumber[][]] & { + withdrawals: IDelegationManagerTypes.WithdrawalStructOutput[]; + shares: BigNumber[][]; + } + >; + + getSlashableSharesInQueue( + operator: string, + strategy: string, + overrides?: CallOverrides ): Promise; + getWithdrawableShares( + staker: string, + strategies: string[], + overrides?: CallOverrides + ): Promise< + [BigNumber[], BigNumber[]] & { + withdrawableShares: BigNumber[]; + depositShares: BigNumber[]; + } + >; + increaseDelegatedShares( staker: string, strategy: string, - shares: BigNumberish, + prevDepositShares: BigNumberish, + addedShares: BigNumberish, overrides?: Overrides & { from?: string } ): Promise; initialize( initialOwner: string, - _pauserRegistry: string, initialPausedStatus: BigNumberish, - _minWithdrawalDelayBlocks: BigNumberish, - _strategies: string[], - _withdrawalDelayBlocks: BigNumberish[], overrides?: Overrides & { from?: string } ): Promise; @@ -1267,21 +1247,17 @@ export interface DelegationManager extends BaseContract { isOperator(operator: string, overrides?: CallOverrides): Promise; - minWithdrawalDelayBlocks(overrides?: CallOverrides): Promise; + minWithdrawalDelayBlocks(overrides?: CallOverrides): Promise; modifyOperatorDetails( - newOperatorDetails: IDelegationManager.OperatorDetailsStruct, + operator: string, + newDelegationApprover: string, overrides?: Overrides & { from?: string } ): Promise; - operatorDetails( - operator: string, - overrides?: CallOverrides - ): Promise; - operatorShares( - arg0: string, - arg1: string, + operator: string, + strategy: string, overrides?: CallOverrides ): Promise; @@ -1306,57 +1282,50 @@ export interface DelegationManager extends BaseContract { pauserRegistry(overrides?: CallOverrides): Promise; pendingWithdrawals( - arg0: BytesLike, + withdrawalRoot: BytesLike, overrides?: CallOverrides ): Promise; + permissionController(overrides?: CallOverrides): Promise; + queueWithdrawals( - queuedWithdrawalParams: IDelegationManager.QueuedWithdrawalParamsStruct[], + params: IDelegationManagerTypes.QueuedWithdrawalParamsStruct[], overrides?: Overrides & { from?: string } ): Promise; - registerAsOperator( - registeringOperatorDetails: IDelegationManager.OperatorDetailsStruct, - metadataURI: string, - overrides?: Overrides & { from?: string } - ): Promise; + queuedWithdrawals( + withdrawalRoot: BytesLike, + overrides?: CallOverrides + ): Promise; - renounceOwnership( + redelegate( + newOperator: string, + newOperatorApproverSig: ISignatureUtilsMixinTypes.SignatureWithExpiryStruct, + approverSalt: BytesLike, overrides?: Overrides & { from?: string } ): Promise; - setMinWithdrawalDelayBlocks( - newMinWithdrawalDelayBlocks: BigNumberish, + registerAsOperator( + initDelegationApprover: string, + allocationDelay: BigNumberish, + metadataURI: string, overrides?: Overrides & { from?: string } ): Promise; - setPauserRegistry( - newPauserRegistry: string, + renounceOwnership( overrides?: Overrides & { from?: string } ): Promise; - setStrategyWithdrawalDelayBlocks( - strategies: string[], - withdrawalDelayBlocks: BigNumberish[], + slashOperatorShares( + operator: string, + strategy: string, + prevMaxMagnitude: BigNumberish, + newMaxMagnitude: BigNumberish, overrides?: Overrides & { from?: string } ): Promise; - slasher(overrides?: CallOverrides): Promise; - - stakerNonce(arg0: string, overrides?: CallOverrides): Promise; - - stakerOptOutWindowBlocks( - operator: string, - overrides?: CallOverrides - ): Promise; - strategyManager(overrides?: CallOverrides): Promise; - strategyWithdrawalDelayBlocks( - arg0: string, - overrides?: CallOverrides - ): Promise; - transferOwnership( newOwner: string, overrides?: Overrides & { from?: string } @@ -1373,99 +1342,75 @@ export interface DelegationManager extends BaseContract { ): Promise; updateOperatorMetadataURI( + operator: string, metadataURI: string, overrides?: Overrides & { from?: string } ): Promise; + version(overrides?: CallOverrides): Promise; + callStatic: { DELEGATION_APPROVAL_TYPEHASH(overrides?: CallOverrides): Promise; - DOMAIN_TYPEHASH(overrides?: CallOverrides): Promise; - - MAX_STAKER_OPT_OUT_WINDOW_BLOCKS( - overrides?: CallOverrides - ): Promise; - - MAX_WITHDRAWAL_DELAY_BLOCKS(overrides?: CallOverrides): Promise; - - STAKER_DELEGATION_TYPEHASH(overrides?: CallOverrides): Promise; + allocationManager(overrides?: CallOverrides): Promise; beaconChainETHStrategy(overrides?: CallOverrides): Promise; - calculateCurrentStakerDelegationDigestHash( - staker: string, - operator: string, - expiry: BigNumberish, - overrides?: CallOverrides - ): Promise; - calculateDelegationApprovalDigestHash( staker: string, operator: string, - _delegationApprover: string, + approver: string, approverSalt: BytesLike, expiry: BigNumberish, overrides?: CallOverrides ): Promise; - calculateStakerDelegationDigestHash( - staker: string, - _stakerNonce: BigNumberish, - operator: string, - expiry: BigNumberish, - overrides?: CallOverrides - ): Promise; - calculateWithdrawalRoot( - withdrawal: IDelegationManager.WithdrawalStruct, + withdrawal: IDelegationManagerTypes.WithdrawalStruct, overrides?: CallOverrides ): Promise; completeQueuedWithdrawal( - withdrawal: IDelegationManager.WithdrawalStruct, + withdrawal: IDelegationManagerTypes.WithdrawalStruct, tokens: string[], - middlewareTimesIndex: BigNumberish, receiveAsTokens: boolean, overrides?: CallOverrides ): Promise; completeQueuedWithdrawals( - withdrawals: IDelegationManager.WithdrawalStruct[], + withdrawals: IDelegationManagerTypes.WithdrawalStruct[], tokens: string[][], - middlewareTimesIndexes: BigNumberish[], receiveAsTokens: boolean[], overrides?: CallOverrides ): Promise; + convertToDepositShares( + staker: string, + strategies: string[], + withdrawableShares: BigNumberish[], + overrides?: CallOverrides + ): Promise; + cumulativeWithdrawalsQueued( - arg0: string, + staker: string, overrides?: CallOverrides ): Promise; decreaseDelegatedShares( staker: string, - strategy: string, - shares: BigNumberish, + curDepositShares: BigNumberish, + beaconChainSlashingFactorDecrease: BigNumberish, overrides?: CallOverrides ): Promise; delegateTo( operator: string, - approverSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, - approverSalt: BytesLike, - overrides?: CallOverrides - ): Promise; - - delegateToBySignature( - staker: string, - operator: string, - stakerSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, - approverSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, + approverSignatureAndExpiry: ISignatureUtilsMixinTypes.SignatureWithExpiryStruct, approverSalt: BytesLike, overrides?: CallOverrides ): Promise; - delegatedTo(arg0: string, overrides?: CallOverrides): Promise; + delegatedTo(staker: string, overrides?: CallOverrides): Promise; delegationApprover( operator: string, @@ -1473,16 +1418,22 @@ export interface DelegationManager extends BaseContract { ): Promise; delegationApproverSaltIsSpent( - arg0: string, - arg1: BytesLike, + delegationApprover: string, + salt: BytesLike, overrides?: CallOverrides ): Promise; + depositScalingFactor( + staker: string, + strategy: string, + overrides?: CallOverrides + ): Promise; + domainSeparator(overrides?: CallOverrides): Promise; eigenPodManager(overrides?: CallOverrides): Promise; - getDelegatableShares( + getDepositedShares( staker: string, overrides?: CallOverrides ): Promise<[string[], BigNumber[]]>; @@ -1493,25 +1444,65 @@ export interface DelegationManager extends BaseContract { overrides?: CallOverrides ): Promise; - getWithdrawalDelay( + getOperatorsShares( + operators: string[], strategies: string[], overrides?: CallOverrides + ): Promise; + + getQueuedWithdrawal( + withdrawalRoot: BytesLike, + overrides?: CallOverrides + ): Promise< + [IDelegationManagerTypes.WithdrawalStructOutput, BigNumber[]] & { + withdrawal: IDelegationManagerTypes.WithdrawalStructOutput; + shares: BigNumber[]; + } + >; + + getQueuedWithdrawalRoots( + staker: string, + overrides?: CallOverrides + ): Promise; + + getQueuedWithdrawals( + staker: string, + overrides?: CallOverrides + ): Promise< + [IDelegationManagerTypes.WithdrawalStructOutput[], BigNumber[][]] & { + withdrawals: IDelegationManagerTypes.WithdrawalStructOutput[]; + shares: BigNumber[][]; + } + >; + + getSlashableSharesInQueue( + operator: string, + strategy: string, + overrides?: CallOverrides ): Promise; + getWithdrawableShares( + staker: string, + strategies: string[], + overrides?: CallOverrides + ): Promise< + [BigNumber[], BigNumber[]] & { + withdrawableShares: BigNumber[]; + depositShares: BigNumber[]; + } + >; + increaseDelegatedShares( staker: string, strategy: string, - shares: BigNumberish, + prevDepositShares: BigNumberish, + addedShares: BigNumberish, overrides?: CallOverrides ): Promise; initialize( initialOwner: string, - _pauserRegistry: string, initialPausedStatus: BigNumberish, - _minWithdrawalDelayBlocks: BigNumberish, - _strategies: string[], - _withdrawalDelayBlocks: BigNumberish[], overrides?: CallOverrides ): Promise; @@ -1519,21 +1510,17 @@ export interface DelegationManager extends BaseContract { isOperator(operator: string, overrides?: CallOverrides): Promise; - minWithdrawalDelayBlocks(overrides?: CallOverrides): Promise; + minWithdrawalDelayBlocks(overrides?: CallOverrides): Promise; modifyOperatorDetails( - newOperatorDetails: IDelegationManager.OperatorDetailsStruct, - overrides?: CallOverrides - ): Promise; - - operatorDetails( operator: string, + newDelegationApprover: string, overrides?: CallOverrides - ): Promise; + ): Promise; operatorShares( - arg0: string, - arg1: string, + operator: string, + strategy: string, overrides?: CallOverrides ): Promise; @@ -1556,55 +1543,48 @@ export interface DelegationManager extends BaseContract { pauserRegistry(overrides?: CallOverrides): Promise; pendingWithdrawals( - arg0: BytesLike, + withdrawalRoot: BytesLike, overrides?: CallOverrides ): Promise; + permissionController(overrides?: CallOverrides): Promise; + queueWithdrawals( - queuedWithdrawalParams: IDelegationManager.QueuedWithdrawalParamsStruct[], + params: IDelegationManagerTypes.QueuedWithdrawalParamsStruct[], overrides?: CallOverrides ): Promise; - registerAsOperator( - registeringOperatorDetails: IDelegationManager.OperatorDetailsStruct, - metadataURI: string, - overrides?: CallOverrides - ): Promise; - - renounceOwnership(overrides?: CallOverrides): Promise; - - setMinWithdrawalDelayBlocks( - newMinWithdrawalDelayBlocks: BigNumberish, + queuedWithdrawals( + withdrawalRoot: BytesLike, overrides?: CallOverrides - ): Promise; + ): Promise; - setPauserRegistry( - newPauserRegistry: string, + redelegate( + newOperator: string, + newOperatorApproverSig: ISignatureUtilsMixinTypes.SignatureWithExpiryStruct, + approverSalt: BytesLike, overrides?: CallOverrides - ): Promise; + ): Promise; - setStrategyWithdrawalDelayBlocks( - strategies: string[], - withdrawalDelayBlocks: BigNumberish[], + registerAsOperator( + initDelegationApprover: string, + allocationDelay: BigNumberish, + metadataURI: string, overrides?: CallOverrides ): Promise; - slasher(overrides?: CallOverrides): Promise; - - stakerNonce(arg0: string, overrides?: CallOverrides): Promise; + renounceOwnership(overrides?: CallOverrides): Promise; - stakerOptOutWindowBlocks( + slashOperatorShares( operator: string, + strategy: string, + prevMaxMagnitude: BigNumberish, + newMaxMagnitude: BigNumberish, overrides?: CallOverrides - ): Promise; + ): Promise; strategyManager(overrides?: CallOverrides): Promise; - strategyWithdrawalDelayBlocks( - arg0: string, - overrides?: CallOverrides - ): Promise; - transferOwnership( newOwner: string, overrides?: CallOverrides @@ -1618,32 +1598,37 @@ export interface DelegationManager extends BaseContract { ): Promise; updateOperatorMetadataURI( + operator: string, metadataURI: string, overrides?: CallOverrides ): Promise; + + version(overrides?: CallOverrides): Promise; }; filters: { - "Initialized(uint8)"(version?: null): InitializedEventFilter; - Initialized(version?: null): InitializedEventFilter; - - "MinWithdrawalDelayBlocksSet(uint256,uint256)"( - previousValue?: null, - newValue?: null - ): MinWithdrawalDelayBlocksSetEventFilter; - MinWithdrawalDelayBlocksSet( - previousValue?: null, - newValue?: null - ): MinWithdrawalDelayBlocksSetEventFilter; - - "OperatorDetailsModified(address,(address,address,uint32))"( + "DelegationApproverUpdated(address,address)"( operator?: string | null, - newOperatorDetails?: null - ): OperatorDetailsModifiedEventFilter; - OperatorDetailsModified( + newDelegationApprover?: null + ): DelegationApproverUpdatedEventFilter; + DelegationApproverUpdated( operator?: string | null, - newOperatorDetails?: null - ): OperatorDetailsModifiedEventFilter; + newDelegationApprover?: null + ): DelegationApproverUpdatedEventFilter; + + "DepositScalingFactorUpdated(address,address,uint256)"( + staker?: null, + strategy?: null, + newDepositScalingFactor?: null + ): DepositScalingFactorUpdatedEventFilter; + DepositScalingFactorUpdated( + staker?: null, + strategy?: null, + newDepositScalingFactor?: null + ): DepositScalingFactorUpdatedEventFilter; + + "Initialized(uint8)"(version?: null): InitializedEventFilter; + Initialized(version?: null): InitializedEventFilter; "OperatorMetadataURIUpdated(address,string)"( operator?: string | null, @@ -1654,13 +1639,13 @@ export interface DelegationManager extends BaseContract { metadataURI?: null ): OperatorMetadataURIUpdatedEventFilter; - "OperatorRegistered(address,(address,address,uint32))"( + "OperatorRegistered(address,address)"( operator?: string | null, - operatorDetails?: null + delegationApprover?: null ): OperatorRegisteredEventFilter; OperatorRegistered( operator?: string | null, - operatorDetails?: null + delegationApprover?: null ): OperatorRegisteredEventFilter; "OperatorSharesDecreased(address,address,address,uint256)"( @@ -1689,6 +1674,17 @@ export interface DelegationManager extends BaseContract { shares?: null ): OperatorSharesIncreasedEventFilter; + "OperatorSharesSlashed(address,address,uint256)"( + operator?: string | null, + strategy?: null, + totalSlashedShares?: null + ): OperatorSharesSlashedEventFilter; + OperatorSharesSlashed( + operator?: string | null, + strategy?: null, + totalSlashedShares?: null + ): OperatorSharesSlashedEventFilter; + "OwnershipTransferred(address,address)"( previousOwner?: string | null, newOwner?: string | null @@ -1704,14 +1700,23 @@ export interface DelegationManager extends BaseContract { ): PausedEventFilter; Paused(account?: string | null, newPausedStatus?: null): PausedEventFilter; - "PauserRegistrySet(address,address)"( - pauserRegistry?: null, - newPauserRegistry?: null - ): PauserRegistrySetEventFilter; - PauserRegistrySet( - pauserRegistry?: null, - newPauserRegistry?: null - ): PauserRegistrySetEventFilter; + "SlashingWithdrawalCompleted(bytes32)"( + withdrawalRoot?: null + ): SlashingWithdrawalCompletedEventFilter; + SlashingWithdrawalCompleted( + withdrawalRoot?: null + ): SlashingWithdrawalCompletedEventFilter; + + "SlashingWithdrawalQueued(bytes32,(address,address,address,uint256,uint32,address[],uint256[]),uint256[])"( + withdrawalRoot?: null, + withdrawal?: null, + sharesToWithdraw?: null + ): SlashingWithdrawalQueuedEventFilter; + SlashingWithdrawalQueued( + withdrawalRoot?: null, + withdrawal?: null, + sharesToWithdraw?: null + ): SlashingWithdrawalQueuedEventFilter; "StakerDelegated(address,address)"( staker?: string | null, @@ -1740,17 +1745,6 @@ export interface DelegationManager extends BaseContract { operator?: string | null ): StakerUndelegatedEventFilter; - "StrategyWithdrawalDelayBlocksSet(address,uint256,uint256)"( - strategy?: null, - previousValue?: null, - newValue?: null - ): StrategyWithdrawalDelayBlocksSetEventFilter; - StrategyWithdrawalDelayBlocksSet( - strategy?: null, - previousValue?: null, - newValue?: null - ): StrategyWithdrawalDelayBlocksSetEventFilter; - "Unpaused(address,uint256)"( account?: string | null, newPausedStatus?: null @@ -1759,111 +1753,70 @@ export interface DelegationManager extends BaseContract { account?: string | null, newPausedStatus?: null ): UnpausedEventFilter; - - "WithdrawalCompleted(bytes32)"( - withdrawalRoot?: null - ): WithdrawalCompletedEventFilter; - WithdrawalCompleted(withdrawalRoot?: null): WithdrawalCompletedEventFilter; - - "WithdrawalQueued(bytes32,(address,address,address,uint256,uint32,address[],uint256[]))"( - withdrawalRoot?: null, - withdrawal?: null - ): WithdrawalQueuedEventFilter; - WithdrawalQueued( - withdrawalRoot?: null, - withdrawal?: null - ): WithdrawalQueuedEventFilter; }; estimateGas: { DELEGATION_APPROVAL_TYPEHASH(overrides?: CallOverrides): Promise; - DOMAIN_TYPEHASH(overrides?: CallOverrides): Promise; - - MAX_STAKER_OPT_OUT_WINDOW_BLOCKS( - overrides?: CallOverrides - ): Promise; - - MAX_WITHDRAWAL_DELAY_BLOCKS(overrides?: CallOverrides): Promise; - - STAKER_DELEGATION_TYPEHASH(overrides?: CallOverrides): Promise; + allocationManager(overrides?: CallOverrides): Promise; beaconChainETHStrategy(overrides?: CallOverrides): Promise; - calculateCurrentStakerDelegationDigestHash( - staker: string, - operator: string, - expiry: BigNumberish, - overrides?: CallOverrides - ): Promise; - calculateDelegationApprovalDigestHash( staker: string, operator: string, - _delegationApprover: string, + approver: string, approverSalt: BytesLike, expiry: BigNumberish, overrides?: CallOverrides ): Promise; - calculateStakerDelegationDigestHash( - staker: string, - _stakerNonce: BigNumberish, - operator: string, - expiry: BigNumberish, - overrides?: CallOverrides - ): Promise; - calculateWithdrawalRoot( - withdrawal: IDelegationManager.WithdrawalStruct, + withdrawal: IDelegationManagerTypes.WithdrawalStruct, overrides?: CallOverrides ): Promise; completeQueuedWithdrawal( - withdrawal: IDelegationManager.WithdrawalStruct, + withdrawal: IDelegationManagerTypes.WithdrawalStruct, tokens: string[], - middlewareTimesIndex: BigNumberish, receiveAsTokens: boolean, overrides?: Overrides & { from?: string } ): Promise; completeQueuedWithdrawals( - withdrawals: IDelegationManager.WithdrawalStruct[], + withdrawals: IDelegationManagerTypes.WithdrawalStruct[], tokens: string[][], - middlewareTimesIndexes: BigNumberish[], receiveAsTokens: boolean[], overrides?: Overrides & { from?: string } ): Promise; + convertToDepositShares( + staker: string, + strategies: string[], + withdrawableShares: BigNumberish[], + overrides?: CallOverrides + ): Promise; + cumulativeWithdrawalsQueued( - arg0: string, + staker: string, overrides?: CallOverrides ): Promise; decreaseDelegatedShares( staker: string, - strategy: string, - shares: BigNumberish, + curDepositShares: BigNumberish, + beaconChainSlashingFactorDecrease: BigNumberish, overrides?: Overrides & { from?: string } ): Promise; delegateTo( operator: string, - approverSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, - approverSalt: BytesLike, - overrides?: Overrides & { from?: string } - ): Promise; - - delegateToBySignature( - staker: string, - operator: string, - stakerSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, - approverSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, + approverSignatureAndExpiry: ISignatureUtilsMixinTypes.SignatureWithExpiryStruct, approverSalt: BytesLike, overrides?: Overrides & { from?: string } ): Promise; - delegatedTo(arg0: string, overrides?: CallOverrides): Promise; + delegatedTo(staker: string, overrides?: CallOverrides): Promise; delegationApprover( operator: string, @@ -1871,8 +1824,14 @@ export interface DelegationManager extends BaseContract { ): Promise; delegationApproverSaltIsSpent( - arg0: string, - arg1: BytesLike, + delegationApprover: string, + salt: BytesLike, + overrides?: CallOverrides + ): Promise; + + depositScalingFactor( + staker: string, + strategy: string, overrides?: CallOverrides ): Promise; @@ -1880,7 +1839,7 @@ export interface DelegationManager extends BaseContract { eigenPodManager(overrides?: CallOverrides): Promise; - getDelegatableShares( + getDepositedShares( staker: string, overrides?: CallOverrides ): Promise; @@ -1891,7 +1850,35 @@ export interface DelegationManager extends BaseContract { overrides?: CallOverrides ): Promise; - getWithdrawalDelay( + getOperatorsShares( + operators: string[], + strategies: string[], + overrides?: CallOverrides + ): Promise; + + getQueuedWithdrawal( + withdrawalRoot: BytesLike, + overrides?: CallOverrides + ): Promise; + + getQueuedWithdrawalRoots( + staker: string, + overrides?: CallOverrides + ): Promise; + + getQueuedWithdrawals( + staker: string, + overrides?: CallOverrides + ): Promise; + + getSlashableSharesInQueue( + operator: string, + strategy: string, + overrides?: CallOverrides + ): Promise; + + getWithdrawableShares( + staker: string, strategies: string[], overrides?: CallOverrides ): Promise; @@ -1899,17 +1886,14 @@ export interface DelegationManager extends BaseContract { increaseDelegatedShares( staker: string, strategy: string, - shares: BigNumberish, + prevDepositShares: BigNumberish, + addedShares: BigNumberish, overrides?: Overrides & { from?: string } ): Promise; initialize( initialOwner: string, - _pauserRegistry: string, initialPausedStatus: BigNumberish, - _minWithdrawalDelayBlocks: BigNumberish, - _strategies: string[], - _withdrawalDelayBlocks: BigNumberish[], overrides?: Overrides & { from?: string } ): Promise; @@ -1920,18 +1904,14 @@ export interface DelegationManager extends BaseContract { minWithdrawalDelayBlocks(overrides?: CallOverrides): Promise; modifyOperatorDetails( - newOperatorDetails: IDelegationManager.OperatorDetailsStruct, - overrides?: Overrides & { from?: string } - ): Promise; - - operatorDetails( operator: string, - overrides?: CallOverrides + newDelegationApprover: string, + overrides?: Overrides & { from?: string } ): Promise; operatorShares( - arg0: string, - arg1: string, + operator: string, + strategy: string, overrides?: CallOverrides ): Promise; @@ -1954,57 +1934,50 @@ export interface DelegationManager extends BaseContract { pauserRegistry(overrides?: CallOverrides): Promise; pendingWithdrawals( - arg0: BytesLike, + withdrawalRoot: BytesLike, overrides?: CallOverrides ): Promise; - queueWithdrawals( - queuedWithdrawalParams: IDelegationManager.QueuedWithdrawalParamsStruct[], - overrides?: Overrides & { from?: string } - ): Promise; + permissionController(overrides?: CallOverrides): Promise; - registerAsOperator( - registeringOperatorDetails: IDelegationManager.OperatorDetailsStruct, - metadataURI: string, + queueWithdrawals( + params: IDelegationManagerTypes.QueuedWithdrawalParamsStruct[], overrides?: Overrides & { from?: string } ): Promise; - renounceOwnership( - overrides?: Overrides & { from?: string } + queuedWithdrawals( + withdrawalRoot: BytesLike, + overrides?: CallOverrides ): Promise; - setMinWithdrawalDelayBlocks( - newMinWithdrawalDelayBlocks: BigNumberish, + redelegate( + newOperator: string, + newOperatorApproverSig: ISignatureUtilsMixinTypes.SignatureWithExpiryStruct, + approverSalt: BytesLike, overrides?: Overrides & { from?: string } ): Promise; - setPauserRegistry( - newPauserRegistry: string, + registerAsOperator( + initDelegationApprover: string, + allocationDelay: BigNumberish, + metadataURI: string, overrides?: Overrides & { from?: string } ): Promise; - setStrategyWithdrawalDelayBlocks( - strategies: string[], - withdrawalDelayBlocks: BigNumberish[], + renounceOwnership( overrides?: Overrides & { from?: string } ): Promise; - slasher(overrides?: CallOverrides): Promise; - - stakerNonce(arg0: string, overrides?: CallOverrides): Promise; - - stakerOptOutWindowBlocks( + slashOperatorShares( operator: string, - overrides?: CallOverrides + strategy: string, + prevMaxMagnitude: BigNumberish, + newMaxMagnitude: BigNumberish, + overrides?: Overrides & { from?: string } ): Promise; strategyManager(overrides?: CallOverrides): Promise; - strategyWithdrawalDelayBlocks( - arg0: string, - overrides?: CallOverrides - ): Promise; - transferOwnership( newOwner: string, overrides?: Overrides & { from?: string } @@ -2021,9 +1994,12 @@ export interface DelegationManager extends BaseContract { ): Promise; updateOperatorMetadataURI( + operator: string, metadataURI: string, overrides?: Overrides & { from?: string } ): Promise; + + version(overrides?: CallOverrides): Promise; }; populateTransaction: { @@ -2031,99 +2007,68 @@ export interface DelegationManager extends BaseContract { overrides?: CallOverrides ): Promise; - DOMAIN_TYPEHASH(overrides?: CallOverrides): Promise; - - MAX_STAKER_OPT_OUT_WINDOW_BLOCKS( - overrides?: CallOverrides - ): Promise; - - MAX_WITHDRAWAL_DELAY_BLOCKS( - overrides?: CallOverrides - ): Promise; - - STAKER_DELEGATION_TYPEHASH( - overrides?: CallOverrides - ): Promise; + allocationManager(overrides?: CallOverrides): Promise; beaconChainETHStrategy( overrides?: CallOverrides ): Promise; - calculateCurrentStakerDelegationDigestHash( - staker: string, - operator: string, - expiry: BigNumberish, - overrides?: CallOverrides - ): Promise; - calculateDelegationApprovalDigestHash( staker: string, operator: string, - _delegationApprover: string, + approver: string, approverSalt: BytesLike, expiry: BigNumberish, overrides?: CallOverrides ): Promise; - calculateStakerDelegationDigestHash( - staker: string, - _stakerNonce: BigNumberish, - operator: string, - expiry: BigNumberish, - overrides?: CallOverrides - ): Promise; - calculateWithdrawalRoot( - withdrawal: IDelegationManager.WithdrawalStruct, + withdrawal: IDelegationManagerTypes.WithdrawalStruct, overrides?: CallOverrides ): Promise; completeQueuedWithdrawal( - withdrawal: IDelegationManager.WithdrawalStruct, + withdrawal: IDelegationManagerTypes.WithdrawalStruct, tokens: string[], - middlewareTimesIndex: BigNumberish, receiveAsTokens: boolean, overrides?: Overrides & { from?: string } ): Promise; completeQueuedWithdrawals( - withdrawals: IDelegationManager.WithdrawalStruct[], + withdrawals: IDelegationManagerTypes.WithdrawalStruct[], tokens: string[][], - middlewareTimesIndexes: BigNumberish[], receiveAsTokens: boolean[], overrides?: Overrides & { from?: string } ): Promise; + convertToDepositShares( + staker: string, + strategies: string[], + withdrawableShares: BigNumberish[], + overrides?: CallOverrides + ): Promise; + cumulativeWithdrawalsQueued( - arg0: string, + staker: string, overrides?: CallOverrides ): Promise; decreaseDelegatedShares( staker: string, - strategy: string, - shares: BigNumberish, + curDepositShares: BigNumberish, + beaconChainSlashingFactorDecrease: BigNumberish, overrides?: Overrides & { from?: string } ): Promise; delegateTo( operator: string, - approverSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, - approverSalt: BytesLike, - overrides?: Overrides & { from?: string } - ): Promise; - - delegateToBySignature( - staker: string, - operator: string, - stakerSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, - approverSignatureAndExpiry: ISignatureUtils.SignatureWithExpiryStruct, + approverSignatureAndExpiry: ISignatureUtilsMixinTypes.SignatureWithExpiryStruct, approverSalt: BytesLike, overrides?: Overrides & { from?: string } ): Promise; delegatedTo( - arg0: string, + staker: string, overrides?: CallOverrides ): Promise; @@ -2133,8 +2078,14 @@ export interface DelegationManager extends BaseContract { ): Promise; delegationApproverSaltIsSpent( - arg0: string, - arg1: BytesLike, + delegationApprover: string, + salt: BytesLike, + overrides?: CallOverrides + ): Promise; + + depositScalingFactor( + staker: string, + strategy: string, overrides?: CallOverrides ): Promise; @@ -2142,7 +2093,7 @@ export interface DelegationManager extends BaseContract { eigenPodManager(overrides?: CallOverrides): Promise; - getDelegatableShares( + getDepositedShares( staker: string, overrides?: CallOverrides ): Promise; @@ -2153,7 +2104,35 @@ export interface DelegationManager extends BaseContract { overrides?: CallOverrides ): Promise; - getWithdrawalDelay( + getOperatorsShares( + operators: string[], + strategies: string[], + overrides?: CallOverrides + ): Promise; + + getQueuedWithdrawal( + withdrawalRoot: BytesLike, + overrides?: CallOverrides + ): Promise; + + getQueuedWithdrawalRoots( + staker: string, + overrides?: CallOverrides + ): Promise; + + getQueuedWithdrawals( + staker: string, + overrides?: CallOverrides + ): Promise; + + getSlashableSharesInQueue( + operator: string, + strategy: string, + overrides?: CallOverrides + ): Promise; + + getWithdrawableShares( + staker: string, strategies: string[], overrides?: CallOverrides ): Promise; @@ -2161,17 +2140,14 @@ export interface DelegationManager extends BaseContract { increaseDelegatedShares( staker: string, strategy: string, - shares: BigNumberish, + prevDepositShares: BigNumberish, + addedShares: BigNumberish, overrides?: Overrides & { from?: string } ): Promise; initialize( initialOwner: string, - _pauserRegistry: string, initialPausedStatus: BigNumberish, - _minWithdrawalDelayBlocks: BigNumberish, - _strategies: string[], - _withdrawalDelayBlocks: BigNumberish[], overrides?: Overrides & { from?: string } ): Promise; @@ -2190,18 +2166,14 @@ export interface DelegationManager extends BaseContract { ): Promise; modifyOperatorDetails( - newOperatorDetails: IDelegationManager.OperatorDetailsStruct, - overrides?: Overrides & { from?: string } - ): Promise; - - operatorDetails( operator: string, - overrides?: CallOverrides + newDelegationApprover: string, + overrides?: Overrides & { from?: string } ): Promise; operatorShares( - arg0: string, - arg1: string, + operator: string, + strategy: string, overrides?: CallOverrides ): Promise; @@ -2226,60 +2198,52 @@ export interface DelegationManager extends BaseContract { pauserRegistry(overrides?: CallOverrides): Promise; pendingWithdrawals( - arg0: BytesLike, + withdrawalRoot: BytesLike, overrides?: CallOverrides ): Promise; - queueWithdrawals( - queuedWithdrawalParams: IDelegationManager.QueuedWithdrawalParamsStruct[], - overrides?: Overrides & { from?: string } + permissionController( + overrides?: CallOverrides ): Promise; - registerAsOperator( - registeringOperatorDetails: IDelegationManager.OperatorDetailsStruct, - metadataURI: string, + queueWithdrawals( + params: IDelegationManagerTypes.QueuedWithdrawalParamsStruct[], overrides?: Overrides & { from?: string } ): Promise; - renounceOwnership( - overrides?: Overrides & { from?: string } + queuedWithdrawals( + withdrawalRoot: BytesLike, + overrides?: CallOverrides ): Promise; - setMinWithdrawalDelayBlocks( - newMinWithdrawalDelayBlocks: BigNumberish, + redelegate( + newOperator: string, + newOperatorApproverSig: ISignatureUtilsMixinTypes.SignatureWithExpiryStruct, + approverSalt: BytesLike, overrides?: Overrides & { from?: string } ): Promise; - setPauserRegistry( - newPauserRegistry: string, + registerAsOperator( + initDelegationApprover: string, + allocationDelay: BigNumberish, + metadataURI: string, overrides?: Overrides & { from?: string } ): Promise; - setStrategyWithdrawalDelayBlocks( - strategies: string[], - withdrawalDelayBlocks: BigNumberish[], + renounceOwnership( overrides?: Overrides & { from?: string } ): Promise; - slasher(overrides?: CallOverrides): Promise; - - stakerNonce( - arg0: string, - overrides?: CallOverrides - ): Promise; - - stakerOptOutWindowBlocks( + slashOperatorShares( operator: string, - overrides?: CallOverrides + strategy: string, + prevMaxMagnitude: BigNumberish, + newMaxMagnitude: BigNumberish, + overrides?: Overrides & { from?: string } ): Promise; strategyManager(overrides?: CallOverrides): Promise; - strategyWithdrawalDelayBlocks( - arg0: string, - overrides?: CallOverrides - ): Promise; - transferOwnership( newOwner: string, overrides?: Overrides & { from?: string } @@ -2296,8 +2260,11 @@ export interface DelegationManager extends BaseContract { ): Promise; updateOperatorMetadataURI( + operator: string, metadataURI: string, overrides?: Overrides & { from?: string } ): Promise; + + version(overrides?: CallOverrides): Promise; }; } diff --git a/src/avs/contracts/ECDSAStakeRegistry.ts b/src/avs/contracts/ECDSAStakeRegistry.ts index d2843ca1..048e4455 100644 --- a/src/avs/contracts/ECDSAStakeRegistry.ts +++ b/src/avs/contracts/ECDSAStakeRegistry.ts @@ -26,23 +26,27 @@ import type { OnEvent, } from "./common"; -export type StrategyParamsStruct = { - strategy: string; - multiplier: BigNumberish; -}; +export declare namespace IECDSAStakeRegistryTypes { + export type StrategyParamsStruct = { + strategy: string; + multiplier: BigNumberish; + }; -export type StrategyParamsStructOutput = [string, BigNumber] & { - strategy: string; - multiplier: BigNumber; -}; + export type StrategyParamsStructOutput = [string, BigNumber] & { + strategy: string; + multiplier: BigNumber; + }; -export type QuorumStruct = { strategies: StrategyParamsStruct[] }; + export type QuorumStruct = { + strategies: IECDSAStakeRegistryTypes.StrategyParamsStruct[]; + }; -export type QuorumStructOutput = [StrategyParamsStructOutput[]] & { - strategies: StrategyParamsStructOutput[]; -}; + export type QuorumStructOutput = [ + IECDSAStakeRegistryTypes.StrategyParamsStructOutput[] + ] & { strategies: IECDSAStakeRegistryTypes.StrategyParamsStructOutput[] }; +} -export declare namespace ISignatureUtils { +export declare namespace ISignatureUtilsMixinTypes { export type SignatureWithSaltAndExpiryStruct = { signature: BytesLike; salt: BytesLike; @@ -64,7 +68,7 @@ export interface ECDSAStakeRegistryInterface extends utils.Interface { "getLastCheckpointThresholdWeightAtBlock(uint32)": FunctionFragment; "getLastCheckpointTotalWeight()": FunctionFragment; "getLastCheckpointTotalWeightAtBlock(uint32)": FunctionFragment; - "getLastestOperatorSigningKey(address)": FunctionFragment; + "getLatestOperatorSigningKey(address)": FunctionFragment; "getOperatorSigningKeyAtBlock(address,uint256)": FunctionFragment; "getOperatorWeight(address)": FunctionFragment; "getOperatorWeightAtBlock(address,uint32)": FunctionFragment; @@ -93,7 +97,7 @@ export interface ECDSAStakeRegistryInterface extends utils.Interface { | "getLastCheckpointThresholdWeightAtBlock" | "getLastCheckpointTotalWeight" | "getLastCheckpointTotalWeightAtBlock" - | "getLastestOperatorSigningKey" + | "getLatestOperatorSigningKey" | "getOperatorSigningKeyAtBlock" | "getOperatorWeight" | "getOperatorWeightAtBlock" @@ -139,7 +143,7 @@ export interface ECDSAStakeRegistryInterface extends utils.Interface { values: [BigNumberish] ): string; encodeFunctionData( - functionFragment: "getLastestOperatorSigningKey", + functionFragment: "getLatestOperatorSigningKey", values: [string] ): string; encodeFunctionData( @@ -156,7 +160,7 @@ export interface ECDSAStakeRegistryInterface extends utils.Interface { ): string; encodeFunctionData( functionFragment: "initialize", - values: [string, BigNumberish, QuorumStruct] + values: [string, BigNumberish, IECDSAStakeRegistryTypes.QuorumStruct] ): string; encodeFunctionData( functionFragment: "isValidSignature", @@ -174,7 +178,7 @@ export interface ECDSAStakeRegistryInterface extends utils.Interface { encodeFunctionData(functionFragment: "quorum", values?: undefined): string; encodeFunctionData( functionFragment: "registerOperatorWithSignature", - values: [ISignatureUtils.SignatureWithSaltAndExpiryStruct, string] + values: [ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiryStruct, string] ): string; encodeFunctionData( functionFragment: "renounceOwnership", @@ -202,7 +206,7 @@ export interface ECDSAStakeRegistryInterface extends utils.Interface { ): string; encodeFunctionData( functionFragment: "updateQuorumConfig", - values: [QuorumStruct, string[]] + values: [IECDSAStakeRegistryTypes.QuorumStruct, string[]] ): string; encodeFunctionData( functionFragment: "updateStakeThreshold", @@ -234,7 +238,7 @@ export interface ECDSAStakeRegistryInterface extends utils.Interface { data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "getLastestOperatorSigningKey", + functionFragment: "getLatestOperatorSigningKey", data: BytesLike ): Result; decodeFunctionResult( @@ -336,8 +340,8 @@ export type InitializedEvent = TypedEvent<[number], InitializedEventObject>; export type InitializedEventFilter = TypedEventFilter; export interface MinimumWeightUpdatedEventObject { - _old: BigNumber; - _new: BigNumber; + previous: BigNumber; + current: BigNumber; } export type MinimumWeightUpdatedEvent = TypedEvent< [BigNumber, BigNumber], @@ -348,8 +352,8 @@ export type MinimumWeightUpdatedEventFilter = TypedEventFilter; export interface OperatorDeregisteredEventObject { - _operator: string; - _avs: string; + operator: string; + avs: string; } export type OperatorDeregisteredEvent = TypedEvent< [string, string], @@ -360,8 +364,8 @@ export type OperatorDeregisteredEventFilter = TypedEventFilter; export interface OperatorRegisteredEventObject { - _operator: string; - _avs: string; + operator: string; + avs: string; } export type OperatorRegisteredEvent = TypedEvent< [string, string], @@ -372,7 +376,7 @@ export type OperatorRegisteredEventFilter = TypedEventFilter; export interface OperatorWeightUpdatedEventObject { - _operator: string; + operator: string; oldWeight: BigNumber; newWeight: BigNumber; } @@ -397,11 +401,14 @@ export type OwnershipTransferredEventFilter = TypedEventFilter; export interface QuorumUpdatedEventObject { - _old: QuorumStructOutput; - _new: QuorumStructOutput; + previous: IECDSAStakeRegistryTypes.QuorumStructOutput; + current: IECDSAStakeRegistryTypes.QuorumStructOutput; } export type QuorumUpdatedEvent = TypedEvent< - [QuorumStructOutput, QuorumStructOutput], + [ + IECDSAStakeRegistryTypes.QuorumStructOutput, + IECDSAStakeRegistryTypes.QuorumStructOutput + ], QuorumUpdatedEventObject >; @@ -422,7 +429,7 @@ export type SigningKeyUpdateEventFilter = TypedEventFilter; export interface ThresholdWeightUpdatedEventObject { - _thresholdWeight: BigNumber; + thresholdWeight: BigNumber; } export type ThresholdWeightUpdatedEvent = TypedEvent< [BigNumber], @@ -488,7 +495,7 @@ export interface ECDSAStakeRegistry extends BaseContract { ): Promise; getLastCheckpointOperatorWeight( - _operator: string, + operator: string, overrides?: CallOverrides ): Promise<[BigNumber]>; @@ -497,7 +504,7 @@ export interface ECDSAStakeRegistry extends BaseContract { ): Promise<[BigNumber]>; getLastCheckpointThresholdWeightAtBlock( - _blockNumber: BigNumberish, + blockNumber: BigNumberish, overrides?: CallOverrides ): Promise<[BigNumber]>; @@ -506,41 +513,41 @@ export interface ECDSAStakeRegistry extends BaseContract { ): Promise<[BigNumber]>; getLastCheckpointTotalWeightAtBlock( - _blockNumber: BigNumberish, + blockNumber: BigNumberish, overrides?: CallOverrides ): Promise<[BigNumber]>; - getLastestOperatorSigningKey( - _operator: string, + getLatestOperatorSigningKey( + operator: string, overrides?: CallOverrides ): Promise<[string]>; getOperatorSigningKeyAtBlock( - _operator: string, - _blockNumber: BigNumberish, + operator: string, + blockNumber: BigNumberish, overrides?: CallOverrides ): Promise<[string]>; getOperatorWeight( - _operator: string, + operator: string, overrides?: CallOverrides ): Promise<[BigNumber]>; getOperatorWeightAtBlock( - _operator: string, - _blockNumber: BigNumberish, + operator: string, + blockNumber: BigNumberish, overrides?: CallOverrides ): Promise<[BigNumber]>; initialize( _serviceManager: string, - _thresholdWeight: BigNumberish, - _quorum: QuorumStruct, + thresholdWeight: BigNumberish, + quorum: IECDSAStakeRegistryTypes.QuorumStruct, overrides?: Overrides & { from?: string } ): Promise; isValidSignature( - _dataHash: BytesLike, + digest: BytesLike, _signatureData: BytesLike, overrides?: CallOverrides ): Promise<[string]>; @@ -548,17 +555,19 @@ export interface ECDSAStakeRegistry extends BaseContract { minimumWeight(overrides?: CallOverrides): Promise<[BigNumber]>; operatorRegistered( - _operator: string, + operator: string, overrides?: CallOverrides ): Promise<[boolean]>; owner(overrides?: CallOverrides): Promise<[string]>; - quorum(overrides?: CallOverrides): Promise<[QuorumStructOutput]>; + quorum( + overrides?: CallOverrides + ): Promise<[IECDSAStakeRegistryTypes.QuorumStructOutput]>; registerOperatorWithSignature( - _operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, - _signingKey: string, + operatorSignature: ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiryStruct, + signingKey: string, overrides?: Overrides & { from?: string } ): Promise; @@ -572,18 +581,18 @@ export interface ECDSAStakeRegistry extends BaseContract { ): Promise; updateMinimumWeight( - _newMinimumWeight: BigNumberish, - _operators: string[], + newMinimumWeight: BigNumberish, + operators: string[], overrides?: Overrides & { from?: string } ): Promise; updateOperatorSigningKey( - _newSigningKey: string, + newSigningKey: string, overrides?: Overrides & { from?: string } ): Promise; updateOperators( - _operators: string[], + operators: string[], overrides?: Overrides & { from?: string } ): Promise; @@ -594,13 +603,13 @@ export interface ECDSAStakeRegistry extends BaseContract { ): Promise; updateQuorumConfig( - _quorum: QuorumStruct, - _operators: string[], + quorum: IECDSAStakeRegistryTypes.QuorumStruct, + operators: string[], overrides?: Overrides & { from?: string } ): Promise; updateStakeThreshold( - _thresholdWeight: BigNumberish, + thresholdWeight: BigNumberish, overrides?: Overrides & { from?: string } ): Promise; }; @@ -610,7 +619,7 @@ export interface ECDSAStakeRegistry extends BaseContract { ): Promise; getLastCheckpointOperatorWeight( - _operator: string, + operator: string, overrides?: CallOverrides ): Promise; @@ -619,48 +628,48 @@ export interface ECDSAStakeRegistry extends BaseContract { ): Promise; getLastCheckpointThresholdWeightAtBlock( - _blockNumber: BigNumberish, + blockNumber: BigNumberish, overrides?: CallOverrides ): Promise; getLastCheckpointTotalWeight(overrides?: CallOverrides): Promise; getLastCheckpointTotalWeightAtBlock( - _blockNumber: BigNumberish, + blockNumber: BigNumberish, overrides?: CallOverrides ): Promise; - getLastestOperatorSigningKey( - _operator: string, + getLatestOperatorSigningKey( + operator: string, overrides?: CallOverrides ): Promise; getOperatorSigningKeyAtBlock( - _operator: string, - _blockNumber: BigNumberish, + operator: string, + blockNumber: BigNumberish, overrides?: CallOverrides ): Promise; getOperatorWeight( - _operator: string, + operator: string, overrides?: CallOverrides ): Promise; getOperatorWeightAtBlock( - _operator: string, - _blockNumber: BigNumberish, + operator: string, + blockNumber: BigNumberish, overrides?: CallOverrides ): Promise; initialize( _serviceManager: string, - _thresholdWeight: BigNumberish, - _quorum: QuorumStruct, + thresholdWeight: BigNumberish, + quorum: IECDSAStakeRegistryTypes.QuorumStruct, overrides?: Overrides & { from?: string } ): Promise; isValidSignature( - _dataHash: BytesLike, + digest: BytesLike, _signatureData: BytesLike, overrides?: CallOverrides ): Promise; @@ -668,17 +677,19 @@ export interface ECDSAStakeRegistry extends BaseContract { minimumWeight(overrides?: CallOverrides): Promise; operatorRegistered( - _operator: string, + operator: string, overrides?: CallOverrides ): Promise; owner(overrides?: CallOverrides): Promise; - quorum(overrides?: CallOverrides): Promise; + quorum( + overrides?: CallOverrides + ): Promise; registerOperatorWithSignature( - _operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, - _signingKey: string, + operatorSignature: ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiryStruct, + signingKey: string, overrides?: Overrides & { from?: string } ): Promise; @@ -692,18 +703,18 @@ export interface ECDSAStakeRegistry extends BaseContract { ): Promise; updateMinimumWeight( - _newMinimumWeight: BigNumberish, - _operators: string[], + newMinimumWeight: BigNumberish, + operators: string[], overrides?: Overrides & { from?: string } ): Promise; updateOperatorSigningKey( - _newSigningKey: string, + newSigningKey: string, overrides?: Overrides & { from?: string } ): Promise; updateOperators( - _operators: string[], + operators: string[], overrides?: Overrides & { from?: string } ): Promise; @@ -714,13 +725,13 @@ export interface ECDSAStakeRegistry extends BaseContract { ): Promise; updateQuorumConfig( - _quorum: QuorumStruct, - _operators: string[], + quorum: IECDSAStakeRegistryTypes.QuorumStruct, + operators: string[], overrides?: Overrides & { from?: string } ): Promise; updateStakeThreshold( - _thresholdWeight: BigNumberish, + thresholdWeight: BigNumberish, overrides?: Overrides & { from?: string } ): Promise; @@ -728,7 +739,7 @@ export interface ECDSAStakeRegistry extends BaseContract { deregisterOperator(overrides?: CallOverrides): Promise; getLastCheckpointOperatorWeight( - _operator: string, + operator: string, overrides?: CallOverrides ): Promise; @@ -737,48 +748,48 @@ export interface ECDSAStakeRegistry extends BaseContract { ): Promise; getLastCheckpointThresholdWeightAtBlock( - _blockNumber: BigNumberish, + blockNumber: BigNumberish, overrides?: CallOverrides ): Promise; getLastCheckpointTotalWeight(overrides?: CallOverrides): Promise; getLastCheckpointTotalWeightAtBlock( - _blockNumber: BigNumberish, + blockNumber: BigNumberish, overrides?: CallOverrides ): Promise; - getLastestOperatorSigningKey( - _operator: string, + getLatestOperatorSigningKey( + operator: string, overrides?: CallOverrides ): Promise; getOperatorSigningKeyAtBlock( - _operator: string, - _blockNumber: BigNumberish, + operator: string, + blockNumber: BigNumberish, overrides?: CallOverrides ): Promise; getOperatorWeight( - _operator: string, + operator: string, overrides?: CallOverrides ): Promise; getOperatorWeightAtBlock( - _operator: string, - _blockNumber: BigNumberish, + operator: string, + blockNumber: BigNumberish, overrides?: CallOverrides ): Promise; initialize( _serviceManager: string, - _thresholdWeight: BigNumberish, - _quorum: QuorumStruct, + thresholdWeight: BigNumberish, + quorum: IECDSAStakeRegistryTypes.QuorumStruct, overrides?: CallOverrides ): Promise; isValidSignature( - _dataHash: BytesLike, + digest: BytesLike, _signatureData: BytesLike, overrides?: CallOverrides ): Promise; @@ -786,17 +797,19 @@ export interface ECDSAStakeRegistry extends BaseContract { minimumWeight(overrides?: CallOverrides): Promise; operatorRegistered( - _operator: string, + operator: string, overrides?: CallOverrides ): Promise; owner(overrides?: CallOverrides): Promise; - quorum(overrides?: CallOverrides): Promise; + quorum( + overrides?: CallOverrides + ): Promise; registerOperatorWithSignature( - _operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, - _signingKey: string, + operatorSignature: ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiryStruct, + signingKey: string, overrides?: CallOverrides ): Promise; @@ -808,18 +821,18 @@ export interface ECDSAStakeRegistry extends BaseContract { ): Promise; updateMinimumWeight( - _newMinimumWeight: BigNumberish, - _operators: string[], + newMinimumWeight: BigNumberish, + operators: string[], overrides?: CallOverrides ): Promise; updateOperatorSigningKey( - _newSigningKey: string, + newSigningKey: string, overrides?: CallOverrides ): Promise; updateOperators( - _operators: string[], + operators: string[], overrides?: CallOverrides ): Promise; @@ -830,13 +843,13 @@ export interface ECDSAStakeRegistry extends BaseContract { ): Promise; updateQuorumConfig( - _quorum: QuorumStruct, - _operators: string[], + quorum: IECDSAStakeRegistryTypes.QuorumStruct, + operators: string[], overrides?: CallOverrides ): Promise; updateStakeThreshold( - _thresholdWeight: BigNumberish, + thresholdWeight: BigNumberish, overrides?: CallOverrides ): Promise; }; @@ -846,39 +859,39 @@ export interface ECDSAStakeRegistry extends BaseContract { Initialized(version?: null): InitializedEventFilter; "MinimumWeightUpdated(uint256,uint256)"( - _old?: null, - _new?: null + previous?: null, + current?: null ): MinimumWeightUpdatedEventFilter; MinimumWeightUpdated( - _old?: null, - _new?: null + previous?: null, + current?: null ): MinimumWeightUpdatedEventFilter; "OperatorDeregistered(address,address)"( - _operator?: string | null, - _avs?: string | null + operator?: string | null, + avs?: string | null ): OperatorDeregisteredEventFilter; OperatorDeregistered( - _operator?: string | null, - _avs?: string | null + operator?: string | null, + avs?: string | null ): OperatorDeregisteredEventFilter; "OperatorRegistered(address,address)"( - _operator?: string | null, - _avs?: string | null + operator?: string | null, + avs?: string | null ): OperatorRegisteredEventFilter; OperatorRegistered( - _operator?: string | null, - _avs?: string | null + operator?: string | null, + avs?: string | null ): OperatorRegisteredEventFilter; "OperatorWeightUpdated(address,uint256,uint256)"( - _operator?: string | null, + operator?: string | null, oldWeight?: null, newWeight?: null ): OperatorWeightUpdatedEventFilter; OperatorWeightUpdated( - _operator?: string | null, + operator?: string | null, oldWeight?: null, newWeight?: null ): OperatorWeightUpdatedEventFilter; @@ -893,10 +906,10 @@ export interface ECDSAStakeRegistry extends BaseContract { ): OwnershipTransferredEventFilter; "QuorumUpdated(((address,uint96)[]),((address,uint96)[]))"( - _old?: null, - _new?: null + previous?: null, + current?: null ): QuorumUpdatedEventFilter; - QuorumUpdated(_old?: null, _new?: null): QuorumUpdatedEventFilter; + QuorumUpdated(previous?: null, current?: null): QuorumUpdatedEventFilter; "SigningKeyUpdate(address,uint256,address,address)"( operator?: string | null, @@ -912,10 +925,10 @@ export interface ECDSAStakeRegistry extends BaseContract { ): SigningKeyUpdateEventFilter; "ThresholdWeightUpdated(uint256)"( - _thresholdWeight?: null + thresholdWeight?: null ): ThresholdWeightUpdatedEventFilter; ThresholdWeightUpdated( - _thresholdWeight?: null + thresholdWeight?: null ): ThresholdWeightUpdatedEventFilter; "TotalWeightUpdated(uint256,uint256)"( @@ -943,7 +956,7 @@ export interface ECDSAStakeRegistry extends BaseContract { ): Promise; getLastCheckpointOperatorWeight( - _operator: string, + operator: string, overrides?: CallOverrides ): Promise; @@ -952,48 +965,48 @@ export interface ECDSAStakeRegistry extends BaseContract { ): Promise; getLastCheckpointThresholdWeightAtBlock( - _blockNumber: BigNumberish, + blockNumber: BigNumberish, overrides?: CallOverrides ): Promise; getLastCheckpointTotalWeight(overrides?: CallOverrides): Promise; getLastCheckpointTotalWeightAtBlock( - _blockNumber: BigNumberish, + blockNumber: BigNumberish, overrides?: CallOverrides ): Promise; - getLastestOperatorSigningKey( - _operator: string, + getLatestOperatorSigningKey( + operator: string, overrides?: CallOverrides ): Promise; getOperatorSigningKeyAtBlock( - _operator: string, - _blockNumber: BigNumberish, + operator: string, + blockNumber: BigNumberish, overrides?: CallOverrides ): Promise; getOperatorWeight( - _operator: string, + operator: string, overrides?: CallOverrides ): Promise; getOperatorWeightAtBlock( - _operator: string, - _blockNumber: BigNumberish, + operator: string, + blockNumber: BigNumberish, overrides?: CallOverrides ): Promise; initialize( _serviceManager: string, - _thresholdWeight: BigNumberish, - _quorum: QuorumStruct, + thresholdWeight: BigNumberish, + quorum: IECDSAStakeRegistryTypes.QuorumStruct, overrides?: Overrides & { from?: string } ): Promise; isValidSignature( - _dataHash: BytesLike, + digest: BytesLike, _signatureData: BytesLike, overrides?: CallOverrides ): Promise; @@ -1001,7 +1014,7 @@ export interface ECDSAStakeRegistry extends BaseContract { minimumWeight(overrides?: CallOverrides): Promise; operatorRegistered( - _operator: string, + operator: string, overrides?: CallOverrides ): Promise; @@ -1010,8 +1023,8 @@ export interface ECDSAStakeRegistry extends BaseContract { quorum(overrides?: CallOverrides): Promise; registerOperatorWithSignature( - _operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, - _signingKey: string, + operatorSignature: ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiryStruct, + signingKey: string, overrides?: Overrides & { from?: string } ): Promise; @@ -1025,18 +1038,18 @@ export interface ECDSAStakeRegistry extends BaseContract { ): Promise; updateMinimumWeight( - _newMinimumWeight: BigNumberish, - _operators: string[], + newMinimumWeight: BigNumberish, + operators: string[], overrides?: Overrides & { from?: string } ): Promise; updateOperatorSigningKey( - _newSigningKey: string, + newSigningKey: string, overrides?: Overrides & { from?: string } ): Promise; updateOperators( - _operators: string[], + operators: string[], overrides?: Overrides & { from?: string } ): Promise; @@ -1047,13 +1060,13 @@ export interface ECDSAStakeRegistry extends BaseContract { ): Promise; updateQuorumConfig( - _quorum: QuorumStruct, - _operators: string[], + quorum: IECDSAStakeRegistryTypes.QuorumStruct, + operators: string[], overrides?: Overrides & { from?: string } ): Promise; updateStakeThreshold( - _thresholdWeight: BigNumberish, + thresholdWeight: BigNumberish, overrides?: Overrides & { from?: string } ): Promise; }; @@ -1064,7 +1077,7 @@ export interface ECDSAStakeRegistry extends BaseContract { ): Promise; getLastCheckpointOperatorWeight( - _operator: string, + operator: string, overrides?: CallOverrides ): Promise; @@ -1073,7 +1086,7 @@ export interface ECDSAStakeRegistry extends BaseContract { ): Promise; getLastCheckpointThresholdWeightAtBlock( - _blockNumber: BigNumberish, + blockNumber: BigNumberish, overrides?: CallOverrides ): Promise; @@ -1082,41 +1095,41 @@ export interface ECDSAStakeRegistry extends BaseContract { ): Promise; getLastCheckpointTotalWeightAtBlock( - _blockNumber: BigNumberish, + blockNumber: BigNumberish, overrides?: CallOverrides ): Promise; - getLastestOperatorSigningKey( - _operator: string, + getLatestOperatorSigningKey( + operator: string, overrides?: CallOverrides ): Promise; getOperatorSigningKeyAtBlock( - _operator: string, - _blockNumber: BigNumberish, + operator: string, + blockNumber: BigNumberish, overrides?: CallOverrides ): Promise; getOperatorWeight( - _operator: string, + operator: string, overrides?: CallOverrides ): Promise; getOperatorWeightAtBlock( - _operator: string, - _blockNumber: BigNumberish, + operator: string, + blockNumber: BigNumberish, overrides?: CallOverrides ): Promise; initialize( _serviceManager: string, - _thresholdWeight: BigNumberish, - _quorum: QuorumStruct, + thresholdWeight: BigNumberish, + quorum: IECDSAStakeRegistryTypes.QuorumStruct, overrides?: Overrides & { from?: string } ): Promise; isValidSignature( - _dataHash: BytesLike, + digest: BytesLike, _signatureData: BytesLike, overrides?: CallOverrides ): Promise; @@ -1124,7 +1137,7 @@ export interface ECDSAStakeRegistry extends BaseContract { minimumWeight(overrides?: CallOverrides): Promise; operatorRegistered( - _operator: string, + operator: string, overrides?: CallOverrides ): Promise; @@ -1133,8 +1146,8 @@ export interface ECDSAStakeRegistry extends BaseContract { quorum(overrides?: CallOverrides): Promise; registerOperatorWithSignature( - _operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, - _signingKey: string, + operatorSignature: ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiryStruct, + signingKey: string, overrides?: Overrides & { from?: string } ): Promise; @@ -1148,18 +1161,18 @@ export interface ECDSAStakeRegistry extends BaseContract { ): Promise; updateMinimumWeight( - _newMinimumWeight: BigNumberish, - _operators: string[], + newMinimumWeight: BigNumberish, + operators: string[], overrides?: Overrides & { from?: string } ): Promise; updateOperatorSigningKey( - _newSigningKey: string, + newSigningKey: string, overrides?: Overrides & { from?: string } ): Promise; updateOperators( - _operators: string[], + operators: string[], overrides?: Overrides & { from?: string } ): Promise; @@ -1170,13 +1183,13 @@ export interface ECDSAStakeRegistry extends BaseContract { ): Promise; updateQuorumConfig( - _quorum: QuorumStruct, - _operators: string[], + quorum: IECDSAStakeRegistryTypes.QuorumStruct, + operators: string[], overrides?: Overrides & { from?: string } ): Promise; updateStakeThreshold( - _thresholdWeight: BigNumberish, + thresholdWeight: BigNumberish, overrides?: Overrides & { from?: string } ): Promise; }; diff --git a/src/avs/contracts/ReclaimServiceManager.ts b/src/avs/contracts/ReclaimServiceManager.ts index e3cc95b8..0d2d120a 100644 --- a/src/avs/contracts/ReclaimServiceManager.ts +++ b/src/avs/contracts/ReclaimServiceManager.ts @@ -26,7 +26,7 @@ import type { OnEvent, } from "./common"; -export declare namespace IRewardsCoordinator { +export declare namespace IRewardsCoordinatorTypes { export type StrategyAndMultiplierStruct = { strategy: string; multiplier: BigNumberish; @@ -38,7 +38,7 @@ export declare namespace IRewardsCoordinator { }; export type RewardsSubmissionStruct = { - strategiesAndMultipliers: IRewardsCoordinator.StrategyAndMultiplierStruct[]; + strategiesAndMultipliers: IRewardsCoordinatorTypes.StrategyAndMultiplierStruct[]; token: string; amount: BigNumberish; startTimestamp: BigNumberish; @@ -46,13 +46,13 @@ export declare namespace IRewardsCoordinator { }; export type RewardsSubmissionStructOutput = [ - IRewardsCoordinator.StrategyAndMultiplierStructOutput[], + IRewardsCoordinatorTypes.StrategyAndMultiplierStructOutput[], string, BigNumber, number, number ] & { - strategiesAndMultipliers: IRewardsCoordinator.StrategyAndMultiplierStructOutput[]; + strategiesAndMultipliers: IRewardsCoordinatorTypes.StrategyAndMultiplierStructOutput[]; token: string; amount: BigNumber; startTimestamp: number; @@ -67,127 +67,32 @@ export declare namespace IRewardsCoordinator { }; export type OperatorDirectedRewardsSubmissionStruct = { - strategiesAndMultipliers: IRewardsCoordinator.StrategyAndMultiplierStruct[]; + strategiesAndMultipliers: IRewardsCoordinatorTypes.StrategyAndMultiplierStruct[]; token: string; - operatorRewards: IRewardsCoordinator.OperatorRewardStruct[]; + operatorRewards: IRewardsCoordinatorTypes.OperatorRewardStruct[]; startTimestamp: BigNumberish; duration: BigNumberish; description: string; }; export type OperatorDirectedRewardsSubmissionStructOutput = [ - IRewardsCoordinator.StrategyAndMultiplierStructOutput[], + IRewardsCoordinatorTypes.StrategyAndMultiplierStructOutput[], string, - IRewardsCoordinator.OperatorRewardStructOutput[], + IRewardsCoordinatorTypes.OperatorRewardStructOutput[], number, number, string ] & { - strategiesAndMultipliers: IRewardsCoordinator.StrategyAndMultiplierStructOutput[]; + strategiesAndMultipliers: IRewardsCoordinatorTypes.StrategyAndMultiplierStructOutput[]; token: string; - operatorRewards: IRewardsCoordinator.OperatorRewardStructOutput[]; + operatorRewards: IRewardsCoordinatorTypes.OperatorRewardStructOutput[]; startTimestamp: number; duration: number; description: string; }; } -export declare namespace IReclaimServiceManager { - export type ClaimRequestStruct = { - provider: string; - claimUserId: BytesLike; - claimHash: BytesLike; - requestedAt: BigNumberish; - owner: string; - fee: BigNumberish; - }; - - export type ClaimRequestStructOutput = [ - string, - string, - string, - number, - string, - BigNumber - ] & { - provider: string; - claimUserId: string; - claimHash: string; - requestedAt: number; - owner: string; - fee: BigNumber; - }; - - export type OperatorMetadataStruct = { addr: string; url: string }; - - export type OperatorMetadataStructOutput = [string, string] & { - addr: string; - url: string; - }; - - export type OperatorStruct = { addr: string; url: string }; - - export type OperatorStructOutput = [string, string] & { - addr: string; - url: string; - }; - - export type TaskStruct = { - request: IReclaimServiceManager.ClaimRequestStruct; - createdAt: BigNumberish; - expiresAt: BigNumberish; - minimumSignatures: BigNumberish; - operators: IReclaimServiceManager.OperatorStruct[]; - feePaid: BigNumberish; - }; - - export type TaskStructOutput = [ - IReclaimServiceManager.ClaimRequestStructOutput, - number, - number, - number, - IReclaimServiceManager.OperatorStructOutput[], - BigNumber - ] & { - request: IReclaimServiceManager.ClaimRequestStructOutput; - createdAt: number; - expiresAt: number; - minimumSignatures: number; - operators: IReclaimServiceManager.OperatorStructOutput[]; - feePaid: BigNumber; - }; - - export type CompletedTaskStruct = { - task: IReclaimServiceManager.TaskStruct; - signatures: BytesLike[]; - }; - - export type CompletedTaskStructOutput = [ - IReclaimServiceManager.TaskStructOutput, - string[] - ] & { task: IReclaimServiceManager.TaskStructOutput; signatures: string[] }; - - export type TaskCreationMetadataStruct = { - maxTaskLifetimeS: BigNumberish; - minSignaturesPerTask: BigNumberish; - maxTaskCreationDelayS: BigNumberish; - minFee: BigNumberish; - }; - - export type TaskCreationMetadataStructOutput = [ - number, - number, - number, - BigNumber - ] & { - maxTaskLifetimeS: number; - minSignaturesPerTask: number; - maxTaskCreationDelayS: number; - minFee: BigNumber; - }; -} - -export declare namespace ISignatureUtils { +export declare namespace ISignatureUtilsMixinTypes { export type SignatureWithSaltAndExpiryStruct = { signature: BytesLike; salt: BytesLike; @@ -203,93 +108,71 @@ export declare namespace ISignatureUtils { export interface ReclaimServiceManagerInterface extends utils.Interface { functions: { - "allTaskHashes(uint32)": FunctionFragment; + "addOperatorToWhitelist(address)": FunctionFragment; + "addPendingAdmin(address)": FunctionFragment; "avsDirectory()": FunctionFragment; "createAVSRewardsSubmission(((address,uint96)[],address,uint256,uint32,uint32)[])": FunctionFragment; - "createNewTask((string,bytes32,bytes32,uint32,address,uint256),bytes)": FunctionFragment; "createOperatorDirectedAVSRewardsSubmission(((address,uint96)[],address,(address,uint256)[],uint32,uint32,string)[])": FunctionFragment; - "defaultStrategy()": FunctionFragment; "deregisterOperatorFromAVS(address)": FunctionFragment; - "encodeClaimRequest((string,bytes32,bytes32,uint32,address,uint256))": FunctionFragment; - "getMetadataForOperator(address)": FunctionFragment; + "deregisterOperatorFromOperatorSets(address,uint32[])": FunctionFragment; "getOperatorRestakedStrategies(address)": FunctionFragment; "getRestakeableStrategies()": FunctionFragment; - "getToken()": FunctionFragment; "initialize(address,address)": FunctionFragment; "isOperatorWhitelisted(address)": FunctionFragment; - "latestTaskNum()": FunctionFragment; - "operatorHasMinimumWeight(address)": FunctionFragment; "owner()": FunctionFragment; - "pause(uint256)": FunctionFragment; - "pauseAll()": FunctionFragment; - "paused(uint8)": FunctionFragment; - "paused()": FunctionFragment; - "pauserRegistry()": FunctionFragment; "registerOperatorToAVS(address,(bytes,bytes32,uint256))": FunctionFragment; - "registeredOperators(uint256)": FunctionFragment; + "removeAdmin(address)": FunctionFragment; + "removeAppointee(address,address,bytes4)": FunctionFragment; + "removeOperatorFromWhitelist(address)": FunctionFragment; + "removePendingAdmin(address)": FunctionFragment; "renounceOwnership()": FunctionFragment; "rewardsInitiator()": FunctionFragment; + "setAppointee(address,address,bytes4)": FunctionFragment; "setClaimerFor(address)": FunctionFragment; - "setPauserRegistry(address)": FunctionFragment; "setRewardsInitiator(address)": FunctionFragment; - "stakeRegistry()": FunctionFragment; - "taskCompleted((((string,bytes32,bytes32,uint32,address,uint256),uint32,uint32,uint8,(address,string)[],uint256),bytes[]),uint32)": FunctionFragment; - "taskCreationMetadata()": FunctionFragment; + "taskManager()": FunctionFragment; "transferOwnership(address)": FunctionFragment; - "unpause(uint256)": FunctionFragment; "updateAVSMetadataURI(string)": FunctionFragment; - "updateOperatorMetadata((address,string))": FunctionFragment; - "updateTaskCreationMetadata((uint32,uint8,uint32,uint256))": FunctionFragment; - "whitelistAddressAsOperator(address,bool)": FunctionFragment; "whitelistedOperators(uint256)": FunctionFragment; }; getFunction( nameOrSignatureOrTopic: - | "allTaskHashes" + | "addOperatorToWhitelist" + | "addPendingAdmin" | "avsDirectory" | "createAVSRewardsSubmission" - | "createNewTask" | "createOperatorDirectedAVSRewardsSubmission" - | "defaultStrategy" | "deregisterOperatorFromAVS" - | "encodeClaimRequest" - | "getMetadataForOperator" + | "deregisterOperatorFromOperatorSets" | "getOperatorRestakedStrategies" | "getRestakeableStrategies" - | "getToken" | "initialize" | "isOperatorWhitelisted" - | "latestTaskNum" - | "operatorHasMinimumWeight" | "owner" - | "pause" - | "pauseAll" - | "paused(uint8)" - | "paused()" - | "pauserRegistry" | "registerOperatorToAVS" - | "registeredOperators" + | "removeAdmin" + | "removeAppointee" + | "removeOperatorFromWhitelist" + | "removePendingAdmin" | "renounceOwnership" | "rewardsInitiator" + | "setAppointee" | "setClaimerFor" - | "setPauserRegistry" | "setRewardsInitiator" - | "stakeRegistry" - | "taskCompleted" - | "taskCreationMetadata" + | "taskManager" | "transferOwnership" - | "unpause" | "updateAVSMetadataURI" - | "updateOperatorMetadata" - | "updateTaskCreationMetadata" - | "whitelistAddressAsOperator" | "whitelistedOperators" ): FunctionFragment; encodeFunctionData( - functionFragment: "allTaskHashes", - values: [BigNumberish] + functionFragment: "addOperatorToWhitelist", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "addPendingAdmin", + values: [string] ): string; encodeFunctionData( functionFragment: "avsDirectory", @@ -297,31 +180,19 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { ): string; encodeFunctionData( functionFragment: "createAVSRewardsSubmission", - values: [IRewardsCoordinator.RewardsSubmissionStruct[]] - ): string; - encodeFunctionData( - functionFragment: "createNewTask", - values: [IReclaimServiceManager.ClaimRequestStruct, BytesLike] + values: [IRewardsCoordinatorTypes.RewardsSubmissionStruct[]] ): string; encodeFunctionData( functionFragment: "createOperatorDirectedAVSRewardsSubmission", - values: [IRewardsCoordinator.OperatorDirectedRewardsSubmissionStruct[]] - ): string; - encodeFunctionData( - functionFragment: "defaultStrategy", - values?: undefined + values: [IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[]] ): string; encodeFunctionData( functionFragment: "deregisterOperatorFromAVS", values: [string] ): string; encodeFunctionData( - functionFragment: "encodeClaimRequest", - values: [IReclaimServiceManager.ClaimRequestStruct] - ): string; - encodeFunctionData( - functionFragment: "getMetadataForOperator", - values: [string] + functionFragment: "deregisterOperatorFromOperatorSets", + values: [string, BigNumberish[]] ): string; encodeFunctionData( functionFragment: "getOperatorRestakedStrategies", @@ -331,7 +202,6 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { functionFragment: "getRestakeableStrategies", values?: undefined ): string; - encodeFunctionData(functionFragment: "getToken", values?: undefined): string; encodeFunctionData( functionFragment: "initialize", values: [string, string] @@ -340,33 +210,23 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { functionFragment: "isOperatorWhitelisted", values: [string] ): string; - encodeFunctionData( - functionFragment: "latestTaskNum", - values?: undefined - ): string; - encodeFunctionData( - functionFragment: "operatorHasMinimumWeight", - values: [string] - ): string; encodeFunctionData(functionFragment: "owner", values?: undefined): string; - encodeFunctionData(functionFragment: "pause", values: [BigNumberish]): string; - encodeFunctionData(functionFragment: "pauseAll", values?: undefined): string; encodeFunctionData( - functionFragment: "paused(uint8)", - values: [BigNumberish] + functionFragment: "registerOperatorToAVS", + values: [string, ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiryStruct] ): string; - encodeFunctionData(functionFragment: "paused()", values?: undefined): string; + encodeFunctionData(functionFragment: "removeAdmin", values: [string]): string; encodeFunctionData( - functionFragment: "pauserRegistry", - values?: undefined + functionFragment: "removeAppointee", + values: [string, string, BytesLike] ): string; encodeFunctionData( - functionFragment: "registerOperatorToAVS", - values: [string, ISignatureUtils.SignatureWithSaltAndExpiryStruct] + functionFragment: "removeOperatorFromWhitelist", + values: [string] ): string; encodeFunctionData( - functionFragment: "registeredOperators", - values: [BigNumberish] + functionFragment: "removePendingAdmin", + values: [string] ): string; encodeFunctionData( functionFragment: "renounceOwnership", @@ -377,11 +237,11 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { values?: undefined ): string; encodeFunctionData( - functionFragment: "setClaimerFor", - values: [string] + functionFragment: "setAppointee", + values: [string, string, BytesLike] ): string; encodeFunctionData( - functionFragment: "setPauserRegistry", + functionFragment: "setClaimerFor", values: [string] ): string; encodeFunctionData( @@ -389,80 +249,48 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { values: [string] ): string; encodeFunctionData( - functionFragment: "stakeRegistry", - values?: undefined - ): string; - encodeFunctionData( - functionFragment: "taskCompleted", - values: [IReclaimServiceManager.CompletedTaskStruct, BigNumberish] - ): string; - encodeFunctionData( - functionFragment: "taskCreationMetadata", + functionFragment: "taskManager", values?: undefined ): string; encodeFunctionData( functionFragment: "transferOwnership", values: [string] ): string; - encodeFunctionData( - functionFragment: "unpause", - values: [BigNumberish] - ): string; encodeFunctionData( functionFragment: "updateAVSMetadataURI", values: [string] ): string; - encodeFunctionData( - functionFragment: "updateOperatorMetadata", - values: [IReclaimServiceManager.OperatorMetadataStruct] - ): string; - encodeFunctionData( - functionFragment: "updateTaskCreationMetadata", - values: [IReclaimServiceManager.TaskCreationMetadataStruct] - ): string; - encodeFunctionData( - functionFragment: "whitelistAddressAsOperator", - values: [string, boolean] - ): string; encodeFunctionData( functionFragment: "whitelistedOperators", values: [BigNumberish] ): string; decodeFunctionResult( - functionFragment: "allTaskHashes", + functionFragment: "addOperatorToWhitelist", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "avsDirectory", + functionFragment: "addPendingAdmin", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "createAVSRewardsSubmission", + functionFragment: "avsDirectory", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "createNewTask", + functionFragment: "createAVSRewardsSubmission", data: BytesLike ): Result; decodeFunctionResult( functionFragment: "createOperatorDirectedAVSRewardsSubmission", data: BytesLike ): Result; - decodeFunctionResult( - functionFragment: "defaultStrategy", - data: BytesLike - ): Result; decodeFunctionResult( functionFragment: "deregisterOperatorFromAVS", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "encodeClaimRequest", - data: BytesLike - ): Result; - decodeFunctionResult( - functionFragment: "getMetadataForOperator", + functionFragment: "deregisterOperatorFromOperatorSets", data: BytesLike ): Result; decodeFunctionResult( @@ -473,38 +301,30 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { functionFragment: "getRestakeableStrategies", data: BytesLike ): Result; - decodeFunctionResult(functionFragment: "getToken", data: BytesLike): Result; decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; decodeFunctionResult( functionFragment: "isOperatorWhitelisted", data: BytesLike ): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; decodeFunctionResult( - functionFragment: "latestTaskNum", - data: BytesLike - ): Result; - decodeFunctionResult( - functionFragment: "operatorHasMinimumWeight", + functionFragment: "registerOperatorToAVS", data: BytesLike ): Result; - decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; - decodeFunctionResult(functionFragment: "pause", data: BytesLike): Result; - decodeFunctionResult(functionFragment: "pauseAll", data: BytesLike): Result; decodeFunctionResult( - functionFragment: "paused(uint8)", + functionFragment: "removeAdmin", data: BytesLike ): Result; - decodeFunctionResult(functionFragment: "paused()", data: BytesLike): Result; decodeFunctionResult( - functionFragment: "pauserRegistry", + functionFragment: "removeAppointee", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "registerOperatorToAVS", + functionFragment: "removeOperatorFromWhitelist", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "registeredOperators", + functionFragment: "removePendingAdmin", data: BytesLike ): Result; decodeFunctionResult( @@ -516,11 +336,11 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "setClaimerFor", + functionFragment: "setAppointee", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "setPauserRegistry", + functionFragment: "setClaimerFor", data: BytesLike ): Result; decodeFunctionResult( @@ -528,38 +348,17 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "stakeRegistry", - data: BytesLike - ): Result; - decodeFunctionResult( - functionFragment: "taskCompleted", - data: BytesLike - ): Result; - decodeFunctionResult( - functionFragment: "taskCreationMetadata", + functionFragment: "taskManager", data: BytesLike ): Result; decodeFunctionResult( functionFragment: "transferOwnership", data: BytesLike ): Result; - decodeFunctionResult(functionFragment: "unpause", data: BytesLike): Result; decodeFunctionResult( functionFragment: "updateAVSMetadataURI", data: BytesLike ): Result; - decodeFunctionResult( - functionFragment: "updateOperatorMetadata", - data: BytesLike - ): Result; - decodeFunctionResult( - functionFragment: "updateTaskCreationMetadata", - data: BytesLike - ): Result; - decodeFunctionResult( - functionFragment: "whitelistAddressAsOperator", - data: BytesLike - ): Result; decodeFunctionResult( functionFragment: "whitelistedOperators", data: BytesLike @@ -567,23 +366,13 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { events: { "Initialized(uint8)": EventFragment; - "NewTaskCreated(uint32,((string,bytes32,bytes32,uint32,address,uint256),uint32,uint32,uint8,(address,string)[],uint256))": EventFragment; "OwnershipTransferred(address,address)": EventFragment; - "Paused(address,uint256)": EventFragment; - "PauserRegistrySet(address,address)": EventFragment; "RewardsInitiatorUpdated(address,address)": EventFragment; - "TaskCompleted(uint32,(((string,bytes32,bytes32,uint32,address,uint256),uint32,uint32,uint8,(address,string)[],uint256),bytes[]))": EventFragment; - "Unpaused(address,uint256)": EventFragment; }; getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; - getEvent(nameOrSignatureOrTopic: "NewTaskCreated"): EventFragment; getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; - getEvent(nameOrSignatureOrTopic: "Paused"): EventFragment; - getEvent(nameOrSignatureOrTopic: "PauserRegistrySet"): EventFragment; getEvent(nameOrSignatureOrTopic: "RewardsInitiatorUpdated"): EventFragment; - getEvent(nameOrSignatureOrTopic: "TaskCompleted"): EventFragment; - getEvent(nameOrSignatureOrTopic: "Unpaused"): EventFragment; } export interface InitializedEventObject { @@ -593,17 +382,6 @@ export type InitializedEvent = TypedEvent<[number], InitializedEventObject>; export type InitializedEventFilter = TypedEventFilter; -export interface NewTaskCreatedEventObject { - taskIndex: number; - task: IReclaimServiceManager.TaskStructOutput; -} -export type NewTaskCreatedEvent = TypedEvent< - [number, IReclaimServiceManager.TaskStructOutput], - NewTaskCreatedEventObject ->; - -export type NewTaskCreatedEventFilter = TypedEventFilter; - export interface OwnershipTransferredEventObject { previousOwner: string; newOwner: string; @@ -616,26 +394,6 @@ export type OwnershipTransferredEvent = TypedEvent< export type OwnershipTransferredEventFilter = TypedEventFilter; -export interface PausedEventObject { - account: string; - newPausedStatus: BigNumber; -} -export type PausedEvent = TypedEvent<[string, BigNumber], PausedEventObject>; - -export type PausedEventFilter = TypedEventFilter; - -export interface PauserRegistrySetEventObject { - pauserRegistry: string; - newPauserRegistry: string; -} -export type PauserRegistrySetEvent = TypedEvent< - [string, string], - PauserRegistrySetEventObject ->; - -export type PauserRegistrySetEventFilter = - TypedEventFilter; - export interface RewardsInitiatorUpdatedEventObject { prevRewardsInitiator: string; newRewardsInitiator: string; @@ -648,28 +406,6 @@ export type RewardsInitiatorUpdatedEvent = TypedEvent< export type RewardsInitiatorUpdatedEventFilter = TypedEventFilter; -export interface TaskCompletedEventObject { - taskIndex: number; - task: IReclaimServiceManager.CompletedTaskStructOutput; -} -export type TaskCompletedEvent = TypedEvent< - [number, IReclaimServiceManager.CompletedTaskStructOutput], - TaskCompletedEventObject ->; - -export type TaskCompletedEventFilter = TypedEventFilter; - -export interface UnpausedEventObject { - account: string; - newPausedStatus: BigNumber; -} -export type UnpausedEvent = TypedEvent< - [string, BigNumber], - UnpausedEventObject ->; - -export type UnpausedEventFilter = TypedEventFilter; - export interface ReclaimServiceManager extends BaseContract { connect(signerOrProvider: Signer | Provider | string): this; attach(addressOrName: string): this; @@ -697,58 +433,49 @@ export interface ReclaimServiceManager extends BaseContract { removeListener: OnEvent; functions: { - allTaskHashes( - arg0: BigNumberish, - overrides?: CallOverrides - ): Promise<[string]>; - - avsDirectory(overrides?: CallOverrides): Promise<[string]>; + addOperatorToWhitelist( + operator: string, + overrides?: Overrides & { from?: string } + ): Promise; - createAVSRewardsSubmission( - rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + addPendingAdmin( + admin: string, overrides?: Overrides & { from?: string } ): Promise; - createNewTask( - request: IReclaimServiceManager.ClaimRequestStruct, - requestSignature: BytesLike, + avsDirectory(overrides?: CallOverrides): Promise<[string]>; + + createAVSRewardsSubmission( + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; createOperatorDirectedAVSRewardsSubmission( - operatorDirectedRewardsSubmissions: IRewardsCoordinator.OperatorDirectedRewardsSubmissionStruct[], + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; - defaultStrategy(overrides?: CallOverrides): Promise<[string]>; - deregisterOperatorFromAVS( operator: string, overrides?: Overrides & { from?: string } ): Promise; - encodeClaimRequest( - request: IReclaimServiceManager.ClaimRequestStruct, - overrides?: CallOverrides - ): Promise<[string]>; - - getMetadataForOperator( + deregisterOperatorFromOperatorSets( operator: string, - overrides?: CallOverrides - ): Promise<[IReclaimServiceManager.OperatorMetadataStructOutput]>; + operatorSetIds: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; getOperatorRestakedStrategies( - _operator: string, + operator: string, overrides?: CallOverrides ): Promise<[string[]]>; getRestakeableStrategies(overrides?: CallOverrides): Promise<[string[]]>; - getToken(overrides?: CallOverrides): Promise<[string]>; - initialize( initialOwner: string, - strategy: string, + rewardsInitiator: string, overrides?: Overrides & { from?: string } ): Promise; @@ -757,43 +484,35 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: CallOverrides ): Promise<[boolean]>; - latestTaskNum(overrides?: CallOverrides): Promise<[number]>; - - operatorHasMinimumWeight( - operator: string, - overrides?: CallOverrides - ): Promise<[boolean]>; - owner(overrides?: CallOverrides): Promise<[string]>; - pause( - newPausedStatus: BigNumberish, + registerOperatorToAVS( + operator: string, + operatorSignature: ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiryStruct, overrides?: Overrides & { from?: string } ): Promise; - pauseAll( + removeAdmin( + admin: string, overrides?: Overrides & { from?: string } ): Promise; - "paused(uint8)"( - index: BigNumberish, - overrides?: CallOverrides - ): Promise<[boolean]>; - - "paused()"(overrides?: CallOverrides): Promise<[BigNumber]>; - - pauserRegistry(overrides?: CallOverrides): Promise<[string]>; + removeAppointee( + appointee: string, + target: string, + selector: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; - registerOperatorToAVS( + removeOperatorFromWhitelist( operator: string, - operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, overrides?: Overrides & { from?: string } ): Promise; - registeredOperators( - arg0: BigNumberish, - overrides?: CallOverrides - ): Promise<[string, string] & { addr: string; url: string }>; + removePendingAdmin( + pendingAdmin: string, + overrides?: Overrides & { from?: string } + ): Promise; renounceOwnership( overrides?: Overrides & { from?: string } @@ -801,13 +520,15 @@ export interface ReclaimServiceManager extends BaseContract { rewardsInitiator(overrides?: CallOverrides): Promise<[string]>; - setClaimerFor( - claimer: string, + setAppointee( + appointee: string, + target: string, + selector: BytesLike, overrides?: Overrides & { from?: string } ): Promise; - setPauserRegistry( - newPauserRegistry: string, + setClaimerFor( + claimer: string, overrides?: Overrides & { from?: string } ): Promise; @@ -816,111 +537,67 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; - stakeRegistry(overrides?: CallOverrides): Promise<[string]>; - - taskCompleted( - completedTask: IReclaimServiceManager.CompletedTaskStruct, - referenceTaskIndex: BigNumberish, - overrides?: Overrides & { from?: string } - ): Promise; - - taskCreationMetadata( - overrides?: CallOverrides - ): Promise< - [number, number, number, BigNumber] & { - maxTaskLifetimeS: number; - minSignaturesPerTask: number; - maxTaskCreationDelayS: number; - minFee: BigNumber; - } - >; + taskManager(overrides?: CallOverrides): Promise<[string]>; transferOwnership( newOwner: string, overrides?: Overrides & { from?: string } ): Promise; - unpause( - newPausedStatus: BigNumberish, - overrides?: Overrides & { from?: string } - ): Promise; - updateAVSMetadataURI( _metadataURI: string, overrides?: Overrides & { from?: string } ): Promise; - updateOperatorMetadata( - metadata: IReclaimServiceManager.OperatorMetadataStruct, - overrides?: Overrides & { from?: string } - ): Promise; - - updateTaskCreationMetadata( - newMetadata: IReclaimServiceManager.TaskCreationMetadataStruct, - overrides?: Overrides & { from?: string } - ): Promise; - - whitelistAddressAsOperator( - operator: string, - isWhitelisted: boolean, - overrides?: Overrides & { from?: string } - ): Promise; - whitelistedOperators( arg0: BigNumberish, overrides?: CallOverrides ): Promise<[string]>; }; - allTaskHashes(arg0: BigNumberish, overrides?: CallOverrides): Promise; - - avsDirectory(overrides?: CallOverrides): Promise; + addOperatorToWhitelist( + operator: string, + overrides?: Overrides & { from?: string } + ): Promise; - createAVSRewardsSubmission( - rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + addPendingAdmin( + admin: string, overrides?: Overrides & { from?: string } ): Promise; - createNewTask( - request: IReclaimServiceManager.ClaimRequestStruct, - requestSignature: BytesLike, + avsDirectory(overrides?: CallOverrides): Promise; + + createAVSRewardsSubmission( + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; createOperatorDirectedAVSRewardsSubmission( - operatorDirectedRewardsSubmissions: IRewardsCoordinator.OperatorDirectedRewardsSubmissionStruct[], + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; - defaultStrategy(overrides?: CallOverrides): Promise; - deregisterOperatorFromAVS( operator: string, overrides?: Overrides & { from?: string } ): Promise; - encodeClaimRequest( - request: IReclaimServiceManager.ClaimRequestStruct, - overrides?: CallOverrides - ): Promise; - - getMetadataForOperator( + deregisterOperatorFromOperatorSets( operator: string, - overrides?: CallOverrides - ): Promise; + operatorSetIds: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; getOperatorRestakedStrategies( - _operator: string, + operator: string, overrides?: CallOverrides ): Promise; getRestakeableStrategies(overrides?: CallOverrides): Promise; - getToken(overrides?: CallOverrides): Promise; - initialize( initialOwner: string, - strategy: string, + rewardsInitiator: string, overrides?: Overrides & { from?: string } ): Promise; @@ -929,43 +606,35 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: CallOverrides ): Promise; - latestTaskNum(overrides?: CallOverrides): Promise; - - operatorHasMinimumWeight( - operator: string, - overrides?: CallOverrides - ): Promise; - owner(overrides?: CallOverrides): Promise; - pause( - newPausedStatus: BigNumberish, + registerOperatorToAVS( + operator: string, + operatorSignature: ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiryStruct, overrides?: Overrides & { from?: string } ): Promise; - pauseAll( + removeAdmin( + admin: string, overrides?: Overrides & { from?: string } ): Promise; - "paused(uint8)"( - index: BigNumberish, - overrides?: CallOverrides - ): Promise; - - "paused()"(overrides?: CallOverrides): Promise; - - pauserRegistry(overrides?: CallOverrides): Promise; + removeAppointee( + appointee: string, + target: string, + selector: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; - registerOperatorToAVS( + removeOperatorFromWhitelist( operator: string, - operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, overrides?: Overrides & { from?: string } ): Promise; - registeredOperators( - arg0: BigNumberish, - overrides?: CallOverrides - ): Promise<[string, string] & { addr: string; url: string }>; + removePendingAdmin( + pendingAdmin: string, + overrides?: Overrides & { from?: string } + ): Promise; renounceOwnership( overrides?: Overrides & { from?: string } @@ -973,13 +642,15 @@ export interface ReclaimServiceManager extends BaseContract { rewardsInitiator(overrides?: CallOverrides): Promise; - setClaimerFor( - claimer: string, + setAppointee( + appointee: string, + target: string, + selector: BytesLike, overrides?: Overrides & { from?: string } ): Promise; - setPauserRegistry( - newPauserRegistry: string, + setClaimerFor( + claimer: string, overrides?: Overrides & { from?: string } ): Promise; @@ -988,114 +659,64 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; - stakeRegistry(overrides?: CallOverrides): Promise; - - taskCompleted( - completedTask: IReclaimServiceManager.CompletedTaskStruct, - referenceTaskIndex: BigNumberish, - overrides?: Overrides & { from?: string } - ): Promise; - - taskCreationMetadata( - overrides?: CallOverrides - ): Promise< - [number, number, number, BigNumber] & { - maxTaskLifetimeS: number; - minSignaturesPerTask: number; - maxTaskCreationDelayS: number; - minFee: BigNumber; - } - >; + taskManager(overrides?: CallOverrides): Promise; transferOwnership( newOwner: string, overrides?: Overrides & { from?: string } ): Promise; - unpause( - newPausedStatus: BigNumberish, - overrides?: Overrides & { from?: string } - ): Promise; - updateAVSMetadataURI( _metadataURI: string, overrides?: Overrides & { from?: string } ): Promise; - updateOperatorMetadata( - metadata: IReclaimServiceManager.OperatorMetadataStruct, - overrides?: Overrides & { from?: string } - ): Promise; - - updateTaskCreationMetadata( - newMetadata: IReclaimServiceManager.TaskCreationMetadataStruct, - overrides?: Overrides & { from?: string } - ): Promise; - - whitelistAddressAsOperator( - operator: string, - isWhitelisted: boolean, - overrides?: Overrides & { from?: string } - ): Promise; - whitelistedOperators( arg0: BigNumberish, overrides?: CallOverrides ): Promise; callStatic: { - allTaskHashes( - arg0: BigNumberish, + addOperatorToWhitelist( + operator: string, overrides?: CallOverrides - ): Promise; + ): Promise; + + addPendingAdmin(admin: string, overrides?: CallOverrides): Promise; avsDirectory(overrides?: CallOverrides): Promise; createAVSRewardsSubmission( - rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], - overrides?: CallOverrides - ): Promise; - - createNewTask( - request: IReclaimServiceManager.ClaimRequestStruct, - requestSignature: BytesLike, + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], overrides?: CallOverrides ): Promise; createOperatorDirectedAVSRewardsSubmission( - operatorDirectedRewardsSubmissions: IRewardsCoordinator.OperatorDirectedRewardsSubmissionStruct[], + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], overrides?: CallOverrides ): Promise; - defaultStrategy(overrides?: CallOverrides): Promise; - deregisterOperatorFromAVS( operator: string, overrides?: CallOverrides ): Promise; - encodeClaimRequest( - request: IReclaimServiceManager.ClaimRequestStruct, - overrides?: CallOverrides - ): Promise; - - getMetadataForOperator( + deregisterOperatorFromOperatorSets( operator: string, + operatorSetIds: BigNumberish[], overrides?: CallOverrides - ): Promise; + ): Promise; getOperatorRestakedStrategies( - _operator: string, + operator: string, overrides?: CallOverrides ): Promise; getRestakeableStrategies(overrides?: CallOverrides): Promise; - getToken(overrides?: CallOverrides): Promise; - initialize( initialOwner: string, - strategy: string, + rewardsInitiator: string, overrides?: CallOverrides ): Promise; @@ -1104,108 +725,63 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: CallOverrides ): Promise; - latestTaskNum(overrides?: CallOverrides): Promise; - - operatorHasMinimumWeight( - operator: string, - overrides?: CallOverrides - ): Promise; - owner(overrides?: CallOverrides): Promise; - pause( - newPausedStatus: BigNumberish, + registerOperatorToAVS( + operator: string, + operatorSignature: ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiryStruct, overrides?: CallOverrides ): Promise; - pauseAll(overrides?: CallOverrides): Promise; + removeAdmin(admin: string, overrides?: CallOverrides): Promise; - "paused(uint8)"( - index: BigNumberish, + removeAppointee( + appointee: string, + target: string, + selector: BytesLike, overrides?: CallOverrides - ): Promise; - - "paused()"(overrides?: CallOverrides): Promise; - - pauserRegistry(overrides?: CallOverrides): Promise; + ): Promise; - registerOperatorToAVS( + removeOperatorFromWhitelist( operator: string, - operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, overrides?: CallOverrides ): Promise; - registeredOperators( - arg0: BigNumberish, + removePendingAdmin( + pendingAdmin: string, overrides?: CallOverrides - ): Promise<[string, string] & { addr: string; url: string }>; + ): Promise; renounceOwnership(overrides?: CallOverrides): Promise; rewardsInitiator(overrides?: CallOverrides): Promise; - setClaimerFor(claimer: string, overrides?: CallOverrides): Promise; - - setPauserRegistry( - newPauserRegistry: string, + setAppointee( + appointee: string, + target: string, + selector: BytesLike, overrides?: CallOverrides ): Promise; + setClaimerFor(claimer: string, overrides?: CallOverrides): Promise; + setRewardsInitiator( newRewardsInitiator: string, overrides?: CallOverrides ): Promise; - stakeRegistry(overrides?: CallOverrides): Promise; - - taskCompleted( - completedTask: IReclaimServiceManager.CompletedTaskStruct, - referenceTaskIndex: BigNumberish, - overrides?: CallOverrides - ): Promise; - - taskCreationMetadata( - overrides?: CallOverrides - ): Promise< - [number, number, number, BigNumber] & { - maxTaskLifetimeS: number; - minSignaturesPerTask: number; - maxTaskCreationDelayS: number; - minFee: BigNumber; - } - >; + taskManager(overrides?: CallOverrides): Promise; transferOwnership( newOwner: string, overrides?: CallOverrides ): Promise; - unpause( - newPausedStatus: BigNumberish, - overrides?: CallOverrides - ): Promise; - updateAVSMetadataURI( _metadataURI: string, overrides?: CallOverrides ): Promise; - updateOperatorMetadata( - metadata: IReclaimServiceManager.OperatorMetadataStruct, - overrides?: CallOverrides - ): Promise; - - updateTaskCreationMetadata( - newMetadata: IReclaimServiceManager.TaskCreationMetadataStruct, - overrides?: CallOverrides - ): Promise; - - whitelistAddressAsOperator( - operator: string, - isWhitelisted: boolean, - overrides?: CallOverrides - ): Promise; - whitelistedOperators( arg0: BigNumberish, overrides?: CallOverrides @@ -1216,15 +792,6 @@ export interface ReclaimServiceManager extends BaseContract { "Initialized(uint8)"(version?: null): InitializedEventFilter; Initialized(version?: null): InitializedEventFilter; - "NewTaskCreated(uint32,((string,bytes32,bytes32,uint32,address,uint256),uint32,uint32,uint8,(address,string)[],uint256))"( - taskIndex?: BigNumberish | null, - task?: null - ): NewTaskCreatedEventFilter; - NewTaskCreated( - taskIndex?: BigNumberish | null, - task?: null - ): NewTaskCreatedEventFilter; - "OwnershipTransferred(address,address)"( previousOwner?: string | null, newOwner?: string | null @@ -1234,21 +801,6 @@ export interface ReclaimServiceManager extends BaseContract { newOwner?: string | null ): OwnershipTransferredEventFilter; - "Paused(address,uint256)"( - account?: string | null, - newPausedStatus?: null - ): PausedEventFilter; - Paused(account?: string | null, newPausedStatus?: null): PausedEventFilter; - - "PauserRegistrySet(address,address)"( - pauserRegistry?: null, - newPauserRegistry?: null - ): PauserRegistrySetEventFilter; - PauserRegistrySet( - pauserRegistry?: null, - newPauserRegistry?: null - ): PauserRegistrySetEventFilter; - "RewardsInitiatorUpdated(address,address)"( prevRewardsInitiator?: null, newRewardsInitiator?: null @@ -1257,79 +809,52 @@ export interface ReclaimServiceManager extends BaseContract { prevRewardsInitiator?: null, newRewardsInitiator?: null ): RewardsInitiatorUpdatedEventFilter; - - "TaskCompleted(uint32,(((string,bytes32,bytes32,uint32,address,uint256),uint32,uint32,uint8,(address,string)[],uint256),bytes[]))"( - taskIndex?: BigNumberish | null, - task?: null - ): TaskCompletedEventFilter; - TaskCompleted( - taskIndex?: BigNumberish | null, - task?: null - ): TaskCompletedEventFilter; - - "Unpaused(address,uint256)"( - account?: string | null, - newPausedStatus?: null - ): UnpausedEventFilter; - Unpaused( - account?: string | null, - newPausedStatus?: null - ): UnpausedEventFilter; }; estimateGas: { - allTaskHashes( - arg0: BigNumberish, - overrides?: CallOverrides + addOperatorToWhitelist( + operator: string, + overrides?: Overrides & { from?: string } ): Promise; - avsDirectory(overrides?: CallOverrides): Promise; - - createAVSRewardsSubmission( - rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + addPendingAdmin( + admin: string, overrides?: Overrides & { from?: string } ): Promise; - createNewTask( - request: IReclaimServiceManager.ClaimRequestStruct, - requestSignature: BytesLike, + avsDirectory(overrides?: CallOverrides): Promise; + + createAVSRewardsSubmission( + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; createOperatorDirectedAVSRewardsSubmission( - operatorDirectedRewardsSubmissions: IRewardsCoordinator.OperatorDirectedRewardsSubmissionStruct[], + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; - defaultStrategy(overrides?: CallOverrides): Promise; - deregisterOperatorFromAVS( operator: string, overrides?: Overrides & { from?: string } ): Promise; - encodeClaimRequest( - request: IReclaimServiceManager.ClaimRequestStruct, - overrides?: CallOverrides - ): Promise; - - getMetadataForOperator( + deregisterOperatorFromOperatorSets( operator: string, - overrides?: CallOverrides + operatorSetIds: BigNumberish[], + overrides?: Overrides & { from?: string } ): Promise; getOperatorRestakedStrategies( - _operator: string, + operator: string, overrides?: CallOverrides ): Promise; getRestakeableStrategies(overrides?: CallOverrides): Promise; - getToken(overrides?: CallOverrides): Promise; - initialize( initialOwner: string, - strategy: string, + rewardsInitiator: string, overrides?: Overrides & { from?: string } ): Promise; @@ -1338,40 +863,34 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: CallOverrides ): Promise; - latestTaskNum(overrides?: CallOverrides): Promise; + owner(overrides?: CallOverrides): Promise; - operatorHasMinimumWeight( + registerOperatorToAVS( operator: string, - overrides?: CallOverrides + operatorSignature: ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiryStruct, + overrides?: Overrides & { from?: string } ): Promise; - owner(overrides?: CallOverrides): Promise; - - pause( - newPausedStatus: BigNumberish, + removeAdmin( + admin: string, overrides?: Overrides & { from?: string } ): Promise; - pauseAll(overrides?: Overrides & { from?: string }): Promise; - - "paused(uint8)"( - index: BigNumberish, - overrides?: CallOverrides + removeAppointee( + appointee: string, + target: string, + selector: BytesLike, + overrides?: Overrides & { from?: string } ): Promise; - "paused()"(overrides?: CallOverrides): Promise; - - pauserRegistry(overrides?: CallOverrides): Promise; - - registerOperatorToAVS( + removeOperatorFromWhitelist( operator: string, - operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, overrides?: Overrides & { from?: string } ): Promise; - registeredOperators( - arg0: BigNumberish, - overrides?: CallOverrides + removePendingAdmin( + pendingAdmin: string, + overrides?: Overrides & { from?: string } ): Promise; renounceOwnership( @@ -1380,13 +899,15 @@ export interface ReclaimServiceManager extends BaseContract { rewardsInitiator(overrides?: CallOverrides): Promise; - setClaimerFor( - claimer: string, + setAppointee( + appointee: string, + target: string, + selector: BytesLike, overrides?: Overrides & { from?: string } ): Promise; - setPauserRegistry( - newPauserRegistry: string, + setClaimerFor( + claimer: string, overrides?: Overrides & { from?: string } ): Promise; @@ -1395,47 +916,18 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; - stakeRegistry(overrides?: CallOverrides): Promise; - - taskCompleted( - completedTask: IReclaimServiceManager.CompletedTaskStruct, - referenceTaskIndex: BigNumberish, - overrides?: Overrides & { from?: string } - ): Promise; - - taskCreationMetadata(overrides?: CallOverrides): Promise; + taskManager(overrides?: CallOverrides): Promise; transferOwnership( newOwner: string, overrides?: Overrides & { from?: string } ): Promise; - unpause( - newPausedStatus: BigNumberish, - overrides?: Overrides & { from?: string } - ): Promise; - updateAVSMetadataURI( _metadataURI: string, overrides?: Overrides & { from?: string } ): Promise; - updateOperatorMetadata( - metadata: IReclaimServiceManager.OperatorMetadataStruct, - overrides?: Overrides & { from?: string } - ): Promise; - - updateTaskCreationMetadata( - newMetadata: IReclaimServiceManager.TaskCreationMetadataStruct, - overrides?: Overrides & { from?: string } - ): Promise; - - whitelistAddressAsOperator( - operator: string, - isWhitelisted: boolean, - overrides?: Overrides & { from?: string } - ): Promise; - whitelistedOperators( arg0: BigNumberish, overrides?: CallOverrides @@ -1443,48 +935,41 @@ export interface ReclaimServiceManager extends BaseContract { }; populateTransaction: { - allTaskHashes( - arg0: BigNumberish, - overrides?: CallOverrides + addOperatorToWhitelist( + operator: string, + overrides?: Overrides & { from?: string } ): Promise; - avsDirectory(overrides?: CallOverrides): Promise; - - createAVSRewardsSubmission( - rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + addPendingAdmin( + admin: string, overrides?: Overrides & { from?: string } ): Promise; - createNewTask( - request: IReclaimServiceManager.ClaimRequestStruct, - requestSignature: BytesLike, + avsDirectory(overrides?: CallOverrides): Promise; + + createAVSRewardsSubmission( + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; createOperatorDirectedAVSRewardsSubmission( - operatorDirectedRewardsSubmissions: IRewardsCoordinator.OperatorDirectedRewardsSubmissionStruct[], + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; - defaultStrategy(overrides?: CallOverrides): Promise; - deregisterOperatorFromAVS( operator: string, overrides?: Overrides & { from?: string } ): Promise; - encodeClaimRequest( - request: IReclaimServiceManager.ClaimRequestStruct, - overrides?: CallOverrides - ): Promise; - - getMetadataForOperator( + deregisterOperatorFromOperatorSets( operator: string, - overrides?: CallOverrides + operatorSetIds: BigNumberish[], + overrides?: Overrides & { from?: string } ): Promise; getOperatorRestakedStrategies( - _operator: string, + operator: string, overrides?: CallOverrides ): Promise; @@ -1492,11 +977,9 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: CallOverrides ): Promise; - getToken(overrides?: CallOverrides): Promise; - initialize( initialOwner: string, - strategy: string, + rewardsInitiator: string, overrides?: Overrides & { from?: string } ): Promise; @@ -1505,42 +988,34 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: CallOverrides ): Promise; - latestTaskNum(overrides?: CallOverrides): Promise; - - operatorHasMinimumWeight( - operator: string, - overrides?: CallOverrides - ): Promise; - owner(overrides?: CallOverrides): Promise; - pause( - newPausedStatus: BigNumberish, + registerOperatorToAVS( + operator: string, + operatorSignature: ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiryStruct, overrides?: Overrides & { from?: string } ): Promise; - pauseAll( + removeAdmin( + admin: string, overrides?: Overrides & { from?: string } ): Promise; - "paused(uint8)"( - index: BigNumberish, - overrides?: CallOverrides + removeAppointee( + appointee: string, + target: string, + selector: BytesLike, + overrides?: Overrides & { from?: string } ): Promise; - "paused()"(overrides?: CallOverrides): Promise; - - pauserRegistry(overrides?: CallOverrides): Promise; - - registerOperatorToAVS( + removeOperatorFromWhitelist( operator: string, - operatorSignature: ISignatureUtils.SignatureWithSaltAndExpiryStruct, overrides?: Overrides & { from?: string } ): Promise; - registeredOperators( - arg0: BigNumberish, - overrides?: CallOverrides + removePendingAdmin( + pendingAdmin: string, + overrides?: Overrides & { from?: string } ): Promise; renounceOwnership( @@ -1549,13 +1024,15 @@ export interface ReclaimServiceManager extends BaseContract { rewardsInitiator(overrides?: CallOverrides): Promise; - setClaimerFor( - claimer: string, + setAppointee( + appointee: string, + target: string, + selector: BytesLike, overrides?: Overrides & { from?: string } ): Promise; - setPauserRegistry( - newPauserRegistry: string, + setClaimerFor( + claimer: string, overrides?: Overrides & { from?: string } ): Promise; @@ -1564,49 +1041,18 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; - stakeRegistry(overrides?: CallOverrides): Promise; - - taskCompleted( - completedTask: IReclaimServiceManager.CompletedTaskStruct, - referenceTaskIndex: BigNumberish, - overrides?: Overrides & { from?: string } - ): Promise; - - taskCreationMetadata( - overrides?: CallOverrides - ): Promise; + taskManager(overrides?: CallOverrides): Promise; transferOwnership( newOwner: string, overrides?: Overrides & { from?: string } ): Promise; - unpause( - newPausedStatus: BigNumberish, - overrides?: Overrides & { from?: string } - ): Promise; - updateAVSMetadataURI( _metadataURI: string, overrides?: Overrides & { from?: string } ): Promise; - updateOperatorMetadata( - metadata: IReclaimServiceManager.OperatorMetadataStruct, - overrides?: Overrides & { from?: string } - ): Promise; - - updateTaskCreationMetadata( - newMetadata: IReclaimServiceManager.TaskCreationMetadataStruct, - overrides?: Overrides & { from?: string } - ): Promise; - - whitelistAddressAsOperator( - operator: string, - isWhitelisted: boolean, - overrides?: Overrides & { from?: string } - ): Promise; - whitelistedOperators( arg0: BigNumberish, overrides?: CallOverrides diff --git a/src/avs/contracts/ReclaimSlashingRegistryCoordinator.ts b/src/avs/contracts/ReclaimSlashingRegistryCoordinator.ts new file mode 100644 index 00000000..90b1c2e9 --- /dev/null +++ b/src/avs/contracts/ReclaimSlashingRegistryCoordinator.ts @@ -0,0 +1,2216 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +} from "./common"; + +export declare namespace ISlashingRegistryCoordinatorTypes { + export type OperatorKickParamStruct = { + quorumNumber: BigNumberish; + operator: string; + }; + + export type OperatorKickParamStructOutput = [number, string] & { + quorumNumber: number; + operator: string; + }; + + export type OperatorSetParamStruct = { + maxOperatorCount: BigNumberish; + kickBIPsOfOperatorStake: BigNumberish; + kickBIPsOfTotalStake: BigNumberish; + }; + + export type OperatorSetParamStructOutput = [number, number, number] & { + maxOperatorCount: number; + kickBIPsOfOperatorStake: number; + kickBIPsOfTotalStake: number; + }; + + export type OperatorInfoStruct = { + operatorId: BytesLike; + status: BigNumberish; + }; + + export type OperatorInfoStructOutput = [string, number] & { + operatorId: string; + status: number; + }; + + export type QuorumBitmapUpdateStruct = { + updateBlockNumber: BigNumberish; + nextUpdateBlockNumber: BigNumberish; + quorumBitmap: BigNumberish; + }; + + export type QuorumBitmapUpdateStructOutput = [number, number, BigNumber] & { + updateBlockNumber: number; + nextUpdateBlockNumber: number; + quorumBitmap: BigNumber; + }; +} + +export declare namespace IStakeRegistryTypes { + export type StrategyParamsStruct = { + strategy: string; + multiplier: BigNumberish; + }; + + export type StrategyParamsStructOutput = [string, BigNumber] & { + strategy: string; + multiplier: BigNumber; + }; +} + +export declare namespace BN254 { + export type G1PointStruct = { X: BigNumberish; Y: BigNumberish }; + + export type G1PointStructOutput = [BigNumber, BigNumber] & { + X: BigNumber; + Y: BigNumber; + }; +} + +export interface ReclaimSlashingRegistryCoordinatorInterface + extends utils.Interface { + functions: { + "OPERATOR_CHURN_APPROVAL_TYPEHASH()": FunctionFragment; + "PUBKEY_REGISTRATION_TYPEHASH()": FunctionFragment; + "allocationManager()": FunctionFragment; + "avs()": FunctionFragment; + "blsApkRegistry()": FunctionFragment; + "calculateOperatorChurnApprovalDigestHash(address,bytes32,(uint8,address)[],bytes32,uint256)": FunctionFragment; + "calculatePubkeyRegistrationMessageHash(address)": FunctionFragment; + "churnApprover()": FunctionFragment; + "createSlashableStakeQuorum((uint32,uint16,uint16),uint96,(address,uint96)[],uint32)": FunctionFragment; + "createTotalDelegatedStakeQuorum((uint32,uint16,uint16),uint96,(address,uint96)[])": FunctionFragment; + "deregisterOperator(address,address,uint32[])": FunctionFragment; + "domainSeparator()": FunctionFragment; + "eip712Domain()": FunctionFragment; + "ejectOperator(address,bytes)": FunctionFragment; + "ejectionCooldown()": FunctionFragment; + "ejector()": FunctionFragment; + "getCurrentQuorumBitmap(bytes32)": FunctionFragment; + "getOperator(address)": FunctionFragment; + "getOperatorFromId(bytes32)": FunctionFragment; + "getOperatorId(address)": FunctionFragment; + "getOperatorSetParams(uint8)": FunctionFragment; + "getOperatorStatus(address)": FunctionFragment; + "getQuorumBitmapAtBlockNumberByIndex(bytes32,uint32,uint256)": FunctionFragment; + "getQuorumBitmapHistoryLength(bytes32)": FunctionFragment; + "getQuorumBitmapIndicesAtBlockNumber(uint32,bytes32[])": FunctionFragment; + "getQuorumBitmapUpdateByIndex(bytes32,uint256)": FunctionFragment; + "indexRegistry()": FunctionFragment; + "initialize(address,address,address,uint256,address)": FunctionFragment; + "isChurnApproverSaltUsed(bytes32)": FunctionFragment; + "lastEjectionTimestamp(address)": FunctionFragment; + "owner()": FunctionFragment; + "pause(uint256)": FunctionFragment; + "pauseAll()": FunctionFragment; + "paused(uint8)": FunctionFragment; + "paused()": FunctionFragment; + "pauserRegistry()": FunctionFragment; + "pubkeyRegistrationMessageHash(address)": FunctionFragment; + "quorumCount()": FunctionFragment; + "quorumUpdateBlockNumber(uint8)": FunctionFragment; + "registerOperator(address,address,uint32[],bytes)": FunctionFragment; + "renounceOwnership()": FunctionFragment; + "setAVS(address)": FunctionFragment; + "setChurnApprover(address)": FunctionFragment; + "setEjectionCooldown(uint256)": FunctionFragment; + "setEjector(address)": FunctionFragment; + "setOperatorSetParams(uint8,(uint32,uint16,uint16))": FunctionFragment; + "socketRegistry()": FunctionFragment; + "stakeRegistry()": FunctionFragment; + "supportsAVS(address)": FunctionFragment; + "transferOwnership(address)": FunctionFragment; + "unpause(uint256)": FunctionFragment; + "updateOperators(address[])": FunctionFragment; + "updateOperatorsForQuorum(address[][],bytes)": FunctionFragment; + "updateSocket(string)": FunctionFragment; + "version()": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "OPERATOR_CHURN_APPROVAL_TYPEHASH" + | "PUBKEY_REGISTRATION_TYPEHASH" + | "allocationManager" + | "avs" + | "blsApkRegistry" + | "calculateOperatorChurnApprovalDigestHash" + | "calculatePubkeyRegistrationMessageHash" + | "churnApprover" + | "createSlashableStakeQuorum" + | "createTotalDelegatedStakeQuorum" + | "deregisterOperator" + | "domainSeparator" + | "eip712Domain" + | "ejectOperator" + | "ejectionCooldown" + | "ejector" + | "getCurrentQuorumBitmap" + | "getOperator" + | "getOperatorFromId" + | "getOperatorId" + | "getOperatorSetParams" + | "getOperatorStatus" + | "getQuorumBitmapAtBlockNumberByIndex" + | "getQuorumBitmapHistoryLength" + | "getQuorumBitmapIndicesAtBlockNumber" + | "getQuorumBitmapUpdateByIndex" + | "indexRegistry" + | "initialize" + | "isChurnApproverSaltUsed" + | "lastEjectionTimestamp" + | "owner" + | "pause" + | "pauseAll" + | "paused(uint8)" + | "paused()" + | "pauserRegistry" + | "pubkeyRegistrationMessageHash" + | "quorumCount" + | "quorumUpdateBlockNumber" + | "registerOperator" + | "renounceOwnership" + | "setAVS" + | "setChurnApprover" + | "setEjectionCooldown" + | "setEjector" + | "setOperatorSetParams" + | "socketRegistry" + | "stakeRegistry" + | "supportsAVS" + | "transferOwnership" + | "unpause" + | "updateOperators" + | "updateOperatorsForQuorum" + | "updateSocket" + | "version" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "OPERATOR_CHURN_APPROVAL_TYPEHASH", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "PUBKEY_REGISTRATION_TYPEHASH", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "allocationManager", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "avs", values?: undefined): string; + encodeFunctionData( + functionFragment: "blsApkRegistry", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "calculateOperatorChurnApprovalDigestHash", + values: [ + string, + BytesLike, + ISlashingRegistryCoordinatorTypes.OperatorKickParamStruct[], + BytesLike, + BigNumberish + ] + ): string; + encodeFunctionData( + functionFragment: "calculatePubkeyRegistrationMessageHash", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "churnApprover", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "createSlashableStakeQuorum", + values: [ + ISlashingRegistryCoordinatorTypes.OperatorSetParamStruct, + BigNumberish, + IStakeRegistryTypes.StrategyParamsStruct[], + BigNumberish + ] + ): string; + encodeFunctionData( + functionFragment: "createTotalDelegatedStakeQuorum", + values: [ + ISlashingRegistryCoordinatorTypes.OperatorSetParamStruct, + BigNumberish, + IStakeRegistryTypes.StrategyParamsStruct[] + ] + ): string; + encodeFunctionData( + functionFragment: "deregisterOperator", + values: [string, string, BigNumberish[]] + ): string; + encodeFunctionData( + functionFragment: "domainSeparator", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "eip712Domain", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "ejectOperator", + values: [string, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "ejectionCooldown", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "ejector", values?: undefined): string; + encodeFunctionData( + functionFragment: "getCurrentQuorumBitmap", + values: [BytesLike] + ): string; + encodeFunctionData(functionFragment: "getOperator", values: [string]): string; + encodeFunctionData( + functionFragment: "getOperatorFromId", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "getOperatorId", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "getOperatorSetParams", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getOperatorStatus", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "getQuorumBitmapAtBlockNumberByIndex", + values: [BytesLike, BigNumberish, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getQuorumBitmapHistoryLength", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "getQuorumBitmapIndicesAtBlockNumber", + values: [BigNumberish, BytesLike[]] + ): string; + encodeFunctionData( + functionFragment: "getQuorumBitmapUpdateByIndex", + values: [BytesLike, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "indexRegistry", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "initialize", + values: [string, string, string, BigNumberish, string] + ): string; + encodeFunctionData( + functionFragment: "isChurnApproverSaltUsed", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "lastEjectionTimestamp", + values: [string] + ): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData(functionFragment: "pause", values: [BigNumberish]): string; + encodeFunctionData(functionFragment: "pauseAll", values?: undefined): string; + encodeFunctionData( + functionFragment: "paused(uint8)", + values: [BigNumberish] + ): string; + encodeFunctionData(functionFragment: "paused()", values?: undefined): string; + encodeFunctionData( + functionFragment: "pauserRegistry", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "pubkeyRegistrationMessageHash", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "quorumCount", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "quorumUpdateBlockNumber", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "registerOperator", + values: [string, string, BigNumberish[], BytesLike] + ): string; + encodeFunctionData( + functionFragment: "renounceOwnership", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "setAVS", values: [string]): string; + encodeFunctionData( + functionFragment: "setChurnApprover", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "setEjectionCooldown", + values: [BigNumberish] + ): string; + encodeFunctionData(functionFragment: "setEjector", values: [string]): string; + encodeFunctionData( + functionFragment: "setOperatorSetParams", + values: [ + BigNumberish, + ISlashingRegistryCoordinatorTypes.OperatorSetParamStruct + ] + ): string; + encodeFunctionData( + functionFragment: "socketRegistry", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "stakeRegistry", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "supportsAVS", values: [string]): string; + encodeFunctionData( + functionFragment: "transferOwnership", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "unpause", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "updateOperators", + values: [string[]] + ): string; + encodeFunctionData( + functionFragment: "updateOperatorsForQuorum", + values: [string[][], BytesLike] + ): string; + encodeFunctionData( + functionFragment: "updateSocket", + values: [string] + ): string; + encodeFunctionData(functionFragment: "version", values?: undefined): string; + + decodeFunctionResult( + functionFragment: "OPERATOR_CHURN_APPROVAL_TYPEHASH", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "PUBKEY_REGISTRATION_TYPEHASH", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "allocationManager", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "avs", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "blsApkRegistry", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "calculateOperatorChurnApprovalDigestHash", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "calculatePubkeyRegistrationMessageHash", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "churnApprover", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "createSlashableStakeQuorum", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "createTotalDelegatedStakeQuorum", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "deregisterOperator", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "domainSeparator", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "eip712Domain", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "ejectOperator", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "ejectionCooldown", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "ejector", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getCurrentQuorumBitmap", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getOperator", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getOperatorFromId", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getOperatorId", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getOperatorSetParams", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getOperatorStatus", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getQuorumBitmapAtBlockNumberByIndex", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getQuorumBitmapHistoryLength", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getQuorumBitmapIndicesAtBlockNumber", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getQuorumBitmapUpdateByIndex", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "indexRegistry", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "isChurnApproverSaltUsed", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "lastEjectionTimestamp", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "pause", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "pauseAll", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "paused(uint8)", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "paused()", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "pauserRegistry", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "pubkeyRegistrationMessageHash", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "quorumCount", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "quorumUpdateBlockNumber", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "registerOperator", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "renounceOwnership", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "setAVS", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "setChurnApprover", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setEjectionCooldown", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "setEjector", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "setOperatorSetParams", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "socketRegistry", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "stakeRegistry", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "supportsAVS", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "transferOwnership", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "unpause", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "updateOperators", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "updateOperatorsForQuorum", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "updateSocket", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "version", data: BytesLike): Result; + + events: { + "AVSUpdated(address,address)": EventFragment; + "ChurnApproverUpdated(address,address)": EventFragment; + "EIP712DomainChanged()": EventFragment; + "EjectionCooldownUpdated(uint256,uint256)": EventFragment; + "EjectorUpdated(address,address)": EventFragment; + "Initialized(uint8)": EventFragment; + "OperatorDeregistered(address,bytes32)": EventFragment; + "OperatorRegistered(address,bytes32)": EventFragment; + "OperatorSetParamsUpdated(uint8,(uint32,uint16,uint16))": EventFragment; + "OperatorSocketUpdate(bytes32,string)": EventFragment; + "OwnershipTransferred(address,address)": EventFragment; + "Paused(address,uint256)": EventFragment; + "QuorumBlockNumberUpdated(uint8,uint256)": EventFragment; + "QuorumCreated(uint8,(uint32,uint16,uint16),uint96,(address,uint96)[],uint8,uint32)": EventFragment; + "Unpaused(address,uint256)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "AVSUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "ChurnApproverUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "EIP712DomainChanged"): EventFragment; + getEvent(nameOrSignatureOrTopic: "EjectionCooldownUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "EjectorUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OperatorDeregistered"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OperatorRegistered"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OperatorSetParamsUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OperatorSocketUpdate"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Paused"): EventFragment; + getEvent(nameOrSignatureOrTopic: "QuorumBlockNumberUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "QuorumCreated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Unpaused"): EventFragment; +} + +export interface AVSUpdatedEventObject { + prevAVS: string; + newAVS: string; +} +export type AVSUpdatedEvent = TypedEvent< + [string, string], + AVSUpdatedEventObject +>; + +export type AVSUpdatedEventFilter = TypedEventFilter; + +export interface ChurnApproverUpdatedEventObject { + prevChurnApprover: string; + newChurnApprover: string; +} +export type ChurnApproverUpdatedEvent = TypedEvent< + [string, string], + ChurnApproverUpdatedEventObject +>; + +export type ChurnApproverUpdatedEventFilter = + TypedEventFilter; + +export interface EIP712DomainChangedEventObject {} +export type EIP712DomainChangedEvent = TypedEvent< + [], + EIP712DomainChangedEventObject +>; + +export type EIP712DomainChangedEventFilter = + TypedEventFilter; + +export interface EjectionCooldownUpdatedEventObject { + prevEjectionCooldown: BigNumber; + newEjectionCooldown: BigNumber; +} +export type EjectionCooldownUpdatedEvent = TypedEvent< + [BigNumber, BigNumber], + EjectionCooldownUpdatedEventObject +>; + +export type EjectionCooldownUpdatedEventFilter = + TypedEventFilter; + +export interface EjectorUpdatedEventObject { + prevEjector: string; + newEjector: string; +} +export type EjectorUpdatedEvent = TypedEvent< + [string, string], + EjectorUpdatedEventObject +>; + +export type EjectorUpdatedEventFilter = TypedEventFilter; + +export interface InitializedEventObject { + version: number; +} +export type InitializedEvent = TypedEvent<[number], InitializedEventObject>; + +export type InitializedEventFilter = TypedEventFilter; + +export interface OperatorDeregisteredEventObject { + operator: string; + operatorId: string; +} +export type OperatorDeregisteredEvent = TypedEvent< + [string, string], + OperatorDeregisteredEventObject +>; + +export type OperatorDeregisteredEventFilter = + TypedEventFilter; + +export interface OperatorRegisteredEventObject { + operator: string; + operatorId: string; +} +export type OperatorRegisteredEvent = TypedEvent< + [string, string], + OperatorRegisteredEventObject +>; + +export type OperatorRegisteredEventFilter = + TypedEventFilter; + +export interface OperatorSetParamsUpdatedEventObject { + quorumNumber: number; + operatorSetParams: ISlashingRegistryCoordinatorTypes.OperatorSetParamStructOutput; +} +export type OperatorSetParamsUpdatedEvent = TypedEvent< + [number, ISlashingRegistryCoordinatorTypes.OperatorSetParamStructOutput], + OperatorSetParamsUpdatedEventObject +>; + +export type OperatorSetParamsUpdatedEventFilter = + TypedEventFilter; + +export interface OperatorSocketUpdateEventObject { + operatorId: string; + socket: string; +} +export type OperatorSocketUpdateEvent = TypedEvent< + [string, string], + OperatorSocketUpdateEventObject +>; + +export type OperatorSocketUpdateEventFilter = + TypedEventFilter; + +export interface OwnershipTransferredEventObject { + previousOwner: string; + newOwner: string; +} +export type OwnershipTransferredEvent = TypedEvent< + [string, string], + OwnershipTransferredEventObject +>; + +export type OwnershipTransferredEventFilter = + TypedEventFilter; + +export interface PausedEventObject { + account: string; + newPausedStatus: BigNumber; +} +export type PausedEvent = TypedEvent<[string, BigNumber], PausedEventObject>; + +export type PausedEventFilter = TypedEventFilter; + +export interface QuorumBlockNumberUpdatedEventObject { + quorumNumber: number; + blocknumber: BigNumber; +} +export type QuorumBlockNumberUpdatedEvent = TypedEvent< + [number, BigNumber], + QuorumBlockNumberUpdatedEventObject +>; + +export type QuorumBlockNumberUpdatedEventFilter = + TypedEventFilter; + +export interface QuorumCreatedEventObject { + quorumNumber: number; + operatorSetParams: ISlashingRegistryCoordinatorTypes.OperatorSetParamStructOutput; + minimumStake: BigNumber; + strategyParams: IStakeRegistryTypes.StrategyParamsStructOutput[]; + stakeType: number; + lookAheadPeriod: number; +} +export type QuorumCreatedEvent = TypedEvent< + [ + number, + ISlashingRegistryCoordinatorTypes.OperatorSetParamStructOutput, + BigNumber, + IStakeRegistryTypes.StrategyParamsStructOutput[], + number, + number + ], + QuorumCreatedEventObject +>; + +export type QuorumCreatedEventFilter = TypedEventFilter; + +export interface UnpausedEventObject { + account: string; + newPausedStatus: BigNumber; +} +export type UnpausedEvent = TypedEvent< + [string, BigNumber], + UnpausedEventObject +>; + +export type UnpausedEventFilter = TypedEventFilter; + +export interface ReclaimSlashingRegistryCoordinator extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: ReclaimSlashingRegistryCoordinatorInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + OPERATOR_CHURN_APPROVAL_TYPEHASH( + overrides?: CallOverrides + ): Promise<[string]>; + + PUBKEY_REGISTRATION_TYPEHASH(overrides?: CallOverrides): Promise<[string]>; + + allocationManager(overrides?: CallOverrides): Promise<[string]>; + + avs(overrides?: CallOverrides): Promise<[string]>; + + blsApkRegistry(overrides?: CallOverrides): Promise<[string]>; + + calculateOperatorChurnApprovalDigestHash( + registeringOperator: string, + registeringOperatorId: BytesLike, + operatorKickParams: ISlashingRegistryCoordinatorTypes.OperatorKickParamStruct[], + salt: BytesLike, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + calculatePubkeyRegistrationMessageHash( + operator: string, + overrides?: CallOverrides + ): Promise<[string]>; + + churnApprover(overrides?: CallOverrides): Promise<[string]>; + + createSlashableStakeQuorum( + operatorSetParams: ISlashingRegistryCoordinatorTypes.OperatorSetParamStruct, + minimumStake: BigNumberish, + strategyParams: IStakeRegistryTypes.StrategyParamsStruct[], + lookAheadPeriod: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + createTotalDelegatedStakeQuorum( + operatorSetParams: ISlashingRegistryCoordinatorTypes.OperatorSetParamStruct, + minimumStake: BigNumberish, + strategyParams: IStakeRegistryTypes.StrategyParamsStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + deregisterOperator( + operator: string, + avs: string, + operatorSetIds: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + domainSeparator(overrides?: CallOverrides): Promise<[string]>; + + eip712Domain( + overrides?: CallOverrides + ): Promise< + [string, string, string, BigNumber, string, string, BigNumber[]] & { + fields: string; + name: string; + version: string; + chainId: BigNumber; + verifyingContract: string; + salt: string; + extensions: BigNumber[]; + } + >; + + ejectOperator( + operator: string, + quorumNumbers: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + ejectionCooldown(overrides?: CallOverrides): Promise<[BigNumber]>; + + ejector(overrides?: CallOverrides): Promise<[string]>; + + getCurrentQuorumBitmap( + operatorId: BytesLike, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getOperator( + operator: string, + overrides?: CallOverrides + ): Promise<[ISlashingRegistryCoordinatorTypes.OperatorInfoStructOutput]>; + + getOperatorFromId( + operatorId: BytesLike, + overrides?: CallOverrides + ): Promise<[string]>; + + getOperatorId( + operator: string, + overrides?: CallOverrides + ): Promise<[string]>; + + getOperatorSetParams( + quorumNumber: BigNumberish, + overrides?: CallOverrides + ): Promise< + [ISlashingRegistryCoordinatorTypes.OperatorSetParamStructOutput] + >; + + getOperatorStatus( + operator: string, + overrides?: CallOverrides + ): Promise<[number]>; + + getQuorumBitmapAtBlockNumberByIndex( + operatorId: BytesLike, + blockNumber: BigNumberish, + index: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getQuorumBitmapHistoryLength( + operatorId: BytesLike, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getQuorumBitmapIndicesAtBlockNumber( + blockNumber: BigNumberish, + operatorIds: BytesLike[], + overrides?: CallOverrides + ): Promise<[number[]]>; + + getQuorumBitmapUpdateByIndex( + operatorId: BytesLike, + index: BigNumberish, + overrides?: CallOverrides + ): Promise< + [ISlashingRegistryCoordinatorTypes.QuorumBitmapUpdateStructOutput] + >; + + indexRegistry(overrides?: CallOverrides): Promise<[string]>; + + initialize( + initialOwner: string, + churnApprover: string, + ejector: string, + initialPausedStatus: BigNumberish, + avs: string, + overrides?: Overrides & { from?: string } + ): Promise; + + isChurnApproverSaltUsed( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean]>; + + lastEjectionTimestamp( + arg0: string, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + owner(overrides?: CallOverrides): Promise<[string]>; + + pause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + pauseAll( + overrides?: Overrides & { from?: string } + ): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise<[boolean]>; + + "paused()"(overrides?: CallOverrides): Promise<[BigNumber]>; + + pauserRegistry(overrides?: CallOverrides): Promise<[string]>; + + pubkeyRegistrationMessageHash( + operator: string, + overrides?: CallOverrides + ): Promise<[BN254.G1PointStructOutput]>; + + quorumCount(overrides?: CallOverrides): Promise<[number]>; + + quorumUpdateBlockNumber( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + registerOperator( + operator: string, + avs: string, + operatorSetIds: BigNumberish[], + data: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + setAVS( + _avs: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setChurnApprover( + _churnApprover: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setEjectionCooldown( + _ejectionCooldown: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setEjector( + _ejector: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setOperatorSetParams( + quorumNumber: BigNumberish, + operatorSetParams: ISlashingRegistryCoordinatorTypes.OperatorSetParamStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + socketRegistry(overrides?: CallOverrides): Promise<[string]>; + + stakeRegistry(overrides?: CallOverrides): Promise<[string]>; + + supportsAVS(_avs: string, overrides?: CallOverrides): Promise<[boolean]>; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + updateOperators( + operators: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + updateOperatorsForQuorum( + operatorsPerQuorum: string[][], + quorumNumbers: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + updateSocket( + socket: string, + overrides?: Overrides & { from?: string } + ): Promise; + + version(overrides?: CallOverrides): Promise<[string]>; + }; + + OPERATOR_CHURN_APPROVAL_TYPEHASH(overrides?: CallOverrides): Promise; + + PUBKEY_REGISTRATION_TYPEHASH(overrides?: CallOverrides): Promise; + + allocationManager(overrides?: CallOverrides): Promise; + + avs(overrides?: CallOverrides): Promise; + + blsApkRegistry(overrides?: CallOverrides): Promise; + + calculateOperatorChurnApprovalDigestHash( + registeringOperator: string, + registeringOperatorId: BytesLike, + operatorKickParams: ISlashingRegistryCoordinatorTypes.OperatorKickParamStruct[], + salt: BytesLike, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise; + + calculatePubkeyRegistrationMessageHash( + operator: string, + overrides?: CallOverrides + ): Promise; + + churnApprover(overrides?: CallOverrides): Promise; + + createSlashableStakeQuorum( + operatorSetParams: ISlashingRegistryCoordinatorTypes.OperatorSetParamStruct, + minimumStake: BigNumberish, + strategyParams: IStakeRegistryTypes.StrategyParamsStruct[], + lookAheadPeriod: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + createTotalDelegatedStakeQuorum( + operatorSetParams: ISlashingRegistryCoordinatorTypes.OperatorSetParamStruct, + minimumStake: BigNumberish, + strategyParams: IStakeRegistryTypes.StrategyParamsStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + deregisterOperator( + operator: string, + avs: string, + operatorSetIds: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + domainSeparator(overrides?: CallOverrides): Promise; + + eip712Domain( + overrides?: CallOverrides + ): Promise< + [string, string, string, BigNumber, string, string, BigNumber[]] & { + fields: string; + name: string; + version: string; + chainId: BigNumber; + verifyingContract: string; + salt: string; + extensions: BigNumber[]; + } + >; + + ejectOperator( + operator: string, + quorumNumbers: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + ejectionCooldown(overrides?: CallOverrides): Promise; + + ejector(overrides?: CallOverrides): Promise; + + getCurrentQuorumBitmap( + operatorId: BytesLike, + overrides?: CallOverrides + ): Promise; + + getOperator( + operator: string, + overrides?: CallOverrides + ): Promise; + + getOperatorFromId( + operatorId: BytesLike, + overrides?: CallOverrides + ): Promise; + + getOperatorId(operator: string, overrides?: CallOverrides): Promise; + + getOperatorSetParams( + quorumNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getOperatorStatus( + operator: string, + overrides?: CallOverrides + ): Promise; + + getQuorumBitmapAtBlockNumberByIndex( + operatorId: BytesLike, + blockNumber: BigNumberish, + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getQuorumBitmapHistoryLength( + operatorId: BytesLike, + overrides?: CallOverrides + ): Promise; + + getQuorumBitmapIndicesAtBlockNumber( + blockNumber: BigNumberish, + operatorIds: BytesLike[], + overrides?: CallOverrides + ): Promise; + + getQuorumBitmapUpdateByIndex( + operatorId: BytesLike, + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + indexRegistry(overrides?: CallOverrides): Promise; + + initialize( + initialOwner: string, + churnApprover: string, + ejector: string, + initialPausedStatus: BigNumberish, + avs: string, + overrides?: Overrides & { from?: string } + ): Promise; + + isChurnApproverSaltUsed( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + lastEjectionTimestamp( + arg0: string, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + pauseAll( + overrides?: Overrides & { from?: string } + ): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + pauserRegistry(overrides?: CallOverrides): Promise; + + pubkeyRegistrationMessageHash( + operator: string, + overrides?: CallOverrides + ): Promise; + + quorumCount(overrides?: CallOverrides): Promise; + + quorumUpdateBlockNumber( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + registerOperator( + operator: string, + avs: string, + operatorSetIds: BigNumberish[], + data: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + setAVS( + _avs: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setChurnApprover( + _churnApprover: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setEjectionCooldown( + _ejectionCooldown: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setEjector( + _ejector: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setOperatorSetParams( + quorumNumber: BigNumberish, + operatorSetParams: ISlashingRegistryCoordinatorTypes.OperatorSetParamStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + socketRegistry(overrides?: CallOverrides): Promise; + + stakeRegistry(overrides?: CallOverrides): Promise; + + supportsAVS(_avs: string, overrides?: CallOverrides): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + updateOperators( + operators: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + updateOperatorsForQuorum( + operatorsPerQuorum: string[][], + quorumNumbers: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + updateSocket( + socket: string, + overrides?: Overrides & { from?: string } + ): Promise; + + version(overrides?: CallOverrides): Promise; + + callStatic: { + OPERATOR_CHURN_APPROVAL_TYPEHASH( + overrides?: CallOverrides + ): Promise; + + PUBKEY_REGISTRATION_TYPEHASH(overrides?: CallOverrides): Promise; + + allocationManager(overrides?: CallOverrides): Promise; + + avs(overrides?: CallOverrides): Promise; + + blsApkRegistry(overrides?: CallOverrides): Promise; + + calculateOperatorChurnApprovalDigestHash( + registeringOperator: string, + registeringOperatorId: BytesLike, + operatorKickParams: ISlashingRegistryCoordinatorTypes.OperatorKickParamStruct[], + salt: BytesLike, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise; + + calculatePubkeyRegistrationMessageHash( + operator: string, + overrides?: CallOverrides + ): Promise; + + churnApprover(overrides?: CallOverrides): Promise; + + createSlashableStakeQuorum( + operatorSetParams: ISlashingRegistryCoordinatorTypes.OperatorSetParamStruct, + minimumStake: BigNumberish, + strategyParams: IStakeRegistryTypes.StrategyParamsStruct[], + lookAheadPeriod: BigNumberish, + overrides?: CallOverrides + ): Promise; + + createTotalDelegatedStakeQuorum( + operatorSetParams: ISlashingRegistryCoordinatorTypes.OperatorSetParamStruct, + minimumStake: BigNumberish, + strategyParams: IStakeRegistryTypes.StrategyParamsStruct[], + overrides?: CallOverrides + ): Promise; + + deregisterOperator( + operator: string, + avs: string, + operatorSetIds: BigNumberish[], + overrides?: CallOverrides + ): Promise; + + domainSeparator(overrides?: CallOverrides): Promise; + + eip712Domain( + overrides?: CallOverrides + ): Promise< + [string, string, string, BigNumber, string, string, BigNumber[]] & { + fields: string; + name: string; + version: string; + chainId: BigNumber; + verifyingContract: string; + salt: string; + extensions: BigNumber[]; + } + >; + + ejectOperator( + operator: string, + quorumNumbers: BytesLike, + overrides?: CallOverrides + ): Promise; + + ejectionCooldown(overrides?: CallOverrides): Promise; + + ejector(overrides?: CallOverrides): Promise; + + getCurrentQuorumBitmap( + operatorId: BytesLike, + overrides?: CallOverrides + ): Promise; + + getOperator( + operator: string, + overrides?: CallOverrides + ): Promise; + + getOperatorFromId( + operatorId: BytesLike, + overrides?: CallOverrides + ): Promise; + + getOperatorId(operator: string, overrides?: CallOverrides): Promise; + + getOperatorSetParams( + quorumNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getOperatorStatus( + operator: string, + overrides?: CallOverrides + ): Promise; + + getQuorumBitmapAtBlockNumberByIndex( + operatorId: BytesLike, + blockNumber: BigNumberish, + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getQuorumBitmapHistoryLength( + operatorId: BytesLike, + overrides?: CallOverrides + ): Promise; + + getQuorumBitmapIndicesAtBlockNumber( + blockNumber: BigNumberish, + operatorIds: BytesLike[], + overrides?: CallOverrides + ): Promise; + + getQuorumBitmapUpdateByIndex( + operatorId: BytesLike, + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + indexRegistry(overrides?: CallOverrides): Promise; + + initialize( + initialOwner: string, + churnApprover: string, + ejector: string, + initialPausedStatus: BigNumberish, + avs: string, + overrides?: CallOverrides + ): Promise; + + isChurnApproverSaltUsed( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + lastEjectionTimestamp( + arg0: string, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pause( + newPausedStatus: BigNumberish, + overrides?: CallOverrides + ): Promise; + + pauseAll(overrides?: CallOverrides): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + pauserRegistry(overrides?: CallOverrides): Promise; + + pubkeyRegistrationMessageHash( + operator: string, + overrides?: CallOverrides + ): Promise; + + quorumCount(overrides?: CallOverrides): Promise; + + quorumUpdateBlockNumber( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + registerOperator( + operator: string, + avs: string, + operatorSetIds: BigNumberish[], + data: BytesLike, + overrides?: CallOverrides + ): Promise; + + renounceOwnership(overrides?: CallOverrides): Promise; + + setAVS(_avs: string, overrides?: CallOverrides): Promise; + + setChurnApprover( + _churnApprover: string, + overrides?: CallOverrides + ): Promise; + + setEjectionCooldown( + _ejectionCooldown: BigNumberish, + overrides?: CallOverrides + ): Promise; + + setEjector(_ejector: string, overrides?: CallOverrides): Promise; + + setOperatorSetParams( + quorumNumber: BigNumberish, + operatorSetParams: ISlashingRegistryCoordinatorTypes.OperatorSetParamStruct, + overrides?: CallOverrides + ): Promise; + + socketRegistry(overrides?: CallOverrides): Promise; + + stakeRegistry(overrides?: CallOverrides): Promise; + + supportsAVS(_avs: string, overrides?: CallOverrides): Promise; + + transferOwnership( + newOwner: string, + overrides?: CallOverrides + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: CallOverrides + ): Promise; + + updateOperators( + operators: string[], + overrides?: CallOverrides + ): Promise; + + updateOperatorsForQuorum( + operatorsPerQuorum: string[][], + quorumNumbers: BytesLike, + overrides?: CallOverrides + ): Promise; + + updateSocket(socket: string, overrides?: CallOverrides): Promise; + + version(overrides?: CallOverrides): Promise; + }; + + filters: { + "AVSUpdated(address,address)"( + prevAVS?: null, + newAVS?: null + ): AVSUpdatedEventFilter; + AVSUpdated(prevAVS?: null, newAVS?: null): AVSUpdatedEventFilter; + + "ChurnApproverUpdated(address,address)"( + prevChurnApprover?: null, + newChurnApprover?: null + ): ChurnApproverUpdatedEventFilter; + ChurnApproverUpdated( + prevChurnApprover?: null, + newChurnApprover?: null + ): ChurnApproverUpdatedEventFilter; + + "EIP712DomainChanged()"(): EIP712DomainChangedEventFilter; + EIP712DomainChanged(): EIP712DomainChangedEventFilter; + + "EjectionCooldownUpdated(uint256,uint256)"( + prevEjectionCooldown?: null, + newEjectionCooldown?: null + ): EjectionCooldownUpdatedEventFilter; + EjectionCooldownUpdated( + prevEjectionCooldown?: null, + newEjectionCooldown?: null + ): EjectionCooldownUpdatedEventFilter; + + "EjectorUpdated(address,address)"( + prevEjector?: null, + newEjector?: null + ): EjectorUpdatedEventFilter; + EjectorUpdated( + prevEjector?: null, + newEjector?: null + ): EjectorUpdatedEventFilter; + + "Initialized(uint8)"(version?: null): InitializedEventFilter; + Initialized(version?: null): InitializedEventFilter; + + "OperatorDeregistered(address,bytes32)"( + operator?: string | null, + operatorId?: BytesLike | null + ): OperatorDeregisteredEventFilter; + OperatorDeregistered( + operator?: string | null, + operatorId?: BytesLike | null + ): OperatorDeregisteredEventFilter; + + "OperatorRegistered(address,bytes32)"( + operator?: string | null, + operatorId?: BytesLike | null + ): OperatorRegisteredEventFilter; + OperatorRegistered( + operator?: string | null, + operatorId?: BytesLike | null + ): OperatorRegisteredEventFilter; + + "OperatorSetParamsUpdated(uint8,(uint32,uint16,uint16))"( + quorumNumber?: BigNumberish | null, + operatorSetParams?: null + ): OperatorSetParamsUpdatedEventFilter; + OperatorSetParamsUpdated( + quorumNumber?: BigNumberish | null, + operatorSetParams?: null + ): OperatorSetParamsUpdatedEventFilter; + + "OperatorSocketUpdate(bytes32,string)"( + operatorId?: BytesLike | null, + socket?: null + ): OperatorSocketUpdateEventFilter; + OperatorSocketUpdate( + operatorId?: BytesLike | null, + socket?: null + ): OperatorSocketUpdateEventFilter; + + "OwnershipTransferred(address,address)"( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + OwnershipTransferred( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + + "Paused(address,uint256)"( + account?: string | null, + newPausedStatus?: null + ): PausedEventFilter; + Paused(account?: string | null, newPausedStatus?: null): PausedEventFilter; + + "QuorumBlockNumberUpdated(uint8,uint256)"( + quorumNumber?: BigNumberish | null, + blocknumber?: null + ): QuorumBlockNumberUpdatedEventFilter; + QuorumBlockNumberUpdated( + quorumNumber?: BigNumberish | null, + blocknumber?: null + ): QuorumBlockNumberUpdatedEventFilter; + + "QuorumCreated(uint8,(uint32,uint16,uint16),uint96,(address,uint96)[],uint8,uint32)"( + quorumNumber?: BigNumberish | null, + operatorSetParams?: null, + minimumStake?: null, + strategyParams?: null, + stakeType?: null, + lookAheadPeriod?: null + ): QuorumCreatedEventFilter; + QuorumCreated( + quorumNumber?: BigNumberish | null, + operatorSetParams?: null, + minimumStake?: null, + strategyParams?: null, + stakeType?: null, + lookAheadPeriod?: null + ): QuorumCreatedEventFilter; + + "Unpaused(address,uint256)"( + account?: string | null, + newPausedStatus?: null + ): UnpausedEventFilter; + Unpaused( + account?: string | null, + newPausedStatus?: null + ): UnpausedEventFilter; + }; + + estimateGas: { + OPERATOR_CHURN_APPROVAL_TYPEHASH( + overrides?: CallOverrides + ): Promise; + + PUBKEY_REGISTRATION_TYPEHASH(overrides?: CallOverrides): Promise; + + allocationManager(overrides?: CallOverrides): Promise; + + avs(overrides?: CallOverrides): Promise; + + blsApkRegistry(overrides?: CallOverrides): Promise; + + calculateOperatorChurnApprovalDigestHash( + registeringOperator: string, + registeringOperatorId: BytesLike, + operatorKickParams: ISlashingRegistryCoordinatorTypes.OperatorKickParamStruct[], + salt: BytesLike, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise; + + calculatePubkeyRegistrationMessageHash( + operator: string, + overrides?: CallOverrides + ): Promise; + + churnApprover(overrides?: CallOverrides): Promise; + + createSlashableStakeQuorum( + operatorSetParams: ISlashingRegistryCoordinatorTypes.OperatorSetParamStruct, + minimumStake: BigNumberish, + strategyParams: IStakeRegistryTypes.StrategyParamsStruct[], + lookAheadPeriod: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + createTotalDelegatedStakeQuorum( + operatorSetParams: ISlashingRegistryCoordinatorTypes.OperatorSetParamStruct, + minimumStake: BigNumberish, + strategyParams: IStakeRegistryTypes.StrategyParamsStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + deregisterOperator( + operator: string, + avs: string, + operatorSetIds: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + domainSeparator(overrides?: CallOverrides): Promise; + + eip712Domain(overrides?: CallOverrides): Promise; + + ejectOperator( + operator: string, + quorumNumbers: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + ejectionCooldown(overrides?: CallOverrides): Promise; + + ejector(overrides?: CallOverrides): Promise; + + getCurrentQuorumBitmap( + operatorId: BytesLike, + overrides?: CallOverrides + ): Promise; + + getOperator( + operator: string, + overrides?: CallOverrides + ): Promise; + + getOperatorFromId( + operatorId: BytesLike, + overrides?: CallOverrides + ): Promise; + + getOperatorId( + operator: string, + overrides?: CallOverrides + ): Promise; + + getOperatorSetParams( + quorumNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getOperatorStatus( + operator: string, + overrides?: CallOverrides + ): Promise; + + getQuorumBitmapAtBlockNumberByIndex( + operatorId: BytesLike, + blockNumber: BigNumberish, + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getQuorumBitmapHistoryLength( + operatorId: BytesLike, + overrides?: CallOverrides + ): Promise; + + getQuorumBitmapIndicesAtBlockNumber( + blockNumber: BigNumberish, + operatorIds: BytesLike[], + overrides?: CallOverrides + ): Promise; + + getQuorumBitmapUpdateByIndex( + operatorId: BytesLike, + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + indexRegistry(overrides?: CallOverrides): Promise; + + initialize( + initialOwner: string, + churnApprover: string, + ejector: string, + initialPausedStatus: BigNumberish, + avs: string, + overrides?: Overrides & { from?: string } + ): Promise; + + isChurnApproverSaltUsed( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + lastEjectionTimestamp( + arg0: string, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + pauseAll(overrides?: Overrides & { from?: string }): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + pauserRegistry(overrides?: CallOverrides): Promise; + + pubkeyRegistrationMessageHash( + operator: string, + overrides?: CallOverrides + ): Promise; + + quorumCount(overrides?: CallOverrides): Promise; + + quorumUpdateBlockNumber( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + registerOperator( + operator: string, + avs: string, + operatorSetIds: BigNumberish[], + data: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + setAVS( + _avs: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setChurnApprover( + _churnApprover: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setEjectionCooldown( + _ejectionCooldown: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setEjector( + _ejector: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setOperatorSetParams( + quorumNumber: BigNumberish, + operatorSetParams: ISlashingRegistryCoordinatorTypes.OperatorSetParamStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + socketRegistry(overrides?: CallOverrides): Promise; + + stakeRegistry(overrides?: CallOverrides): Promise; + + supportsAVS(_avs: string, overrides?: CallOverrides): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + updateOperators( + operators: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + updateOperatorsForQuorum( + operatorsPerQuorum: string[][], + quorumNumbers: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + updateSocket( + socket: string, + overrides?: Overrides & { from?: string } + ): Promise; + + version(overrides?: CallOverrides): Promise; + }; + + populateTransaction: { + OPERATOR_CHURN_APPROVAL_TYPEHASH( + overrides?: CallOverrides + ): Promise; + + PUBKEY_REGISTRATION_TYPEHASH( + overrides?: CallOverrides + ): Promise; + + allocationManager(overrides?: CallOverrides): Promise; + + avs(overrides?: CallOverrides): Promise; + + blsApkRegistry(overrides?: CallOverrides): Promise; + + calculateOperatorChurnApprovalDigestHash( + registeringOperator: string, + registeringOperatorId: BytesLike, + operatorKickParams: ISlashingRegistryCoordinatorTypes.OperatorKickParamStruct[], + salt: BytesLike, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise; + + calculatePubkeyRegistrationMessageHash( + operator: string, + overrides?: CallOverrides + ): Promise; + + churnApprover(overrides?: CallOverrides): Promise; + + createSlashableStakeQuorum( + operatorSetParams: ISlashingRegistryCoordinatorTypes.OperatorSetParamStruct, + minimumStake: BigNumberish, + strategyParams: IStakeRegistryTypes.StrategyParamsStruct[], + lookAheadPeriod: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + createTotalDelegatedStakeQuorum( + operatorSetParams: ISlashingRegistryCoordinatorTypes.OperatorSetParamStruct, + minimumStake: BigNumberish, + strategyParams: IStakeRegistryTypes.StrategyParamsStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + deregisterOperator( + operator: string, + avs: string, + operatorSetIds: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + domainSeparator(overrides?: CallOverrides): Promise; + + eip712Domain(overrides?: CallOverrides): Promise; + + ejectOperator( + operator: string, + quorumNumbers: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + ejectionCooldown(overrides?: CallOverrides): Promise; + + ejector(overrides?: CallOverrides): Promise; + + getCurrentQuorumBitmap( + operatorId: BytesLike, + overrides?: CallOverrides + ): Promise; + + getOperator( + operator: string, + overrides?: CallOverrides + ): Promise; + + getOperatorFromId( + operatorId: BytesLike, + overrides?: CallOverrides + ): Promise; + + getOperatorId( + operator: string, + overrides?: CallOverrides + ): Promise; + + getOperatorSetParams( + quorumNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getOperatorStatus( + operator: string, + overrides?: CallOverrides + ): Promise; + + getQuorumBitmapAtBlockNumberByIndex( + operatorId: BytesLike, + blockNumber: BigNumberish, + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getQuorumBitmapHistoryLength( + operatorId: BytesLike, + overrides?: CallOverrides + ): Promise; + + getQuorumBitmapIndicesAtBlockNumber( + blockNumber: BigNumberish, + operatorIds: BytesLike[], + overrides?: CallOverrides + ): Promise; + + getQuorumBitmapUpdateByIndex( + operatorId: BytesLike, + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + indexRegistry(overrides?: CallOverrides): Promise; + + initialize( + initialOwner: string, + churnApprover: string, + ejector: string, + initialPausedStatus: BigNumberish, + avs: string, + overrides?: Overrides & { from?: string } + ): Promise; + + isChurnApproverSaltUsed( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + lastEjectionTimestamp( + arg0: string, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + pauseAll( + overrides?: Overrides & { from?: string } + ): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + pauserRegistry(overrides?: CallOverrides): Promise; + + pubkeyRegistrationMessageHash( + operator: string, + overrides?: CallOverrides + ): Promise; + + quorumCount(overrides?: CallOverrides): Promise; + + quorumUpdateBlockNumber( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + registerOperator( + operator: string, + avs: string, + operatorSetIds: BigNumberish[], + data: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + setAVS( + _avs: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setChurnApprover( + _churnApprover: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setEjectionCooldown( + _ejectionCooldown: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + setEjector( + _ejector: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setOperatorSetParams( + quorumNumber: BigNumberish, + operatorSetParams: ISlashingRegistryCoordinatorTypes.OperatorSetParamStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + socketRegistry(overrides?: CallOverrides): Promise; + + stakeRegistry(overrides?: CallOverrides): Promise; + + supportsAVS( + _avs: string, + overrides?: CallOverrides + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + updateOperators( + operators: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + updateOperatorsForQuorum( + operatorsPerQuorum: string[][], + quorumNumbers: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + updateSocket( + socket: string, + overrides?: Overrides & { from?: string } + ): Promise; + + version(overrides?: CallOverrides): Promise; + }; +} diff --git a/src/avs/contracts/ReclaimTaskManager.ts b/src/avs/contracts/ReclaimTaskManager.ts new file mode 100644 index 00000000..b97ebb67 --- /dev/null +++ b/src/avs/contracts/ReclaimTaskManager.ts @@ -0,0 +1,1326 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +} from "./common"; + +export declare namespace IReclaimTaskManager { + export type ClaimRequestStruct = { + provider: string; + claimUserId: BytesLike; + claimHash: BytesLike; + requestedAt: BigNumberish; + owner: string; + fee: BigNumberish; + }; + + export type ClaimRequestStructOutput = [ + string, + string, + string, + number, + string, + BigNumber + ] & { + provider: string; + claimUserId: string; + claimHash: string; + requestedAt: number; + owner: string; + fee: BigNumber; + }; + + export type TaskCreationMetadataStruct = { + maxTaskLifetimeS: BigNumberish; + minSignaturesPerTask: BigNumberish; + maxTaskCreationDelayS: BigNumberish; + minFee: BigNumberish; + }; + + export type TaskCreationMetadataStructOutput = [ + number, + number, + number, + BigNumber + ] & { + maxTaskLifetimeS: number; + minSignaturesPerTask: number; + maxTaskCreationDelayS: number; + minFee: BigNumber; + }; + + export type ReclaimOperatorStruct = { addr: string; url: string }; + + export type ReclaimOperatorStructOutput = [string, string] & { + addr: string; + url: string; + }; + + export type TaskStruct = { + request: IReclaimTaskManager.ClaimRequestStruct; + createdAt: BigNumberish; + expiresAt: BigNumberish; + minimumSignatures: BigNumberish; + operators: IReclaimTaskManager.ReclaimOperatorStruct[]; + feePaid: BigNumberish; + }; + + export type TaskStructOutput = [ + IReclaimTaskManager.ClaimRequestStructOutput, + number, + number, + number, + IReclaimTaskManager.ReclaimOperatorStructOutput[], + BigNumber + ] & { + request: IReclaimTaskManager.ClaimRequestStructOutput; + createdAt: number; + expiresAt: number; + minimumSignatures: number; + operators: IReclaimTaskManager.ReclaimOperatorStructOutput[]; + feePaid: BigNumber; + }; + + export type CompletedTaskStruct = { + task: IReclaimTaskManager.TaskStruct; + signatures: BytesLike[]; + }; + + export type CompletedTaskStructOutput = [ + IReclaimTaskManager.TaskStructOutput, + string[] + ] & { task: IReclaimTaskManager.TaskStructOutput; signatures: string[] }; +} + +export declare namespace OperatorStateRetriever { + export type CheckSignaturesIndicesStruct = { + nonSignerQuorumBitmapIndices: BigNumberish[]; + quorumApkIndices: BigNumberish[]; + totalStakeIndices: BigNumberish[]; + nonSignerStakeIndices: BigNumberish[][]; + }; + + export type CheckSignaturesIndicesStructOutput = [ + number[], + number[], + number[], + number[][] + ] & { + nonSignerQuorumBitmapIndices: number[]; + quorumApkIndices: number[]; + totalStakeIndices: number[]; + nonSignerStakeIndices: number[][]; + }; + + export type OperatorStruct = { + operator: string; + operatorId: BytesLike; + stake: BigNumberish; + }; + + export type OperatorStructOutput = [string, string, BigNumber] & { + operator: string; + operatorId: string; + stake: BigNumber; + }; +} + +export interface ReclaimTaskManagerInterface extends utils.Interface { + functions: { + "allTaskHashes(uint32)": FunctionFragment; + "createNewTask((string,bytes32,bytes32,uint32,address,uint256),bytes)": FunctionFragment; + "defaultStrategy()": FunctionFragment; + "encodeClaimRequest((string,bytes32,bytes32,uint32,address,uint256))": FunctionFragment; + "getBatchOperatorFromId(address,bytes32[])": FunctionFragment; + "getBatchOperatorId(address,address[])": FunctionFragment; + "getCheckSignaturesIndices(address,uint32,bytes,bytes32[])": FunctionFragment; + "getLatestTaskNum()": FunctionFragment; + "getOperatorState(address,bytes,uint32)": FunctionFragment; + "getOperatorState(address,bytes32,uint32)": FunctionFragment; + "getQuorumBitmapsAtBlockNumber(address,bytes32[],uint32)": FunctionFragment; + "getTaskCreationMetadata()": FunctionFragment; + "getToken()": FunctionFragment; + "initialize(address,address)": FunctionFragment; + "latestTaskNum()": FunctionFragment; + "operatorHasMinimumWeight(address)": FunctionFragment; + "owner()": FunctionFragment; + "pause(uint256)": FunctionFragment; + "pauseAll()": FunctionFragment; + "paused(uint8)": FunctionFragment; + "paused()": FunctionFragment; + "pauserRegistry()": FunctionFragment; + "renounceOwnership()": FunctionFragment; + "rewardsCoordinator()": FunctionFragment; + "setRewardsCoordinator(address)": FunctionFragment; + "setStakeRegistry(address)": FunctionFragment; + "stakeRegistry()": FunctionFragment; + "taskCompleted((((string,bytes32,bytes32,uint32,address,uint256),uint32,uint32,uint8,(address,string)[],uint256),bytes[]),uint32)": FunctionFragment; + "taskCreationMetadata()": FunctionFragment; + "transferOwnership(address)": FunctionFragment; + "unpause(uint256)": FunctionFragment; + "updateTaskCreationMetadata((uint32,uint8,uint32,uint256))": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "allTaskHashes" + | "createNewTask" + | "defaultStrategy" + | "encodeClaimRequest" + | "getBatchOperatorFromId" + | "getBatchOperatorId" + | "getCheckSignaturesIndices" + | "getLatestTaskNum" + | "getOperatorState(address,bytes,uint32)" + | "getOperatorState(address,bytes32,uint32)" + | "getQuorumBitmapsAtBlockNumber" + | "getTaskCreationMetadata" + | "getToken" + | "initialize" + | "latestTaskNum" + | "operatorHasMinimumWeight" + | "owner" + | "pause" + | "pauseAll" + | "paused(uint8)" + | "paused()" + | "pauserRegistry" + | "renounceOwnership" + | "rewardsCoordinator" + | "setRewardsCoordinator" + | "setStakeRegistry" + | "stakeRegistry" + | "taskCompleted" + | "taskCreationMetadata" + | "transferOwnership" + | "unpause" + | "updateTaskCreationMetadata" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "allTaskHashes", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "createNewTask", + values: [IReclaimTaskManager.ClaimRequestStruct, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "defaultStrategy", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "encodeClaimRequest", + values: [IReclaimTaskManager.ClaimRequestStruct] + ): string; + encodeFunctionData( + functionFragment: "getBatchOperatorFromId", + values: [string, BytesLike[]] + ): string; + encodeFunctionData( + functionFragment: "getBatchOperatorId", + values: [string, string[]] + ): string; + encodeFunctionData( + functionFragment: "getCheckSignaturesIndices", + values: [string, BigNumberish, BytesLike, BytesLike[]] + ): string; + encodeFunctionData( + functionFragment: "getLatestTaskNum", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getOperatorState(address,bytes,uint32)", + values: [string, BytesLike, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getOperatorState(address,bytes32,uint32)", + values: [string, BytesLike, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getQuorumBitmapsAtBlockNumber", + values: [string, BytesLike[], BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getTaskCreationMetadata", + values?: undefined + ): string; + encodeFunctionData(functionFragment: "getToken", values?: undefined): string; + encodeFunctionData( + functionFragment: "initialize", + values: [string, string] + ): string; + encodeFunctionData( + functionFragment: "latestTaskNum", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "operatorHasMinimumWeight", + values: [string] + ): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData(functionFragment: "pause", values: [BigNumberish]): string; + encodeFunctionData(functionFragment: "pauseAll", values?: undefined): string; + encodeFunctionData( + functionFragment: "paused(uint8)", + values: [BigNumberish] + ): string; + encodeFunctionData(functionFragment: "paused()", values?: undefined): string; + encodeFunctionData( + functionFragment: "pauserRegistry", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "renounceOwnership", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "rewardsCoordinator", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "setRewardsCoordinator", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "setStakeRegistry", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "stakeRegistry", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "taskCompleted", + values: [IReclaimTaskManager.CompletedTaskStruct, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "taskCreationMetadata", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "unpause", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "updateTaskCreationMetadata", + values: [IReclaimTaskManager.TaskCreationMetadataStruct] + ): string; + + decodeFunctionResult( + functionFragment: "allTaskHashes", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "createNewTask", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "defaultStrategy", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "encodeClaimRequest", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getBatchOperatorFromId", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getBatchOperatorId", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getCheckSignaturesIndices", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getLatestTaskNum", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getOperatorState(address,bytes,uint32)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getOperatorState(address,bytes32,uint32)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getQuorumBitmapsAtBlockNumber", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getTaskCreationMetadata", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "getToken", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "latestTaskNum", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "operatorHasMinimumWeight", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "pause", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "pauseAll", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "paused(uint8)", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "paused()", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "pauserRegistry", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "renounceOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "rewardsCoordinator", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setRewardsCoordinator", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setStakeRegistry", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "stakeRegistry", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "taskCompleted", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "taskCreationMetadata", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "transferOwnership", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "unpause", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "updateTaskCreationMetadata", + data: BytesLike + ): Result; + + events: { + "Initialized(uint8)": EventFragment; + "NewTaskCreated(uint32,((string,bytes32,bytes32,uint32,address,uint256),uint32,uint32,uint8,(address,string)[],uint256))": EventFragment; + "OwnershipTransferred(address,address)": EventFragment; + "Paused(address,uint256)": EventFragment; + "TaskCompleted(uint32,(((string,bytes32,bytes32,uint32,address,uint256),uint32,uint32,uint8,(address,string)[],uint256),bytes[]))": EventFragment; + "Unpaused(address,uint256)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; + getEvent(nameOrSignatureOrTopic: "NewTaskCreated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Paused"): EventFragment; + getEvent(nameOrSignatureOrTopic: "TaskCompleted"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Unpaused"): EventFragment; +} + +export interface InitializedEventObject { + version: number; +} +export type InitializedEvent = TypedEvent<[number], InitializedEventObject>; + +export type InitializedEventFilter = TypedEventFilter; + +export interface NewTaskCreatedEventObject { + taskIndex: number; + task: IReclaimTaskManager.TaskStructOutput; +} +export type NewTaskCreatedEvent = TypedEvent< + [number, IReclaimTaskManager.TaskStructOutput], + NewTaskCreatedEventObject +>; + +export type NewTaskCreatedEventFilter = TypedEventFilter; + +export interface OwnershipTransferredEventObject { + previousOwner: string; + newOwner: string; +} +export type OwnershipTransferredEvent = TypedEvent< + [string, string], + OwnershipTransferredEventObject +>; + +export type OwnershipTransferredEventFilter = + TypedEventFilter; + +export interface PausedEventObject { + account: string; + newPausedStatus: BigNumber; +} +export type PausedEvent = TypedEvent<[string, BigNumber], PausedEventObject>; + +export type PausedEventFilter = TypedEventFilter; + +export interface TaskCompletedEventObject { + taskIndex: number; + task: IReclaimTaskManager.CompletedTaskStructOutput; +} +export type TaskCompletedEvent = TypedEvent< + [number, IReclaimTaskManager.CompletedTaskStructOutput], + TaskCompletedEventObject +>; + +export type TaskCompletedEventFilter = TypedEventFilter; + +export interface UnpausedEventObject { + account: string; + newPausedStatus: BigNumber; +} +export type UnpausedEvent = TypedEvent< + [string, BigNumber], + UnpausedEventObject +>; + +export type UnpausedEventFilter = TypedEventFilter; + +export interface ReclaimTaskManager extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: ReclaimTaskManagerInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + allTaskHashes( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + createNewTask( + request: IReclaimTaskManager.ClaimRequestStruct, + requestSignature: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + defaultStrategy(overrides?: CallOverrides): Promise<[string]>; + + encodeClaimRequest( + request: IReclaimTaskManager.ClaimRequestStruct, + overrides?: CallOverrides + ): Promise<[string]>; + + getBatchOperatorFromId( + registryCoordinator: string, + operatorIds: BytesLike[], + overrides?: CallOverrides + ): Promise<[string[]] & { operators: string[] }>; + + getBatchOperatorId( + registryCoordinator: string, + operators: string[], + overrides?: CallOverrides + ): Promise<[string[]] & { operatorIds: string[] }>; + + getCheckSignaturesIndices( + registryCoordinator: string, + referenceBlockNumber: BigNumberish, + quorumNumbers: BytesLike, + nonSignerOperatorIds: BytesLike[], + overrides?: CallOverrides + ): Promise<[OperatorStateRetriever.CheckSignaturesIndicesStructOutput]>; + + getLatestTaskNum(overrides?: CallOverrides): Promise<[number]>; + + "getOperatorState(address,bytes,uint32)"( + registryCoordinator: string, + quorumNumbers: BytesLike, + blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise<[OperatorStateRetriever.OperatorStructOutput[][]]>; + + "getOperatorState(address,bytes32,uint32)"( + registryCoordinator: string, + operatorId: BytesLike, + blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber, OperatorStateRetriever.OperatorStructOutput[][]]>; + + getQuorumBitmapsAtBlockNumber( + registryCoordinator: string, + operatorIds: BytesLike[], + blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber[]]>; + + getTaskCreationMetadata( + overrides?: CallOverrides + ): Promise<[IReclaimTaskManager.TaskCreationMetadataStructOutput]>; + + getToken(overrides?: CallOverrides): Promise<[string]>; + + initialize( + initialOwner: string, + strategy: string, + overrides?: Overrides & { from?: string } + ): Promise; + + latestTaskNum(overrides?: CallOverrides): Promise<[number]>; + + operatorHasMinimumWeight( + operator: string, + overrides?: CallOverrides + ): Promise<[boolean]>; + + owner(overrides?: CallOverrides): Promise<[string]>; + + pause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + pauseAll( + overrides?: Overrides & { from?: string } + ): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise<[boolean]>; + + "paused()"(overrides?: CallOverrides): Promise<[BigNumber]>; + + pauserRegistry(overrides?: CallOverrides): Promise<[string]>; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + rewardsCoordinator(overrides?: CallOverrides): Promise<[string]>; + + setRewardsCoordinator( + _rewardsCoordinator: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setStakeRegistry( + _stakeRegistry: string, + overrides?: Overrides & { from?: string } + ): Promise; + + stakeRegistry(overrides?: CallOverrides): Promise<[string]>; + + taskCompleted( + completedTask: IReclaimTaskManager.CompletedTaskStruct, + referenceTaskIndex: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + taskCreationMetadata( + overrides?: CallOverrides + ): Promise< + [number, number, number, BigNumber] & { + maxTaskLifetimeS: number; + minSignaturesPerTask: number; + maxTaskCreationDelayS: number; + minFee: BigNumber; + } + >; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + updateTaskCreationMetadata( + newMetadata: IReclaimTaskManager.TaskCreationMetadataStruct, + overrides?: Overrides & { from?: string } + ): Promise; + }; + + allTaskHashes(arg0: BigNumberish, overrides?: CallOverrides): Promise; + + createNewTask( + request: IReclaimTaskManager.ClaimRequestStruct, + requestSignature: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + defaultStrategy(overrides?: CallOverrides): Promise; + + encodeClaimRequest( + request: IReclaimTaskManager.ClaimRequestStruct, + overrides?: CallOverrides + ): Promise; + + getBatchOperatorFromId( + registryCoordinator: string, + operatorIds: BytesLike[], + overrides?: CallOverrides + ): Promise; + + getBatchOperatorId( + registryCoordinator: string, + operators: string[], + overrides?: CallOverrides + ): Promise; + + getCheckSignaturesIndices( + registryCoordinator: string, + referenceBlockNumber: BigNumberish, + quorumNumbers: BytesLike, + nonSignerOperatorIds: BytesLike[], + overrides?: CallOverrides + ): Promise; + + getLatestTaskNum(overrides?: CallOverrides): Promise; + + "getOperatorState(address,bytes,uint32)"( + registryCoordinator: string, + quorumNumbers: BytesLike, + blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "getOperatorState(address,bytes32,uint32)"( + registryCoordinator: string, + operatorId: BytesLike, + blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber, OperatorStateRetriever.OperatorStructOutput[][]]>; + + getQuorumBitmapsAtBlockNumber( + registryCoordinator: string, + operatorIds: BytesLike[], + blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getTaskCreationMetadata( + overrides?: CallOverrides + ): Promise; + + getToken(overrides?: CallOverrides): Promise; + + initialize( + initialOwner: string, + strategy: string, + overrides?: Overrides & { from?: string } + ): Promise; + + latestTaskNum(overrides?: CallOverrides): Promise; + + operatorHasMinimumWeight( + operator: string, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + pauseAll( + overrides?: Overrides & { from?: string } + ): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + pauserRegistry(overrides?: CallOverrides): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + rewardsCoordinator(overrides?: CallOverrides): Promise; + + setRewardsCoordinator( + _rewardsCoordinator: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setStakeRegistry( + _stakeRegistry: string, + overrides?: Overrides & { from?: string } + ): Promise; + + stakeRegistry(overrides?: CallOverrides): Promise; + + taskCompleted( + completedTask: IReclaimTaskManager.CompletedTaskStruct, + referenceTaskIndex: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + taskCreationMetadata( + overrides?: CallOverrides + ): Promise< + [number, number, number, BigNumber] & { + maxTaskLifetimeS: number; + minSignaturesPerTask: number; + maxTaskCreationDelayS: number; + minFee: BigNumber; + } + >; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + updateTaskCreationMetadata( + newMetadata: IReclaimTaskManager.TaskCreationMetadataStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + callStatic: { + allTaskHashes( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + createNewTask( + request: IReclaimTaskManager.ClaimRequestStruct, + requestSignature: BytesLike, + overrides?: CallOverrides + ): Promise; + + defaultStrategy(overrides?: CallOverrides): Promise; + + encodeClaimRequest( + request: IReclaimTaskManager.ClaimRequestStruct, + overrides?: CallOverrides + ): Promise; + + getBatchOperatorFromId( + registryCoordinator: string, + operatorIds: BytesLike[], + overrides?: CallOverrides + ): Promise; + + getBatchOperatorId( + registryCoordinator: string, + operators: string[], + overrides?: CallOverrides + ): Promise; + + getCheckSignaturesIndices( + registryCoordinator: string, + referenceBlockNumber: BigNumberish, + quorumNumbers: BytesLike, + nonSignerOperatorIds: BytesLike[], + overrides?: CallOverrides + ): Promise; + + getLatestTaskNum(overrides?: CallOverrides): Promise; + + "getOperatorState(address,bytes,uint32)"( + registryCoordinator: string, + quorumNumbers: BytesLike, + blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "getOperatorState(address,bytes32,uint32)"( + registryCoordinator: string, + operatorId: BytesLike, + blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber, OperatorStateRetriever.OperatorStructOutput[][]]>; + + getQuorumBitmapsAtBlockNumber( + registryCoordinator: string, + operatorIds: BytesLike[], + blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getTaskCreationMetadata( + overrides?: CallOverrides + ): Promise; + + getToken(overrides?: CallOverrides): Promise; + + initialize( + initialOwner: string, + strategy: string, + overrides?: CallOverrides + ): Promise; + + latestTaskNum(overrides?: CallOverrides): Promise; + + operatorHasMinimumWeight( + operator: string, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pause( + newPausedStatus: BigNumberish, + overrides?: CallOverrides + ): Promise; + + pauseAll(overrides?: CallOverrides): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + pauserRegistry(overrides?: CallOverrides): Promise; + + renounceOwnership(overrides?: CallOverrides): Promise; + + rewardsCoordinator(overrides?: CallOverrides): Promise; + + setRewardsCoordinator( + _rewardsCoordinator: string, + overrides?: CallOverrides + ): Promise; + + setStakeRegistry( + _stakeRegistry: string, + overrides?: CallOverrides + ): Promise; + + stakeRegistry(overrides?: CallOverrides): Promise; + + taskCompleted( + completedTask: IReclaimTaskManager.CompletedTaskStruct, + referenceTaskIndex: BigNumberish, + overrides?: CallOverrides + ): Promise; + + taskCreationMetadata( + overrides?: CallOverrides + ): Promise< + [number, number, number, BigNumber] & { + maxTaskLifetimeS: number; + minSignaturesPerTask: number; + maxTaskCreationDelayS: number; + minFee: BigNumber; + } + >; + + transferOwnership( + newOwner: string, + overrides?: CallOverrides + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: CallOverrides + ): Promise; + + updateTaskCreationMetadata( + newMetadata: IReclaimTaskManager.TaskCreationMetadataStruct, + overrides?: CallOverrides + ): Promise; + }; + + filters: { + "Initialized(uint8)"(version?: null): InitializedEventFilter; + Initialized(version?: null): InitializedEventFilter; + + "NewTaskCreated(uint32,((string,bytes32,bytes32,uint32,address,uint256),uint32,uint32,uint8,(address,string)[],uint256))"( + taskIndex?: BigNumberish | null, + task?: null + ): NewTaskCreatedEventFilter; + NewTaskCreated( + taskIndex?: BigNumberish | null, + task?: null + ): NewTaskCreatedEventFilter; + + "OwnershipTransferred(address,address)"( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + OwnershipTransferred( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + + "Paused(address,uint256)"( + account?: string | null, + newPausedStatus?: null + ): PausedEventFilter; + Paused(account?: string | null, newPausedStatus?: null): PausedEventFilter; + + "TaskCompleted(uint32,(((string,bytes32,bytes32,uint32,address,uint256),uint32,uint32,uint8,(address,string)[],uint256),bytes[]))"( + taskIndex?: BigNumberish | null, + task?: null + ): TaskCompletedEventFilter; + TaskCompleted( + taskIndex?: BigNumberish | null, + task?: null + ): TaskCompletedEventFilter; + + "Unpaused(address,uint256)"( + account?: string | null, + newPausedStatus?: null + ): UnpausedEventFilter; + Unpaused( + account?: string | null, + newPausedStatus?: null + ): UnpausedEventFilter; + }; + + estimateGas: { + allTaskHashes( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + createNewTask( + request: IReclaimTaskManager.ClaimRequestStruct, + requestSignature: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + defaultStrategy(overrides?: CallOverrides): Promise; + + encodeClaimRequest( + request: IReclaimTaskManager.ClaimRequestStruct, + overrides?: CallOverrides + ): Promise; + + getBatchOperatorFromId( + registryCoordinator: string, + operatorIds: BytesLike[], + overrides?: CallOverrides + ): Promise; + + getBatchOperatorId( + registryCoordinator: string, + operators: string[], + overrides?: CallOverrides + ): Promise; + + getCheckSignaturesIndices( + registryCoordinator: string, + referenceBlockNumber: BigNumberish, + quorumNumbers: BytesLike, + nonSignerOperatorIds: BytesLike[], + overrides?: CallOverrides + ): Promise; + + getLatestTaskNum(overrides?: CallOverrides): Promise; + + "getOperatorState(address,bytes,uint32)"( + registryCoordinator: string, + quorumNumbers: BytesLike, + blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "getOperatorState(address,bytes32,uint32)"( + registryCoordinator: string, + operatorId: BytesLike, + blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getQuorumBitmapsAtBlockNumber( + registryCoordinator: string, + operatorIds: BytesLike[], + blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getTaskCreationMetadata(overrides?: CallOverrides): Promise; + + getToken(overrides?: CallOverrides): Promise; + + initialize( + initialOwner: string, + strategy: string, + overrides?: Overrides & { from?: string } + ): Promise; + + latestTaskNum(overrides?: CallOverrides): Promise; + + operatorHasMinimumWeight( + operator: string, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + pauseAll(overrides?: Overrides & { from?: string }): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + pauserRegistry(overrides?: CallOverrides): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + rewardsCoordinator(overrides?: CallOverrides): Promise; + + setRewardsCoordinator( + _rewardsCoordinator: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setStakeRegistry( + _stakeRegistry: string, + overrides?: Overrides & { from?: string } + ): Promise; + + stakeRegistry(overrides?: CallOverrides): Promise; + + taskCompleted( + completedTask: IReclaimTaskManager.CompletedTaskStruct, + referenceTaskIndex: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + taskCreationMetadata(overrides?: CallOverrides): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + updateTaskCreationMetadata( + newMetadata: IReclaimTaskManager.TaskCreationMetadataStruct, + overrides?: Overrides & { from?: string } + ): Promise; + }; + + populateTransaction: { + allTaskHashes( + arg0: BigNumberish, + overrides?: CallOverrides + ): Promise; + + createNewTask( + request: IReclaimTaskManager.ClaimRequestStruct, + requestSignature: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + defaultStrategy(overrides?: CallOverrides): Promise; + + encodeClaimRequest( + request: IReclaimTaskManager.ClaimRequestStruct, + overrides?: CallOverrides + ): Promise; + + getBatchOperatorFromId( + registryCoordinator: string, + operatorIds: BytesLike[], + overrides?: CallOverrides + ): Promise; + + getBatchOperatorId( + registryCoordinator: string, + operators: string[], + overrides?: CallOverrides + ): Promise; + + getCheckSignaturesIndices( + registryCoordinator: string, + referenceBlockNumber: BigNumberish, + quorumNumbers: BytesLike, + nonSignerOperatorIds: BytesLike[], + overrides?: CallOverrides + ): Promise; + + getLatestTaskNum(overrides?: CallOverrides): Promise; + + "getOperatorState(address,bytes,uint32)"( + registryCoordinator: string, + quorumNumbers: BytesLike, + blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "getOperatorState(address,bytes32,uint32)"( + registryCoordinator: string, + operatorId: BytesLike, + blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getQuorumBitmapsAtBlockNumber( + registryCoordinator: string, + operatorIds: BytesLike[], + blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getTaskCreationMetadata( + overrides?: CallOverrides + ): Promise; + + getToken(overrides?: CallOverrides): Promise; + + initialize( + initialOwner: string, + strategy: string, + overrides?: Overrides & { from?: string } + ): Promise; + + latestTaskNum(overrides?: CallOverrides): Promise; + + operatorHasMinimumWeight( + operator: string, + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + pauseAll( + overrides?: Overrides & { from?: string } + ): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + pauserRegistry(overrides?: CallOverrides): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + rewardsCoordinator( + overrides?: CallOverrides + ): Promise; + + setRewardsCoordinator( + _rewardsCoordinator: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setStakeRegistry( + _stakeRegistry: string, + overrides?: Overrides & { from?: string } + ): Promise; + + stakeRegistry(overrides?: CallOverrides): Promise; + + taskCompleted( + completedTask: IReclaimTaskManager.CompletedTaskStruct, + referenceTaskIndex: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + taskCreationMetadata( + overrides?: CallOverrides + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + updateTaskCreationMetadata( + newMetadata: IReclaimTaskManager.TaskCreationMetadataStruct, + overrides?: Overrides & { from?: string } + ): Promise; + }; +} diff --git a/src/avs/contracts/RewardsCoordinator.ts b/src/avs/contracts/RewardsCoordinator.ts index 256273e0..ab0190da 100644 --- a/src/avs/contracts/RewardsCoordinator.ts +++ b/src/avs/contracts/RewardsCoordinator.ts @@ -26,7 +26,54 @@ import type { OnEvent, } from "./common"; -export declare namespace IRewardsCoordinator { +export type OperatorSetStruct = { avs: string; id: BigNumberish }; + +export type OperatorSetStructOutput = [string, number] & { + avs: string; + id: number; +}; + +export declare namespace IRewardsCoordinatorTypes { + export type RewardsCoordinatorConstructorParamsStruct = { + delegationManager: string; + strategyManager: string; + allocationManager: string; + pauserRegistry: string; + permissionController: string; + CALCULATION_INTERVAL_SECONDS: BigNumberish; + MAX_REWARDS_DURATION: BigNumberish; + MAX_RETROACTIVE_LENGTH: BigNumberish; + MAX_FUTURE_LENGTH: BigNumberish; + GENESIS_REWARDS_TIMESTAMP: BigNumberish; + version: string; + }; + + export type RewardsCoordinatorConstructorParamsStructOutput = [ + string, + string, + string, + string, + string, + number, + number, + number, + number, + number, + string + ] & { + delegationManager: string; + strategyManager: string; + allocationManager: string; + pauserRegistry: string; + permissionController: string; + CALCULATION_INTERVAL_SECONDS: number; + MAX_REWARDS_DURATION: number; + MAX_RETROACTIVE_LENGTH: number; + MAX_FUTURE_LENGTH: number; + GENESIS_REWARDS_TIMESTAMP: number; + version: string; + }; + export type EarnerTreeMerkleLeafStruct = { earner: string; earnerTokenRoot: BytesLike; @@ -51,28 +98,28 @@ export declare namespace IRewardsCoordinator { rootIndex: BigNumberish; earnerIndex: BigNumberish; earnerTreeProof: BytesLike; - earnerLeaf: IRewardsCoordinator.EarnerTreeMerkleLeafStruct; + earnerLeaf: IRewardsCoordinatorTypes.EarnerTreeMerkleLeafStruct; tokenIndices: BigNumberish[]; tokenTreeProofs: BytesLike[]; - tokenLeaves: IRewardsCoordinator.TokenTreeMerkleLeafStruct[]; + tokenLeaves: IRewardsCoordinatorTypes.TokenTreeMerkleLeafStruct[]; }; export type RewardsMerkleClaimStructOutput = [ number, number, string, - IRewardsCoordinator.EarnerTreeMerkleLeafStructOutput, + IRewardsCoordinatorTypes.EarnerTreeMerkleLeafStructOutput, number[], string[], - IRewardsCoordinator.TokenTreeMerkleLeafStructOutput[] + IRewardsCoordinatorTypes.TokenTreeMerkleLeafStructOutput[] ] & { rootIndex: number; earnerIndex: number; earnerTreeProof: string; - earnerLeaf: IRewardsCoordinator.EarnerTreeMerkleLeafStructOutput; + earnerLeaf: IRewardsCoordinatorTypes.EarnerTreeMerkleLeafStructOutput; tokenIndices: number[]; tokenTreeProofs: string[]; - tokenLeaves: IRewardsCoordinator.TokenTreeMerkleLeafStructOutput[]; + tokenLeaves: IRewardsCoordinatorTypes.TokenTreeMerkleLeafStructOutput[]; }; export type StrategyAndMultiplierStruct = { @@ -86,7 +133,7 @@ export declare namespace IRewardsCoordinator { }; export type RewardsSubmissionStruct = { - strategiesAndMultipliers: IRewardsCoordinator.StrategyAndMultiplierStruct[]; + strategiesAndMultipliers: IRewardsCoordinatorTypes.StrategyAndMultiplierStruct[]; token: string; amount: BigNumberish; startTimestamp: BigNumberish; @@ -94,13 +141,13 @@ export declare namespace IRewardsCoordinator { }; export type RewardsSubmissionStructOutput = [ - IRewardsCoordinator.StrategyAndMultiplierStructOutput[], + IRewardsCoordinatorTypes.StrategyAndMultiplierStructOutput[], string, BigNumber, number, number ] & { - strategiesAndMultipliers: IRewardsCoordinator.StrategyAndMultiplierStructOutput[]; + strategiesAndMultipliers: IRewardsCoordinatorTypes.StrategyAndMultiplierStructOutput[]; token: string; amount: BigNumber; startTimestamp: number; @@ -115,25 +162,25 @@ export declare namespace IRewardsCoordinator { }; export type OperatorDirectedRewardsSubmissionStruct = { - strategiesAndMultipliers: IRewardsCoordinator.StrategyAndMultiplierStruct[]; + strategiesAndMultipliers: IRewardsCoordinatorTypes.StrategyAndMultiplierStruct[]; token: string; - operatorRewards: IRewardsCoordinator.OperatorRewardStruct[]; + operatorRewards: IRewardsCoordinatorTypes.OperatorRewardStruct[]; startTimestamp: BigNumberish; duration: BigNumberish; description: string; }; export type OperatorDirectedRewardsSubmissionStructOutput = [ - IRewardsCoordinator.StrategyAndMultiplierStructOutput[], + IRewardsCoordinatorTypes.StrategyAndMultiplierStructOutput[], string, - IRewardsCoordinator.OperatorRewardStructOutput[], + IRewardsCoordinatorTypes.OperatorRewardStructOutput[], number, number, string ] & { - strategiesAndMultipliers: IRewardsCoordinator.StrategyAndMultiplierStructOutput[]; + strategiesAndMultipliers: IRewardsCoordinatorTypes.StrategyAndMultiplierStructOutput[]; token: string; - operatorRewards: IRewardsCoordinator.OperatorRewardStructOutput[]; + operatorRewards: IRewardsCoordinatorTypes.OperatorRewardStructOutput[]; startTimestamp: number; duration: number; description: string; @@ -167,6 +214,7 @@ export interface RewardsCoordinatorInterface extends utils.Interface { "MAX_RETROACTIVE_LENGTH()": FunctionFragment; "MAX_REWARDS_DURATION()": FunctionFragment; "activationDelay()": FunctionFragment; + "allocationManager()": FunctionFragment; "beaconChainETHStrategy()": FunctionFragment; "calculateEarnerLeafHash((address,bytes32))": FunctionFragment; "calculateTokenLeafHash((address,uint256))": FunctionFragment; @@ -174,6 +222,7 @@ export interface RewardsCoordinatorInterface extends utils.Interface { "claimerFor(address)": FunctionFragment; "createAVSRewardsSubmission(((address,uint96)[],address,uint256,uint32,uint32)[])": FunctionFragment; "createOperatorDirectedAVSRewardsSubmission(address,((address,uint96)[],address,(address,uint256)[],uint32,uint32,string)[])": FunctionFragment; + "createOperatorDirectedOperatorSetRewardsSubmission((address,uint32),((address,uint96)[],address,(address,uint256)[],uint32,uint32,string)[])": FunctionFragment; "createRewardsForAllEarners(((address,uint96)[],address,uint256,uint32,uint32)[])": FunctionFragment; "createRewardsForAllSubmission(((address,uint96)[],address,uint256,uint32,uint32)[])": FunctionFragment; "cumulativeClaimed(address,address)": FunctionFragment; @@ -181,17 +230,18 @@ export interface RewardsCoordinatorInterface extends utils.Interface { "defaultOperatorSplitBips()": FunctionFragment; "delegationManager()": FunctionFragment; "disableRoot(uint32)": FunctionFragment; - "domainSeparator()": FunctionFragment; "getCurrentClaimableDistributionRoot()": FunctionFragment; "getCurrentDistributionRoot()": FunctionFragment; "getDistributionRootAtIndex(uint256)": FunctionFragment; "getDistributionRootsLength()": FunctionFragment; "getOperatorAVSSplit(address,address)": FunctionFragment; "getOperatorPISplit(address)": FunctionFragment; + "getOperatorSetSplit(address,(address,uint32))": FunctionFragment; "getRootIndexFromHash(bytes32)": FunctionFragment; - "initialize(address,address,uint256,address,uint32,uint16)": FunctionFragment; + "initialize(address,uint256,address,uint32,uint16)": FunctionFragment; "isAVSRewardsSubmissionHash(address,bytes32)": FunctionFragment; "isOperatorDirectedAVSRewardsSubmissionHash(address,bytes32)": FunctionFragment; + "isOperatorDirectedOperatorSetRewardsSubmissionHash(address,bytes32)": FunctionFragment; "isRewardsForAllSubmitter(address)": FunctionFragment; "isRewardsSubmissionForAllEarnersHash(address,bytes32)": FunctionFragment; "isRewardsSubmissionForAllHash(address,bytes32)": FunctionFragment; @@ -201,16 +251,18 @@ export interface RewardsCoordinatorInterface extends utils.Interface { "paused(uint8)": FunctionFragment; "paused()": FunctionFragment; "pauserRegistry()": FunctionFragment; + "permissionController()": FunctionFragment; "processClaim((uint32,uint32,bytes,(address,bytes32),uint32[],bytes[],(address,uint256)[]),address)": FunctionFragment; "processClaims((uint32,uint32,bytes,(address,bytes32),uint32[],bytes[],(address,uint256)[])[],address)": FunctionFragment; "renounceOwnership()": FunctionFragment; "rewardsUpdater()": FunctionFragment; "setActivationDelay(uint32)": FunctionFragment; "setClaimerFor(address)": FunctionFragment; + "setClaimerFor(address,address)": FunctionFragment; "setDefaultOperatorSplit(uint16)": FunctionFragment; "setOperatorAVSSplit(address,address,uint16)": FunctionFragment; "setOperatorPISplit(address,uint16)": FunctionFragment; - "setPauserRegistry(address)": FunctionFragment; + "setOperatorSetSplit(address,(address,uint32),uint16)": FunctionFragment; "setRewardsForAllSubmitter(address,bool)": FunctionFragment; "setRewardsUpdater(address)": FunctionFragment; "strategyManager()": FunctionFragment; @@ -218,6 +270,7 @@ export interface RewardsCoordinatorInterface extends utils.Interface { "submitRoot(bytes32,uint32)": FunctionFragment; "transferOwnership(address)": FunctionFragment; "unpause(uint256)": FunctionFragment; + "version()": FunctionFragment; }; getFunction( @@ -228,6 +281,7 @@ export interface RewardsCoordinatorInterface extends utils.Interface { | "MAX_RETROACTIVE_LENGTH" | "MAX_REWARDS_DURATION" | "activationDelay" + | "allocationManager" | "beaconChainETHStrategy" | "calculateEarnerLeafHash" | "calculateTokenLeafHash" @@ -235,6 +289,7 @@ export interface RewardsCoordinatorInterface extends utils.Interface { | "claimerFor" | "createAVSRewardsSubmission" | "createOperatorDirectedAVSRewardsSubmission" + | "createOperatorDirectedOperatorSetRewardsSubmission" | "createRewardsForAllEarners" | "createRewardsForAllSubmission" | "cumulativeClaimed" @@ -242,17 +297,18 @@ export interface RewardsCoordinatorInterface extends utils.Interface { | "defaultOperatorSplitBips" | "delegationManager" | "disableRoot" - | "domainSeparator" | "getCurrentClaimableDistributionRoot" | "getCurrentDistributionRoot" | "getDistributionRootAtIndex" | "getDistributionRootsLength" | "getOperatorAVSSplit" | "getOperatorPISplit" + | "getOperatorSetSplit" | "getRootIndexFromHash" | "initialize" | "isAVSRewardsSubmissionHash" | "isOperatorDirectedAVSRewardsSubmissionHash" + | "isOperatorDirectedOperatorSetRewardsSubmissionHash" | "isRewardsForAllSubmitter" | "isRewardsSubmissionForAllEarnersHash" | "isRewardsSubmissionForAllHash" @@ -262,16 +318,18 @@ export interface RewardsCoordinatorInterface extends utils.Interface { | "paused(uint8)" | "paused()" | "pauserRegistry" + | "permissionController" | "processClaim" | "processClaims" | "renounceOwnership" | "rewardsUpdater" | "setActivationDelay" - | "setClaimerFor" + | "setClaimerFor(address)" + | "setClaimerFor(address,address)" | "setDefaultOperatorSplit" | "setOperatorAVSSplit" | "setOperatorPISplit" - | "setPauserRegistry" + | "setOperatorSetSplit" | "setRewardsForAllSubmitter" | "setRewardsUpdater" | "strategyManager" @@ -279,6 +337,7 @@ export interface RewardsCoordinatorInterface extends utils.Interface { | "submitRoot" | "transferOwnership" | "unpause" + | "version" ): FunctionFragment; encodeFunctionData( @@ -305,41 +364,52 @@ export interface RewardsCoordinatorInterface extends utils.Interface { functionFragment: "activationDelay", values?: undefined ): string; + encodeFunctionData( + functionFragment: "allocationManager", + values?: undefined + ): string; encodeFunctionData( functionFragment: "beaconChainETHStrategy", values?: undefined ): string; encodeFunctionData( functionFragment: "calculateEarnerLeafHash", - values: [IRewardsCoordinator.EarnerTreeMerkleLeafStruct] + values: [IRewardsCoordinatorTypes.EarnerTreeMerkleLeafStruct] ): string; encodeFunctionData( functionFragment: "calculateTokenLeafHash", - values: [IRewardsCoordinator.TokenTreeMerkleLeafStruct] + values: [IRewardsCoordinatorTypes.TokenTreeMerkleLeafStruct] ): string; encodeFunctionData( functionFragment: "checkClaim", - values: [IRewardsCoordinator.RewardsMerkleClaimStruct] + values: [IRewardsCoordinatorTypes.RewardsMerkleClaimStruct] ): string; encodeFunctionData(functionFragment: "claimerFor", values: [string]): string; encodeFunctionData( functionFragment: "createAVSRewardsSubmission", - values: [IRewardsCoordinator.RewardsSubmissionStruct[]] + values: [IRewardsCoordinatorTypes.RewardsSubmissionStruct[]] ): string; encodeFunctionData( functionFragment: "createOperatorDirectedAVSRewardsSubmission", values: [ string, - IRewardsCoordinator.OperatorDirectedRewardsSubmissionStruct[] + IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[] + ] + ): string; + encodeFunctionData( + functionFragment: "createOperatorDirectedOperatorSetRewardsSubmission", + values: [ + OperatorSetStruct, + IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[] ] ): string; encodeFunctionData( functionFragment: "createRewardsForAllEarners", - values: [IRewardsCoordinator.RewardsSubmissionStruct[]] + values: [IRewardsCoordinatorTypes.RewardsSubmissionStruct[]] ): string; encodeFunctionData( functionFragment: "createRewardsForAllSubmission", - values: [IRewardsCoordinator.RewardsSubmissionStruct[]] + values: [IRewardsCoordinatorTypes.RewardsSubmissionStruct[]] ): string; encodeFunctionData( functionFragment: "cumulativeClaimed", @@ -361,10 +431,6 @@ export interface RewardsCoordinatorInterface extends utils.Interface { functionFragment: "disableRoot", values: [BigNumberish] ): string; - encodeFunctionData( - functionFragment: "domainSeparator", - values?: undefined - ): string; encodeFunctionData( functionFragment: "getCurrentClaimableDistributionRoot", values?: undefined @@ -389,13 +455,17 @@ export interface RewardsCoordinatorInterface extends utils.Interface { functionFragment: "getOperatorPISplit", values: [string] ): string; + encodeFunctionData( + functionFragment: "getOperatorSetSplit", + values: [string, OperatorSetStruct] + ): string; encodeFunctionData( functionFragment: "getRootIndexFromHash", values: [BytesLike] ): string; encodeFunctionData( functionFragment: "initialize", - values: [string, string, BigNumberish, string, BigNumberish, BigNumberish] + values: [string, BigNumberish, string, BigNumberish, BigNumberish] ): string; encodeFunctionData( functionFragment: "isAVSRewardsSubmissionHash", @@ -405,6 +475,10 @@ export interface RewardsCoordinatorInterface extends utils.Interface { functionFragment: "isOperatorDirectedAVSRewardsSubmissionHash", values: [string, BytesLike] ): string; + encodeFunctionData( + functionFragment: "isOperatorDirectedOperatorSetRewardsSubmissionHash", + values: [string, BytesLike] + ): string; encodeFunctionData( functionFragment: "isRewardsForAllSubmitter", values: [string] @@ -429,13 +503,17 @@ export interface RewardsCoordinatorInterface extends utils.Interface { functionFragment: "pauserRegistry", values?: undefined ): string; + encodeFunctionData( + functionFragment: "permissionController", + values?: undefined + ): string; encodeFunctionData( functionFragment: "processClaim", - values: [IRewardsCoordinator.RewardsMerkleClaimStruct, string] + values: [IRewardsCoordinatorTypes.RewardsMerkleClaimStruct, string] ): string; encodeFunctionData( functionFragment: "processClaims", - values: [IRewardsCoordinator.RewardsMerkleClaimStruct[], string] + values: [IRewardsCoordinatorTypes.RewardsMerkleClaimStruct[], string] ): string; encodeFunctionData( functionFragment: "renounceOwnership", @@ -450,9 +528,13 @@ export interface RewardsCoordinatorInterface extends utils.Interface { values: [BigNumberish] ): string; encodeFunctionData( - functionFragment: "setClaimerFor", + functionFragment: "setClaimerFor(address)", values: [string] ): string; + encodeFunctionData( + functionFragment: "setClaimerFor(address,address)", + values: [string, string] + ): string; encodeFunctionData( functionFragment: "setDefaultOperatorSplit", values: [BigNumberish] @@ -466,8 +548,8 @@ export interface RewardsCoordinatorInterface extends utils.Interface { values: [string, BigNumberish] ): string; encodeFunctionData( - functionFragment: "setPauserRegistry", - values: [string] + functionFragment: "setOperatorSetSplit", + values: [string, OperatorSetStruct, BigNumberish] ): string; encodeFunctionData( functionFragment: "setRewardsForAllSubmitter", @@ -497,6 +579,7 @@ export interface RewardsCoordinatorInterface extends utils.Interface { functionFragment: "unpause", values: [BigNumberish] ): string; + encodeFunctionData(functionFragment: "version", values?: undefined): string; decodeFunctionResult( functionFragment: "CALCULATION_INTERVAL_SECONDS", @@ -522,6 +605,10 @@ export interface RewardsCoordinatorInterface extends utils.Interface { functionFragment: "activationDelay", data: BytesLike ): Result; + decodeFunctionResult( + functionFragment: "allocationManager", + data: BytesLike + ): Result; decodeFunctionResult( functionFragment: "beaconChainETHStrategy", data: BytesLike @@ -544,6 +631,10 @@ export interface RewardsCoordinatorInterface extends utils.Interface { functionFragment: "createOperatorDirectedAVSRewardsSubmission", data: BytesLike ): Result; + decodeFunctionResult( + functionFragment: "createOperatorDirectedOperatorSetRewardsSubmission", + data: BytesLike + ): Result; decodeFunctionResult( functionFragment: "createRewardsForAllEarners", data: BytesLike @@ -572,10 +663,6 @@ export interface RewardsCoordinatorInterface extends utils.Interface { functionFragment: "disableRoot", data: BytesLike ): Result; - decodeFunctionResult( - functionFragment: "domainSeparator", - data: BytesLike - ): Result; decodeFunctionResult( functionFragment: "getCurrentClaimableDistributionRoot", data: BytesLike @@ -600,6 +687,10 @@ export interface RewardsCoordinatorInterface extends utils.Interface { functionFragment: "getOperatorPISplit", data: BytesLike ): Result; + decodeFunctionResult( + functionFragment: "getOperatorSetSplit", + data: BytesLike + ): Result; decodeFunctionResult( functionFragment: "getRootIndexFromHash", data: BytesLike @@ -613,6 +704,10 @@ export interface RewardsCoordinatorInterface extends utils.Interface { functionFragment: "isOperatorDirectedAVSRewardsSubmissionHash", data: BytesLike ): Result; + decodeFunctionResult( + functionFragment: "isOperatorDirectedOperatorSetRewardsSubmissionHash", + data: BytesLike + ): Result; decodeFunctionResult( functionFragment: "isRewardsForAllSubmitter", data: BytesLike @@ -637,6 +732,10 @@ export interface RewardsCoordinatorInterface extends utils.Interface { functionFragment: "pauserRegistry", data: BytesLike ): Result; + decodeFunctionResult( + functionFragment: "permissionController", + data: BytesLike + ): Result; decodeFunctionResult( functionFragment: "processClaim", data: BytesLike @@ -658,7 +757,11 @@ export interface RewardsCoordinatorInterface extends utils.Interface { data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "setClaimerFor", + functionFragment: "setClaimerFor(address)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setClaimerFor(address,address)", data: BytesLike ): Result; decodeFunctionResult( @@ -674,7 +777,7 @@ export interface RewardsCoordinatorInterface extends utils.Interface { data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "setPauserRegistry", + functionFragment: "setOperatorSetSplit", data: BytesLike ): Result; decodeFunctionResult( @@ -699,6 +802,7 @@ export interface RewardsCoordinatorInterface extends utils.Interface { data: BytesLike ): Result; decodeFunctionResult(functionFragment: "unpause", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "version", data: BytesLike): Result; events: { "AVSRewardsSubmissionCreated(address,uint256,bytes32,((address,uint96)[],address,uint256,uint32,uint32))": EventFragment; @@ -710,10 +814,11 @@ export interface RewardsCoordinatorInterface extends utils.Interface { "Initialized(uint8)": EventFragment; "OperatorAVSSplitBipsSet(address,address,address,uint32,uint16,uint16)": EventFragment; "OperatorDirectedAVSRewardsSubmissionCreated(address,address,bytes32,uint256,((address,uint96)[],address,(address,uint256)[],uint32,uint32,string))": EventFragment; + "OperatorDirectedOperatorSetRewardsSubmissionCreated(address,bytes32,(address,uint32),uint256,((address,uint96)[],address,(address,uint256)[],uint32,uint32,string))": EventFragment; "OperatorPISplitBipsSet(address,address,uint32,uint16,uint16)": EventFragment; + "OperatorSetSplitBipsSet(address,address,(address,uint32),uint32,uint16,uint16)": EventFragment; "OwnershipTransferred(address,address)": EventFragment; "Paused(address,uint256)": EventFragment; - "PauserRegistrySet(address,address)": EventFragment; "RewardsClaimed(bytes32,address,address,address,address,uint256)": EventFragment; "RewardsForAllSubmitterSet(address,bool,bool)": EventFragment; "RewardsSubmissionForAllCreated(address,uint256,bytes32,((address,uint96)[],address,uint256,uint32,uint32))": EventFragment; @@ -737,10 +842,13 @@ export interface RewardsCoordinatorInterface extends utils.Interface { getEvent( nameOrSignatureOrTopic: "OperatorDirectedAVSRewardsSubmissionCreated" ): EventFragment; + getEvent( + nameOrSignatureOrTopic: "OperatorDirectedOperatorSetRewardsSubmissionCreated" + ): EventFragment; getEvent(nameOrSignatureOrTopic: "OperatorPISplitBipsSet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OperatorSetSplitBipsSet"): EventFragment; getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; getEvent(nameOrSignatureOrTopic: "Paused"): EventFragment; - getEvent(nameOrSignatureOrTopic: "PauserRegistrySet"): EventFragment; getEvent(nameOrSignatureOrTopic: "RewardsClaimed"): EventFragment; getEvent(nameOrSignatureOrTopic: "RewardsForAllSubmitterSet"): EventFragment; getEvent( @@ -757,14 +865,14 @@ export interface AVSRewardsSubmissionCreatedEventObject { avs: string; submissionNonce: BigNumber; rewardsSubmissionHash: string; - rewardsSubmission: IRewardsCoordinator.RewardsSubmissionStructOutput; + rewardsSubmission: IRewardsCoordinatorTypes.RewardsSubmissionStructOutput; } export type AVSRewardsSubmissionCreatedEvent = TypedEvent< [ string, BigNumber, string, - IRewardsCoordinator.RewardsSubmissionStructOutput + IRewardsCoordinatorTypes.RewardsSubmissionStructOutput ], AVSRewardsSubmissionCreatedEventObject >; @@ -861,7 +969,7 @@ export interface OperatorDirectedAVSRewardsSubmissionCreatedEventObject { avs: string; operatorDirectedRewardsSubmissionHash: string; submissionNonce: BigNumber; - operatorDirectedRewardsSubmission: IRewardsCoordinator.OperatorDirectedRewardsSubmissionStructOutput; + operatorDirectedRewardsSubmission: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStructOutput; } export type OperatorDirectedAVSRewardsSubmissionCreatedEvent = TypedEvent< [ @@ -869,7 +977,7 @@ export type OperatorDirectedAVSRewardsSubmissionCreatedEvent = TypedEvent< string, string, BigNumber, - IRewardsCoordinator.OperatorDirectedRewardsSubmissionStructOutput + IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStructOutput ], OperatorDirectedAVSRewardsSubmissionCreatedEventObject >; @@ -877,6 +985,28 @@ export type OperatorDirectedAVSRewardsSubmissionCreatedEvent = TypedEvent< export type OperatorDirectedAVSRewardsSubmissionCreatedEventFilter = TypedEventFilter; +export interface OperatorDirectedOperatorSetRewardsSubmissionCreatedEventObject { + caller: string; + operatorDirectedRewardsSubmissionHash: string; + operatorSet: OperatorSetStructOutput; + submissionNonce: BigNumber; + operatorDirectedRewardsSubmission: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStructOutput; +} +export type OperatorDirectedOperatorSetRewardsSubmissionCreatedEvent = + TypedEvent< + [ + string, + string, + OperatorSetStructOutput, + BigNumber, + IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStructOutput + ], + OperatorDirectedOperatorSetRewardsSubmissionCreatedEventObject + >; + +export type OperatorDirectedOperatorSetRewardsSubmissionCreatedEventFilter = + TypedEventFilter; + export interface OperatorPISplitBipsSetEventObject { caller: string; operator: string; @@ -892,6 +1022,22 @@ export type OperatorPISplitBipsSetEvent = TypedEvent< export type OperatorPISplitBipsSetEventFilter = TypedEventFilter; +export interface OperatorSetSplitBipsSetEventObject { + caller: string; + operator: string; + operatorSet: OperatorSetStructOutput; + activatedAt: number; + oldOperatorSetSplitBips: number; + newOperatorSetSplitBips: number; +} +export type OperatorSetSplitBipsSetEvent = TypedEvent< + [string, string, OperatorSetStructOutput, number, number, number], + OperatorSetSplitBipsSetEventObject +>; + +export type OperatorSetSplitBipsSetEventFilter = + TypedEventFilter; + export interface OwnershipTransferredEventObject { previousOwner: string; newOwner: string; @@ -912,18 +1058,6 @@ export type PausedEvent = TypedEvent<[string, BigNumber], PausedEventObject>; export type PausedEventFilter = TypedEventFilter; -export interface PauserRegistrySetEventObject { - pauserRegistry: string; - newPauserRegistry: string; -} -export type PauserRegistrySetEvent = TypedEvent< - [string, string], - PauserRegistrySetEventObject ->; - -export type PauserRegistrySetEventFilter = - TypedEventFilter; - export interface RewardsClaimedEventObject { root: string; earner: string; @@ -956,14 +1090,14 @@ export interface RewardsSubmissionForAllCreatedEventObject { submitter: string; submissionNonce: BigNumber; rewardsSubmissionHash: string; - rewardsSubmission: IRewardsCoordinator.RewardsSubmissionStructOutput; + rewardsSubmission: IRewardsCoordinatorTypes.RewardsSubmissionStructOutput; } export type RewardsSubmissionForAllCreatedEvent = TypedEvent< [ string, BigNumber, string, - IRewardsCoordinator.RewardsSubmissionStructOutput + IRewardsCoordinatorTypes.RewardsSubmissionStructOutput ], RewardsSubmissionForAllCreatedEventObject >; @@ -975,14 +1109,14 @@ export interface RewardsSubmissionForAllEarnersCreatedEventObject { tokenHopper: string; submissionNonce: BigNumber; rewardsSubmissionHash: string; - rewardsSubmission: IRewardsCoordinator.RewardsSubmissionStructOutput; + rewardsSubmission: IRewardsCoordinatorTypes.RewardsSubmissionStructOutput; } export type RewardsSubmissionForAllEarnersCreatedEvent = TypedEvent< [ string, BigNumber, string, - IRewardsCoordinator.RewardsSubmissionStructOutput + IRewardsCoordinatorTypes.RewardsSubmissionStructOutput ], RewardsSubmissionForAllEarnersCreatedEventObject >; @@ -1052,51 +1186,62 @@ export interface RewardsCoordinator extends BaseContract { activationDelay(overrides?: CallOverrides): Promise<[number]>; + allocationManager(overrides?: CallOverrides): Promise<[string]>; + beaconChainETHStrategy(overrides?: CallOverrides): Promise<[string]>; calculateEarnerLeafHash( - leaf: IRewardsCoordinator.EarnerTreeMerkleLeafStruct, + leaf: IRewardsCoordinatorTypes.EarnerTreeMerkleLeafStruct, overrides?: CallOverrides ): Promise<[string]>; calculateTokenLeafHash( - leaf: IRewardsCoordinator.TokenTreeMerkleLeafStruct, + leaf: IRewardsCoordinatorTypes.TokenTreeMerkleLeafStruct, overrides?: CallOverrides ): Promise<[string]>; checkClaim( - claim: IRewardsCoordinator.RewardsMerkleClaimStruct, + claim: IRewardsCoordinatorTypes.RewardsMerkleClaimStruct, overrides?: CallOverrides ): Promise<[boolean]>; - claimerFor(arg0: string, overrides?: CallOverrides): Promise<[string]>; + claimerFor( + earner: string, + overrides?: CallOverrides + ): Promise<[string] & { claimer: string }>; createAVSRewardsSubmission( - rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; createOperatorDirectedAVSRewardsSubmission( avs: string, - operatorDirectedRewardsSubmissions: IRewardsCoordinator.OperatorDirectedRewardsSubmissionStruct[], + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createOperatorDirectedOperatorSetRewardsSubmission( + operatorSet: OperatorSetStruct, + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; createRewardsForAllEarners( - rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; createRewardsForAllSubmission( - rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; cumulativeClaimed( - arg0: string, - arg1: string, + earner: string, + token: string, overrides?: CallOverrides - ): Promise<[BigNumber]>; + ): Promise<[BigNumber] & { totalClaimed: BigNumber }>; currRewardsCalculationEndTimestamp( overrides?: CallOverrides @@ -1111,20 +1256,18 @@ export interface RewardsCoordinator extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; - domainSeparator(overrides?: CallOverrides): Promise<[string]>; - getCurrentClaimableDistributionRoot( overrides?: CallOverrides - ): Promise<[IRewardsCoordinator.DistributionRootStructOutput]>; + ): Promise<[IRewardsCoordinatorTypes.DistributionRootStructOutput]>; getCurrentDistributionRoot( overrides?: CallOverrides - ): Promise<[IRewardsCoordinator.DistributionRootStructOutput]>; + ): Promise<[IRewardsCoordinatorTypes.DistributionRootStructOutput]>; getDistributionRootAtIndex( index: BigNumberish, overrides?: CallOverrides - ): Promise<[IRewardsCoordinator.DistributionRootStructOutput]>; + ): Promise<[IRewardsCoordinatorTypes.DistributionRootStructOutput]>; getDistributionRootsLength(overrides?: CallOverrides): Promise<[BigNumber]>; @@ -1139,6 +1282,12 @@ export interface RewardsCoordinator extends BaseContract { overrides?: CallOverrides ): Promise<[number]>; + getOperatorSetSplit( + operator: string, + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise<[number]>; + getRootIndexFromHash( rootHash: BytesLike, overrides?: CallOverrides @@ -1146,7 +1295,6 @@ export interface RewardsCoordinator extends BaseContract { initialize( initialOwner: string, - _pauserRegistry: string, initialPausedStatus: BigNumberish, _rewardsUpdater: string, _activationDelay: BigNumberish, @@ -1155,33 +1303,39 @@ export interface RewardsCoordinator extends BaseContract { ): Promise; isAVSRewardsSubmissionHash( - arg0: string, - arg1: BytesLike, + avs: string, + hash: BytesLike, overrides?: CallOverrides - ): Promise<[boolean]>; + ): Promise<[boolean] & { valid: boolean }>; isOperatorDirectedAVSRewardsSubmissionHash( - arg0: string, - arg1: BytesLike, + avs: string, + hash: BytesLike, overrides?: CallOverrides - ): Promise<[boolean]>; + ): Promise<[boolean] & { valid: boolean }>; + + isOperatorDirectedOperatorSetRewardsSubmissionHash( + avs: string, + hash: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean] & { valid: boolean }>; isRewardsForAllSubmitter( - arg0: string, + submitter: string, overrides?: CallOverrides - ): Promise<[boolean]>; + ): Promise<[boolean] & { valid: boolean }>; isRewardsSubmissionForAllEarnersHash( - arg0: string, - arg1: BytesLike, + avs: string, + hash: BytesLike, overrides?: CallOverrides - ): Promise<[boolean]>; + ): Promise<[boolean] & { valid: boolean }>; isRewardsSubmissionForAllHash( - arg0: string, - arg1: BytesLike, + avs: string, + hash: BytesLike, overrides?: CallOverrides - ): Promise<[boolean]>; + ): Promise<[boolean] & { valid: boolean }>; owner(overrides?: CallOverrides): Promise<[string]>; @@ -1203,14 +1357,16 @@ export interface RewardsCoordinator extends BaseContract { pauserRegistry(overrides?: CallOverrides): Promise<[string]>; + permissionController(overrides?: CallOverrides): Promise<[string]>; + processClaim( - claim: IRewardsCoordinator.RewardsMerkleClaimStruct, + claim: IRewardsCoordinatorTypes.RewardsMerkleClaimStruct, recipient: string, overrides?: Overrides & { from?: string } ): Promise; processClaims( - claims: IRewardsCoordinator.RewardsMerkleClaimStruct[], + claims: IRewardsCoordinatorTypes.RewardsMerkleClaimStruct[], recipient: string, overrides?: Overrides & { from?: string } ): Promise; @@ -1226,7 +1382,13 @@ export interface RewardsCoordinator extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; - setClaimerFor( + "setClaimerFor(address)"( + claimer: string, + overrides?: Overrides & { from?: string } + ): Promise; + + "setClaimerFor(address,address)"( + earner: string, claimer: string, overrides?: Overrides & { from?: string } ): Promise; @@ -1249,8 +1411,10 @@ export interface RewardsCoordinator extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; - setPauserRegistry( - newPauserRegistry: string, + setOperatorSetSplit( + operator: string, + operatorSet: OperatorSetStruct, + split: BigNumberish, overrides?: Overrides & { from?: string } ): Promise; @@ -1268,9 +1432,9 @@ export interface RewardsCoordinator extends BaseContract { strategyManager(overrides?: CallOverrides): Promise<[string]>; submissionNonce( - arg0: string, + avs: string, overrides?: CallOverrides - ): Promise<[BigNumber]>; + ): Promise<[BigNumber] & { nonce: BigNumber }>; submitRoot( root: BytesLike, @@ -1287,6 +1451,8 @@ export interface RewardsCoordinator extends BaseContract { newPausedStatus: BigNumberish, overrides?: Overrides & { from?: string } ): Promise; + + version(overrides?: CallOverrides): Promise<[string]>; }; CALCULATION_INTERVAL_SECONDS(overrides?: CallOverrides): Promise; @@ -1301,49 +1467,57 @@ export interface RewardsCoordinator extends BaseContract { activationDelay(overrides?: CallOverrides): Promise; + allocationManager(overrides?: CallOverrides): Promise; + beaconChainETHStrategy(overrides?: CallOverrides): Promise; calculateEarnerLeafHash( - leaf: IRewardsCoordinator.EarnerTreeMerkleLeafStruct, + leaf: IRewardsCoordinatorTypes.EarnerTreeMerkleLeafStruct, overrides?: CallOverrides ): Promise; calculateTokenLeafHash( - leaf: IRewardsCoordinator.TokenTreeMerkleLeafStruct, + leaf: IRewardsCoordinatorTypes.TokenTreeMerkleLeafStruct, overrides?: CallOverrides ): Promise; checkClaim( - claim: IRewardsCoordinator.RewardsMerkleClaimStruct, + claim: IRewardsCoordinatorTypes.RewardsMerkleClaimStruct, overrides?: CallOverrides ): Promise; - claimerFor(arg0: string, overrides?: CallOverrides): Promise; + claimerFor(earner: string, overrides?: CallOverrides): Promise; createAVSRewardsSubmission( - rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; createOperatorDirectedAVSRewardsSubmission( avs: string, - operatorDirectedRewardsSubmissions: IRewardsCoordinator.OperatorDirectedRewardsSubmissionStruct[], + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createOperatorDirectedOperatorSetRewardsSubmission( + operatorSet: OperatorSetStruct, + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; createRewardsForAllEarners( - rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; createRewardsForAllSubmission( - rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; cumulativeClaimed( - arg0: string, - arg1: string, + earner: string, + token: string, overrides?: CallOverrides ): Promise; @@ -1360,20 +1534,18 @@ export interface RewardsCoordinator extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; - domainSeparator(overrides?: CallOverrides): Promise; - getCurrentClaimableDistributionRoot( overrides?: CallOverrides - ): Promise; + ): Promise; getCurrentDistributionRoot( overrides?: CallOverrides - ): Promise; + ): Promise; getDistributionRootAtIndex( index: BigNumberish, overrides?: CallOverrides - ): Promise; + ): Promise; getDistributionRootsLength(overrides?: CallOverrides): Promise; @@ -1388,6 +1560,12 @@ export interface RewardsCoordinator extends BaseContract { overrides?: CallOverrides ): Promise; + getOperatorSetSplit( + operator: string, + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + getRootIndexFromHash( rootHash: BytesLike, overrides?: CallOverrides @@ -1395,7 +1573,6 @@ export interface RewardsCoordinator extends BaseContract { initialize( initialOwner: string, - _pauserRegistry: string, initialPausedStatus: BigNumberish, _rewardsUpdater: string, _activationDelay: BigNumberish, @@ -1404,31 +1581,37 @@ export interface RewardsCoordinator extends BaseContract { ): Promise; isAVSRewardsSubmissionHash( - arg0: string, - arg1: BytesLike, + avs: string, + hash: BytesLike, overrides?: CallOverrides ): Promise; isOperatorDirectedAVSRewardsSubmissionHash( - arg0: string, - arg1: BytesLike, + avs: string, + hash: BytesLike, + overrides?: CallOverrides + ): Promise; + + isOperatorDirectedOperatorSetRewardsSubmissionHash( + avs: string, + hash: BytesLike, overrides?: CallOverrides ): Promise; isRewardsForAllSubmitter( - arg0: string, + submitter: string, overrides?: CallOverrides ): Promise; isRewardsSubmissionForAllEarnersHash( - arg0: string, - arg1: BytesLike, + avs: string, + hash: BytesLike, overrides?: CallOverrides ): Promise; isRewardsSubmissionForAllHash( - arg0: string, - arg1: BytesLike, + avs: string, + hash: BytesLike, overrides?: CallOverrides ): Promise; @@ -1452,14 +1635,16 @@ export interface RewardsCoordinator extends BaseContract { pauserRegistry(overrides?: CallOverrides): Promise; + permissionController(overrides?: CallOverrides): Promise; + processClaim( - claim: IRewardsCoordinator.RewardsMerkleClaimStruct, + claim: IRewardsCoordinatorTypes.RewardsMerkleClaimStruct, recipient: string, overrides?: Overrides & { from?: string } ): Promise; processClaims( - claims: IRewardsCoordinator.RewardsMerkleClaimStruct[], + claims: IRewardsCoordinatorTypes.RewardsMerkleClaimStruct[], recipient: string, overrides?: Overrides & { from?: string } ): Promise; @@ -1475,7 +1660,13 @@ export interface RewardsCoordinator extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; - setClaimerFor( + "setClaimerFor(address)"( + claimer: string, + overrides?: Overrides & { from?: string } + ): Promise; + + "setClaimerFor(address,address)"( + earner: string, claimer: string, overrides?: Overrides & { from?: string } ): Promise; @@ -1498,8 +1689,10 @@ export interface RewardsCoordinator extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; - setPauserRegistry( - newPauserRegistry: string, + setOperatorSetSplit( + operator: string, + operatorSet: OperatorSetStruct, + split: BigNumberish, overrides?: Overrides & { from?: string } ): Promise; @@ -1516,7 +1709,7 @@ export interface RewardsCoordinator extends BaseContract { strategyManager(overrides?: CallOverrides): Promise; - submissionNonce(arg0: string, overrides?: CallOverrides): Promise; + submissionNonce(avs: string, overrides?: CallOverrides): Promise; submitRoot( root: BytesLike, @@ -1534,6 +1727,8 @@ export interface RewardsCoordinator extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; + version(overrides?: CallOverrides): Promise; + callStatic: { CALCULATION_INTERVAL_SECONDS(overrides?: CallOverrides): Promise; @@ -1547,49 +1742,57 @@ export interface RewardsCoordinator extends BaseContract { activationDelay(overrides?: CallOverrides): Promise; + allocationManager(overrides?: CallOverrides): Promise; + beaconChainETHStrategy(overrides?: CallOverrides): Promise; calculateEarnerLeafHash( - leaf: IRewardsCoordinator.EarnerTreeMerkleLeafStruct, + leaf: IRewardsCoordinatorTypes.EarnerTreeMerkleLeafStruct, overrides?: CallOverrides ): Promise; calculateTokenLeafHash( - leaf: IRewardsCoordinator.TokenTreeMerkleLeafStruct, + leaf: IRewardsCoordinatorTypes.TokenTreeMerkleLeafStruct, overrides?: CallOverrides ): Promise; checkClaim( - claim: IRewardsCoordinator.RewardsMerkleClaimStruct, + claim: IRewardsCoordinatorTypes.RewardsMerkleClaimStruct, overrides?: CallOverrides ): Promise; - claimerFor(arg0: string, overrides?: CallOverrides): Promise; + claimerFor(earner: string, overrides?: CallOverrides): Promise; createAVSRewardsSubmission( - rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], overrides?: CallOverrides ): Promise; createOperatorDirectedAVSRewardsSubmission( avs: string, - operatorDirectedRewardsSubmissions: IRewardsCoordinator.OperatorDirectedRewardsSubmissionStruct[], + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], + overrides?: CallOverrides + ): Promise; + + createOperatorDirectedOperatorSetRewardsSubmission( + operatorSet: OperatorSetStruct, + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], overrides?: CallOverrides ): Promise; createRewardsForAllEarners( - rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], overrides?: CallOverrides ): Promise; createRewardsForAllSubmission( - rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], overrides?: CallOverrides ): Promise; cumulativeClaimed( - arg0: string, - arg1: string, + earner: string, + token: string, overrides?: CallOverrides ): Promise; @@ -1606,20 +1809,18 @@ export interface RewardsCoordinator extends BaseContract { overrides?: CallOverrides ): Promise; - domainSeparator(overrides?: CallOverrides): Promise; - getCurrentClaimableDistributionRoot( overrides?: CallOverrides - ): Promise; + ): Promise; getCurrentDistributionRoot( overrides?: CallOverrides - ): Promise; + ): Promise; getDistributionRootAtIndex( index: BigNumberish, overrides?: CallOverrides - ): Promise; + ): Promise; getDistributionRootsLength(overrides?: CallOverrides): Promise; @@ -1634,6 +1835,12 @@ export interface RewardsCoordinator extends BaseContract { overrides?: CallOverrides ): Promise; + getOperatorSetSplit( + operator: string, + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + getRootIndexFromHash( rootHash: BytesLike, overrides?: CallOverrides @@ -1641,7 +1848,6 @@ export interface RewardsCoordinator extends BaseContract { initialize( initialOwner: string, - _pauserRegistry: string, initialPausedStatus: BigNumberish, _rewardsUpdater: string, _activationDelay: BigNumberish, @@ -1650,31 +1856,37 @@ export interface RewardsCoordinator extends BaseContract { ): Promise; isAVSRewardsSubmissionHash( - arg0: string, - arg1: BytesLike, + avs: string, + hash: BytesLike, overrides?: CallOverrides ): Promise; isOperatorDirectedAVSRewardsSubmissionHash( - arg0: string, - arg1: BytesLike, + avs: string, + hash: BytesLike, + overrides?: CallOverrides + ): Promise; + + isOperatorDirectedOperatorSetRewardsSubmissionHash( + avs: string, + hash: BytesLike, overrides?: CallOverrides ): Promise; isRewardsForAllSubmitter( - arg0: string, + submitter: string, overrides?: CallOverrides ): Promise; isRewardsSubmissionForAllEarnersHash( - arg0: string, - arg1: BytesLike, + avs: string, + hash: BytesLike, overrides?: CallOverrides ): Promise; isRewardsSubmissionForAllHash( - arg0: string, - arg1: BytesLike, + avs: string, + hash: BytesLike, overrides?: CallOverrides ): Promise; @@ -1696,14 +1908,16 @@ export interface RewardsCoordinator extends BaseContract { pauserRegistry(overrides?: CallOverrides): Promise; + permissionController(overrides?: CallOverrides): Promise; + processClaim( - claim: IRewardsCoordinator.RewardsMerkleClaimStruct, + claim: IRewardsCoordinatorTypes.RewardsMerkleClaimStruct, recipient: string, overrides?: CallOverrides ): Promise; processClaims( - claims: IRewardsCoordinator.RewardsMerkleClaimStruct[], + claims: IRewardsCoordinatorTypes.RewardsMerkleClaimStruct[], recipient: string, overrides?: CallOverrides ): Promise; @@ -1717,7 +1931,16 @@ export interface RewardsCoordinator extends BaseContract { overrides?: CallOverrides ): Promise; - setClaimerFor(claimer: string, overrides?: CallOverrides): Promise; + "setClaimerFor(address)"( + claimer: string, + overrides?: CallOverrides + ): Promise; + + "setClaimerFor(address,address)"( + earner: string, + claimer: string, + overrides?: CallOverrides + ): Promise; setDefaultOperatorSplit( split: BigNumberish, @@ -1737,8 +1960,10 @@ export interface RewardsCoordinator extends BaseContract { overrides?: CallOverrides ): Promise; - setPauserRegistry( - newPauserRegistry: string, + setOperatorSetSplit( + operator: string, + operatorSet: OperatorSetStruct, + split: BigNumberish, overrides?: CallOverrides ): Promise; @@ -1755,10 +1980,7 @@ export interface RewardsCoordinator extends BaseContract { strategyManager(overrides?: CallOverrides): Promise; - submissionNonce( - arg0: string, - overrides?: CallOverrides - ): Promise; + submissionNonce(avs: string, overrides?: CallOverrides): Promise; submitRoot( root: BytesLike, @@ -1775,6 +1997,8 @@ export interface RewardsCoordinator extends BaseContract { newPausedStatus: BigNumberish, overrides?: CallOverrides ): Promise; + + version(overrides?: CallOverrides): Promise; }; filters: { @@ -1875,6 +2099,21 @@ export interface RewardsCoordinator extends BaseContract { operatorDirectedRewardsSubmission?: null ): OperatorDirectedAVSRewardsSubmissionCreatedEventFilter; + "OperatorDirectedOperatorSetRewardsSubmissionCreated(address,bytes32,(address,uint32),uint256,((address,uint96)[],address,(address,uint256)[],uint32,uint32,string))"( + caller?: string | null, + operatorDirectedRewardsSubmissionHash?: BytesLike | null, + operatorSet?: null, + submissionNonce?: null, + operatorDirectedRewardsSubmission?: null + ): OperatorDirectedOperatorSetRewardsSubmissionCreatedEventFilter; + OperatorDirectedOperatorSetRewardsSubmissionCreated( + caller?: string | null, + operatorDirectedRewardsSubmissionHash?: BytesLike | null, + operatorSet?: null, + submissionNonce?: null, + operatorDirectedRewardsSubmission?: null + ): OperatorDirectedOperatorSetRewardsSubmissionCreatedEventFilter; + "OperatorPISplitBipsSet(address,address,uint32,uint16,uint16)"( caller?: string | null, operator?: string | null, @@ -1890,6 +2129,23 @@ export interface RewardsCoordinator extends BaseContract { newOperatorPISplitBips?: null ): OperatorPISplitBipsSetEventFilter; + "OperatorSetSplitBipsSet(address,address,(address,uint32),uint32,uint16,uint16)"( + caller?: string | null, + operator?: string | null, + operatorSet?: null, + activatedAt?: null, + oldOperatorSetSplitBips?: null, + newOperatorSetSplitBips?: null + ): OperatorSetSplitBipsSetEventFilter; + OperatorSetSplitBipsSet( + caller?: string | null, + operator?: string | null, + operatorSet?: null, + activatedAt?: null, + oldOperatorSetSplitBips?: null, + newOperatorSetSplitBips?: null + ): OperatorSetSplitBipsSetEventFilter; + "OwnershipTransferred(address,address)"( previousOwner?: string | null, newOwner?: string | null @@ -1905,15 +2161,6 @@ export interface RewardsCoordinator extends BaseContract { ): PausedEventFilter; Paused(account?: string | null, newPausedStatus?: null): PausedEventFilter; - "PauserRegistrySet(address,address)"( - pauserRegistry?: null, - newPauserRegistry?: null - ): PauserRegistrySetEventFilter; - PauserRegistrySet( - pauserRegistry?: null, - newPauserRegistry?: null - ): PauserRegistrySetEventFilter; - "RewardsClaimed(bytes32,address,address,address,address,uint256)"( root?: null, earner?: string | null, @@ -2000,49 +2247,57 @@ export interface RewardsCoordinator extends BaseContract { activationDelay(overrides?: CallOverrides): Promise; + allocationManager(overrides?: CallOverrides): Promise; + beaconChainETHStrategy(overrides?: CallOverrides): Promise; calculateEarnerLeafHash( - leaf: IRewardsCoordinator.EarnerTreeMerkleLeafStruct, + leaf: IRewardsCoordinatorTypes.EarnerTreeMerkleLeafStruct, overrides?: CallOverrides ): Promise; calculateTokenLeafHash( - leaf: IRewardsCoordinator.TokenTreeMerkleLeafStruct, + leaf: IRewardsCoordinatorTypes.TokenTreeMerkleLeafStruct, overrides?: CallOverrides ): Promise; checkClaim( - claim: IRewardsCoordinator.RewardsMerkleClaimStruct, + claim: IRewardsCoordinatorTypes.RewardsMerkleClaimStruct, overrides?: CallOverrides ): Promise; - claimerFor(arg0: string, overrides?: CallOverrides): Promise; + claimerFor(earner: string, overrides?: CallOverrides): Promise; createAVSRewardsSubmission( - rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; createOperatorDirectedAVSRewardsSubmission( avs: string, - operatorDirectedRewardsSubmissions: IRewardsCoordinator.OperatorDirectedRewardsSubmissionStruct[], + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createOperatorDirectedOperatorSetRewardsSubmission( + operatorSet: OperatorSetStruct, + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; createRewardsForAllEarners( - rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; createRewardsForAllSubmission( - rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; cumulativeClaimed( - arg0: string, - arg1: string, + earner: string, + token: string, overrides?: CallOverrides ): Promise; @@ -2059,8 +2314,6 @@ export interface RewardsCoordinator extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; - domainSeparator(overrides?: CallOverrides): Promise; - getCurrentClaimableDistributionRoot( overrides?: CallOverrides ): Promise; @@ -2085,6 +2338,12 @@ export interface RewardsCoordinator extends BaseContract { overrides?: CallOverrides ): Promise; + getOperatorSetSplit( + operator: string, + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + getRootIndexFromHash( rootHash: BytesLike, overrides?: CallOverrides @@ -2092,7 +2351,6 @@ export interface RewardsCoordinator extends BaseContract { initialize( initialOwner: string, - _pauserRegistry: string, initialPausedStatus: BigNumberish, _rewardsUpdater: string, _activationDelay: BigNumberish, @@ -2101,31 +2359,37 @@ export interface RewardsCoordinator extends BaseContract { ): Promise; isAVSRewardsSubmissionHash( - arg0: string, - arg1: BytesLike, + avs: string, + hash: BytesLike, overrides?: CallOverrides ): Promise; isOperatorDirectedAVSRewardsSubmissionHash( - arg0: string, - arg1: BytesLike, + avs: string, + hash: BytesLike, + overrides?: CallOverrides + ): Promise; + + isOperatorDirectedOperatorSetRewardsSubmissionHash( + avs: string, + hash: BytesLike, overrides?: CallOverrides ): Promise; isRewardsForAllSubmitter( - arg0: string, + submitter: string, overrides?: CallOverrides ): Promise; isRewardsSubmissionForAllEarnersHash( - arg0: string, - arg1: BytesLike, + avs: string, + hash: BytesLike, overrides?: CallOverrides ): Promise; isRewardsSubmissionForAllHash( - arg0: string, - arg1: BytesLike, + avs: string, + hash: BytesLike, overrides?: CallOverrides ): Promise; @@ -2147,14 +2411,16 @@ export interface RewardsCoordinator extends BaseContract { pauserRegistry(overrides?: CallOverrides): Promise; + permissionController(overrides?: CallOverrides): Promise; + processClaim( - claim: IRewardsCoordinator.RewardsMerkleClaimStruct, + claim: IRewardsCoordinatorTypes.RewardsMerkleClaimStruct, recipient: string, overrides?: Overrides & { from?: string } ): Promise; processClaims( - claims: IRewardsCoordinator.RewardsMerkleClaimStruct[], + claims: IRewardsCoordinatorTypes.RewardsMerkleClaimStruct[], recipient: string, overrides?: Overrides & { from?: string } ): Promise; @@ -2170,7 +2436,13 @@ export interface RewardsCoordinator extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; - setClaimerFor( + "setClaimerFor(address)"( + claimer: string, + overrides?: Overrides & { from?: string } + ): Promise; + + "setClaimerFor(address,address)"( + earner: string, claimer: string, overrides?: Overrides & { from?: string } ): Promise; @@ -2193,8 +2465,10 @@ export interface RewardsCoordinator extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; - setPauserRegistry( - newPauserRegistry: string, + setOperatorSetSplit( + operator: string, + operatorSet: OperatorSetStruct, + split: BigNumberish, overrides?: Overrides & { from?: string } ): Promise; @@ -2211,10 +2485,7 @@ export interface RewardsCoordinator extends BaseContract { strategyManager(overrides?: CallOverrides): Promise; - submissionNonce( - arg0: string, - overrides?: CallOverrides - ): Promise; + submissionNonce(avs: string, overrides?: CallOverrides): Promise; submitRoot( root: BytesLike, @@ -2231,6 +2502,8 @@ export interface RewardsCoordinator extends BaseContract { newPausedStatus: BigNumberish, overrides?: Overrides & { from?: string } ): Promise; + + version(overrides?: CallOverrides): Promise; }; populateTransaction: { @@ -2254,54 +2527,62 @@ export interface RewardsCoordinator extends BaseContract { activationDelay(overrides?: CallOverrides): Promise; + allocationManager(overrides?: CallOverrides): Promise; + beaconChainETHStrategy( overrides?: CallOverrides ): Promise; calculateEarnerLeafHash( - leaf: IRewardsCoordinator.EarnerTreeMerkleLeafStruct, + leaf: IRewardsCoordinatorTypes.EarnerTreeMerkleLeafStruct, overrides?: CallOverrides ): Promise; calculateTokenLeafHash( - leaf: IRewardsCoordinator.TokenTreeMerkleLeafStruct, + leaf: IRewardsCoordinatorTypes.TokenTreeMerkleLeafStruct, overrides?: CallOverrides ): Promise; checkClaim( - claim: IRewardsCoordinator.RewardsMerkleClaimStruct, + claim: IRewardsCoordinatorTypes.RewardsMerkleClaimStruct, overrides?: CallOverrides ): Promise; claimerFor( - arg0: string, + earner: string, overrides?: CallOverrides ): Promise; createAVSRewardsSubmission( - rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; createOperatorDirectedAVSRewardsSubmission( avs: string, - operatorDirectedRewardsSubmissions: IRewardsCoordinator.OperatorDirectedRewardsSubmissionStruct[], + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createOperatorDirectedOperatorSetRewardsSubmission( + operatorSet: OperatorSetStruct, + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; createRewardsForAllEarners( - rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; createRewardsForAllSubmission( - rewardsSubmissions: IRewardsCoordinator.RewardsSubmissionStruct[], + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; cumulativeClaimed( - arg0: string, - arg1: string, + earner: string, + token: string, overrides?: CallOverrides ): Promise; @@ -2320,8 +2601,6 @@ export interface RewardsCoordinator extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; - domainSeparator(overrides?: CallOverrides): Promise; - getCurrentClaimableDistributionRoot( overrides?: CallOverrides ): Promise; @@ -2350,6 +2629,12 @@ export interface RewardsCoordinator extends BaseContract { overrides?: CallOverrides ): Promise; + getOperatorSetSplit( + operator: string, + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + getRootIndexFromHash( rootHash: BytesLike, overrides?: CallOverrides @@ -2357,7 +2642,6 @@ export interface RewardsCoordinator extends BaseContract { initialize( initialOwner: string, - _pauserRegistry: string, initialPausedStatus: BigNumberish, _rewardsUpdater: string, _activationDelay: BigNumberish, @@ -2366,31 +2650,37 @@ export interface RewardsCoordinator extends BaseContract { ): Promise; isAVSRewardsSubmissionHash( - arg0: string, - arg1: BytesLike, + avs: string, + hash: BytesLike, overrides?: CallOverrides ): Promise; isOperatorDirectedAVSRewardsSubmissionHash( - arg0: string, - arg1: BytesLike, + avs: string, + hash: BytesLike, + overrides?: CallOverrides + ): Promise; + + isOperatorDirectedOperatorSetRewardsSubmissionHash( + avs: string, + hash: BytesLike, overrides?: CallOverrides ): Promise; isRewardsForAllSubmitter( - arg0: string, + submitter: string, overrides?: CallOverrides ): Promise; isRewardsSubmissionForAllEarnersHash( - arg0: string, - arg1: BytesLike, + avs: string, + hash: BytesLike, overrides?: CallOverrides ): Promise; isRewardsSubmissionForAllHash( - arg0: string, - arg1: BytesLike, + avs: string, + hash: BytesLike, overrides?: CallOverrides ): Promise; @@ -2414,14 +2704,18 @@ export interface RewardsCoordinator extends BaseContract { pauserRegistry(overrides?: CallOverrides): Promise; + permissionController( + overrides?: CallOverrides + ): Promise; + processClaim( - claim: IRewardsCoordinator.RewardsMerkleClaimStruct, + claim: IRewardsCoordinatorTypes.RewardsMerkleClaimStruct, recipient: string, overrides?: Overrides & { from?: string } ): Promise; processClaims( - claims: IRewardsCoordinator.RewardsMerkleClaimStruct[], + claims: IRewardsCoordinatorTypes.RewardsMerkleClaimStruct[], recipient: string, overrides?: Overrides & { from?: string } ): Promise; @@ -2437,7 +2731,13 @@ export interface RewardsCoordinator extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; - setClaimerFor( + "setClaimerFor(address)"( + claimer: string, + overrides?: Overrides & { from?: string } + ): Promise; + + "setClaimerFor(address,address)"( + earner: string, claimer: string, overrides?: Overrides & { from?: string } ): Promise; @@ -2460,8 +2760,10 @@ export interface RewardsCoordinator extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; - setPauserRegistry( - newPauserRegistry: string, + setOperatorSetSplit( + operator: string, + operatorSet: OperatorSetStruct, + split: BigNumberish, overrides?: Overrides & { from?: string } ): Promise; @@ -2479,7 +2781,7 @@ export interface RewardsCoordinator extends BaseContract { strategyManager(overrides?: CallOverrides): Promise; submissionNonce( - arg0: string, + avs: string, overrides?: CallOverrides ): Promise; @@ -2498,5 +2800,7 @@ export interface RewardsCoordinator extends BaseContract { newPausedStatus: BigNumberish, overrides?: Overrides & { from?: string } ): Promise; + + version(overrides?: CallOverrides): Promise; }; } diff --git a/src/avs/contracts/SocketRegistry.ts b/src/avs/contracts/SocketRegistry.ts new file mode 100644 index 00000000..e8de3252 --- /dev/null +++ b/src/avs/contracts/SocketRegistry.ts @@ -0,0 +1,204 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { FunctionFragment, Result } from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +} from "./common"; + +export interface SocketRegistryInterface extends utils.Interface { + functions: { + "getOperatorSocket(bytes32)": FunctionFragment; + "operatorIdToSocket(bytes32)": FunctionFragment; + "setOperatorSocket(bytes32,string)": FunctionFragment; + "slashingRegistryCoordinator()": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "getOperatorSocket" + | "operatorIdToSocket" + | "setOperatorSocket" + | "slashingRegistryCoordinator" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "getOperatorSocket", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "operatorIdToSocket", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "setOperatorSocket", + values: [BytesLike, string] + ): string; + encodeFunctionData( + functionFragment: "slashingRegistryCoordinator", + values?: undefined + ): string; + + decodeFunctionResult( + functionFragment: "getOperatorSocket", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "operatorIdToSocket", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setOperatorSocket", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "slashingRegistryCoordinator", + data: BytesLike + ): Result; + + events: {}; +} + +export interface SocketRegistry extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: SocketRegistryInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + getOperatorSocket( + _operatorId: BytesLike, + overrides?: CallOverrides + ): Promise<[string]>; + + operatorIdToSocket( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise<[string]>; + + setOperatorSocket( + _operatorId: BytesLike, + _socket: string, + overrides?: Overrides & { from?: string } + ): Promise; + + slashingRegistryCoordinator(overrides?: CallOverrides): Promise<[string]>; + }; + + getOperatorSocket( + _operatorId: BytesLike, + overrides?: CallOverrides + ): Promise; + + operatorIdToSocket( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + setOperatorSocket( + _operatorId: BytesLike, + _socket: string, + overrides?: Overrides & { from?: string } + ): Promise; + + slashingRegistryCoordinator(overrides?: CallOverrides): Promise; + + callStatic: { + getOperatorSocket( + _operatorId: BytesLike, + overrides?: CallOverrides + ): Promise; + + operatorIdToSocket( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + setOperatorSocket( + _operatorId: BytesLike, + _socket: string, + overrides?: CallOverrides + ): Promise; + + slashingRegistryCoordinator(overrides?: CallOverrides): Promise; + }; + + filters: {}; + + estimateGas: { + getOperatorSocket( + _operatorId: BytesLike, + overrides?: CallOverrides + ): Promise; + + operatorIdToSocket( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + setOperatorSocket( + _operatorId: BytesLike, + _socket: string, + overrides?: Overrides & { from?: string } + ): Promise; + + slashingRegistryCoordinator(overrides?: CallOverrides): Promise; + }; + + populateTransaction: { + getOperatorSocket( + _operatorId: BytesLike, + overrides?: CallOverrides + ): Promise; + + operatorIdToSocket( + arg0: BytesLike, + overrides?: CallOverrides + ): Promise; + + setOperatorSocket( + _operatorId: BytesLike, + _socket: string, + overrides?: Overrides & { from?: string } + ): Promise; + + slashingRegistryCoordinator( + overrides?: CallOverrides + ): Promise; + }; +} diff --git a/src/avs/contracts/factories/AVSDirectory__factory.ts b/src/avs/contracts/factories/AVSDirectory__factory.ts index 1b660217..59cbece5 100644 --- a/src/avs/contracts/factories/AVSDirectory__factory.ts +++ b/src/avs/contracts/factories/AVSDirectory__factory.ts @@ -14,12 +14,22 @@ const _abi = [ type: "address", internalType: "contract IDelegationManager", }, + { + name: "_pauserRegistry", + type: "address", + internalType: "contract IPauserRegistry", + }, + { + name: "_version", + type: "string", + internalType: "string", + }, ], stateMutability: "nonpayable", }, { type: "function", - name: "DOMAIN_TYPEHASH", + name: "OPERATOR_AVS_REGISTRATION_TYPEHASH", inputs: [], outputs: [ { @@ -32,7 +42,20 @@ const _abi = [ }, { type: "function", - name: "OPERATOR_AVS_REGISTRATION_TYPEHASH", + name: "OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH", + inputs: [], + outputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "OPERATOR_SET_REGISTRATION_TYPEHASH", inputs: [], outputs: [ { @@ -48,12 +71,12 @@ const _abi = [ name: "avsOperatorStatus", inputs: [ { - name: "", + name: "avs", type: "address", internalType: "address", }, { - name: "", + name: "operator", type: "address", internalType: "address", }, @@ -62,7 +85,7 @@ const _abi = [ { name: "", type: "uint8", - internalType: "enum IAVSDirectory.OperatorAVSRegistrationStatus", + internalType: "enum IAVSDirectoryTypes.OperatorAVSRegistrationStatus", }, ], stateMutability: "view", @@ -162,11 +185,6 @@ const _abi = [ type: "address", internalType: "address", }, - { - name: "_pauserRegistry", - type: "address", - internalType: "contract IPauserRegistry", - }, { name: "initialPausedStatus", type: "uint256", @@ -181,19 +199,19 @@ const _abi = [ name: "operatorSaltIsSpent", inputs: [ { - name: "", + name: "operator", type: "address", internalType: "address", }, { - name: "", + name: "salt", type: "bytes32", internalType: "bytes32", }, ], outputs: [ { - name: "", + name: "isSpent", type: "bool", internalType: "bool", }, @@ -290,7 +308,8 @@ const _abi = [ { name: "operatorSignature", type: "tuple", - internalType: "struct ISignatureUtils.SignatureWithSaltAndExpiry", + internalType: + "struct ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry", components: [ { name: "signature", @@ -320,19 +339,6 @@ const _abi = [ outputs: [], stateMutability: "nonpayable", }, - { - type: "function", - name: "setPauserRegistry", - inputs: [ - { - name: "newPauserRegistry", - type: "address", - internalType: "contract IPauserRegistry", - }, - ], - outputs: [], - stateMutability: "nonpayable", - }, { type: "function", name: "transferOwnership", @@ -372,6 +378,19 @@ const _abi = [ outputs: [], stateMutability: "nonpayable", }, + { + type: "function", + name: "version", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, { type: "event", name: "AVSMetadataURIUpdated", @@ -424,7 +443,7 @@ const _abi = [ name: "status", type: "uint8", indexed: false, - internalType: "enum IAVSDirectory.OperatorAVSRegistrationStatus", + internalType: "enum IAVSDirectoryTypes.OperatorAVSRegistrationStatus", }, ], anonymous: false, @@ -467,25 +486,6 @@ const _abi = [ ], anonymous: false, }, - { - type: "event", - name: "PauserRegistrySet", - inputs: [ - { - name: "pauserRegistry", - type: "address", - indexed: false, - internalType: "contract IPauserRegistry", - }, - { - name: "newPauserRegistry", - type: "address", - indexed: false, - internalType: "contract IPauserRegistry", - }, - ], - anonymous: false, - }, { type: "event", name: "Unpaused", @@ -505,10 +505,81 @@ const _abi = [ ], anonymous: false, }, + { + type: "error", + name: "CurrentlyPaused", + inputs: [], + }, + { + type: "error", + name: "InputAddressZero", + inputs: [], + }, + { + type: "error", + name: "InvalidNewPausedStatus", + inputs: [], + }, + { + type: "error", + name: "InvalidShortString", + inputs: [], + }, + { + type: "error", + name: "InvalidSignature", + inputs: [], + }, + { + type: "error", + name: "OnlyPauser", + inputs: [], + }, + { + type: "error", + name: "OnlyUnpauser", + inputs: [], + }, + { + type: "error", + name: "OperatorAlreadyRegisteredToAVS", + inputs: [], + }, + { + type: "error", + name: "OperatorNotRegisteredToAVS", + inputs: [], + }, + { + type: "error", + name: "OperatorNotRegisteredToEigenLayer", + inputs: [], + }, + { + type: "error", + name: "SaltSpent", + inputs: [], + }, + { + type: "error", + name: "SignatureExpired", + inputs: [], + }, + { + type: "error", + name: "StringTooLong", + inputs: [ + { + name: "str", + type: "string", + internalType: "string", + }, + ], + }, ] as const; const _bytecode = - "0x60c0806040523461019457604051601f611f2b38819003918201601f19168301916001600160401b038311848410176101805780849260209460405283398101031261013057516001600160a01b038116810361012c576080525f5460ff8160081c166100d75760ff8082161061009d575b4660a052604051611d4990816101e2823960805181818161043801526108be015260a051816118520152f35b60ff90811916175f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a180610071565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b5f80fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fdfe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b5f3560e01c806310d67a2f146113f9578063136439dd146112d65780631794bb3c146110c157806320606b7014611087578063374823b51461103e57806349075da314610fe0578063595c6a6714610f355780635ac86ab714610f025780635c975abb14610ee5578063715018a614610e8a578063886f119514610e625780638da5cb5b14610e3a5780639926ee7d1461076a578063a1060c8814610736578063a364f4da14610601578063a98fb355146104a1578063d79aceab14610467578063df5cf72314610423578063ec76f4421461036d578063f2fde38b146102de578063f698da25146102bc5763fabc1cbc0361000e57346102b75760203660031901126102b257606554600435906001600160a01b0316803b156102ad5760206004916040519283809263755b36bd60e11b82525afa80156102a2576101c9915f91610273575b506001600160a01b03163314611691565b60665419811981160361020857806066556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a2005b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b610295915060203d60201161029b575b61028d81836115a4565b810190611672565b5f6101b8565b503d610283565b6040513d5f823e3d90fd5b61161f565b6114d8565b611488565b346102b7575f3660031901126102b25760206102d661184f565b604051908152f35b346102b75760203660031901126102b2576102f7611578565b6102ff611a1b565b6001600160a01b0381161561031957610317906119d3565b005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346102b75760203660031901126102b257600435335f52609960205260405f20815f5260205260ff60405f2054166103c457335f52609960205260405f20905f5260205260405f20600160ff198254161790555f80f35b60405162461bcd60e51b815260206004820152603160248201527f4156534469726563746f72792e63616e63656c53616c743a2063616e6e6f742060448201527018d85b98d95b081cdc195b9d081cd85b1d607a1b6064820152608490fd5b346102b7575f3660031901126102b2576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346102b7575f3660031901126102b25760206040517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd8152f35b346102b75760203660031901126102b25760043567ffffffffffffffff81116105fc57366023820112156105f75780600401359067ffffffffffffffff821161059e573660248383010111610545577fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437139082602460405192602084528260208501520160408301375f604084830101526040813394601f80199101168101030190a2005b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b6115c6565b611528565b346102b75760203660031901126102b25761061a611578565b61062b600180606654161415611765565b335f52609860205260405f2060018060a01b0382165f5260205260ff60405f2054166002811015610722576001036106b757335f8181526098602090815260408083206001600160a01b0395909516808452948252808320805460ff19169055519182529192917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191a3005b60405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f742072656769737465726564006064820152608490fd5b634e487b7160e01b5f52602160045260245ffd5b346102b75760803660031901126102b25760206102d6610754611578565b61075c61158e565b9060643591604435916117b1565b346102b75760403660031901126102b257610783611578565b6024359067ffffffffffffffff82116105fc5760606003198336030112610de957604051906060820182811067ffffffffffffffff821117610d8457604052826004013567ffffffffffffffff8111610d98578301366023820112156105f757600481013567ffffffffffffffff8111610d84576040519161080f601f8301601f1916602001846115a4565b8183523660248284010111610d2f57815f92602460209301838601378301015282526020820191602484013583526044604082019401358452610859600180606654161415611765565b83514211610cd757335f52609860205260405f2060018060a01b0383165f5260205260ff60405f205416600281101561072257600114610c7f5760018060a01b03821693845f52609960205260405f2084515f5260205260ff60405f205416610c2e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156102ad576020602491604051928380926336b87bd760e11b82528a60048301525afa9081156102a2575f91610bff575b5015610b91576109308591855190519033866117b1565b9151923b15610af2573b156102ad57602091606483926040519485938492630b135d3f60e11b84526004840152604060248401528051918291826044860152018484015e5f828201840152601f01601f19168101030181865afa9081156102a2575f91610aab575b506001600160e01b0319166374eca2c160e11b01610a24575b335f52609860205260405f20825f5260205260405f20600160ff19825416179055815f52609960205260405f2090515f5260205260405f20600160ff1982541617905560405190600182527ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4160203393a3005b60405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a490fd5b90506020813d602011610aea575b81610ac6602093836115a4565b810103126102b257516001600160e01b031981168103610ae65783610998565b5f80fd5b3d9150610ab9565b91610b0090610b0892611a73565b919091611af5565b6001600160a01b0316146109b15760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a490fd5b60405162461bcd60e51b815260206004820152604d60248201525f80516020611cf483398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a490fd5b610c21915060203d602011610c27575b610c1981836115a4565b8101906116f0565b86610919565b503d610c0f565b60405162461bcd60e51b815260206004820152603660248201525f80516020611cf48339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b6064820152608490fd5b60405162461bcd60e51b815260206004820152603f60248201525f80516020611cf483398151915260448201527f56533a206f70657261746f7220616c72656164792072656769737465726564006064820152608490fd5b60405162461bcd60e51b815260206004820152603e60248201525f80516020611cf483398151915260448201527f56533a206f70657261746f72207369676e6174757265206578706972656400006064820152608490fd5b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b346102b7575f3660031901126102b2576033546040516001600160a01b039091168152602090f35b346102b7575f3660031901126102b2576065546040516001600160a01b039091168152602090f35b346102b7575f3660031901126102b257610ea2611a1b565b603380546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346102b7575f3660031901126102b2576020606654604051908152f35b346102b75760203660031901126102b25760043560ff8116809103610ae65760016020911b806066541614604051908152f35b346102b7575f3660031901126102b2576065546001600160a01b0316803b156102ad5760206024916040519283809263237dfb4760e11b82523360048301525afa80156102a257610f8d915f91610fc1575b50611708565b5f196066556040515f1981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2005b610fda915060203d602011610c2757610c1981836115a4565b82610f87565b346102b75760403660031901126102b257610ff9611578565b61100161158e565b9060018060a01b03165f52609860205260405f209060018060a01b03165f5260205260ff60405f2054166040516002821015610722576020918152f35b346102b75760403660031901126102b2576001600160a01b0361105f611578565b165f52609960205260405f206024355f52602052602060ff60405f2054166040519015158152f35b346102b7575f3660031901126102b25760206040517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8668152f35b346102b75760603660031901126102b2576110da611578565b6110e261158e565b604435915f549260ff8460081c1615938480956112c9575b80156112b2575b156112565760ff1981166001175f5584611245575b506065546001600160a01b03161580611233575b156111b85761117c928161116c926066556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2611887565b611174611961565b6097556119d3565b61118257005b61ff00195f54165f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a1005b60405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a490fd5b506001600160a01b038316151561112a565b61ffff1916610101175f5584611116565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b1580156111015750600160ff821614611101565b50600160ff8216106110fa565b346102b75760203660031901126102b257606554600435906001600160a01b0316803b156102ad5760206024916040519283809263237dfb4760e11b82523360048301525afa80156102a257611332915f916113da5750611708565b6066548181160361136f57806066556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2005b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b6113f3915060203d602011610c2757610c1981836115a4565b83610f87565b346114885760203660031901126102b257611412611578565b6065546001600160a01b031690813b156102ad5760206004926040519384809263755b36bd60e11b82525afa9182156102a25761031792611464915f9161146957506001600160a01b03163314611691565b611887565b611482915060203d60201161029b5761028d81836115a4565b846101b8565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b600435906001600160a01b0382168203610ae657565b602435906001600160a01b0382168203610ae657565b90601f8019910116810190811067ffffffffffffffff821117610d8457604052565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b908160209103126102b257516001600160a01b0381168103610ae65790565b1561169857565b60405162461bcd60e51b815260206004820152602a60248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526939903ab73830bab9b2b960b11b6064820152608490fd5b908160209103126102b257518015158103610ae65790565b1561170f57565b60405162461bcd60e51b815260206004820152602860248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526739903830bab9b2b960c11b6064820152608490fd5b1561176c57565b60405162461bcd60e51b815260206004820152601960248201527f5061757361626c653a20696e64657820697320706175736564000000000000006044820152606490fd5b9290916040519260208401947fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd865260018060a01b0316604085015260018060a01b03166060840152608083015260a082015260a0815261181360c0826115a4565b51902061181e61184f565b9060405190602082019261190160f01b845260228301526042820152604281526118496062826115a4565b51902090565b467f00000000000000000000000000000000000000000000000000000000000000000361187c5760975490565b611884611961565b90565b6001600160a01b031680156118e457606554604080516001600160a01b0383168152602081018490527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb69190a16001600160a01b03191617606555565b60405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a490fd5b600a60206040516119736040826115a4565b828152016922b4b3b2b72630bcb2b960b11b81522060405160208101917f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866835260408201524660608201523060808201526080815261184960a0826115a4565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b6033546001600160a01b03163303611a2f57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b815160418103611a9f575090611a9b91602082015190606060408401519301515f1a90611c51565b9091565b604003611aec5760406020830151920151918260ff1c91601b8301809311611ad857611a9b936001600160ff1b03169260ff1690611c51565b634e487b7160e01b5f52601160045260245ffd5b50505f90600290565b60058110156107225780611b065750565b60018103611b535760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b60028103611ba05760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b60038103611bf85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b600414611c0157565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608490fd5b907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411611ce85760ff1690601b82141580611cdd575b611cd2576020935f93608093604051938452868401526040830152606082015282805260015afa156102a2575f516001600160a01b03811615611cca57905f90565b505f90600190565b505050505f90600490565b50601c821415611c88565b505050505f9060039056fe4156534469726563746f72792e72656769737465724f70657261746f72546f41a2646970667358221220dada447b10fbabf0403ad3e1cb6b6df4f5f506cfede15d9f8bdda94ca4e41bfd64736f6c634300081a0033"; + "0x60e0806040523461039257611a388038038061001a816103df565b9283398101906060818303126103425780516001600160a01b038116810361033e5760208201516001600160a01b0381169283820361033e576040810151906001600160401b0382116102ee57019284601f850112156102955783516001600160401b03811161028157610097601f8201601f19166020016103df565b9481865260208601966020838301011161022c57815f926020809301895e860101521561021d5760805260a052601f8151116101e157519051602082106101d1575b1760c0525f5460ff8160081c1661017c5760ff80821603610142575b6040516116339081610405823960805181818161018801528181610d0e01528181610dfa0152610fce015260a0518181816103a8015261095d015260c051818181610ed5015261136e0152f35b60ff90811916175f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a1806100f5565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b5f198260200360031b1b166100d9565b60449060405192839163305a27a960e01b8352602060048401525180918160248501528484015e5f828201840152601f01601f19168101030190fd5b6339b190bb60e11b5f5260045ffd5b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b5f80fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b6040519190601f01601f191682016001600160401b038111838210176102815760405256fe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b5f3560e01c8063136439dd14610fb8578063374823b514610f6f57806349075da314610f1157806354fd4d5014610ebd578063595c6a6714610de85780635ac86ab714610db55780635c975abb14610d98578063715018a614610d3d578063886f119514610cf95780638da5cb5b14610cd15780639926ee7d14610826578063a1060c88146107f2578063a364f4da1461070f578063a98fb355146105af578063c825fe6814610575578063cd6dc6871461044b578063d79aceab14610411578063dce974b9146103d7578063df5cf72314610393578063ec76f4421461035b578063f2fde38b146102cc578063f698da25146102aa5763fabc1cbc0361000e57346102a5576020366003190112610288576004357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156102a05760206004916040519283809263755b36bd60e11b82525afa908115610295575f9161024a575b506001600160a01b0316330361023b5760665419811981160361022c57806066556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a2005b63c61dca5d60e01b5f5260045ffd5b63794821ff60e01b5f5260045ffd5b90506020813d60201161028d575b81610265602093836111a2565b8101031261028857516001600160a01b0381168103610284575f6101dd565b5f80fd5b6110b2565b3d9150610258565b6040513d5f823e3d90fd5b611239565b611062565b346102a5575f3660031901126102885760206102c4611342565b604051908152f35b346102a5576020366003190112610288576102e5611152565b6102ed6114ad565b6001600160a01b038116156103075761030590611505565b005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346102a557602036600319011261028857335f52609960205260405f206004355f5260205260405f20600160ff198254161790555f80f35b346102a5575f366003190112610288576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346102a5575f3660031901126102885760206040517f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe4958152f35b346102a5575f3660031901126102885760206040517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd8152f35b346102a557604036600319011261028857610464611152565b5f5460ff8160081c161591828093610568575b8015610551575b156104f55760ff1982166001175f556104a891836104e4575b506104a360243561143d565b611505565b6104ae57005b61ff00195f54165f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a1005b61ffff1916610101175f5583610497565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b15801561047e5750600160ff83161461047e565b50600160ff831610610477565b346102a5575f3660031901126102885760206040517f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f9298152f35b346102a55760203660031901126102885760043567ffffffffffffffff811161070a57366023820112156107055780600401359067ffffffffffffffff82116106ac573660248383010111610653577fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437139082602460405192602084528260208501520160408301375f604084830101526040813394601f80199101168101030190a2005b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b6111c4565b611102565b346102a557602036600319011261028857610728611152565b60018060665416146107e357335f52609860205260405f2060018060a01b0382165f5260205260ff60405f20541660028110156107cf576001036107c057335f8181526098602090815260408083206001600160a01b0395909516808452948252808320805460ff19169055519182529192917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191a3005b6352df45c960e01b5f5260045ffd5b634e487b7160e01b5f52602160045260245ffd5b63840a48d560e01b5f5260045ffd5b346102a55760803660031901126102885760206102c4610810611152565b610818611168565b9060643591604435916112a4565b346102a55760403660031901126102885761083f611152565b6024359067ffffffffffffffff821161070a5760606003198336030112610c8057604051916060830183811067ffffffffffffffff821117610c6c57604052806004013567ffffffffffffffff8111610c1b578101366023820112156107055760048101356108ad8161121d565b916108bb60405193846111a2565b8183523660248284010111610bc657815f9260246020930183860137830101528352602083019160248201358352604460408501920135825260018060665416146107e357335f52609860205260405f2060018060a01b0382165f5260205260ff60405f20541660028110156107cf57600114610bb75760018060a01b03811693845f52609960205260405f2084515f5260205260ff60405f205416610ba8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156102a0576020602491604051928380926336b87bd760e11b82528a60048301525afa908115610295575f91610b79575b5015610b6a576109cd845184519033856112a4565b905192514211610b5b576109e1838261154d565b60058195929510156107cf578690159485610b48575b50508315610a8a575b50505015610a7b57815f52609960205260405f2090515f5260205260405f20600160ff19825416179055335f52609860205260405f20815f5260205260405f20600160ff1982541617905560405190600182527ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4160203393a3005b638baa579f60e01b5f5260045ffd5b5f935090610ac2610ad08594936040519283916020830195630b135d3f60e11b8752602484015260406044840152606483019061117e565b03601f1981018352826111a2565b51915afa3d15610b41573d610ae48161121d565b90610af260405192836111a2565b81523d5f602083013e5b81610b33575b81610b11575b50838080610a00565b90506020818051810103126102885760200151630b135d3f60e11b1483610b08565b905060208151101590610b02565b6060610afc565b6001600160a01b031614935085876109f7565b630819bdcd60e01b5f5260045ffd5b639f88c8af60e01b5f5260045ffd5b610b9b915060203d602011610ba1575b610b9381836111a2565b81019061128c565b866109b8565b503d610b89565b630d4c4c9160e21b5f5260045ffd5b631aa528bb60e11b5f5260045ffd5b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b346102a5575f366003190112610288576033546040516001600160a01b039091168152602090f35b346102a5575f366003190112610288576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346102a5575f36600319011261028857610d556114ad565b603380546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346102a5575f366003190112610288576020606654604051908152f35b346102a55760203660031901126102885760043560ff81168091036102845760016020911b806066541614604051908152f35b346102a5575f366003190112610288577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156102a05760206024916040519283809263237dfb4760e11b82523360048301525afa908115610295575f91610e9e575b5015610e8f575f196066556040515f1981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2005b631d77d47760e21b5f5260045ffd5b610eb7915060203d602011610ba157610b9381836111a2565b81610e55565b346102a5575f36600319011261028857610f0d610ef97f000000000000000000000000000000000000000000000000000000000000000061146f565b60405191829160208352602083019061117e565b0390f35b346102a557604036600319011261028857610f2a611152565b610f32611168565b9060018060a01b03165f52609860205260405f209060018060a01b03165f5260205260ff60405f20541660405160028210156107cf576020918152f35b346102a5576040366003190112610288576001600160a01b03610f90611152565b165f52609960205260405f206024355f52602052602060ff60405f2054166040519015158152f35b34611062576020366003190112610288576004357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156102a05760206024916040519283809263237dfb4760e11b82523360048301525afa908115610295575f91611043575b5015610e8f576066548181160361022c576103059061143d565b61105c915060203d602011610ba157610b9381836111a2565b82611029565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b600435906001600160a01b038216820361028457565b602435906001600160a01b038216820361028457565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b90601f8019910116810190811067ffffffffffffffff821117610c6c57604052565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b67ffffffffffffffff8111610c6c57601f01601f191660200190565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b90816020910312610288575180151581036102845790565b9290916040519260208401947fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd865260018060a01b0316604085015260018060a01b03166060840152608083015260a082015260a0815261130660c0826111a2565b519020611311611342565b9060405190602082019261190160f01b8452602283015260428201526042815261133c6062826111a2565b51902090565b6040600a6020825161135484826111a2565b828152016922b4b3b2b72630bcb2b960b11b8152206113927f000000000000000000000000000000000000000000000000000000000000000061146f565b8051156114295760ff60f81b6020820151169080516001101561142957602160ff60f81b91015116835190602082019283526021820152600281526113d86022826111a2565b51902082519160208301937f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f855283015260608201524660808201523060a082015260a0815261133c60c0826111a2565b634e487b7160e01b5f52603260045260245ffd5b806066556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2565b60ff811690601f821161149e576040519161148b6040846111a2565b6020808452838101919036833783525290565b632cd44ac360e21b5f5260045ffd5b6033546001600160a01b031633036114c157565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b9060418151145f146115795761157591602082015190606060408401519301515f1a90611582565b9091565b50505f90600290565b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116115f2576020935f9360ff60809460405194855216868401526040830152606082015282805260015afa15610295575f516001600160a01b038116156115ea57905f90565b505f90600190565b505050505f9060039056fea2646970667358221220734132c58aaab6f4e1eadff2c7f14583ca5166549a3189ee341984030e34054364736f6c634300081c0033"; type AVSDirectoryConstructorParams = | [signer?: Signer] @@ -529,15 +600,29 @@ export class AVSDirectory__factory extends ContractFactory { override deploy( _delegation: string, + _pauserRegistry: string, + _version: string, overrides?: Overrides & { from?: string } ): Promise { - return super.deploy(_delegation, overrides || {}) as Promise; + return super.deploy( + _delegation, + _pauserRegistry, + _version, + overrides || {} + ) as Promise; } override getDeployTransaction( _delegation: string, + _pauserRegistry: string, + _version: string, overrides?: Overrides & { from?: string } ): TransactionRequest { - return super.getDeployTransaction(_delegation, overrides || {}); + return super.getDeployTransaction( + _delegation, + _pauserRegistry, + _version, + overrides || {} + ); } override attach(address: string): AVSDirectory { return super.attach(address) as AVSDirectory; diff --git a/src/avs/contracts/factories/DelegationManager__factory.ts b/src/avs/contracts/factories/DelegationManager__factory.ts index 1ac50bfc..1d2b5911 100644 --- a/src/avs/contracts/factories/DelegationManager__factory.ts +++ b/src/avs/contracts/factories/DelegationManager__factory.ts @@ -1,7 +1,14 @@ /* Autogenerated file. Do not edit manually. */ /* tslint:disable */ /* eslint-disable */ -import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; +import { + Signer, + utils, + Contract, + ContractFactory, + BigNumberish, + Overrides, +} from "ethers"; import type { Provider, TransactionRequest } from "@ethersproject/providers"; import type { DelegationManager, @@ -18,73 +25,41 @@ const _abi = [ internalType: "contract IStrategyManager", }, { - name: "_slasher", + name: "_eigenPodManager", type: "address", - internalType: "contract ISlasher", + internalType: "contract IEigenPodManager", }, { - name: "_eigenPodManager", + name: "_allocationManager", type: "address", - internalType: "contract IEigenPodManager", + internalType: "contract IAllocationManager", }, - ], - stateMutability: "nonpayable", - }, - { - type: "function", - name: "DELEGATION_APPROVAL_TYPEHASH", - inputs: [], - outputs: [ { - name: "", - type: "bytes32", - internalType: "bytes32", + name: "_pauserRegistry", + type: "address", + internalType: "contract IPauserRegistry", }, - ], - stateMutability: "view", - }, - { - type: "function", - name: "DOMAIN_TYPEHASH", - inputs: [], - outputs: [ { - name: "", - type: "bytes32", - internalType: "bytes32", + name: "_permissionController", + type: "address", + internalType: "contract IPermissionController", }, - ], - stateMutability: "view", - }, - { - type: "function", - name: "MAX_STAKER_OPT_OUT_WINDOW_BLOCKS", - inputs: [], - outputs: [ { - name: "", - type: "uint256", - internalType: "uint256", + name: "_MIN_WITHDRAWAL_DELAY", + type: "uint32", + internalType: "uint32", }, - ], - stateMutability: "view", - }, - { - type: "function", - name: "MAX_WITHDRAWAL_DELAY_BLOCKS", - inputs: [], - outputs: [ { - name: "", - type: "uint256", - internalType: "uint256", + name: "_version", + type: "string", + internalType: "string", }, ], - stateMutability: "view", + stateMutability: "nonpayable", }, { type: "function", - name: "STAKER_DELEGATION_TYPEHASH", + name: "DELEGATION_APPROVAL_TYPEHASH", inputs: [], outputs: [ { @@ -97,42 +72,26 @@ const _abi = [ }, { type: "function", - name: "beaconChainETHStrategy", + name: "allocationManager", inputs: [], outputs: [ { name: "", type: "address", - internalType: "contract IStrategy", + internalType: "contract IAllocationManager", }, ], 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", - }, - ], + name: "beaconChainETHStrategy", + inputs: [], outputs: [ { name: "", - type: "bytes32", - internalType: "bytes32", + type: "address", + internalType: "contract IStrategy", }, ], stateMutability: "view", @@ -152,7 +111,7 @@ const _abi = [ internalType: "address", }, { - name: "_delegationApprover", + name: "approver", type: "address", internalType: "address", }, @@ -176,40 +135,6 @@ const _abi = [ ], 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", @@ -217,7 +142,7 @@ const _abi = [ { name: "withdrawal", type: "tuple", - internalType: "struct IDelegationManager.Withdrawal", + internalType: "struct IDelegationManagerTypes.Withdrawal", components: [ { name: "staker", @@ -250,7 +175,7 @@ const _abi = [ internalType: "contract IStrategy[]", }, { - name: "shares", + name: "scaledShares", type: "uint256[]", internalType: "uint256[]", }, @@ -273,7 +198,7 @@ const _abi = [ { name: "withdrawal", type: "tuple", - internalType: "struct IDelegationManager.Withdrawal", + internalType: "struct IDelegationManagerTypes.Withdrawal", components: [ { name: "staker", @@ -306,7 +231,7 @@ const _abi = [ internalType: "contract IStrategy[]", }, { - name: "shares", + name: "scaledShares", type: "uint256[]", internalType: "uint256[]", }, @@ -317,11 +242,6 @@ const _abi = [ type: "address[]", internalType: "contract IERC20[]", }, - { - name: "middlewareTimesIndex", - type: "uint256", - internalType: "uint256", - }, { name: "receiveAsTokens", type: "bool", @@ -338,7 +258,7 @@ const _abi = [ { name: "withdrawals", type: "tuple[]", - internalType: "struct IDelegationManager.Withdrawal[]", + internalType: "struct IDelegationManagerTypes.Withdrawal[]", components: [ { name: "staker", @@ -371,7 +291,7 @@ const _abi = [ internalType: "contract IStrategy[]", }, { - name: "shares", + name: "scaledShares", type: "uint256[]", internalType: "uint256[]", }, @@ -382,11 +302,6 @@ const _abi = [ type: "address[][]", internalType: "contract IERC20[][]", }, - { - name: "middlewareTimesIndexes", - type: "uint256[]", - internalType: "uint256[]", - }, { name: "receiveAsTokens", type: "bool[]", @@ -398,76 +313,70 @@ const _abi = [ }, { type: "function", - name: "cumulativeWithdrawalsQueued", + name: "convertToDepositShares", inputs: [ { - name: "", + name: "staker", type: "address", internalType: "address", }, + { + name: "strategies", + type: "address[]", + internalType: "contract IStrategy[]", + }, + { + name: "withdrawableShares", + type: "uint256[]", + internalType: "uint256[]", + }, ], outputs: [ { name: "", - type: "uint256", - internalType: "uint256", + type: "uint256[]", + internalType: "uint256[]", }, ], stateMutability: "view", }, { type: "function", - name: "decreaseDelegatedShares", + name: "cumulativeWithdrawalsQueued", inputs: [ { name: "staker", type: "address", internalType: "address", }, + ], + outputs: [ { - name: "strategy", - type: "address", - internalType: "contract IStrategy", - }, - { - name: "shares", + name: "totalQueued", type: "uint256", internalType: "uint256", }, ], - outputs: [], - stateMutability: "nonpayable", + stateMutability: "view", }, { type: "function", - name: "delegateTo", + name: "decreaseDelegatedShares", inputs: [ { - name: "operator", + name: "staker", type: "address", internalType: "address", }, { - name: "approverSignatureAndExpiry", - type: "tuple", - internalType: "struct ISignatureUtils.SignatureWithExpiry", - components: [ - { - name: "signature", - type: "bytes", - internalType: "bytes", - }, - { - name: "expiry", - type: "uint256", - internalType: "uint256", - }, - ], + name: "curDepositShares", + type: "uint256", + internalType: "uint256", }, { - name: "approverSalt", - type: "bytes32", - internalType: "bytes32", + name: "beaconChainSlashingFactorDecrease", + type: "uint64", + internalType: "uint64", }, ], outputs: [], @@ -475,39 +384,17 @@ const _abi = [ }, { type: "function", - name: "delegateToBySignature", + name: "delegateTo", inputs: [ - { - name: "staker", - type: "address", - internalType: "address", - }, { name: "operator", type: "address", internalType: "address", }, - { - name: "stakerSignatureAndExpiry", - type: "tuple", - internalType: "struct ISignatureUtils.SignatureWithExpiry", - components: [ - { - name: "signature", - type: "bytes", - internalType: "bytes", - }, - { - name: "expiry", - type: "uint256", - internalType: "uint256", - }, - ], - }, { name: "approverSignatureAndExpiry", type: "tuple", - internalType: "struct ISignatureUtils.SignatureWithExpiry", + internalType: "struct ISignatureUtilsMixinTypes.SignatureWithExpiry", components: [ { name: "signature", @@ -535,14 +422,14 @@ const _abi = [ name: "delegatedTo", inputs: [ { - name: "", + name: "staker", type: "address", internalType: "address", }, ], outputs: [ { - name: "", + name: "operator", type: "address", internalType: "address", }, @@ -573,25 +460,49 @@ const _abi = [ name: "delegationApproverSaltIsSpent", inputs: [ { - name: "", + name: "delegationApprover", type: "address", internalType: "address", }, { - name: "", + name: "salt", type: "bytes32", internalType: "bytes32", }, ], outputs: [ { - name: "", + name: "spent", type: "bool", internalType: "bool", }, ], stateMutability: "view", }, + { + type: "function", + name: "depositScalingFactor", + inputs: [ + { + name: "staker", + type: "address", + internalType: "address", + }, + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, { type: "function", name: "domainSeparator", @@ -620,7 +531,7 @@ const _abi = [ }, { type: "function", - name: "getDelegatableShares", + name: "getDepositedShares", inputs: [ { name: "staker", @@ -668,8 +579,13 @@ const _abi = [ }, { type: "function", - name: "getWithdrawalDelay", + name: "getOperatorsShares", inputs: [ + { + name: "operators", + type: "address[]", + internalType: "address[]", + }, { name: "strategies", type: "address[]", @@ -679,69 +595,248 @@ const _abi = [ outputs: [ { name: "", - type: "uint256", - internalType: "uint256", + type: "uint256[][]", + internalType: "uint256[][]", }, ], stateMutability: "view", }, { type: "function", - name: "increaseDelegatedShares", + name: "getQueuedWithdrawal", inputs: [ { - name: "staker", - type: "address", - internalType: "address", - }, - { - name: "strategy", - type: "address", - internalType: "contract IStrategy", - }, - { - name: "shares", - type: "uint256", - internalType: "uint256", + name: "withdrawalRoot", + type: "bytes32", + internalType: "bytes32", }, ], - outputs: [], - stateMutability: "nonpayable", - }, - { - type: "function", - name: "initialize", - inputs: [ + outputs: [ { - name: "initialOwner", - type: "address", - internalType: "address", - }, + name: "withdrawal", + type: "tuple", + internalType: "struct IDelegationManagerTypes.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: "contract IStrategy[]", + }, + { + name: "scaledShares", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + }, { - name: "_pauserRegistry", + name: "shares", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getQueuedWithdrawalRoots", + inputs: [ + { + name: "staker", type: "address", - internalType: "contract IPauserRegistry", + internalType: "address", }, + ], + outputs: [ { - name: "initialPausedStatus", - type: "uint256", - internalType: "uint256", + name: "", + type: "bytes32[]", + internalType: "bytes32[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getQueuedWithdrawals", + inputs: [ + { + name: "staker", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "withdrawals", + type: "tuple[]", + internalType: "struct IDelegationManagerTypes.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: "contract IStrategy[]", + }, + { + name: "scaledShares", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + }, + { + name: "shares", + type: "uint256[][]", + internalType: "uint256[][]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getSlashableSharesInQueue", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", }, { - name: "_minWithdrawalDelayBlocks", + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + ], + outputs: [ + { + name: "", type: "uint256", internalType: "uint256", }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getWithdrawableShares", + inputs: [ { - name: "_strategies", + name: "staker", + type: "address", + internalType: "address", + }, + { + name: "strategies", type: "address[]", internalType: "contract IStrategy[]", }, + ], + outputs: [ { - name: "_withdrawalDelayBlocks", + name: "withdrawableShares", type: "uint256[]", internalType: "uint256[]", }, + { + name: "depositShares", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "increaseDelegatedShares", + inputs: [ + { + name: "staker", + type: "address", + internalType: "address", + }, + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + { + name: "prevDepositShares", + type: "uint256", + internalType: "uint256", + }, + { + name: "addedShares", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "initialize", + inputs: [ + { + name: "initialOwner", + type: "address", + internalType: "address", + }, + { + name: "initialPausedStatus", + type: "uint256", + internalType: "uint256", + }, ], outputs: [], stateMutability: "nonpayable", @@ -791,8 +886,8 @@ const _abi = [ outputs: [ { name: "", - type: "uint256", - internalType: "uint256", + type: "uint32", + internalType: "uint32", }, ], stateMutability: "view", @@ -800,87 +895,39 @@ const _abi = [ { type: "function", name: "modifyOperatorDetails", - inputs: [ - { - name: "newOperatorDetails", - type: "tuple", - internalType: "struct IDelegationManager.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: "struct IDelegationManager.OperatorDetails", - components: [ - { - name: "__deprecated_earningsReceiver", - type: "address", - internalType: "address", - }, - { - name: "delegationApprover", - type: "address", - internalType: "address", - }, - { - name: "stakerOptOutWindowBlocks", - type: "uint32", - internalType: "uint32", - }, - ], + name: "newDelegationApprover", + type: "address", + internalType: "address", }, ], - stateMutability: "view", + outputs: [], + stateMutability: "nonpayable", }, { type: "function", name: "operatorShares", inputs: [ { - name: "", + name: "operator", type: "address", internalType: "address", }, { - name: "", + name: "strategy", type: "address", internalType: "contract IStrategy", }, ], outputs: [ { - name: "", + name: "shares", type: "uint256", internalType: "uint256", }, @@ -970,28 +1017,41 @@ const _abi = [ name: "pendingWithdrawals", inputs: [ { - name: "", + name: "withdrawalRoot", type: "bytes32", internalType: "bytes32", }, ], outputs: [ { - name: "", + name: "pending", type: "bool", internalType: "bool", }, ], stateMutability: "view", }, + { + type: "function", + name: "permissionController", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IPermissionController", + }, + ], + stateMutability: "view", + }, { type: "function", name: "queueWithdrawals", inputs: [ { - name: "queuedWithdrawalParams", + name: "params", type: "tuple[]", - internalType: "struct IDelegationManager.QueuedWithdrawalParams[]", + internalType: "struct IDelegationManagerTypes.QueuedWithdrawalParams[]", components: [ { name: "strategies", @@ -999,12 +1059,12 @@ const _abi = [ internalType: "contract IStrategy[]", }, { - name: "shares", + name: "depositShares", type: "uint256[]", internalType: "uint256[]", }, { - name: "withdrawer", + name: "__deprecated_withdrawer", type: "address", internalType: "address", }, @@ -1022,85 +1082,119 @@ const _abi = [ }, { type: "function", - name: "registerAsOperator", + name: "queuedWithdrawals", inputs: [ { - name: "registeringOperatorDetails", + name: "withdrawalRoot", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "withdrawal", type: "tuple", - internalType: "struct IDelegationManager.OperatorDetails", + internalType: "struct IDelegationManagerTypes.Withdrawal", components: [ { - name: "__deprecated_earningsReceiver", + name: "staker", type: "address", internalType: "address", }, { - name: "delegationApprover", + name: "delegatedTo", type: "address", internalType: "address", }, { - name: "stakerOptOutWindowBlocks", + name: "withdrawer", + type: "address", + internalType: "address", + }, + { + name: "nonce", + type: "uint256", + internalType: "uint256", + }, + { + name: "startBlock", type: "uint32", internalType: "uint32", }, + { + name: "strategies", + type: "address[]", + internalType: "contract IStrategy[]", + }, + { + name: "scaledShares", + type: "uint256[]", + internalType: "uint256[]", + }, ], }, - { - name: "metadataURI", - type: "string", - internalType: "string", - }, ], - outputs: [], - stateMutability: "nonpayable", - }, - { - type: "function", - name: "renounceOwnership", - inputs: [], - outputs: [], - stateMutability: "nonpayable", + stateMutability: "view", }, { type: "function", - name: "setMinWithdrawalDelayBlocks", + name: "redelegate", inputs: [ { - name: "newMinWithdrawalDelayBlocks", - type: "uint256", - internalType: "uint256", + name: "newOperator", + type: "address", + internalType: "address", + }, + { + name: "newOperatorApproverSig", + type: "tuple", + internalType: "struct ISignatureUtilsMixinTypes.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: "setPauserRegistry", - inputs: [ + outputs: [ { - name: "newPauserRegistry", - type: "address", - internalType: "contract IPauserRegistry", + name: "withdrawalRoots", + type: "bytes32[]", + internalType: "bytes32[]", }, ], - outputs: [], stateMutability: "nonpayable", }, { type: "function", - name: "setStrategyWithdrawalDelayBlocks", + name: "registerAsOperator", inputs: [ { - name: "strategies", - type: "address[]", - internalType: "contract IStrategy[]", + name: "initDelegationApprover", + type: "address", + internalType: "address", }, { - name: "withdrawalDelayBlocks", - type: "uint256[]", - internalType: "uint256[]", + name: "allocationDelay", + type: "uint32", + internalType: "uint32", + }, + { + name: "metadataURI", + type: "string", + internalType: "string", }, ], outputs: [], @@ -1108,54 +1202,38 @@ const _abi = [ }, { type: "function", - name: "slasher", + name: "renounceOwnership", inputs: [], - outputs: [ - { - name: "", - type: "address", - internalType: "contract ISlasher", - }, - ], - stateMutability: "view", + outputs: [], + stateMutability: "nonpayable", }, { type: "function", - name: "stakerNonce", + name: "slashOperatorShares", inputs: [ { - name: "", + name: "operator", type: "address", internalType: "address", }, - ], - outputs: [ { - name: "", - type: "uint256", - internalType: "uint256", + name: "strategy", + type: "address", + internalType: "contract IStrategy", }, - ], - stateMutability: "view", - }, - { - type: "function", - name: "stakerOptOutWindowBlocks", - inputs: [ { - name: "operator", - type: "address", - internalType: "address", + name: "prevMaxMagnitude", + type: "uint64", + internalType: "uint64", }, - ], - outputs: [ { - name: "", - type: "uint256", - internalType: "uint256", + name: "newMaxMagnitude", + type: "uint64", + internalType: "uint64", }, ], - stateMutability: "view", + outputs: [], + stateMutability: "nonpayable", }, { type: "function", @@ -1170,25 +1248,6 @@ const _abi = [ ], stateMutability: "view", }, - { - type: "function", - name: "strategyWithdrawalDelayBlocks", - inputs: [ - { - name: "", - type: "address", - internalType: "contract IStrategy", - }, - ], - outputs: [ - { - name: "", - type: "uint256", - internalType: "uint256", - }, - ], - stateMutability: "view", - }, { type: "function", name: "transferOwnership", @@ -1238,6 +1297,11 @@ const _abi = [ type: "function", name: "updateOperatorMetadataURI", inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, { name: "metadataURI", type: "string", @@ -1247,31 +1311,56 @@ const _abi = [ outputs: [], stateMutability: "nonpayable", }, + { + type: "function", + name: "version", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, { type: "event", - name: "Initialized", + name: "DelegationApproverUpdated", inputs: [ { - name: "version", - type: "uint8", + name: "operator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newDelegationApprover", + type: "address", indexed: false, - internalType: "uint8", + internalType: "address", }, ], anonymous: false, }, { type: "event", - name: "MinWithdrawalDelayBlocksSet", + name: "DepositScalingFactorUpdated", inputs: [ { - name: "previousValue", - type: "uint256", + name: "staker", + type: "address", indexed: false, - internalType: "uint256", + internalType: "address", + }, + { + name: "strategy", + type: "address", + indexed: false, + internalType: "contract IStrategy", }, { - name: "newValue", + name: "newDepositScalingFactor", type: "uint256", indexed: false, internalType: "uint256", @@ -1281,36 +1370,13 @@ const _abi = [ }, { type: "event", - name: "OperatorDetailsModified", + name: "Initialized", inputs: [ { - name: "operator", - type: "address", - indexed: true, - internalType: "address", - }, - { - name: "newOperatorDetails", - type: "tuple", + name: "version", + type: "uint8", indexed: false, - internalType: "struct IDelegationManager.OperatorDetails", - components: [ - { - name: "__deprecated_earningsReceiver", - type: "address", - internalType: "address", - }, - { - name: "delegationApprover", - type: "address", - internalType: "address", - }, - { - name: "stakerOptOutWindowBlocks", - type: "uint32", - internalType: "uint32", - }, - ], + internalType: "uint8", }, ], anonymous: false, @@ -1345,27 +1411,10 @@ const _abi = [ internalType: "address", }, { - name: "operatorDetails", - type: "tuple", + name: "delegationApprover", + type: "address", indexed: false, - internalType: "struct IDelegationManager.OperatorDetails", - components: [ - { - name: "__deprecated_earningsReceiver", - type: "address", - internalType: "address", - }, - { - name: "delegationApprover", - type: "address", - internalType: "address", - }, - { - name: "stakerOptOutWindowBlocks", - type: "uint32", - internalType: "uint32", - }, - ], + internalType: "address", }, ], anonymous: false, @@ -1432,6 +1481,31 @@ const _abi = [ ], anonymous: false, }, + { + type: "event", + name: "OperatorSharesSlashed", + inputs: [ + { + name: "operator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "strategy", + type: "address", + indexed: false, + internalType: "contract IStrategy", + }, + { + name: "totalSlashedShares", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, { type: "event", name: "OwnershipTransferred", @@ -1472,19 +1546,75 @@ const _abi = [ }, { type: "event", - name: "PauserRegistrySet", + name: "SlashingWithdrawalCompleted", inputs: [ { - name: "pauserRegistry", - type: "address", + name: "withdrawalRoot", + type: "bytes32", indexed: false, - internalType: "contract IPauserRegistry", + internalType: "bytes32", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "SlashingWithdrawalQueued", + inputs: [ + { + name: "withdrawalRoot", + type: "bytes32", + indexed: false, + internalType: "bytes32", }, { - name: "newPauserRegistry", - type: "address", + name: "withdrawal", + type: "tuple", indexed: false, - internalType: "contract IPauserRegistry", + internalType: "struct IDelegationManagerTypes.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: "contract IStrategy[]", + }, + { + name: "scaledShares", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + }, + { + name: "sharesToWithdraw", + type: "uint256[]", + indexed: false, + internalType: "uint256[]", }, ], anonymous: false, @@ -1546,31 +1676,6 @@ const _abi = [ ], anonymous: false, }, - { - type: "event", - name: "StrategyWithdrawalDelayBlocksSet", - inputs: [ - { - name: "strategy", - type: "address", - indexed: false, - internalType: "contract IStrategy", - }, - { - name: "previousValue", - type: "uint256", - indexed: false, - internalType: "uint256", - }, - { - name: "newValue", - type: "uint256", - indexed: false, - internalType: "uint256", - }, - ], - anonymous: false, - }, { type: "event", name: "Unpaused", @@ -1591,78 +1696,145 @@ const _abi = [ anonymous: false, }, { - type: "event", - name: "WithdrawalCompleted", - inputs: [ - { - name: "withdrawalRoot", - type: "bytes32", - indexed: false, - internalType: "bytes32", - }, - ], - anonymous: false, + type: "error", + name: "ActivelyDelegated", + inputs: [], }, { - type: "event", - name: "WithdrawalQueued", + type: "error", + name: "CallerCannotUndelegate", + inputs: [], + }, + { + type: "error", + name: "CurrentlyPaused", + inputs: [], + }, + { + type: "error", + name: "FullySlashed", + inputs: [], + }, + { + type: "error", + name: "InputAddressZero", + inputs: [], + }, + { + type: "error", + name: "InputArrayLengthMismatch", + inputs: [], + }, + { + type: "error", + name: "InputArrayLengthZero", + inputs: [], + }, + { + type: "error", + name: "InvalidNewPausedStatus", + inputs: [], + }, + { + type: "error", + name: "InvalidPermissions", + inputs: [], + }, + { + type: "error", + name: "InvalidShortString", + inputs: [], + }, + { + type: "error", + name: "InvalidSignature", + inputs: [], + }, + { + type: "error", + name: "InvalidSnapshotOrdering", + inputs: [], + }, + { + type: "error", + name: "NotActivelyDelegated", + inputs: [], + }, + { + type: "error", + name: "OnlyAllocationManager", + inputs: [], + }, + { + type: "error", + name: "OnlyEigenPodManager", + inputs: [], + }, + { + type: "error", + name: "OnlyPauser", + inputs: [], + }, + { + type: "error", + name: "OnlyStrategyManagerOrEigenPodManager", + inputs: [], + }, + { + type: "error", + name: "OnlyUnpauser", + inputs: [], + }, + { + type: "error", + name: "OperatorNotRegistered", + inputs: [], + }, + { + type: "error", + name: "OperatorsCannotUndelegate", + inputs: [], + }, + { + type: "error", + name: "SaltSpent", + inputs: [], + }, + { + type: "error", + name: "SignatureExpired", + inputs: [], + }, + { + type: "error", + name: "StringTooLong", inputs: [ { - name: "withdrawalRoot", - type: "bytes32", - indexed: false, - internalType: "bytes32", - }, - { - name: "withdrawal", - type: "tuple", - indexed: false, - internalType: "struct IDelegationManager.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: "contract IStrategy[]", - }, - { - name: "shares", - type: "uint256[]", - internalType: "uint256[]", - }, - ], + name: "str", + type: "string", + internalType: "string", }, ], - anonymous: false, + }, + { + type: "error", + name: "WithdrawalDelayNotElapsed", + inputs: [], + }, + { + type: "error", + name: "WithdrawalNotQueued", + inputs: [], + }, + { + type: "error", + name: "WithdrawerNotCaller", + inputs: [], }, ] as const; const _bytecode = - "0x610100806040523461024957604051601f615c8438819003918201601f19168301916001600160401b03831184841017610235578084926060946040528339810103126101e55780516001600160a01b03811681036101e1576020820151916001600160a01b03831683036101e15760400151906001600160a01b03821682036101e15760805260c05260a0525f5460ff8160081c1661018c5760ff80821610610152575b4660e0526040516159ed9081610297823960805181818161190601528181611b85015281816120ce01528181612421015281816126b2015281816128e701528181612e59015281816144310152818161485601526149c3015260a05181610f19015260c05181818161187301528181611a4e01528181611fd00152818161238e0152818161258d0152818161296801528181612eda015281816143c501526147a0015260e051816147070152f35b60ff90811916175f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a1806100a4565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b5f80fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fdfe60c06040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b5f3560e01c80630449ca391461359757806304a4f9791461355d5780630b9f487a146135215780630dd8dd02146133115780630f589e5914612f9757806310d67a2f14612f08578063132d496714612e47578063136439dd14612d245780631522bf0214612cc65780631692836514612c825780631bbce09114612c3c57806320606b7014612c0257806322bf40e41461299657806328a573ae146128d557806329c77d4f1461289d57806333404396146120fd57806339b70e38146120b95780633cdeb5e0146120765780633e28391d146120395780634337738214611fff5780634665bcda14611fbb5780634fc40b6114611f9e578063595c6a6714611ee3578063597b36da14611eae5780635ac86ab714611e7b5780635c975abb14611e5e57806360d7faed14611683578063635bbd101461165f57806365da12641461161f5780636d70f7ae146115f2578063715018a614611597578063778e55f3146115475780637f548071146111a5578063886f11951461117d5780638da5cb5b14611155578063900413471461109f5780639104c3191461107157806399be81c814610f80578063a178848414610f48578063b134427114610f04578063b7f06ebe14610ed5578063bb45fef214610e8c578063c448feb814610e6f578063c488375a14610e37578063c5e480db14610d94578063c94b511114610d61578063ca661c0414610d44578063cf80873e14610ccd578063da8be864146108f8578063eea9064b1461056c578063f16172b0146104cd578063f2fde38b1461043e578063f698da251461041c5763fabc1cbc0361000e573461041757602036600319011261041257606554600435906001600160a01b0316803b1561040d5760206004916040519283809263755b36bd60e11b82525afa801561040257610329915f916103d3575b506001600160a01b03163314614091565b60665419811981160361036857806066556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a2005b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b6103f5915060203d6020116103fb575b6103ed8183613a57565b810190614072565b5f610318565b503d6103e3565b6040513d5f823e3d90fd5b61401f565b61366c565b61361c565b34610417575f366003190112610412576020610436614704565b604051908152f35b3461041757602036600319011261041257610457613856565b61045f615010565b6001600160a01b0381161561047957610477906152a8565b005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b34610417576060366003190112610412576104e73361430e565b156104f55761047733614c57565b60405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a490fd5b3461041757606036600319011261041257610585613856565b6024356001600160401b0381116108f3576105a4903690600401613c77565b335f908152609a6020526040902054604435906001600160a01b031661087d576105cd8361430e565b15610803576105e3600180606654161415613e33565b6001600160a01b038381165f818152609960205260409020600101549093911690811515806107f9575b806107ef575b6106ac575b505050335f52609a60205260405f20816bffffffffffffffffffffffff60a01b825416179055337fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433045f80a361066c336143c3565b91905f5b8151811015610477576001906106a66001600160a01b036106918386613fe4565b511661069d8388613fe4565b519033876153dc565b01610670565b602081018051421161078457825f52609c60205260405f20845f5260205260ff60405f205416610719576107119361070991845f52609c60205260405f20825f5260205260405f20600160ff198254161790555190848833613dae565b9051916154fd565b828080610618565b60405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608490fd5b60405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608490fd5b5083331415610613565b508133141561060d565b60405162461bcd60e51b815260206004820152604660248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a206f7060448201527f657261746f72206973206e6f74207265676973746572656420696e2045696765606482015265372630bcb2b960d11b608482015260a490fd5b60405162461bcd60e51b815260206004820152604260248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a20737460448201527f616b657220697320616c7265616479206163746976656c792064656c65676174606482015261195960f21b608482015260a490fd5b6136bc565b3461041757602036600319011261041257610911613856565b610922600280606654161415613e33565b6001600160a01b038082165f908152609a60205260409020541615610c565761094a8161430e565b610beb576001600160a01b0381168015610b80575f818152609a60205260409020546001600160a01b03169033811480159081610b77575b8015610b57575b15610aec57610997846143c3565b929091610ac1575b83817ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af446765f80a35f908152609a6020526040902080546001600160a01b0319169055805180610a15575050505050610a116040516109fd602082613a57565b5f81525f3681375b604051918291826138ac565b0390f35b610a2190939193613e7f565b93604092602092905f5b8651811015610ab157600190610aa08751610a468982613a57565b83815287366020830137885190610a5d8a83613a57565b84825288366020840137848060a01b03610a77858d613fe4565b5116610a8282613fd7565b52610a8d8487613fe4565b51610a9783613fd7565b52878781614739565b610aaa828b613fe4565b5201610a2b565b50505050505050610a1190610a05565b83817ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a5f80a361099f565b60405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608490fd5b50825f52609960205260018060a01b03600160405f200154163314610989565b50823314610982565b60405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608490fd5b60405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608490fd5b60a460405162461bcd60e51b815260206004820152604460248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20737460448201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b6084820152fd5b3461041757602036600319011261041257610cee610ce9613856565b6143c3565b60405190604082016040835283518091526020606084019401905f5b818110610d25578480610a1188878382036020850152613d57565b82516001600160a01b0316865260209586019590920191600101610d0a565b34610417575f36600319011261041257602060405162034bc08152f35b34610417576080366003190112610412576020610436610d7f613856565b610d87613882565b6064359160243590614341565b3461041757602036600319011261041257610dad613856565b5f60408051610dbb81613a21565b828152826020820152015260018060a01b03165f526099602052606060405f2063ffffffff604051610dec81613a21565b6001808060a01b0384541693848352015490826040602083019260018060a01b0385168452019260a01c16825260405193845260018060a01b03905116602084015251166040820152f35b34610417576020366003190112610412576001600160a01b03610e58613856565b165f5260a1602052602060405f2054604051908152f35b34610417575f366003190112610412576020609d54604051908152f35b34610417576040366003190112610412576001600160a01b03610ead613856565b165f52609c60205260405f206024355f52602052602060ff60405f2054166040519015158152f35b34610417576020366003190112610412576004355f52609e602052602060ff60405f2054166040519015158152f35b34610417575f366003190112610412576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610417576020366003190112610412576001600160a01b03610f69613856565b165f52609f602052602060405f2054604051908152f35b34610417576020366003190112610412576004356001600160401b0381116108f357610fb090369060040161393a565b610fb93361430e565b15610ff657610ff17f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b670809091604051918291339583613ff8565b0390a2005b60405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a490fd5b34610417575f36600319011261041257602060405173beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08152f35b34610417576040366003190112610412576110b8613856565b6024356001600160401b0381116108f3576110d7903690600401613b45565b6110e18151613e7f565b6001600160a01b03909216915f5b825181101561113f575f848152609860205260409020600191906001600160a01b0361111b8387613fe4565b5116838060a01b03165f5260205260405f20546111388285613fe4565b52016110ef565b60405160208082528190610a1190820185613d57565b34610417575f366003190112610412576033546040516001600160a01b039091168152602090f35b34610417575f366003190112610412576065546040516001600160a01b039091168152602090f35b346104175760a0366003190112610412576111be613856565b6111c661386c565b6044356001600160401b0381116108f3576111e5903690600401613c77565b6064356001600160401b0381116108f357611204903690600401613c77565b9060843560208201805142116114d2576001600160a01b038087165f908152609a6020526040902054166114515761123b8561430e565b156113cc576112819060018060a01b03871693845f52609b602052600161126a60405f2054935189858c614341565b92865f52609b6020520160405f20555190876154fd565b611292600180606654161415613e33565b6001600160a01b038481165f818152609960205260409020600101549094911690811515806113c2575b806113b8575b611353575b5050505f818152609a6020526040812080546001600160a01b031916841790557fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049080a3611314826143c3565b915f5b82518110156104775760019061134d6001600160a01b036113388387613fe4565b51166113448388613fe4565b519088866153dc565b01611317565b602081014281511061078457825f52609c60205260405f20845f5260205260ff60405f205416610719576113b09361070991845f52609c60205260405f20825f5260205260405f20600160ff19825416179055519084898b613dae565b8480806112c7565b50843314156112c2565b50813314156112bc565b60405162461bcd60e51b815260206004820152605160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a206f70657261746f72206973206e6f7420726567697374656064820152703932b21034b71022b4b3b2b72630bcb2b960791b608482015260a490fd5b60405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b657220697320616c726561647920616374697660648201526c195b1e4819195b1959d85d1959609a1b608482015260a490fd5b60405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a490fd5b3461041757604036600319011261041257611560613856565b61156861386c565b6001600160a01b039182165f908152609860209081526040808320949093168252928352819020549051908152f35b34610417575f366003190112610412576115af615010565b603380546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b34610417576020366003190112610412576020611615611610613856565b61430e565b6040519015158152f35b34610417576020366003190112610412576001600160a01b03611640613856565b165f52609a602052602060018060a01b0360405f205416604051908152f35b3461041757602036600319011261041257611678615010565b6104776004356152f0565b34610417576080366003190112610412576004356001600160401b0381116108f357806004019060e06003198236030112611e59576024356001600160401b0381116108f3576116d7903690600401613817565b919092606435928315158403611e55576116f8600480606654161415613e33565b611707600260c95414156141d7565b600260c95561171e6117193684613baf565b6142f1565b805f52609e60205260ff60405f20541615611df157608484019461175361174487614c46565b63ffffffff609d5491166143a2565b4310611d73576001600160a01b0361176d60448701613d9a565b163303611d025780611c8a575b5f828152609e60205260409020805460ff19169055156119b9579360a484019360c401905f5b6117aa8686613f18565b905081101561199157879061180b6117c184614c46565b826117e66117e16117d28c8c613f18565b6001600160a01b039491613d8a565b613d9a565b165f5260a1602052611804439163ffffffff60405f205491166143a2565b1115615461565b868661184a6117e18489611843826118378c61183d6117e1846118376118308d613d9a565b9d8d613f18565b90613d8a565b98613f18565b3597613d8a565b906001600160a01b031673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081036118ff5750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692833b1561040d5760405162387b1360e81b81526001600160a01b0390921660048301523360248301526044820152915f908390606490829084905af1918215610402576001926118ef575b505b016117a0565b5f6118f991613a57565b896118e7565b90939091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561040d575f9283608492604051978895869463c608c7f360e01b86523360048701526024860152604485015260018060a01b031660648401525af191821561040257600192611981575b506118e9565b5f61198b91613a57565b8961197b565b5050505050505f8051602061599883398151915291506020905b604051908152a1600160c955005b93919490335f52609a60205260018060a01b0360405f205416905f9360a48601945b6119e5868a613f18565b9050811015611c6b578890611a0d6119fc84614c46565b826117e66117e16117d28c88613f18565b8587898673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac085611a376117e16117d2878b613f18565b1603611b61575050505090611a4b90613d9a565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316611a878261183760c48c018e613f18565b3590803b1561040d576040516303a041cf60e21b81526001600160a01b03851660048201526024810192909252602090829060449082905f905af1908115610402575f91611b2f575b506001600160a01b038084165f908152609a602052604090205460019484939291909116908d8b83611b0a575b5050505050505b016119db565b611b24956118376117e192611b1e94613f18565b916153dc565b808b80808d8b611afd565b90506020813d8211611b59575b81611b4960209383613a57565b8101031261041257516001611ad0565b3d9150611b3c565b8461183760c4611bb26117e184611837611bab6117e183611bbb9a60018060a01b037f0000000000000000000000000000000000000000000000000000000000000000169e613d8a565b998d613f18565b94018098613f18565b3592803b1561040d5760405163c4623ea160e01b81523360048201526001600160a01b03938416602482015291909216604482015260648101929092525f908290608490829084905af180156104025760019389928d92611c5b575b508388611c28575b50505050611b04565b611837611c4992611c436117e184611837611c529989613f18565b94613f18565b359033886153dc565b868a8c83611c1f565b5f611c6591613a57565b8d611c17565b505050505050505f8051602061599883398151915291506020906119ab565b611c9760a4860185613f18565b8414905061177a5760405162461bcd60e51b815260206004820152604260248201525f8051602061597883398151915260448201527f645769746864726177616c3a20696e707574206c656e677468206d69736d61746064820152610c6d60f31b608482015260a490fd5b60405162461bcd60e51b815260206004820152605060248201525f8051602061597883398151915260448201527f645769746864726177616c3a206f6e6c7920776974686472617765722063616e60648201526f1031b7b6b83632ba329030b1ba34b7b760811b608482015260a490fd5b60405162461bcd60e51b815260206004820152605f60248201525f8051602061597883398151915260448201527f645769746864726177616c3a206d696e5769746864726177616c44656c61794260648201527f6c6f636b7320706572696f6420686173206e6f74207965742070617373656400608482015260a490fd5b60405162461bcd60e51b815260206004820152604360248201525f8051602061597883398151915260448201527f645769746864726177616c3a20616374696f6e206973206e6f7420696e20717560648201526265756560e81b608482015260a490fd5b5f80fd5b6138e5565b34610417575f366003190112610412576020606654604051908152f35b346104175760203660031901126104125760043560ff8116809103611e555760016020911b806066541614604051908152f35b34610417576020366003190112610412576004356001600160401b0381116108f3576104366117196020923690600401613baf565b34610417575f366003190112610412576065546001600160a01b0316803b1561040d5760206024916040519283809263237dfb4760e11b82523360048301525afa801561040257611f3b915f91611f6f575b5061417a565b5f196066556040515f1981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2005b611f91915060203d602011611f97575b611f898183613a57565b810190614162565b82611f35565b503d611f7f565b34610417575f3660031901126104125760206040516213c6808152f35b34610417575f366003190112610412576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610417575f3660031901126104125760206040517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b8152f35b34610417576020366003190112610412576020611615612057613856565b6001600160a01b039081165f908152609a602052604090205416151590565b34610417576020366003190112610412576001600160a01b03612097613856565b165f526099602052602060018060a01b03600160405f20015416604051908152f35b34610417575f366003190112610412576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610417576080366003190112610412576004356001600160401b0381116108f35761212d903690600401613817565b906080526024356001600160401b0381116108f357612150903690600401613817565b6044929192356001600160401b0381116108f357612172903690600401613817565b9190936064356001600160401b0381116108f35793612198869492953690600401613817565b9490916121ac600480606654161415613e33565b6121bb600260c95414156141d7565b600260c9555f935b81851015612896578460051b80608051013560a05260de1960805136030160a0511215612891578686101561287d576121fe90890189613f18565b96909861220c878487613d8a565b50612218878a88613d8a565b35988915158a03611e55576122366117193660a05160805101613baf565b998a5f52609e60205260ff60405f20541615611df15761225d608060a05181510101614c46565b612271439163ffffffff609d5491166143a2565b11611d735760a0516080516001600160a01b03916122929101604001613d9a565b163303611d0257806127fa575b5f8b8152609e60205260409020805460ff19169055156124e2575f5b6122d360a08051608051010160a05160805101613f18565b90508110156124ac578b906123116122f2608060a05181510101614c46565b826117e66117e16117d260a08051608051010160a05160805101613f18565b61232060a05160805101613d9a565b8b6123656117e1846123476117e18261183760a08051608051010160a05160805101613f18565b936118438261183760c060a051608051010160a05160805101613f18565b906001600160a01b031673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0810361241a5750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692833b1561040d5760405162387b1360e81b81526001600160a01b0390921660048301523360248301526044820152915f908390606490829084905af19182156104025760019261240a575b505b016122bb565b5f61241491613a57565b8d612402565b90939091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561040d575f9283608492604051978895869463c608c7f360e01b86523360048701526024860152604485015260018060a01b031660648401525af19182156104025760019261249c575b50612404565b5f6124a691613a57565b8d612496565b50949950949297600192975060205f80516020615998833981519152919792975b604051908152a10193949691959092966121c3565b335f908152609a60205260408120546001600160a01b0316999897969594939291905b61251d60a08051608051010160a05160805101613f18565b90508110156127d65761253a6122f2608060a05181510101614c46565b8c73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08261256f6117e16117d260a08051608051010160a05160805101613f18565b16036126a0575061258560a05160805101613d9a565b60a0516080517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169392916125cd918491611837910160c0810190613f18565b3592803b1561040d576040516303a041cf60e21b81526001600160a01b03831660048201526024810194909452602090849060449082905f905af18015610402575f9061266e575b6001600160a01b038281165f908152609a6020526040902054600195501680612643575b5050505b01612505565b61266692611b1e6117e18661183760a08051608051010160a05160805101613f18565b8e8080612639565b506020833d8211612698575b8161268760209383613a57565b810103126104125760019251612615565b3d915061267a565b906126d86117e1828d60018060a01b037f00000000000000000000000000000000000000000000000000000000000000001695613d8a565b6126f76117e18361183760a08051608051010160a05160805101613f18565b9060c060a051608051010191612717846118378560a05160805101613f18565b3594803b1561040d5760405163c4623ea160e01b81523360048201526001600160a01b03938416602482015291909216604482015260648101949094525f908490608490829084905af1928315610402576001936127c6575b508c8061277f575b505061263d565b6127bf916127b6846118376127a96117e18361183760a08051608051010160a05160805101613f18565b9360a05160805101613f18565b359133906153dc565b8e8c612778565b5f6127d091613a57565b8f612770565b5095949a509591975095505f805160206159988339815191526020600193996124cd565b61281260a08051608051010160a05160805101613f18565b8b14905061229f5760405162461bcd60e51b815260206004820152604260248201525f8051602061597883398151915260448201527f645769746864726177616c3a20696e707574206c656e677468206d69736d61746064820152610c6d60f31b608482015260a490fd5b634e487b7160e01b5f52603260045260245ffd5b613eb1565b600160c955005b34610417576020366003190112610412576001600160a01b036128be613856565b165f52609b602052602060405f2054604051908152f35b34610417576128e336613967565b90337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316148015612964575b612920906140f0565b6001600160a01b038084165f908152609a60205260409020541661294057005b6001600160a01b038084165f908152609a60205260409020546104779491166153dc565b50337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614612917565b346104175760c0366003190112610412576129af613856565b6129b761386c565b604435906084356001600160401b0381116108f3576129da903690600401613817565b60a4929192356001600160401b0381116108f3576129fc903690600401613817565b9390925f549660ff8860081c161597888099612bf5575b8015612bde575b15612b825760ff1981166001175f5588612b71575b506065546001600160a01b03161580612b5f575b15612ae457612a88612a989288612aa8996066556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2614eaf565b612a90615236565b6097556152a8565b612aa36064356152f0565b615068565b612aae57005b61ff00195f54165f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a1005b60405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a490fd5b506001600160a01b0382161515612a43565b61ffff1916610101175f5588612a2f565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b158015612a1a5750600160ff821614612a1a565b50600160ff821610612a13565b34610417575f3660031901126104125760206040517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8668152f35b34610417576060366003190112610412576020610436612c5a613856565b612c6261386c565b6001600160a01b0382165f908152609b8552604090205460443592614341565b34610417576020366003190112610412576001600160a01b03612ca3613856565b165f526099602052602063ffffffff600160405f20015460a01c16604051908152f35b34610417576040366003190112610412576004356001600160401b0381116108f357612cf6903690600401613817565b602435916001600160401b0383116108f357612d19610477933690600401613817565b929091612aa3615010565b3461041757602036600319011261041257606554600435906001600160a01b0316803b1561040d5760206024916040519283809263237dfb4760e11b82523360048301525afa801561040257612d80915f91612e28575061417a565b60665481811603612dbd57806066556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2005b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b612e41915060203d602011611f9757611f898183613a57565b83611f35565b3461041757612e5536613967565b90337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316148015612ed6575b612e92906140f0565b6001600160a01b038084165f908152609a602052604090205416612eb257005b6001600160a01b038084165f908152609a6020526040902054610477949116614f89565b50337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614612e89565b3461041757602036600319011261041257612f21613856565b6065546001600160a01b031690813b1561040d5760206004926040519384809263755b36bd60e11b82525afa9182156104025761047792612f73915f91612f7857506001600160a01b03163314614091565b614eaf565b612f91915060203d6020116103fb576103ed8183613a57565b84610318565b346104175736600319016080811261041257606013611e59576064356001600160401b0381116108f357612fcf90369060040161393a565b335f908152609a60205260409020546001600160a01b031661329357612ff433614c57565b604051613000816139f2565b6060815260208101905f825261301d600180606654161415613e33565b335f908152609960205260409020600101546001600160a01b03169081151580613289575b80613282575b613185575b5050335f818152609a6020526040812080546001600160a01b0319168317905590915081907fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049080a361309f336143c3565b925f5b82518110156130de576001906130d86001600160a01b036130c38387613fe4565b51166130cf8389613fe4565b519033336153dc565b016130a2565b50604051836004356001600160a01b03811690819003611e555782526024356001600160a01b03811690819003611e555760208301526044359063ffffffff8216809203611e555782610ff19260407f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080909501527f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e260603392a2604051918291339583613ff8565b8251421161078457815f52609c60205260405f205f805260205260ff60405f2054166107195761327a92825f52609c60205260405f205f805260205260405f20600160ff198254161790555160405160208101917f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad83528460408301523360608301523360808301525f60a083015260c082015260c0815261322860e082613a57565b51902061326161326f613239614704565b92604051928391602083019586909160429261190160f01b8352600283015260228201520190565b03601f198101835282613a57565b5190209051916154fd565b82808061304d565b505f613048565b5081331415613042565b60405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a2063616c6c657220697320616c7265616479206163746976656c796064820152690819195b1959d85d195960b21b608482015260a490fd5b34610417576020366003190112610412576004356001600160401b0381116108f357613341903690600401613817565b90613353600280606654161415613e33565b61335c82613e7f565b90335f52609a60205260018060a01b0360405f2054165f5b8481106133895760405180610a1186826138ac565b61339d613397828786613ef6565b80613f18565b90506133b76133ad838887613ef6565b6020810190613f18565b919050036134b657336001600160a01b036133de60406133d8858a89613ef6565b01613d9a565b160361344b5760019061343a84876134328461342a6134206133ad613417613397858861341160406133d884848f613ef6565b9a613ef6565b9490968d613ef6565b9490923691613af1565b923691613b63565b918633614739565b6134448287613fe4565b5201613374565b60405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a2077697468647261776572206d757374206265207374616b6572000000006064820152608490fd5b60405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608490fd5b346104175760a036600319011261041257602061043661353f613856565b61354761386c565b90613550613882565b6084359260643592613dae565b34610417575f3660031901126104125760206040517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad8152f35b3461361c576020366003190112610412576004356001600160401b0381116108f3576135c7903690600401613817565b609d54915f5b8281106135df57602084604051908152f35b6001600160a01b036135f56117e1838686613d8a565b165f5260a160205260405f2054848111613613575b506001016135cd565b9350600161360a565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b9181601f84011215613851578235916001600160401b03831161384c576020808501948460051b01011161384757565b6137be565b613765565b61370c565b600435906001600160a01b0382168203611e5557565b602435906001600160a01b0382168203611e5557565b604435906001600160a01b0382168203611e5557565b35906001600160a01b0382168203611e5557565b60206040818301928281528451809452019201905f5b8181106138cf5750505090565b82518452602093840193909201916001016138c2565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a207374727563742063616c6c6461746120746f6044820152661bc81cda1bdc9d60ca1b6064820152608490fd5b9181601f84011215613851578235916001600160401b03831161384c576020838186019501011161384757565b6060906003190112610412576004356001600160a01b0381168103611e5557906024356001600160a01b0381168103611e55579060443590565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b604081019081106001600160401b03821117613a0d57604052565b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b03821117613a0d57604052565b60e081019081106001600160401b03821117613a0d57604052565b90601f801991011681019081106001600160401b03821117613a0d57604052565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b359063ffffffff82168203611e5557565b6001600160401b038111613a0d5760051b60200190565b929190613afd81613ada565b93613b0b6040519586613a57565b602085838152019160051b810192831161384757905b828210613b2d57505050565b60208091613b3a84613898565b815201910190613b21565b9080601f8301121561385157816020613b6093359101613af1565b90565b929190613b6f81613ada565b93613b7d6040519586613a57565b602085838152019160051b810192831161384757905b828210613b9f57505050565b8135815260209182019101613b93565b919060e083820312613c725760405190613bc882613a3c565b8193613bd381613898565b8352613be160208201613898565b6020840152613bf260408201613898565b604084015260608101356060840152613c0d60808201613ac9565b608084015260a08101356001600160401b038111613c6d5782613c31918301613b45565b60a084015260c0810135906001600160401b038211613c6d570181601f820112156138515760c091816020613c6893359101613b63565b910152565b613a78565b6139a1565b9190604083820312613c725760405190613c90826139f2565b819380356001600160401b038111613c6d5781019082601f83011215613851578135926001600160401b038411613a0d5760405190613cd9601f8601601f191660200183613a57565b84825260208585010111613d02575f602085819682809701838601378301015284520135910152565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b90602080835192838152019201905f5b818110613d745750505090565b8251845260209384019390920191600101613d67565b919081101561287d5760051b0190565b356001600160a01b0381168103611e555790565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad602082019081526001600160a01b0395861692820192909252918416606083015292909116608082015260a081019290925260c080830193909352918152613e1c60e082613a57565b519020613261613e2d613239614704565b51902090565b15613e3a57565b60405162461bcd60e51b815260206004820152601960248201527f5061757361626c653a20696e64657820697320706175736564000000000000006044820152606490fd5b90613e8982613ada565b613e966040519182613a57565b8281528092613ea7601f1991613ada565b0190602036910137565b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206f6666736574000000006044820152606490fd5b919081101561287d5760051b81013590605e1981360301821215612891570190565b903590601e198136030182121561289157018035906001600160401b038211613f9257602001918160051b36038313613f4d57565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c64617461207461696c20746f6f2073686f72740000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206c656e677468000000006044820152606490fd5b80511561287d5760200190565b805182101561287d5760209160051b010190565b90918060409360208452816020850152848401375f828201840152601f01601f1916010190565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b9081602091031261041257516001600160a01b0381168103611e555790565b1561409857565b60405162461bcd60e51b815260206004820152602a60248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526939903ab73830bab9b2b960b11b6064820152608490fd5b156140f757565b60405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60448201527f616e616765724f72456967656e506f644d616e616765720000000000000000006064820152608490fd5b9081602091031261041257518015158103611e555790565b1561418157565b60405162461bcd60e51b815260206004820152602860248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526739903830bab9b2b960c11b6064820152608490fd5b156141de57565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b80516001600160a01b039081168352602080830151821681850152604080840151909216918401919091526060808301519084015260808083015163ffffffff169084015260a08083015160e091850182905280519185018290526101008501939201905f5b8181106142d25750505060c001519160c0818303910152602080835192838152019201905f5b8181106142bc5750505090565b82518452602093840193909201916001016142af565b82516001600160a01b0316855260209485019490920191600101614289565b604051613e2d816132616020820194602086526040830190614223565b6001600160a01b03168015159081614324575090565b5f818152609a60205260409020546001600160a01b031614919050565b92906040519260208401947f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b865260018060a01b0316604085015260018060a01b03166060840152608083015260a082015260a08152613e1c60c082613a57565b919082018092116143af57565b634e487b7160e01b5f52601160045260245ffd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561040d576040516360f4062b60e01b81526001600160a01b039092166004830181905290602090839060249082905afa918215610402575f926146d0575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561040d575f906024604051809481936394f649dd60e01b835260048301525afa908115610402575f905f926145bf575b505f8313156145b957805180614506575050509060408051926144b08285613a57565b60018452614501601f198301928336602088013785936144d282519283613a57565b6001825236602083013773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06144fb8297613fd7565b52613fd7565b529190565b600181018091116143af5761451a90613e7f565b906145258251613e7f565b945f5b825181101561456f576001906001600160a01b036145468286613fe4565b51166145528287613fe4565b5261455d8187613fe4565b51614568828a613fe4565b5201614528565b50939192505081515f1981019081116143af576145a173beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac09184613fe4565b5281515f1981019081116143af576145019085613fe4565b92909150565b9150503d805f833e6145d18183613a57565b8101906040818303126104125780516001600160401b0381116108f35781019082601f8301121561385157815161460781613ada565b926146156040519485613a57565b81845260208085019260051b8201019085821161384757602001915b8183106146b0575050506020810151906001600160401b0382116108f357019180601f8401121561385157825161466781613ada565b936146756040519586613a57565b81855260208086019260051b82010192831161384757602001905b8282106146a0575050505f61448d565b8151815260209182019101614690565b82516001600160a01b0381168103611e5557815260209283019201614631565b9091506020813d6020116146fc575b816146ec60209383613a57565b810103126104125751905f61442e565b3d91506146df565b467f0000000000000000000000000000000000000000000000000000000000000000036147315760975490565b613b60615236565b93949392916001600160a01b038416918215614bc257835115614b41575f5b8451811015614a77576001600160a01b038216614a48575b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b036147978388613fe4565b511603614834577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906147d3818a613fe4565b5191803b1561040d5760405163beffbb8960e01b81526001600160a01b038916600482015260248101939093525f908390604490829084905af191821561040257600192614824575b505b01614758565b5f61482e91613a57565b5f61481c565b6001600160a01b038316841480156149b8575b156148f5576001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691906148838288613fe4565b511661488f828b613fe4565b51833b1561040d57604051638c80d4e560e01b81526001600160a01b038a811660048301529290921660248301526044820152915f908390606490829084905af1918215610402576001926148e5575b5061481e565b5f6148ef91613a57565b5f6148df565b60e460405162461bcd60e51b815260206004820152608460248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a2077697468647261776572206d7560648201527f73742062652073616d652061646472657373206173207374616b65722069662060848201527f746869726450617274795472616e7366657273466f7262696464656e2061726560a482015263081cd95d60e21b60c4820152fd5b506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116906149ef8388613fe4565b5116813b1561040d57602090602460405180948193639b4da03d60e01b835260048301525afa908115610402575f91614a2a575b5015614847565b614a42915060203d8111611f9757611f898183613a57565b5f614a23565b614a726001600160a01b03614a5d8388613fe4565b5116614a69838b613fe4565b51908885614f89565b614770565b505f838152609f60205260409020805496979396939550835f1981146143af57600101905560405195614aa987613a3c565b86526001600160a01b03908116602087015216604085015260608401524363ffffffff16608084015260a083015260c08201527f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f9614b3b614b09836142f1565b92835f52609e60205260405f20600160ff19825416179055604051918291858352604060208401526040830190614223565b0390a190565b60405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374726174656769657320636160648201526c6e6e6f7420626520656d70747960981b608482015260a490fd5b60405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a490fd5b3563ffffffff81168103611e555790565b6044359063ffffffff821690818303611e55576213c6808211614e095760018060a01b031690815f52609960205263ffffffff600160405f20015460a01c1611614d82575f908152609960205260409020600435906001600160a01b0382168203611e555780546001600160a01b0319166001600160a01b0392831617815560010191906024359081168103611e555782546001600160c01b0319166001600160a01b039182161760a09290921b63ffffffff60a01b169190911790915560405160608101917ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac9190614d4a6004613898565b1681526001600160a01b03614d5f6024613898565b16602082015263ffffffff614d746044613ac9565b1660408201528033930390a2565b60405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a490fd5b60405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c490fd5b6001600160a01b03168015614f0c57606554604080516001600160a01b0383168152602081018490527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb69190a16001600160a01b03191617606555565b60405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a490fd5b6001600160a01b039081165f8181526098602090815260408083209487168352939052919091208054919480830394939285116143af57939055604080516001600160a01b0392831681529290911660208301528101919091527f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd9080606081015b0390a2565b6033546001600160a01b0316330361502457565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b9190918383036151b8575f5b838110615082575050505050565b6001600160a01b036150986117e1838786613d8a565b1690815f5260a160205260405f20546150b2828887613d8a565b359062034bc0821161510b57837f0e7efa738e8b0ce6376a0c1af471655540d2e9a81647d7b09ed823018426576d926060926001965f5260a16020528160405f205560405192835260208301526040820152a101615074565b60405162461bcd60e51b815260206004820152607360248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a205f7769746864726177616c60648201527f44656c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544860848201527244524157414c5f44454c41595f424c4f434b5360681b60a482015260c490fd5b60405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a20696e707574206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a490fd5b600a6020604051615248604082613a57565b828152016922b4b3b2b72630bcb2b960b11b81522060405160208101917f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8668352604082015246606082015230608082015260808152613e2d60a082613a57565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b62034bc08111615331577fafa003cd76f87ff9d62b35beea889920f33c0c42b8d45b74954d61d50f4b6b696040609d548151908152836020820152a1609d55565b60405162461bcd60e51b815260206004820152607160248201527f44656c65676174696f6e4d616e616765722e5f7365744d696e5769746864726160448201527f77616c44656c6179426c6f636b733a205f6d696e5769746864726177616c446560648201527f6c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544844526084820152704157414c5f44454c41595f424c4f434b5360781b60a482015260c490fd5b9061500b7f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c939260018060a01b031694855f52609860205260405f2060018060a01b0385165f5260205260405f206154358282546143a2565b9055604080516001600160a01b0394851681529490931660208501529183019190915281906060820190565b1561546857565b60405162461bcd60e51b815260206004820152606e60248201525f8051602061597883398151915260448201527f645769746864726177616c3a207769746864726177616c44656c6179426c6f6360648201527f6b7320706572696f6420686173206e6f74207965742070617373656420666f7260848201526d207468697320737472617465677960901b60a482015260c490fd5b803b15615652576001600160a01b031691823b1561040d5760209283926064604051809681958294630b135d3f60e11b84526004840152604060248401528051918291826044860152018484015e5f828201840152601f01601f191681010301915afa908115610402575f9161560f575b506001600160e01b0319166374eca2c160e11b0161558857565b60405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a490fd5b90506020813d60201161564a575b8161562a60209383613a57565b8101031261041257516001600160e01b031981168103611e55575f61556e565b3d915061561d565b9061566892615660916156f7565b929092615765565b6001600160a01b0390811691160361567c57565b60405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a490fd5b81516041810361572357509061571f91602082015190606060408401519301515f1a906158d5565b9091565b60400361575c5760406020830151920151918260ff1c91601b83018093116143af5761571f936001600160ff1b03169260ff16906158d5565b50505f90600290565b60058110156158c157806157765750565b600181036157c35760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b600281036158105760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b600381036158685760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b60041461587157565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608490fd5b634e487b7160e01b5f52602160045260245ffd5b907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841161596c5760ff1690601b82141580615961575b615956576020935f93608093604051938452868401526040830152606082015282805260015afa15610402575f516001600160a01b0381161561594e57905f90565b505f90600190565b505050505f90600490565b50601c82141561590c565b505050505f9060039056fe44656c65676174696f6e4d616e616765722e5f636f6d706c6574655175657565c97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1da2646970667358221220cfca47a548425704fe847a78f3d1dc84b2d2fc771bb6f6ab49da774e5eba17f564736f6c634300081a0033"; + "0x61016080604052346104bb576163358038038061001b81610508565b92833981019060e08183031261046b578051906001600160a01b0382168203610467576020810151906001600160a01b03821682036104675760408101516001600160a01b03811681036104675760608201516001600160a01b03811694909390858503610467576080840151946001600160a01b03861686036104675760a08501519463ffffffff861686036104675760c0810151906001600160401b03821161041757019688601f890112156103be5787516001600160401b0381116103aa576100f0601f8201601f1916602001610508565b98818a5260208a019a6020838301011161035557815f9260208093018d5e8a010152156103465760805260a05260c05260e0526101005261012052601f81511161030a57519051602082106102fa575b17610140525f5460ff8160081c166102a55760ff8082160361026b575b604051615e07908161052e82396080518181816107ef0152818161113d01528181611b420152612a0a015260a051818181610d7101528181610dd9015281816132eb0152614df7015260c051818181610eff015281816110250152818161181d015281816120ad0152818161279c0152818161335601528181614423015281816145390152614dca015260e051818181610c4a01528181610e2b015281816116760152818161194c01528181612461015281816130c701528181613b2401528181613c0d015261563101526101005181818161228b015281816148ce01528181614a600152614bab015261012051818181610fe101526147890152610140518181816110f301526138f90152f35b60ff90811916175f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a18061015d565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b5f198260200360031b1b16610140565b60449060405192839163305a27a960e01b8352602060048401525180918160248501528484015e5f828201840152601f01601f19168101030190fd5b6339b190bb60e11b5f5260045ffd5b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b5f80fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b6040519190601f01601f191682016001600160401b038111838210176103aa5760405256fe608060405260043610612b30575f3560e01c806304a4f9791461034b5780630b9f487a146103465780630dd8dd0214610341578063136439dd1461033c57806325df922e146103375780632aa6d8881461033257806339b70e381461032d5780633c651cf2146103285780633cdeb5e0146103235780633e28391d1461031e5780634657e26a146103195780634665bcda1461031457806354b7c96c1461030f57806354fd4d501461030a578063595c6a6714610305578063597b36da146103005780635ac86ab7146102fb5780635c975abb146102f65780635d975e88146102f15780635dd68579146102ec578063601bb36f146102e757806360a0d1ce146102e257806365da1264146102dd57806366d5ba93146102d85780636d70f7ae146102d35780636e174448146102ce578063715018a6146102c9578063778e55f3146102c457806378296ec5146102bf578063886f1195146102ba5780638da5cb5b146102b557806390041347146102b05780639104c319146102ab5780639435bb43146102a657806399f5371b146102a1578063a17884841461029c578063a33a343314610297578063b7f06ebe14610292578063bb45fef21461028d578063bfae3fd214610288578063c448feb814610283578063c978f7ac1461027e578063ca8aa7c714610279578063cd6dc68714610274578063da8be8641461026f578063e4cc3f901461026a578063eea9064b14610265578063f0e0e67614610260578063f2fde38b1461025b578063f698da2514610256578063fabc1cbc146102515763fd8aa88d03612b3057612abb565b6129ef565b6129d5565b612944565b612883565b612673565b6125b9565b61257a565b612490565b61244c565b6122d4565b61226f565b612229565b6121db565b6121ac565b611f5a565b611dfb565b611d38565b611c26565b611bff565b611bd1565b611b71565b611b2d565b611a99565b611a55565b6119fa565b61193c565b6118f0565b6118ae565b61186b565b6117ef565b611632565b611547565b611432565b611367565b611334565b6112fa565b61112b565b6110db565b611054565b611010565b610fcc565b610f81565b610f2d565b610da0565b610d5c565b610bd7565b610a66565b6107d4565b610682565b6104b0565b6103ff565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b5f9103126103fa57565b6103a0565b34610439575f3660031901126103fa5760206040517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad8152f35b610350565b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b6001600160a01b0381160361049f57565b5f80fd5b35906104ae8261048e565b565b346104395760a03660031901126103fa5760206104f76004356104d28161048e565b6024356104de8161048e565b6044356104ea8161048e565b6064359160843593612b93565b604051908152f35b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b9181601f84011215610644578235916001600160401b03831161063f576020808501948460051b01011161063a57565b6105b1565b610558565b6104ff565b60206040818301928281528451809452019201905f5b81811061066c5750505090565b825184526020938401939092019160010161065f565b346104395760203660031901126103fa576004356001600160401b0381116107cf576106b290369060040161060a565b906106ca6106c4600280606654161490565b15612c3d565b6106d2613a1a565b6106db82612c53565b335f908152609a60205260409020549092906001600160a01b03165f5b82811061071d576107198561070d600160c955565b60405191829182610649565b0390f35b8061075a6107376107316001948789612cde565b80612d00565b905061075161074784888a612cde565b6020810190612d00565b91905014612dbf565b6107be61077f61077861077161073185898b612cde565b3691610947565b8533613bfd565b866107b6876107ae6107a46107478861079c61073182878a612cde565b959097612cde565b9490923691610947565b9236916109bb565b908633613f03565b6107c88288612de2565b52016106f8565b61043e565b346104395760203660031901126103fa576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600435813b1561089d5760206024926040519384809263237dfb4760e11b82523360048301525afa9182156108985761086792610853915f91610869575b50612e69565b61086260665482811614612e7f565b614293565b005b61088b915060203d602011610891575b61088381836108f1565b810190612e49565b5f61084d565b503d610879565b612e5e565b612df6565b634e487b7160e01b5f52604160045260245ffd5b60e081019081106001600160401b038211176108d157604052565b6108a2565b604081019081106001600160401b038211176108d157604052565b90601f801991011681019081106001600160401b038211176108d157604052565b604051906104ae60e0836108f1565b604051906104ae6040836108f1565b6001600160401b0381116108d15760051b60200190565b92919061095381610930565b9361096160405195866108f1565b602085838152019160051b810192831161063a57905b82821061098357505050565b6020809183356109928161048e565b815201910190610977565b9080601f83011215610644578160206109b893359101610947565b90565b9291906109c781610930565b936109d560405195866108f1565b602085838152019160051b810192831161063a57905b8282106109f757505050565b81358152602091820191016109eb565b9080601f83011215610644578160206109b8933591016109bb565b90602080835192838152019201905f5b818110610a3f5750505090565b8251845260209384019390920191600101610a32565b9060206109b8928181520190610a22565b346104395760603660031901126103fa57600435610a838161048e565b6024356001600160401b0381116107cf57610aa290369060040161099d565b906044356001600160401b0381116107cf57610ac2903690600401610a07565b6001600160a01b038281165f818152609a60205260409020549093610aea9286921690613bfd565b610af48451612c53565b935f5b8151811015610b7857600190855f5260a2602052610b67610b4b610b4660405f20610b32610b258689612de2565b516001600160a01b031690565b60018060a01b03165f5260205260405f2090565b612eb7565b610b558388612de2565b51610b608488612de2565b51916142c5565b610b718289612de2565b5201610af7565b604051806107198882610a55565b6024359063ffffffff8216820361049f57565b359063ffffffff8216820361049f57565b9181601f84011215610644578235916001600160401b03831161063f576020838186019501011161063a57565b346104395760603660031901126103fa57600435610bf48161048e565b610bfc610b86565b6044356001600160401b0381116107cf57610c1b903690600401610baa565b610c26939193613a1a565b335f908152609a6020526040902054610c48906001600160a01b031615612eda565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561089d57604051632b6241f360e11b815233600482015263ffffffff9490941660248501525f908490604490829084905af1918215610898577f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b670809093610d3593610d42575b50610ce481336142e1565b610cee3333614341565b6040516001600160a01b0391909116815233907fa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c190602090a2604051918291339583612ef0565b0390a2610867600160c955565b80610d505f610d56936108f1565b806103f0565b5f610cd9565b34610439575f3660031901126103fa576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346104395760803660031901126103fa57600435610dbd8161048e565b602435610dc98161048e565b6064356044356001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633148015610efb575b15610eec57610e0f613a1a565b6001600160a01b038481165f908152609a6020526040902054167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031694909390853b1561089d5760405163152667d960e31b81526001600160a01b0386811660048301528316602482015295602090879060449082905afa95861561089857610eb396610ead915f91610ebd575b50838361450b565b9461470b565b610867600160c955565b610edf915060203d602011610ee5575b610ed781836108f1565b810190612f17565b5f610ea5565b503d610ecd565b63045206a560e21b5f5260045ffd5b50337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e02565b346104395760203660031901126103fa576020610f6f600435610f4f8161048e565b6001600160a01b039081165f908152609960205260409020600101541690565b6040516001600160a01b039091168152f35b346104395760203660031901126103fa576020610fc2600435610fa38161048e565b6001600160a01b039081165f908152609a602052604090205416151590565b6040519015158152f35b34610439575f3660031901126103fa576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610439575f3660031901126103fa576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346104395760403660031901126103fa576110b06004356110748161048e565b602435906110818261048e565b61109261108d82614787565b612f2c565b61109a613a1a565b6110ab6110a6826134cb565b612f42565b6142e1565b600160c955005b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b34610439575f3660031901126103fa576107196111177f000000000000000000000000000000000000000000000000000000000000000061482c565b6040519182916020835260208301906110b7565b34610439575f3660031901126103fa577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561089d5760206024916040519283809263237dfb4760e11b82523360048301525afa8015610898576111a0915f916108695750612e69565b61086761425f565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b91909160e0818403126112f55761125f610912565b92611269826104a3565b8452611277602083016104a3565b6020850152611288604083016104a3565b6040850152606082013560608501526112a360808301610b99565b608085015260a08201356001600160401b0381116112f057816112c791840161099d565b60a085015260c08201356001600160401b0381116112f0576112e99201610a07565b60c0830152565b6111f9565b6111a8565b346104395760203660031901126103fa576004356001600160401b0381116107cf576104f761132f602092369060040161124a565b612f58565b346104395760203660031901126103fa5760043560ff811680910361049f5760016020911b806066541614604051908152f35b34610439575f3660031901126103fa576020606654604051908152f35b90602080835192838152019201905f5b8181106113a15750505090565b82516001600160a01b0316845260209384019390920191600101611394565b80516001600160a01b039081168352602080830151821690840152604080830151909116908301526060808201519083015260808082015163ffffffff16908301526109b89160c061142160a084015160e060a085015260e0840190611384565b9201519060c0818403910152610a22565b346104395760203660031901126103fa5761147461071961145d600435611457612f83565b50614884565b6040929192519384936040855260408501906113c0565b908382036020850152610a22565b9080602083519182815201916020808360051b8301019401925f915b8383106114ad57505050505090565b90919293946020806114cb600193601f198682030187528951610a22565b9701930193019193929061149e565b929160408401936040815282518095526060810194602060608260051b8401019401905f5b81811061151c575050506109b89394506020818403910152611482565b909194602080611538600193605f19888203018c5289516113c0565b970198019101969190966114ff565b346104395760203660031901126103fa576004356115648161048e565b60018060a01b03165f5260a360205260405f20604051808260208294549384815201905f5260205f20925f5b8181106116085750506115a5925003826108f1565b80516115b081612fb9565b906115ba81613008565b925f5b8281106115d657505050610719604051928392836114da565b806115ec6115e660019385612de2565b51614884565b6115f68389612de2565b526116018287612de2565b52016115bd565b8454835260019485019486945060209093019201611590565b6001600160401b0381160361049f57565b346104395760803660031901126103fa5760043561164f8161048e565b60243561165b8161048e565b6044359161166883611621565b60643561167481611621565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036117e05761171e611718611726926116b6613a1a565b6117106116ec876116d78860018060a01b03165f52609860205260405f2090565b9060018060a01b03165f5260205260405f2090565b5461170a6001600160401b038a166001600160401b0385168361570c565b906149be565b968686614b49565b85613078565b938383614c50565b604080516001600160a01b0384811682526020820186905292909216917fdd611f4ef63f4385f1756c86ce1f1f389a9013ba6fa07daba8528291bc2d3c309190a261177f61177382614dac565b6001600160a01b031690565b91823b1561089d5760405163debe1eab60e01b81526001600160a01b039290921660048301526024820152905f908290604490829084905af18015610898576117cc57610867600160c955565b80610d505f6117da936108f1565b5f610eb3565b6323d871a560e01b5f5260045ffd5b346104395760603660031901126103fa5760043561180c8161048e565b60443560243561181b82611621565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361185c576110b092611857613a1a565b613085565b633213a66160e21b5f5260045ffd5b346104395760203660031901126103fa576004356118888161048e565b60018060a01b03165f52609a602052602060018060a01b0360405f205416604051908152f35b346104395760203660031901126103fa576114746107196118d96004356118d48161048e565b6132e9565b604092919251938493604085526040850190611384565b346104395760203660031901126103fa576020610fc26004356119128161048e565b6134cb565b60409060031901126103fa5760043561192f8161048e565b906024356109b88161048e565b346104395761194a36611917565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561089d5760405163152667d960e31b81526001600160a01b0384811660048301528216602482015291602090839060449082905afa90811561089857610719936119c9935f936119d9575b506149fd565b6040519081529081906020820190565b6119f391935060203d602011610ee557610ed781836108f1565b915f6119c3565b34610439575f3660031901126103fa57611a12614e38565b603380546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b34610439576020611a90611a6836611917565b6001600160a01b039182165f9081526098855260408082209290931681526020919091522090565b54604051908152f35b346104395760403660031901126103fa57600435611ab68161048e565b6024356001600160401b0381116107cf57611af67f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b6708090913690600401610baa565b9092611b0461108d82614787565b611b106110a6826134cb565b611b2860405192839260018060a01b03169583612ef0565b0390a2005b34610439575f3660031901126103fa576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610439575f3660031901126103fa576033546040516001600160a01b039091168152602090f35b9060406003198301126103fa57600435611bb28161048e565b91602435906001600160401b0382116107cf576109b89160040161099d565b3461043957610719611beb611be536611b99565b906134fe565b604051918291602083526020830190610a22565b34610439575f3660031901126103fa5760206040515f516020615db25f395f51905f528152f35b346104395760603660031901126103fa576004356001600160401b0381116107cf57611c5690369060040161060a565b6024356001600160401b0381116107cf57611c7590369060040161060a565b916044356001600160401b0381116107cf57611c9890939193369060040161060a565b90611caa6106c4600480606654161490565b611cb2613a1a565b3686900360de1901925f5b86811015610eb3578060051b90818901359186831215611d225783821015611d1d57600192611cf1611d17928a018a612d00565b90611d128d611d09611d04888d8d613571565b613581565b9436910161124a565b614f7b565b01611cbd565b612c85565b612c99565b9060206109b89281815201906113c0565b346104395760203660031901126103fa57600435611d54612f83565b505f5260a460205261071960405f20611dea600660405192611d75846108b6565b80546001600160a01b0316845260018101546001600160a01b0316602085015260028101546001600160a01b0316604085015260038101546060850152611dd3611dc6600483015463ffffffff1690565b63ffffffff166080860152565b611ddf6005820161358b565b60a0850152016135dc565b60c082015260405191829182611d27565b346104395760203660031901126103fa57600435611e188161048e565b60018060a01b03165f52609f602052602060405f2054604051908152f35b6001600160401b0381116108d157601f01601f191660200190565b9060606003198301126103fa57600435611e6a8161048e565b91602435906001600160401b0382116107cf57604082820360031901126112f55760405191611e98836108d6565b80600401356001600160401b0381116112f05781019180602384011215610644576004830135611ec781611e36565b91611ed560405193846108f1565b81835260248583010111611f05576020815f92602480970183860137830101528352013560208201529060443590565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b3461043957611fb9611f6b36611e51565b611f789391929333613726565b92611f81613a1a565b335f908152609a6020526040902054611fa6906001600160a01b031615155b15612eda565b611fb26110a6866134cb565b843361546e565b611fca6106c4600180606654161490565b611fd3336132e9565b611fdf82859395613b15565b335f908152609a602052604090209091906120169084905b80546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b038316337fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433045f80a35f5b855181101561219e575f516020615db25f395f51905f5261206e611773610b25848a612de2565b146120ab575b806120a5612087610b256001948a612de2565b6120918386612de2565b5161209c8488612de2565b519133896145dd565b01612047565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561089d5760405163a3d75e0960e01b815233600482015291602090839060249082905afa9182156108985760019261216e915f91612180575b506001600160401b0361216661214c610b468c610b32610b25896121463360018060a01b03165f5260a260205260405f2090565b93612de2565b612160612159878a612de2565b51916152e7565b90615887565b911690615887565b6121788285612de2565b529050612074565b612198915060203d8111610ee557610ed781836108f1565b5f612112565b6107198561070d600160c955565b346104395760203660031901126103fa576004355f52609e602052602060ff60405f2054166040519015158152f35b346104395760403660031901126103fa576004356121f88161048e565b6024359060018060a01b03165f52609c60205260405f20905f52602052602060ff60405f2054166040519015158152f35b346104395760206104f761226a610b4661224236611917565b6001600160a01b039182165f90815260a2875260408082209290931681526020919091522090565b6152e7565b34610439575f3660031901126103fa57602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b90916122c66109b893604084526040840190610a22565b916020818403910152610a22565b34610439576122e236611b99565b6122ec8151612c53565b6122f68251612c53565b61232a836123246123178760018060a01b03165f52609a60205260405f2090565b546001600160a01b031690565b86613bfd565b925f5b815181101561243d5761234e611773612349610b258486612de2565b614dac565b9061235c610b258285612de2565b91803b1561089d5760405163fe243a1760e01b81526001600160a01b038981166004830152939093166024840152602090839060449082905afa8015610898576001925f9161240f575b506123b18286612de2565b526123fe6123e2610b466123d58a60018060a01b03165f5260a260205260405f2090565b610b32610b258689612de2565b6123ec8387612de2565b516123f7848a612de2565b5191614e22565b6124088287612de2565b520161232d565b612430915060203d8111612436575b61242881836108f1565b8101906132da565b5f6123a6565b503d61241e565b604051806107198587836122af565b34610439575f3660031901126103fa576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346104395760403660031901126103fa576004356124ad8161048e565b6124f26024355f54926124d860ff600886901c16158095819661256c575b811561254c575b506136b2565b836124e9600160ff195f5416175f55565b61253557613715565b6124f857005b61250661ff00195f54165f55565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1005b61254761010061ff00195f5416175f55565b613715565b303b1591508161255e575b505f6124d2565b60ff1660011490505f612557565b600160ff82161091506124cb565b346104395760203660031901126103fa5761071961070d60043561259d8161048e565b613726565b8015150361049f57565b604435906104ae826125a2565b346104395760603660031901126103fa576004356001600160401b0381116107cf5760e0600319823603011261261e57602435906001600160401b0382116107cf5761260c61086792369060040161060a565b906126156125ac565b92600401613849565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a207374727563742063616c6c6461746120746f6044820152661bc81cda1bdc9d60ca1b6064820152608490fd5b34610439576126c661268436611e51565b90612690939293613a1a565b335f908152609a60205260409020546126b3906001600160a01b03161515611fa0565b6126bf6110a6856134cb565b833361546e565b6126d76106c4600180606654161490565b6126e0336132e9565b90916126ec8382613b15565b335f908152609a60205260409020612705908390611ff7565b6001600160a01b038216337fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433045f80a35f5b8451811015610eb3575f516020615db25f395f51905f5261275d611773610b258489612de2565b1461279a575b80612794612776610b2560019489612de2565b6127808388612de2565b5161278b8487612de2565b519133886145dd565b01612736565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561089d5760405163a3d75e0960e01b815233600482015291602090839060249082905afa91821561089857600192612842915f91612854575b506001600160401b03612166612835610b468b610b32610b25896121463360018060a01b03165f5260a260205260405f2090565b612160612159878c612de2565b61284c8287612de2565b529050612763565b61286c915060203d8111610ee557610ed781836108f1565b5f612801565b9060206109b8928181520190611482565b346104395760403660031901126103fa576004356001600160401b0381116107cf5736602382011215610644578060040135906128bf82610930565b916128cd60405193846108f1565b8083526024602084019160051b8301019136831161063a57602401905b82821061292a57836024356001600160401b0381116107cf576107199161291861291e92369060040161099d565b9061387a565b60405191829182612872565b6020809183356129398161048e565b8152019101906128ea565b346104395760203660031901126103fa576004356129618161048e565b612969614e38565b6001600160a01b038116156129815761086790614e90565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b34610439575f3660031901126103fa5760206104f76138cd565b346104395760203660031901126103fa576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600435813b1561089d5760206004926040519384809263755b36bd60e11b82525afa918215610898575f92612a78575b5061086791612a73906001600160a01b031633146139c1565b6139d7565b91506020823d602011612ab3575b81612a93602093836108f1565b810103126103fa57612a736108679251612aac8161048e565b9250612a5a565b3d9150612a86565b346104395760203660031901126103fa57600435612ad88161048e565b60018060a01b03165f5260a360205260405f206040519081602082549182815201915f5260205f20905f5b818110612b1a576107198561070d818703826108f1565b8254845260209093019260019283019201612b03565b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad602082019081526001600160a01b0395861692820192909252918416606083015292909116608082015260a081019290925260c080830193909352918152612c0160e0826108f1565b519020612c0c6138cd565b9060405190602082019261190160f01b84526022830152604282015260428152612c376062826108f1565b51902090565b15612c4457565b63840a48d560e01b5f5260045ffd5b90612c5d82610930565b612c6a60405191826108f1565b8281528092612c7b601f1991610930565b0190602036910137565b634e487b7160e01b5f52603260045260245ffd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206f6666736574000000006044820152606490fd5b9190811015611d1d5760051b81013590605e1981360301821215611d22570190565b903590601e1981360301821215611d2257018035906001600160401b038211612d7a57602001918160051b36038313612d3557565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c64617461207461696c20746f6f2073686f72740000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206c656e677468000000006044820152606490fd5b15612dc657565b6343714afd60e01b5f5260045ffd5b805115611d1d5760200190565b8051821015611d1d5760209160051b010190565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b908160209103126103fa57516109b8816125a2565b6040513d5f823e3d90fd5b15612e7057565b631d77d47760e21b5f5260045ffd5b15612e8657565b63c61dca5d60e01b5f5260045ffd5b60408051909190612ea683826108f1565b6001815291601f1901366020840137565b90604051602081018181106001600160401b038211176108d15760405291548252565b15612ee157565b633bf2b50360e11b5f5260045ffd5b90918060409360208452816020850152848401375f828201840152601f01601f1916010190565b908160209103126103fa57516109b881611621565b15612f3357565b63932d94f760e01b5f5260045ffd5b15612f4957565b6325ec6c1f60e01b5f5260045ffd5b604051612c3781612f7560208201946020865260208601906113c0565b03601f1981018352826108f1565b60405190612f90826108b6565b606060c0835f81525f60208201525f60408201525f838201525f60808201528260a08201520152565b90612fc382610930565b612fd060405191826108f1565b8281528092612fe1601f1991610930565b01905f5b828110612ff157505050565b602090612ffc612f83565b82828501015201612fe5565b9061301282610930565b61301f60405191826108f1565b8281528092613030601f1991610930565b01905f5b82811061304057505050565b806060602080938501015201613034565b634e487b7160e01b5f52601160045260245ffd5b906001820180921161307357565b613051565b9190820180921161307357565b6001600160a01b038181165f908152609a602052604090205416156131d6576001600160a01b0381165f908152609a602052604090206130c490612317565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561089d5760405163152667d960e31b81526001600160a01b03851660048201525f516020615db25f395f51905f52602482015291602090839060449082905afa908115610898576104ae956131ab935f936131b1575b506131a590613188610b4661316e8860018060a01b03165f5260a260205260405f2090565b5f516020615db25f395f51905f525f5260205260405f2090565b936001600160401b0380670de0b6b3a76400005b931691166158fc565b91614e22565b91614cc3565b6131a59193506131cf9060203d602011610ee557610ed781836108f1565b9290613149565b505050565b9080601f830112156106445781516131f281610930565b9261320060405194856108f1565b81845260208085019260051b82010192831161063a57602001905b8282106132285750505090565b815181526020918201910161321b565b9190916040818403126103fa5780516001600160401b0381116107cf57810183601f820112156106445780519061326e82610930565b9161327c60405193846108f1565b80835260208084019160051b8301019186831161063a57602001905b8282106132c0575050509260208201516001600160401b0381116107cf576109b892016131db565b6020809183516132cf8161048e565b815201910190613298565b908160209103126103fa575190565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169190823b1561089d576040516394f649dd60e01b81526001600160a01b0382166004820152925f90849060249082905afa8015610898575f935f916134a3575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561089d5760405163fe243a1760e01b81526001600160a01b039390931660048401525f516020615db25f395f51905f526024840152602090839060449082905afa918215610898575f92613482575b50811561347d576133e96133e48551613065565b612c53565b936133f76133e48251613065565b92613418613406835188612de2565b5f516020615db25f395f51905f529052565b613423825185612de2565b525f5b8151811015613477578061345b613442610b2560019486612de2565b61344c838a612de2565b6001600160a01b039091169052565b6134658185612de2565b516134708287612de2565b5201613426565b50505090565b919050565b61349c91925060203d6020116124365761242881836108f1565b905f6133d0565b90506134c29193503d805f833e6134ba81836108f1565b810190613238565b9290925f613353565b6001600160a01b031680151590816134e1575090565b5f818152609a60205260409020546001600160a01b031614919050565b91909161350b8351612c53565b905f5b845181101561356a576001600160a01b038281165f908152609860205260409020600192916135589190613542848a612de2565b511660018060a01b03165f5260205260405f2090565b546135638286612de2565b520161350e565b5090925050565b9190811015611d1d5760051b0190565b356109b8816125a2565b90604051918281549182825260208201905f5260205f20925f5b8181106135ba5750506104ae925003836108f1565b84546001600160a01b03168352600194850194879450602090930192016135a5565b90604051918281549182825260208201905f5260205f20925f5b81811061360b5750506104ae925003836108f1565b84548352600194850194879450602090930192016135f6565b90604051613631816108b6565b82546001600160a01b039081168252600184015416602082015291829060c0906136ad9060069060028101546001600160a01b0316604086015260038101546060860152613696613689600483015463ffffffff1690565b63ffffffff166080870152565b6136a26005820161358b565b60a0860152016135dc565b910152565b156136b957565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b6137216104ae92614293565b614e90565b61372e613a1a565b6001600160a01b038082165f908152609a6020526040902054161561382457613756816134cb565b61381557613777906001600160a01b03811633819003613782575b506152fa565b906104ae600160c955565b6001600160a01b0382165f908152609a60205260409020546001600160a01b03166137ac81614787565b80156137f0575b6137bc90613833565b6001600160a01b0316907ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a5f80a35f613771565b506001600160a01b038181165f908152609960205260409020600101541633146137b3565b6311ca333560e31b5f5260045ffd5b63a5c7c44560e01b5f5260045ffd5b1561383a57565b631e499a2360e11b5f5260045ffd5b90611d126138739493926138646106c4600480606654161490565b61386c613a1a565b369061124a565b600160c955565b906138858251613008565b915f5b8151811015613477576001906138b1846001600160a01b036138aa8487612de2565b51166134fe565b6138bb8287612de2565b526138c68186612de2565b5001613888565b600a60206040516138df6040826108f1565b828152016922b4b3b2b72630bcb2b960b11b81522061391d7f000000000000000000000000000000000000000000000000000000000000000061482c565b805115611d1d5760ff60f81b60208201511690805160011015611d1d57612f7591612c3791602160ff60f81b91015116604051906020820192835260218201526002815261396c6022826108f1565b519020604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f602082019081529181019590955260608501919091524660808501523060a08501529291829060c0820190565b156139c857565b63794821ff60e01b5f5260045ffd5b6139e8606654198219811614612e7f565b806066556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a2565b600260c95414613a2b57600260c955565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b6020818303126103fa578051906001600160401b0382116107cf57019080601f83011215610644578151613aa381610930565b92613ab160405194856108f1565b81845260208085019260051b82010192831161063a57602001905b828210613ad95750505090565b602080918351613ae881611621565b815201910190613acc565b6001600160a01b0390911681526040602082018190526109b892910190611384565b9190613b218151612c53565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561089d57815f91613b769660405180988194829363547afb8760e01b845260048401613af3565b03915afa938415610898575f94613bd9575b505f5b815181101561356a5780613bc8613ba7610b2560019486612de2565b613bc1613bb4848a612de2565b516001600160401b031690565b905f61450b565b613bd28286612de2565b5201613b8b565b613bf69194503d805f833e613bee81836108f1565b810190613a70565b925f613b88565b929190613c0a8251612c53565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561089d57815f91613c5f9460405180968194829363547afb8760e01b845260048401613af3565b03915afa918215610898575f92613cbd575b505f5b8151811015613cb55780613ca4613c90610b2560019486612de2565b613c9d613bb48488612de2565b908961450b565b613cae8287612de2565b5201613c74565b509193505050565b613cd29192503d805f833e613bee81836108f1565b905f613c71565b15613ce057565b6339b190bb60e11b5f5260045ffd5b15613cf657565b63796cc52560e01b5f5260045ffd5b6001600160a01b03918216815291166020820152604081019190915260600190565b5f1981146130735760010190565b91613d4e9183549060031b91821b915f19901b19161790565b9055565b919091828210613d6157505050565b5f5260205f2091820191015b818110613d78575050565b5f8155600101613d6d565b90600160401b81116108d15781548183556104ae92613d52565b8151916001600160401b0383116108d157602090613dbb8484613d83565b01905f5260205f205f5b838110613dd25750505050565b82516001600160a01b031681830155602090920191600101613dc5565b8151916001600160401b0383116108d157602090613e0d8484613d83565b01905f5260205f205f5b838110613e245750505050565b600190602084519401938184015501613e17565b815181546001600160a01b039182166001600160a01b0319918216178355602084015160018401805491841691831691909117905560408401516002840180549190931691161790556060820151600382015560808201516104ae9260069160c09190613ebe9063ffffffff16600486019063ffffffff1663ffffffff19825416179055565b613ecf60a082015160058601613d9d565b01519101613def565b91613ef5906109b8949284526060602085015260608401906113c0565b916040818403910152610a22565b9194939190613f1c6001600160a01b0383161515613cd9565b613f2886511515613cef565b613f328651612c53565b613f3c8751612c53565b915f5b885181101561412057613f58612349610b25838c612de2565b90613f7e8a610b32610b25846121468b60018060a01b03165f5260a260205260405f2090565b91613fa0613f8b84612eb7565b613f95848c612de2565b516123f7858c612de2565b613faa8388612de2565b52613fc8613fb784612eb7565b613fc1848c612de2565b519061550f565b613fd28387612de2565b528a826001600160a01b0386166140d4575b50506001600160a01b031691613ffd610b25838d612de2565b614007838b612de2565b51843b1561089d57614035946020925f8b6040519889958694859363724af42360e01b855260048501613d05565b03925af190811561089857828c926001955f916140b6575b501561405d575b50505001613f3f565b61226a614094610b2561409a937f8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f965f8755612de2565b92612eb7565b906140ab6040519283928b84613d05565b0390a1895f82614054565b6140ce915060203d81116124365761242881836108f1565b5f61404d565b610b2581836141016140ef610b256141069661411998612de2565b6140f9848d612de2565b51908b61551c565b612de2565b6141108489612de2565b51908987614d42565b8a82613fe4565b5092907f26b2aae26516e8719ef50ea2f6831a2efbd4e37dccdf0f6936b27bc08e793e309550614248929450614243969761416b8360018060a01b03165f52609f60205260405f2090565b546001600160a01b0384165f908152609f6020526040902061418d8154613d27565b90556141b761419a610912565b6001600160a01b0386168152966001600160a01b03166020880152565b6001600160a01b038416604087015260608601524363ffffffff16608086015260a085015260c08401526141ea83612f58565b95869161420f614202845f52609e60205260405f2090565b805460ff19166001179055565b61422a85614225855f5260a460205260405f2090565b613e38565b6001600160a01b03165f90815260a36020526040902090565b615a74565b506142596040519283928684613ed8565b0390a190565b5f196066556040515f1981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2565b806066556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2565b6109b892916142d66142dc926152e7565b906157e7565b6157e7565b6001600160a01b039081165f8181526099602090815260409182902060010180546001600160a01b0319169590941694851790935551928352917f773b54c04d756fcc5e678111f7d730de3be98192000799eee3d63716055a87c69190a2565b91906143546106c4600180606654161490565b61435d836132e9565b61436a8284969396613b15565b9161438984611ff78360018060a01b03165f52609a60205260405f2090565b6001600160a01b038481169082167fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433045f80a35f5b8651811015614502575f516020615db25f395f51905f526143e4611773610b25848b612de2565b14614421575b8061441b6143fd610b256001948b612de2565b6144078387612de2565b516144128489612de2565b5191868a6145dd565b016143bd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561089d5760405163a3d75e0960e01b81526001600160a01b038416600482015291602090839060249082905afa918215610898576001926144d2915f916144e4575b506001600160401b036121666144c5610b468d610b32610b25896121468d60018060a01b03165f5260a260205260405f2090565b612160612159878b612de2565b6144dc8286612de2565b5290506143ea565b6144fc915060203d8111610ee557610ed781836108f1565b5f614491565b50505050509050565b91906001600160a01b03165f516020615db25f395f51905f5214614537576001600160401b0391501690565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561089d5760405163a3d75e0960e01b81526001600160a01b03939093166004840152602090839060249082905afa908115610898576109b8925f926145bc575b506001600160401b0380670de0b6b3a764000061319c565b6145d691925060203d602011610ee557610ed781836108f1565b905f6145a4565b909380156146fc5783156146f5576001600160a01b038581165f90815260a2602090815260408083209387168352929052207f8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f916146589161464a9161226a91610b469091895f84615599565b604051918291868984613d05565b0390a16001600160a01b038085165f908152609a602052604090205416614680575b50505050565b6146e97f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c936146c3846116d78560018060a01b03165f52609860205260405f2090565b6146ce828254613078565b90556040516001600160a01b03909316959293849384613d05565b0390a25f80808061467a565b5050505050565b630a33bc6960e21b5f5260045ffd5b9192909480156146fc57841561477f5761464a61226a7f8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f93610b466146589460018060a01b038b165f5260a2602052896147788a60405f209060018060a01b03165f5260205260405f2090565b9384615599565b505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561089d57604051631beb2b9760e31b81526001600160a01b0390911660048201523360248201523060448201525f80356001600160e01b03191660648301529091602091839160849183915af1908115610898575f91614813575090565b6109b8915060203d6020116108915761088381836108f1565b60ff811690601f821161485b57604051916148486040846108f1565b6020808452838101919036833783525290565b632cd44ac360e21b5f5260045ffd5b9063ffffffff8091169116019063ffffffff821161307357565b6148a26148a791614893612f83565b505f5260a460205260405f2090565b613624565b9060a082016148b7815151612c53565b906148f36148cc608086015163ffffffff1690565b7f00000000000000000000000000000000000000000000000000000000000000009061486a565b63ffffffff431663ffffffff8216105f1461498157845161492e91906001600160a01b031660208701516001600160a01b0316845191615620565b939290925b60c08101915f5b85515181101561497857806149676149556001938751612de2565b51614960838b612de2565b5190615887565b6149718288612de2565b520161493a565b50929350935050565b5083516149a7906001600160a01b031660208601516001600160a01b0316835191613bfd565b93929092614933565b5f1981019190821161307357565b9190820391821161307357565b63ffffffff5f199116019063ffffffff821161307357565b9063ffffffff8091169116039063ffffffff821161307357565b614a589060018060a01b031691825f5260a5602052614a37614a328260405f209060018060a01b03165f5260205260405f2090565b61573b565b925f5260a560205260405f209060018060a01b03165f5260205260405f2090565b614a90614a8b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff43166149e3565b6149cb565b8154919063ffffffff165f5b838110614aff5750505f926109b89492614ac99281158614614ace5750506001600160e01b03841661170a565b615768565b614aec614af391614ae161170a946149b0565b905f5260205f200190565b5460201c90565b6001600160e01b031690565b90928082169080831860011c820180921161307357835f528463ffffffff8360205f20015416115f14614b355750925b90614a9c565b939150600181018091116130735790614b2f565b6001600160a01b039081165f81815260a5602090815260408083209486168352939052919091209094939291614ba391614b829061573b565b955f5260a560205260405f209060018060a01b03165f5260205260405f2090565b614bd6614a8b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff43166149e3565b8154919063ffffffff165f5b838110614c0657505094614ac9916109b8959681155f14614ace57505f905061170a565b90928082169080831860011c820180921161307357835f528463ffffffff8360205f20015416115f14614c3c5750925b90614be2565b939150600181018091116130735790614c36565b60018060a01b031691825f526098602052614c7e8260405f209060018060a01b03165f5260205260405f2090565b918254828103908111613073577f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd9355614cbe6040519283925f84613d05565b0390a2565b91909160018060a01b031691825f52609860205260405f205f516020615db25f395f51905f525f5260205260405f2090815491838303928311613073577f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd935f516020615db25f395f51905f5293614cbe925560405193849384613d05565b6001600160a01b039081165f818152609860209081526040808320948716835293905291909120805491948083039493928511613073577f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd94614cbe925560405193849384613d05565b6001600160a01b03165f516020615db25f395f51905f5203614df5577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690565b6109b89291612160614e33926152e7565b615887565b6033546001600160a01b03163303614e4c57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b15614edf57565b6316110d3560e21b5f5260045ffd5b15614ef557565b6387c9d21960e01b5f5260045ffd5b15614f0b57565b6378f67ae160e11b5f5260045ffd5b5f60066104ae92828155826001820155826002820155826003820155826004820155614f4f8360058301805490828155613d52565b01805490828155613d52565b91908260409103126103fa576020825192015190565b356109b88161048e565b93929360a0810192614f908451518214612dbf565b6040820151614fb290614fab906001600160a01b0316611773565b3314614ed8565b614fbb82612f58565b614fdf614fda614fd3835f52609e60205260405f2090565b5460ff1690565b614eee565b7f1f40400889274ed07b24845e5054a87a0cab969eb1277aafe61ae352e7c32a006150a961505261501a6148cc608088015163ffffffff1690565b61503163ffffffff821663ffffffff431611614f04565b86516001600160a01b031660208801516001600160a01b03168a5191615620565b9261506f8161506a61422a895160018060a01b031690565b615b19565b5061508a615085825f5260a460205260405f2090565b614f1a565b6119c961509f825f52609e60205260405f2090565b805460ff19169055565b0390a182516001600160a01b03165f908152609a602052604090206150cd90612317565b83516150e5906001600160a01b031682885191613bfd565b5f5b875180518210156152da5790888888886151098f96610b258761234992612de2565b61512561511a8760c0860151612de2565b51614960888d612de2565b9687156152cb5786929190156151e25792516001600160a01b039384169361516c93615167939092909161516191610b25918591169951612de2565b95613571565b614f71565b91813b1561089d57604051630bab906360e21b81526001600160a01b039485166004820152908416602482015291909216604482015260648101939093525f908390608490829084905af1918215610898576001926151ce575b505b016150e7565b80610d505f6151dc936108f1565b5f6151c6565b8c516001600160a01b039182169896501693506151fe92505050565b9061520d610b25848d51612de2565b93803b1561089d57615239945f6040948551978895869485936350ff722560e01b855260048501613d05565b03925af18015610898578961528391600194848b5f925f94615288575b505161527191610b25916001600160a01b03165b9551612de2565b61527b8689612de2565b51938961470b565b6151c8565b610b2591945061526a9350916152b76152719360403d81116152c4575b6152af81836108f1565b810190614f5b565b9490949592505091615256565b503d6152a5565b505050505050600191506151c8565b5050505050505050509050565b51806109b85750670de0b6b3a764000090565b6109b89061530f6106c4600280606654161490565b6001600160a01b0381165f908152609a60205260409020606092919061533490612317565b906153626153528260018060a01b03165f52609a60205260405f2090565b80546001600160a01b0319169055565b6001600160a01b038281169082167ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af446765f80a361539d816132e9565b919094855190811561545057506153b390612c53565b926153bf868284613bfd565b915f5b875181101561544657600190615435896153da612e95565b6153e2612e95565b906154046153fb610b25876153f5612e95565b96612de2565b61344c83612dd5565b61540e858b612de2565b5161541883612dd5565b52615423858a612de2565b5161542d84612dd5565b528787613f03565b61543f8289612de2565b52016153c2565b5093955050505050565b955050505050565b1561545f57565b630d4c4c9160e21b5f5260045ffd5b6001600160a01b038281165f9081526099602052604090206001015491949116929083156146f5576104ae9461550591855f52609c60205260405f20815f526020526154c96154c460ff60405f20541615151590565b615458565b6154f7614202826154ea8960018060a01b03165f52609c60205260405f2090565b905f5260205260405f2090565b856020850195865193612b93565b9051915192615949565b906121606109b8926152e7565b6001600160a01b039081165f81815260a560209081526040808320948616835293905291909120909291615574916155539061573b565b935f5260a560205260405f209060018060a01b03165f5260205260405f2090565b908201809211613073576104ae916001600160e01b0316904363ffffffff1690615c28565b92909182156155dc576155bb82614e336155b561226a88612eb7565b86615887565b9080820180921161307357830180931161307357613d4e926142dc916157e7565b50613d4e91506142dc61226a84612eb7565b9161561963ffffffff9160409396959660018060a01b03168552606060208601526060850190611384565b9416910152565b9392909161562e8151612c53565b927f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692833b1561089d57604051632535f40360e21b8152935f92859283918291615686918890600485016155ee565b03915afa918215610898575f926156c8575b505f5b8151811015613cb557806156b7613c90610b2560019486612de2565b6156c18287612de2565b520161569b565b6156dd9192503d805f833e613bee81836108f1565b905f615698565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b91906157198282856158fc565b92821561573657096157285790565b600181018091116130735790565b6156f8565b8054908161574a57505f919050565b815f19810111613073575f525f199060205f2001015460201c614af3565b916001600160401b03809116911603906001600160401b038211613073576001600160401b036109b8921690615887565b8115615736570490565b156157aa57565b60405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b6044820152606490fd5b5f19670de0b6b3a7640000820991670de0b6b3a764000082029182808510940393808503941461587b57670de0b6b3a764000082916158278684116157a3565b09600182190182168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b50906109b89250615799565b5f19828209828202918280831092039180830392146158eb577faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066993670de0b6b3a7640000916158d78484116157a3565b0990828211900360ee1b910360121c170290565b50670de0b6b3a76400009250500490565b90915f198383099280830292838086109503948086039514615926579082916158278684116157a3565b5050906109b89250615799565b1561593a57565b638baa579f60e01b5f5260045ffd5b90924211615a505761595b8284615d01565b9390926005851015615a4b576104ae94159384615a35575b508315615983575b505050615933565b5f935090612f756159bb8594936040519283916020830195630b135d3f60e11b875260248401526040604484015260648301906110b7565b51915afa3d15615a2e573d6159cf81611e36565b906159dd60405192836108f1565b81523d5f602083013e5b81615a20575b816159fc575b505f808061597b565b9050615a19630b135d3f60e11b91602080825183010191016132da565b145f6159f3565b9050602081511015906159ed565b60606159e7565b6001600160a01b0384811691161493505f615973565b6156e4565b630819bdcd60e01b5f5260045ffd5b8054821015611d1d575f5260205f2001905f90565b6001810190825f528160205260405f2054155f14615ad7578054600160401b8110156108d157615ac4615aae826001879401855584615a5f565b819391549060031b91821b915f19901b19161790565b905554915f5260205260405f2055600190565b5050505f90565b80548015615b05575f190190615af48282615a5f565b8154905f199060031b1b1916905555565b634e487b7160e01b5f52603160045260245ffd5b6001810191805f528260205260405f2054928315155f14615bb4575f1984018481116130735783545f19810194908511613073575f9585836154ea94615b679803615b6d575b505050615ade565b55600190565b615b9d615b9791615b8e615b84615bab9588615a5f565b90549060031b1c90565b92839187615a5f565b90613d35565b85905f5260205260405f2090565b555f8080615b5f565b505050505f90565b15615bc357565b63151b8e3f60e11b5f5260045ffd5b8054600160401b8110156108d157615bef91600182018155615a5f565b615c1557815160209283015190921b63ffffffff191663ffffffff909216919091179055565b634e487b7160e01b5f525f60045260245ffd5b805480615c64575b50615c5f6104ae93615c4f615c43610921565b63ffffffff9095168552565b6001600160e01b03166020840152565b615bd2565b805f1981011161307357815f5263ffffffff615cd2615cc95f198460205f200101615cbf615cb160405192615c98846108d6565b548681169081855260201c602085015263ffffffff1690565b858916958691161115615bbc565b5163ffffffff1690565b63ffffffff1690565b03615c30576104ae93925090614ae1615cea926149b0565b9063ffffffff82549181199060201b169116179055565b9060418151145f14615d2d57615d2991602082015190606060408401519301515f1a90615d36565b9091565b50505f90600290565b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615da6576020935f9360ff60809460405194855216868401526040830152606082015282805260015afa15610898575f516001600160a01b03811615615d9e57905f90565b505f90600190565b505050505f9060039056fe000000000000000000000000beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0a264697066735822122088bd6d641c9bc34dfff8fa4227926f10f9e6811614994cef01c36ed04f52c75d64736f6c634300081c0033"; type DelegationManagerConstructorParams = | [signer?: Signer] @@ -1683,27 +1855,43 @@ export class DelegationManager__factory extends ContractFactory { override deploy( _strategyManager: string, - _slasher: string, _eigenPodManager: string, + _allocationManager: string, + _pauserRegistry: string, + _permissionController: string, + _MIN_WITHDRAWAL_DELAY: BigNumberish, + _version: string, overrides?: Overrides & { from?: string } ): Promise { return super.deploy( _strategyManager, - _slasher, _eigenPodManager, + _allocationManager, + _pauserRegistry, + _permissionController, + _MIN_WITHDRAWAL_DELAY, + _version, overrides || {} ) as Promise; } override getDeployTransaction( _strategyManager: string, - _slasher: string, _eigenPodManager: string, + _allocationManager: string, + _pauserRegistry: string, + _permissionController: string, + _MIN_WITHDRAWAL_DELAY: BigNumberish, + _version: string, overrides?: Overrides & { from?: string } ): TransactionRequest { return super.getDeployTransaction( _strategyManager, - _slasher, _eigenPodManager, + _allocationManager, + _pauserRegistry, + _permissionController, + _MIN_WITHDRAWAL_DELAY, + _version, overrides || {} ); } diff --git a/src/avs/contracts/factories/ECDSAStakeRegistry__factory.ts b/src/avs/contracts/factories/ECDSAStakeRegistry__factory.ts index 9e174a2b..d25b6758 100644 --- a/src/avs/contracts/factories/ECDSAStakeRegistry__factory.ts +++ b/src/avs/contracts/factories/ECDSAStakeRegistry__factory.ts @@ -32,7 +32,7 @@ const _abi = [ name: "getLastCheckpointOperatorWeight", inputs: [ { - name: "_operator", + name: "operator", type: "address", internalType: "address", }, @@ -64,7 +64,7 @@ const _abi = [ name: "getLastCheckpointThresholdWeightAtBlock", inputs: [ { - name: "_blockNumber", + name: "blockNumber", type: "uint32", internalType: "uint32", }, @@ -96,7 +96,7 @@ const _abi = [ name: "getLastCheckpointTotalWeightAtBlock", inputs: [ { - name: "_blockNumber", + name: "blockNumber", type: "uint32", internalType: "uint32", }, @@ -112,10 +112,10 @@ const _abi = [ }, { type: "function", - name: "getLastestOperatorSigningKey", + name: "getLatestOperatorSigningKey", inputs: [ { - name: "_operator", + name: "operator", type: "address", internalType: "address", }, @@ -134,12 +134,12 @@ const _abi = [ name: "getOperatorSigningKeyAtBlock", inputs: [ { - name: "_operator", + name: "operator", type: "address", internalType: "address", }, { - name: "_blockNumber", + name: "blockNumber", type: "uint256", internalType: "uint256", }, @@ -158,7 +158,7 @@ const _abi = [ name: "getOperatorWeight", inputs: [ { - name: "_operator", + name: "operator", type: "address", internalType: "address", }, @@ -177,12 +177,12 @@ const _abi = [ name: "getOperatorWeightAtBlock", inputs: [ { - name: "_operator", + name: "operator", type: "address", internalType: "address", }, { - name: "_blockNumber", + name: "blockNumber", type: "uint32", internalType: "uint32", }, @@ -206,19 +206,19 @@ const _abi = [ internalType: "address", }, { - name: "_thresholdWeight", + name: "thresholdWeight", type: "uint256", internalType: "uint256", }, { - name: "_quorum", + name: "quorum", type: "tuple", - internalType: "struct Quorum", + internalType: "struct IECDSAStakeRegistryTypes.Quorum", components: [ { name: "strategies", type: "tuple[]", - internalType: "struct StrategyParams[]", + internalType: "struct IECDSAStakeRegistryTypes.StrategyParams[]", components: [ { name: "strategy", @@ -243,7 +243,7 @@ const _abi = [ name: "isValidSignature", inputs: [ { - name: "_dataHash", + name: "digest", type: "bytes32", internalType: "bytes32", }, @@ -280,7 +280,7 @@ const _abi = [ name: "operatorRegistered", inputs: [ { - name: "_operator", + name: "operator", type: "address", internalType: "address", }, @@ -315,12 +315,12 @@ const _abi = [ { name: "", type: "tuple", - internalType: "struct Quorum", + internalType: "struct IECDSAStakeRegistryTypes.Quorum", components: [ { name: "strategies", type: "tuple[]", - internalType: "struct StrategyParams[]", + internalType: "struct IECDSAStakeRegistryTypes.StrategyParams[]", components: [ { name: "strategy", @@ -344,9 +344,10 @@ const _abi = [ name: "registerOperatorWithSignature", inputs: [ { - name: "_operatorSignature", + name: "operatorSignature", type: "tuple", - internalType: "struct ISignatureUtils.SignatureWithSaltAndExpiry", + internalType: + "struct ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry", components: [ { name: "signature", @@ -366,7 +367,7 @@ const _abi = [ ], }, { - name: "_signingKey", + name: "signingKey", type: "address", internalType: "address", }, @@ -399,12 +400,12 @@ const _abi = [ name: "updateMinimumWeight", inputs: [ { - name: "_newMinimumWeight", + name: "newMinimumWeight", type: "uint256", internalType: "uint256", }, { - name: "_operators", + name: "operators", type: "address[]", internalType: "address[]", }, @@ -417,7 +418,7 @@ const _abi = [ name: "updateOperatorSigningKey", inputs: [ { - name: "_newSigningKey", + name: "newSigningKey", type: "address", internalType: "address", }, @@ -430,7 +431,7 @@ const _abi = [ name: "updateOperators", inputs: [ { - name: "_operators", + name: "operators", type: "address[]", internalType: "address[]", }, @@ -461,14 +462,14 @@ const _abi = [ name: "updateQuorumConfig", inputs: [ { - name: "_quorum", + name: "quorum", type: "tuple", - internalType: "struct Quorum", + internalType: "struct IECDSAStakeRegistryTypes.Quorum", components: [ { name: "strategies", type: "tuple[]", - internalType: "struct StrategyParams[]", + internalType: "struct IECDSAStakeRegistryTypes.StrategyParams[]", components: [ { name: "strategy", @@ -485,7 +486,7 @@ const _abi = [ ], }, { - name: "_operators", + name: "operators", type: "address[]", internalType: "address[]", }, @@ -498,7 +499,7 @@ const _abi = [ name: "updateStakeThreshold", inputs: [ { - name: "_thresholdWeight", + name: "thresholdWeight", type: "uint256", internalType: "uint256", }, @@ -524,13 +525,13 @@ const _abi = [ name: "MinimumWeightUpdated", inputs: [ { - name: "_old", + name: "previous", type: "uint256", indexed: false, internalType: "uint256", }, { - name: "_new", + name: "current", type: "uint256", indexed: false, internalType: "uint256", @@ -543,13 +544,13 @@ const _abi = [ name: "OperatorDeregistered", inputs: [ { - name: "_operator", + name: "operator", type: "address", indexed: true, internalType: "address", }, { - name: "_avs", + name: "avs", type: "address", indexed: true, internalType: "address", @@ -562,13 +563,13 @@ const _abi = [ name: "OperatorRegistered", inputs: [ { - name: "_operator", + name: "operator", type: "address", indexed: true, internalType: "address", }, { - name: "_avs", + name: "avs", type: "address", indexed: true, internalType: "address", @@ -581,7 +582,7 @@ const _abi = [ name: "OperatorWeightUpdated", inputs: [ { - name: "_operator", + name: "operator", type: "address", indexed: true, internalType: "address", @@ -625,15 +626,15 @@ const _abi = [ name: "QuorumUpdated", inputs: [ { - name: "_old", + name: "previous", type: "tuple", indexed: false, - internalType: "struct Quorum", + internalType: "struct IECDSAStakeRegistryTypes.Quorum", components: [ { name: "strategies", type: "tuple[]", - internalType: "struct StrategyParams[]", + internalType: "struct IECDSAStakeRegistryTypes.StrategyParams[]", components: [ { name: "strategy", @@ -650,15 +651,15 @@ const _abi = [ ], }, { - name: "_new", + name: "current", type: "tuple", indexed: false, - internalType: "struct Quorum", + internalType: "struct IECDSAStakeRegistryTypes.Quorum", components: [ { name: "strategies", type: "tuple[]", - internalType: "struct StrategyParams[]", + internalType: "struct IECDSAStakeRegistryTypes.StrategyParams[]", components: [ { name: "strategy", @@ -713,7 +714,7 @@ const _abi = [ name: "ThresholdWeightUpdated", inputs: [ { - name: "_thresholdWeight", + name: "thresholdWeight", type: "uint256", indexed: false, internalType: "uint256", @@ -827,7 +828,7 @@ const _abi = [ ] as const; const _bytecode = - "0x60a080604052346100d957604051601f61280f38819003918201601f19168301916001600160401b038311848410176100c55780849260209460405283398101031261007557516001600160a01b0381168103610071576080526040516126e890816101278239608051816116560152f35b5f80fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fdfe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b5f803560e01c8062cf2ab514610f815780630dba339414610f585780631626ba7e14610c495780631703a01814610bf95780631e4cd85e14610bd0578063314f3a4914610bb65780633b242e4a14610b7f5780633d5611f61461098c57806340bf2fb71461096f5780635140a548146108635780635e1042e81461081d5780635ef53329146107f8578063696255be1461077d578063715018a614610720578063743c31f4146106d8578063857dc190146105c25780638da5cb5b1461059a578063955f2d901461054957806398ec1ac91461051e578063ab11899514610389578063b933fa7414610321578063cdcd3581146102d6578063dec5d1f614610267578063ec7fbb31146102285763f2fde38b1461018e575061000e565b3461022357602036600319011261021e576101a76111c6565b6101af611acb565b6001600160a01b038116156101ca576101c790611cdb565b80f35b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b611006565b610fb6565b503461022357602036600319011261021e5760209060ff906040906001600160a01b036102536111c6565b168152606e84522054166040519015158152f35b503461022357604036600319011261021e576004356001600160401b0381116102d15761029890369060040161140e565b602435906001600160401b0382116102d1576102cc6102be6101c79336906004016111dc565b916102c7611acb565b611e08565b61181e565b611056565b503461022357602036600319011261021e576020906001600160a01b036102fb6111c6565b168152606a8252604090206001600160a01b039061031890611a99565b16604051908152f35b5034610223578060031936011261021e57606c54908161035357602091505b6040516001600160e01b03919091168152f35b5f198201918211610375575061036c602091606c61186d565b5054811c610340565b634e487b7160e01b81526011600452602490fd5b503461022357606036600319011261021e576103a36111c6565b6044356001600160401b0381116102d1576103c290369060040161140e565b82549060ff8260081c161592838094610511575b80156104fa575b1561049e5760ff198316600117855561042d928461048d575b5061040760ff865460081c16611da8565b60018060a01b03166001600160601b0360a01b60685416176068556102c7602435611b23565b61044660ff835460081c1661044181611da8565b611da8565b61044f33611cdb565b6104565780f35b61ff001981541681557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a180f35b61ffff19166101011785555f6103f6565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b1580156103dd5750600160ff8416146103dd565b50600160ff8416106103d6565b3461022357602036600319011261021e57602061054161053c6111c6565b6115de565b604051908152f35b503461022357604036600319011261021e576105636111c6565b6024359063ffffffff8216809203610596576001600160a01b03168252606d6020908152604090922061054191906119fc565b8280fd5b50346102235736600319011261021e576033546040516001600160a01b039091168152602090f35b5034610223578060031936011261021e57338152606e60205260ff604082205416156106c95760655480156106b5575f1901606555338152606e6020526040812060ff19815416905561061c61061733611f6d565b61216a565b50506068546001600160a01b0316803b156106b057818080926024604051809481936351b27a6d60e11b83523360048401525af180156106a557610690575b506068546001600160a01b0316337f31e0adfec71bccee37b6e83a90c2fedb17d8f1693fee863c4771e7bfe2aed5808380a380f35b8161069a91611135565b61021e57805f61065b565b6040513d84823e3d90fd5b61157e565b634e487b7160e01b82526011600452602482fd5b6325ec6c1f60e01b8152600490fd5b503461022357602036600319011261021e576106f26111c6565b338252606e60205260ff60408320541615610711576101c79033611d23565b6325ec6c1f60e01b8252600482fd5b5034610223578060031936011261021e57610739611acb565b603380546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461022357604036600319011261021e576024356004356001600160401b0382116102d1577f713ca53b88d6eb63f5b1854cb8cbdd736ec51eda225e46791aa9298b0160648f60406107d76101c79436906004016111dc565b926107e0611acb565b606754908060675582519182526020820152a161181e565b503461022357602036600319011261021e57610812611acb565b6101c7600435611b23565b503461022357604036600319011261021e576020906001600160a01b036108426111c6565b168152606a8252604090206001600160a01b039061031890602435906119fc565b503461022357604036600319011261021e576004356001600160401b0381116102d15736602382011215610965578060040135906108a082611156565b906108ae6040519283611135565b82825260208201906024829460051b8201019036821161096a5760248101925b82841061093657505050506024356001600160401b0381116102d1576108f89036906004016112cd565b5051156109225751805160655403610913576101c79061181e565b63169efb5b60e11b8252600482fd5b634e487b7160e01b82526032600452602482fd5b83356001600160401b0381116109655760209161095a8392602436918701016111dc565b8152019301926108ce565b6110a6565b61116d565b50346102235736600319011261021e576020606754604051908152f35b503461022357604036600319011261021e576004356001600160401b0381116102d15760606003198236030112610b7a57604051606081018181106001600160401b03821117610b665760405281600401356001600160401b038111610b61576109fc90600436918501016112cd565b8152602480830135602083019081526044909301356040830190815290356001600160a01b0381168103610b5d57335f52606e60205260ff60405f205416610b4e57606554905f198214610b3a576001610a7f9201606555335f52606e60205260405f20600160ff19825416179055610a7761061733611f6d565b505033611d23565b6068546001600160a01b0316803b156106b057610acb5f809460405196879586948593639926ee7d60e01b855233600486015260406024860152516060604486015260a4850190611aa7565b9151606484015251608483015203925af18015610b2f57610b1c575b506068546001600160a01b0316337fa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c18380a380f35b610b2891505f90611135565b5f80610ae7565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b6342ee68b560e01b5f5260045ffd5b5f80fd5b6113bd565b634e487b7160e01b5f52604160045260245ffd5b61136c565b3461022357602036600319011261021e576001600160a01b03610ba06111c6565b165f52606d602052602061054160405f20611a99565b34610223575f36600319011261021e576020610541611a8c565b3461022357602036600319011261021e57602061054163ffffffff610bf361124a565b1661196b565b34610223575f36600319011261021e576060604051610c17816110ff565b52610c45604051610c27816110ff565b610c2f6114df565b8152604051918291602083526020830190611313565b0390f35b3461022357604036600319011261021e576004356024356001600160401b0381116102d157610c7c9036906004016112cd565b805181016060826020830192031261021e5760208201516001600160401b0381116102d15782019181603f84011215610965576020830151610cbd81611156565b93610ccb6040519586611135565b8185526020808087019360051b830101019084821161096a57604001915b818310610f385750505060408101516001600160401b0381116102d15781019180603f8401121561096557602083015192610d2384611156565b93610d316040519586611135565b8085526020808087019260051b840101019183831161096a5760408101915b838310610ec95788888860608901519163ffffffff8316809303610b5d578051915f809582518503610eba578415610eab5743861015945f949093925b848610610df757888888610de857610da481611882565b8211610dd957610db39061196b565b11610dca57604051630b135d3f60e11b8152602090f35b63e121632f60e01b5f5260045ffd5b634b05a0f760e11b5f5260045ffd5b63e64f180f60e01b5f5260045ffd5b949793949293926001600160a01b03610e108a84611556565b511696610de857865f52606a6020528660018060a01b03610e348a60405f206119fc565b16916001600160a01b03161015610e9c57610e5b9083610e548b88611556565b51916123fb565b15610e8d576001610e8387945f985f52606d602052610e7d8a60405f206119fc565b906115d1565b9801949392610d8d565b638baa579f60e01b5f5260045ffd5b63ba50f91160e01b5f5260045ffd5b63251f56a160e21b5f5260045ffd5b631fec674760e31b5f5260045ffd5b82516001600160401b0381116109655760209083010185603f8201121561096557602081015191610ef9836112b2565b610f066040519182611135565b8381526040838501018810610f33575f602085819660408397018386015e83010152815201920191610d50565b61125d565b82516001600160a01b0381168103610b5d57815260209283019201610ce9565b3461022357602036600319011261021e57602061054163ffffffff610f7b61124a565b16611882565b34610fb657602036600319011261021e576004356001600160401b0381116102d1576102cc610fb49136906004016111dc565b005b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b602081019081106001600160401b03821117610b6657604052565b604081019081106001600160401b03821117610b6657604052565b90601f801991011681019081106001600160401b03821117610b6657604052565b6001600160401b038111610b665760051b60200190565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b600435906001600160a01b0382168203610b5d57565b9080601f83011215610965578135906111f482611156565b926112026040519485611135565b82845260208085019360051b82010191821161096a57602001915b81831061122a5750505090565b82356001600160a01b0381168103610b5d5781526020928301920161121d565b6004359063ffffffff82168203610b5d57565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b6001600160401b038111610b6657601f01601f191660200190565b81601f82011215610965578035906112e4826112b2565b926112f26040519485611135565b82845260208383010111610f3357815f926020809301838601378301015290565b602060408184019251938281528451809452019201905f5b8181106113385750505090565b825180516001600160a01b031685526020908101516001600160601b0316818601526040909401939092019160010161132b565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b9190602083820312610b7a57604051611426816110ff565b80938035906001600160401b038211610b61570182601f820112156109655780359061145182611156565b9361145f6040519586611135565b82855260208086019360061b8301019181831161096a57602001925b828410611489575050505052565b604084830312610b7a57604051906114a08261111a565b84356001600160a01b0381168103610b5d5782526020850135906001600160601b0382168203610b5d578260209283604095015281520193019261147b565b606654906114ec82611156565b916114fa6040519384611135565b80835260665f9081525f80516020612693833981519152602085015b8383106115235750505050565b6001602081926040516115358161111a565b8554848060a01b038116825260a01c83820152815201920192019190611516565b805182101561156a5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b91908201809211610b3a57565b6115e66114df565b805190925f61160d6115f784611156565b936116056040519586611135565b808552611156565b602084019490601f19013686375f5b865181101561164e576001906001600160a01b0361163a828a611556565b5151166116478288611556565b520161161c565b5091939092917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169190823b156106b05760408051639004134760e01b81526001600160a01b0390921660048301526024820152925160448401819052839160648301915f5b8181106117e1575050509181805f9403915afa908115610b2f575f91611751575b505f915b8451831015611733576116f48383611556565b51906001600160601b03602061170a8689611556565b5101511691828102928184041490151715610b3a5760019161172b916115d1565b9201916116e1565b915050612710919250046067548110155f1461174c5790565b505f90565b90503d805f833e6117628183611135565b81019060208183031261021e578051906001600160401b0382116102d157019080601f8301121561096557815161179881611156565b926117a66040519485611135565b81845260208085019260051b82010192831161096a57602001905b8282106117d1575050505f6116dd565b81518152602091820191016117c1565b82516001600160a01b03168452869450602093840193909201916001016116bc565b9190915f8382019384129112908015821691151617610b3a57565b905f805b835182101561185c576001906118549061184e6001600160a01b036118478689611556565b5116611f6d565b90611803565b910190611822565b905061186991925061216a565b5050565b805482101561156a575f5260205f2001905f90565b4381101561192757606b54905f905b8282106118ce575050806118ae57505f5b6001600160e01b031690565b5f198101908111610b3a576118c490606b61186d565b505460201c6118a2565b90916118e181841860011c8285166115d1565b908263ffffffff6118f384606b61186d565b50541611156119055750915b90611891565b925060018101809111156118ff57634e487b7160e01b5f52601160045260245ffd5b606460405162461bcd60e51b815260206004820152602060248201527f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e65646044820152fd5b4381101561192757606c54905f905b8282106119a35750508061198d57505f90565b5f198101908111610b3a576118c490606c61186d565b90916119b681841860011c8285166115d1565b908263ffffffff6119c884606c61186d565b50541611156119da5750915b9061197a565b925060018101809111156119d457634e487b7160e01b5f52601160045260245ffd5b9043811015611927578154905f905b828210611a3457505080611a2057505f919050565b5f198101908111610b3a576118c49161186d565b9091611a4781841860011c8285166115d1565b908263ffffffff611a58848861186d565b5054161115611a6a5750915b90611a0b565b92506001810180911115611a6457634e487b7160e01b5f52601160045260245ffd5b606b54806118ae57505f90565b805480611a2057505f919050565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b6033546001600160a01b03163303611adf57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b606c5490611b31606c611a99565b9082151580611cb5575b15611ba957611b4981612513565b915f198401938411610b3a57611b9f602093611b877f9324f7e5a7c0288808a634ccde44b8e979676474b22e29ee9dd569b55e791a4b96606c61186d565b509063ffffffff82549181199060201b169116179055565b50604051908152a1565b63ffffffff4311611c6157611bbd81612513565b9160405193611bcb8561111a565b4363ffffffff1685526001600160e01b039093166020850190815292600160401b811015610b6657806001611c059201606c55606c61186d565b949094611c4e5751925163ffffffff90931663ffffffff19602094851b16179093557f9324f7e5a7c0288808a634ccde44b8e979676474b22e29ee9dd569b55e791a4b92611b9f565b634e487b7160e01b5f525f60045260245ffd5b60405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608490fd5b505f198301838111610b3a57611cd163ffffffff91606c61186d565b5054164314611b3b565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b6001600160a01b039081165f818152606a6020526040902090929190611d4890611a99565b6001600160a01b0390921692911690828214611da357805f52606a602052611d738360405f20612298565b50506040519182527fd061168252f441733658f09e4d8f5b2d998ed4ef24a2bbfd6ceca52ea131500260204393a4565b505050565b15611daf57565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b611e1181612381565b15611f465760405191611e23836110ff565b611e2b6114df565b83526066545f60665580611f0c575b505f5b82518051821015611eb95781611e5291611556565b519060665491600160401b831015610b66576001830160665560665483101561156a5760665f5280516020919091015160a01b6001600160a01b0319166001600160a01b0391909116175f8051602061269383398151915290920191909155600101611e3d565b505091611ef990611f077f23aad4e61744ece164130aa415c1616e80136b0f0770e56589438b90b269265e93604051938493604085526040850190611313565b908382036020850152611313565b0390a1565b60665f525f80516020612693833981519152015f805160206126938339815191525b818110611f3b5750611e3a565b5f8155600101611f2e565b63d173577960e01b5f5260045ffd5b81810392915f138015828513169184121617610b3a57565b6001600160a01b0381165f818152606d602052604081209092908390611f9290611a99565b8094845f52606e60205260ff60405f205416155f1461210c57611fb6929350611f55565b92831561210657825f52606d60205260405f2090815492611fd683611a99565b841515806120e1575b1561203a57611fed5f612513565b945f198101908111610b3a577f88770dc862e47a7ed586907857eb1b75e4c5ffc8b707c7ee10eb74d6885fe59495611b8761202a9260409761186d565b505b82519182526020820152a290565b63ffffffff4311611c615761204e5f612513565b936040519561205c8761111a565b4363ffffffff1687526001600160e01b039095166020870190815294600160401b811015610b66576120939160018201815561186d565b959095611c4e5751935160201b63ffffffff191663ffffffff94909416939093179093557f88770dc862e47a7ed586907857eb1b75e4c5ffc8b707c7ee10eb74d6885fe5949260409261202a565b505f198501858111610b3a576120fc63ffffffff918661186d565b5054164314611fdf565b50505090565b505050612118906115de565b916121238184611f55565b928315612106577f88770dc862e47a7ed586907857eb1b75e4c5ffc8b707c7ee10eb74d6885fe59491604091845f52606d60205261216381845f20612298565b505061202c565b9061217d612176611a8c565b9283611803565b90606b5461218b606b611a99565b9080151580612272575b156121ee576121a384612513565b5f198201918211610b3a57611b876121bc92606b61186d565b507f86dcf86b12dfeedea74ae9300dbdaa193bcce5809369c8177ea2f4eaaa65729b60408051858152846020820152a1565b63ffffffff4311611c615761220284612513565b6040519161220f8361111a565b4363ffffffff1683526001600160e01b039091166020830190815290600160401b811015610b66578060016122499201606b55606b61186d565b919091611c4e579151915160201b63ffffffff191663ffffffff929092169190911790556121bc565b505f198101818111610b3a5761228e63ffffffff91606b61186d565b5054164314612195565b91909180546122a682611a99565b918115158061235c575b156122db576122be85612513565b905f198301928311610b3a576122d792611b879161186d565b9190565b63ffffffff4311611c61576122ef85612513565b90604051926122fd8461111a565b4363ffffffff1684526001600160e01b039092166020840190815291600160401b811015610b66576123349160018201815561186d565b919091611c4e579151915160201b63ffffffff191663ffffffff929092169190911790559190565b505f198201828111610b3a5761237763ffffffff918361186d565b50541643146122b0565b51905f80805b84518210156123e4576001600160a01b036123a28387611556565b515116906001600160a01b0316811115610e9c576123db600191936001600160601b0360206123d1868a611556565b51015116906115d1565b91019091612387565b509192506127101490506123f6575f90565b600190565b9190916124088284612582565b60058110156124ff571590816124e9575b506124e1575f9261245361246185946040519283916020830195630b135d3f60e11b87526024840152604060448401526064830190611aa7565b03601f198101835282611135565b51915afa3d156124da573d612475816112b2565b906124836040519283611135565b81523d5f602083013e5b816124ce575b8161249c575090565b905060208180518101031261021e57602001516001600160e01b0319811690819003610b5d57630b135d3f60e11b1490565b80516020149150612493565b606061248d565b505050600190565b6001600160a01b0383811691161490505f612419565b634e487b7160e01b5f52602160045260245ffd5b6001600160e01b03811161252d576001600160e01b031690565b60405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608490fd5b8151604181036125ae5750906125aa91602082015190606060408401519301515f1a906125f0565b9091565b6040036125e75760406020830151920151918260ff1c91601b8301809311610b3a576125aa936001600160ff1b03169260ff16906125f0565b50505f90600290565b907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116126875760ff1690601b8214158061267c575b612671576020935f93608093604051938452868401526040830152606082015282805260015afa15610b2f575f516001600160a01b0381161561266957905f90565b505f90600190565b505050505f90600490565b50601c821415612627565b505050505f9060039056fe46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e94354a2646970667358221220afd818386e982b126bce3e3bf8a998f3dd0ba6ffa50c1e8f37c83522636fbf0d64736f6c634300081a0033"; + "0x60a080604052346100d957604051601f61297238819003918201601f19168301916001600160401b038311848410176100c55780849260209460405283398101031261007557516001600160a01b03811681036100715760805260405161284b908161012782396080518161165a0152f35b5f80fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fdfe608060405260043610611152575f3560e01c8062cf2ab51461019a5780630dba3394146101955780631626ba7e146101905780631703a0181461018b5780631e4cd85e14610186578063314f3a49146101815780633b242e4a1461017c5780633d5611f61461017757806340bf2fb7146101725780635140a5481461016d5780635e1042e8146101685780635ef5332914610163578063696255be1461015e578063715018a614610159578063743c31f414610154578063857dc1901461014f5780638da5cb5b1461014a578063955f2d901461014557806398ec1ac914610140578063a2ce5fd11461013b578063ab11899514610136578063b933fa7414610131578063dec5d1f61461012c578063ec7fbb31146101275763f2fde38b03611152576110c1565b611081565b61101d565b610fae565b610e9c565b610d91565b610d6a565b610d1c565b610cf4565b610bd5565b610b8a565b610b2f565b610aa4565b610a80565b610a3d565b610977565b61095a565b6108c6565b6107dc565b6107b1565b610784565b610738565b6105c1565b6104d1565b61047a565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b602081019081106001600160401b0382111761031757604052565b6102e8565b606081019081106001600160401b0382111761031757604052565b604081019081106001600160401b0382111761031757604052565b90601f801991011681019081106001600160401b0382111761031757604052565b60405190610382604083610352565b565b6001600160401b0381116103175760051b60200190565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b6001600160a01b0381160361040557565b5f80fd5b9080601f8301121561047557813561042081610384565b9261042e6040519485610352565b81845260208085019260051b82010192831161047057602001905b8282106104565750505090565b602080918335610465816103f4565b815201910190610449565b61039b565b61028f565b346104be5760203660031901126104b9576004356001600160401b0381116104b4576104ad6104b2913690600401610409565b6117e4565b005b61023f565b6101ef565b61019f565b63ffffffff81160361040557565b346104be5760203660031901126104b95760206104fe63ffffffff6004356104f8816104c3565b16611841565b604051908152f35b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b6001600160401b03811161031757601f01601f191660200190565b81601f820112156104755780359061058d8261055b565b9261059b6040519485610352565b828452602083830101116105bc57815f926020809301838601378301015290565b610506565b346104be5760403660031901126104b9576004356024356001600160401b0381116104b4576105f4903690600401610576565b908151820191606081602085019403126104b95760208101516001600160401b0381116104b457810183603f820112156104755760208101519061063782610384565b916106456040519384610352565b8083526020808085019260051b840101019186831161047057604001905b8282106106bb5750505060408201516001600160401b0381116104b45760606106976106a496602061069e948701016111b5565b930161126d565b92611ad6565b604051630b135d3f60e11b815280602081015b0390f35b6020809183516106ca816103f4565b815201910190610663565b5f9103126104b957565b602060408184019251938281528451809452019201905f5b8181106107045750505090565b825180516001600160a01b031685526020908101516001600160601b031681860152604090940193909201916001016106f7565b346104be575f3660031901126104b9576060604051610756816102fc565b526106b7604051610766816102fc565b61076e611278565b81526040519182916020835260208301906106df565b346104be5760203660031901126104b95760206104fe63ffffffff6004356107ab816104c3565b16611968565b346104be575f3660031901126104b95760206001600160e01b036107d3611bb9565b16604051908152f35b346104be5760203660031901126104b9576004356107f9816103f4565b6001600160a01b03165f908152606d602090815260409091206001600160e01b03906107d390611bfd565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b346104be5760403660031901126104b9576004356001600160401b0381116104b45760606003198236030112610955576040516109028161031c565b81600401356001600160401b038111610950576104b29261092b60449260043691840101610576565b835260248101356020840152013560408201526024359061094b826103f4565b6112ef565b610875565b610824565b346104be575f3660031901126104b9576020606754604051908152f35b346104be5760403660031901126104b9576004356001600160401b0381116104b457366023820112156104755780600401356109b281610384565b916109c06040519384610352565b8183526024602084019260051b820101903682116104705760248101925b828410610a0e57602435856001600160401b0382116104b457610a086104b2923690600401610576565b50611429565b83356001600160401b03811161047557602091610a32839260243691870101610409565b8152019301926109de565b346104be5760403660031901126104b9576020600435610a5c816103f4565b6001600160a01b039081165f908152606a8352604090206107d39060243590611a35565b346104be5760203660031901126104b9576104b2600435610a9f611c97565b611cef565b346104be5760403660031901126104b9576024356004356001600160401b0382116104b4577f713ca53b88d6eb63f5b1854cb8cbdd736ec51eda225e46791aa9298b0160648f610afb6104b2933690600401610409565b91610b04611c97565b60675481606755610b276040519283928360209093929193604081019481520152565b0390a16117e4565b346104be575f3660031901126104b957610b47611c97565b603380546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346104be5760203660031901126104b957600435610ba7816103f4565b335f52606e60205260ff60405f20541615610bc6576104b29033611de9565b6325ec6c1f60e01b5f5260045ffd5b346104be575f3660031901126104b957335f908152606e60205260409020610c0790610c03905b5460ff1690565b1590565b610bc657610c1e610c19606554611e7a565b606555565b335f908152606e60205260409020805460ff19169055610c45610c40336120be565b6121ef565b5050606854610c6a90610c5e906001600160a01b031681565b6001600160a01b031690565b803b15610cef576040516351b27a6d60e11b8152336004820152905f908290602490829084905af18015610cea57610cd0575b6068546001600160a01b0316337f31e0adfec71bccee37b6e83a90c2fedb17d8f1693fee863c4771e7bfe2aed5805f80a3005b80610cde5f610ce493610352565b806106d5565b5f610c9d565b6115a5565b611488565b346104be575f3660031901126104b9576033546040516001600160a01b039091168152602090f35b346104be5760403660031901126104b95760206104fe600435610d3e816103f4565b60243590610d4b826104c3565b60018060a01b03165f52606d835263ffffffff60405f20911690611a35565b346104be5760203660031901126104b95760206104fe600435610d8c816103f4565b6115f2565b346104be5760203660031901126104b957600435610dae816103f4565b60018060a01b03165f52606a602052602060018060a01b036107d360405f20611bfd565b919060208382031261095557604051610dea816102fc565b80938035906001600160401b038211610950570182601f8201121561047557803590610e1582610384565b93610e236040519586610352565b82855260208086019360061b8301019181831161047057602001925b828410610e4d575050505052565b6040848303126109555760405190610e6482610337565b8435610e6f816103f4565b82526020850135906001600160601b03821682036104055782602092836040950152815201930192610e3f565b346104be5760603660031901126104b957600435610eb9816103f4565b6044356024356001600160401b0382116104b457610ede610f26923690600401610dd2565b905f5493610f0c610ef6610c038760ff9060081c1690565b80968197610fa0575b8115610f80575b50611766565b84610f1d600160ff195f5416175f55565b610f6957611ee6565b610f2c57005b610f3a61ff00195f54165f55565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1005b610f7b61010061ff00195f5416175f55565b611ee6565b303b15915081610f92575b505f610f06565b60ff1660011490505f610f8b565b600160ff8216109150610eff565b346104be575f3660031901126104b957606c5480610fdd575060205f5b6040516001600160e01b039091168152f35b805f1981011161101857606c5f527f2b4a51ab505fc96a0952efda2ba61bcd3078d4c02c39a186ec16f21883fbe0150154602090811c610fcb565b6115b0565b346104be5760403660031901126104b9576004356001600160401b0381116104b45761104d903690600401610dd2565b602435906001600160401b0382116104b4576104ad6110736104b2933690600401610409565b9161107c611c97565b611fc7565b346104be5760203660031901126104b95760043561109e816103f4565b60018060a01b03165f52606e602052602060ff60405f2054166040519015158152f35b346104be5760203660031901126104b9576004356110de816103f4565b6110e6611c97565b6001600160a01b038116156110fe576104b290611da1565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b9080601f83011215610475578151916111cd83610384565b926111db6040519485610352565b80845260208085019160051b830101918383116104705760208101915b83831061120757505050505090565b82516001600160401b03811161047557820185603f82011215610475576020810151916112338361055b565b6112406040519182610352565b83815260408385010188106105bc575f602085819660408397018386015e830101528152019201916111f8565b5190610382826104c3565b6066549061128582610384565b916112936040519384610352565b80835260665f9081525f5160206127f65f395f51905f52602085015b8383106112bc5750505050565b6001602081926040516112ce81610337565b8554848060a01b038116825260a01c838201528152019201920191906112af565b335f908152606e6020526040902090919061130990610bfc565b6113ed576113529061131f610c19606554611c27565b335f908152606e6020526040902061133e90805460ff19166001179055565b61134a610c40336120be565b505033611de9565b60685461136990610c5e906001600160a01b031681565b803b15610cef57604051639926ee7d60e01b8152915f918391829084908290611396903360048401611c59565b03925af18015610cea576113d9575b506068546001600160a01b0316337fa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c15f80a3565b80610cde5f6113e793610352565b5f6113a5565b6342ee68b560e01b5f5260045ffd5b634e487b7160e01b5f52603260045260245ffd5b80518210156114245760209160051b010190565b6113fc565b805115611424576020015180516065540361144757610382906117e4565b63169efb5b60e11b5f5260045ffd5b9061146082610384565b61146d6040519182610352565b828152809261147e601f1991610384565b0190602036910137565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b6020818303126104b9578051906001600160401b0382116104b457019080601f8301121561047557815161150e81610384565b9261151c6040519485610352565b81845260208085019260051b82010192831161047057602001905b8282106115445750505090565b8151815260209182019101611537565b6060602091604081019360018060a01b031681526040838201528451809452019201905f5b8181106115865750505090565b82516001600160a01b0316845260209384019390920191600101611579565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b8181029291811591840414171561101857565b906001820180921161101857565b9190820180921161101857565b6115fa611278565b915f906116078451611456565b915f5b8551811015611653578061164d6116346116266001948a611410565b51516001600160a01b031690565b61163e8388611410565b6001600160a01b039091169052565b0161160a565b50909290917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169190823b15610cef57604051639004134760e01b8152925f928492839182916116ae9160048401611554565b03915afa908115610cea575f91611744575b505f915b84518310156117225761171a6001916117146116e08686611410565b5161170e61170260206116f38a8d611410565b5101516001600160601b031690565b6001600160601b031690565b906115c4565b906115e5565b9201916116c4565b915050611733919250612710900490565b606754811061173f5790565b505f90565b61176091503d805f833e6117588183610352565b8101906114db565b5f6116c0565b1561176d57565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b9190915f838201938412911290801582169115161761101857565b905f805b83518210156118225760019061181a906118146001600160a01b0361180d8689611410565b51166120be565b906117c9565b9101906117e8565b905061182f9192506121ef565b5050565b5f1981019190821161101857565b438110156119245761185290612274565b606b549063ffffffff165f5b8281106118bf5750508061187b57505f5b6001600160e01b031690565b6118b361188a6118ba92611833565b606b5f527fbd43cb8ece8cd1863bcd6082d65c5b0d25665b1ce17980f0da43c0ed545f98b40190565b5460201c90565b61186f565b90918082169080831860011c820180921161101857606b5f527fbd43cb8ece8cd1863bcd6082d65c5b0d25665b1ce17980f0da43c0ed545f98b482015463ffffffff168410156119125750915b9061185e565b92915061191e906115d7565b9061190c565b606460405162461bcd60e51b815260206004820152602060248201527f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e65646044820152fd5b438110156119245761197990612274565b606c549063ffffffff165f5b8281106119d05750508061199857505f90565b6118b36119a76118ba92611833565b606c5f527f2b4a51ab505fc96a0952efda2ba61bcd3078d4c02c39a186ec16f21883fbe0160190565b90918082169080831860011c820180921161101857606c5f527f2b4a51ab505fc96a0952efda2ba61bcd3078d4c02c39a186ec16f21883fbe01682015463ffffffff16841015611a235750915b90611985565b929150611a2f906115d7565b90611a1d565b904381101561192457611a4790612274565b81549063ffffffff165f5b828110611a8257505080611a6757505f919050565b6118ba91611a776118b392611833565b905f5260205f200190565b90918082169080831860011c820180921161101857845f528363ffffffff611ab48460205f200163ffffffff90541690565b161115611ac45750915b90611a52565b929150611ad0906115d7565b90611abe565b939291938151905f955f9381518403611baa578315611b9b579291905f935b838510611b0c575050505050610382929350612460565b909192939460018060a01b03611b228784611410565b51169863ffffffff88169143831015611b8c57611b77611b8192611b658d600196815f52606a602052611b5e888060a01b039160405f20611a35565b16926122dc565b87611b708b89611410565b5191612300565b611714898c612435565b950193929190611af5565b63e64f180f60e01b5f5260045ffd5b63251f56a160e21b5f5260045ffd5b631fec674760e31b5f5260045ffd5b606b5480611bc657505f90565b805f1981011161101857606b5f527fbd43cb8ece8cd1863bcd6082d65c5b0d25665b1ce17980f0da43c0ed545f98b3015460201c90565b80549081611c0b5750505f90565b815f19810111611018575f525f199060205f2001015460201c90565b5f1981146110185760010190565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9060018060a01b031681526040602082015260806040611c84845160608386015260a0850190611c35565b9360208101516060850152015191015290565b6033546001600160a01b03163303611cab57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b611cf843612274565b6001600160e01b038211611d4c577f9324f7e5a7c0288808a634ccde44b8e979676474b22e29ee9dd569b55e791a4b91602091611d41906001600160e01b03831690606c612620565b5050604051908152a1565b60405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608490fd5b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b6001600160a01b039081165f818152606a6020526040902090929190611e0e90611bfd565b6001600160a01b0390921692911690828214611e7557805f52606a602052611e398360405f206124d1565b50506040516001600160a01b03909216825243917fd061168252f441733658f09e4d8f5b2d998ed4ef24a2bbfd6ceca52ea131500290602090a4565b505050565b8015611018575f190190565b15611e8d57565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b611f1f929161107c91611eff60ff5f5460081c16611e86565b60018060a01b03166001600160601b0360a01b6068541617606855611cef565b611f3860ff5f5460081c16611f3381611e86565b611e86565b61038233611da1565b606654600160401b81101561031757600181016066556066548110156114245760665f5281516020929092015160a01b6001600160a01b0319166001600160a01b0392909216919091175f5160206127f65f395f51905f5290910155565b9091611fb6611fc4936040845260408401906106df565b9160208184039101526106df565b90565b611fd0816124fb565b156120975760405191611fe2836102fc565b611fea611278565b83526066545f6066558061205d575b505f5b82518051821015612023579061201d61201782600194611410565b51611f41565b01611ffc565b505091907f23aad4e61744ece164130aa415c1616e80136b0f0770e56589438b90b269265e9161205860405192839283611f9f565b0390a1565b60665f525f5160206127f65f395f51905f52015f5160206127f65f395f51905f525b81811061208c5750611ff9565b5f815560010161207f565b63d173577960e01b5f5260045ffd5b81810392915f13801582851316918412161761101857565b6001600160a01b0381165f818152606d6020526040812090929083906120e390611bfd565b60018060e01b0316938461211260ff61210c8660018060a01b03165f52606e60205260405f2090565b54161590565b1561218757612120916120a6565b9384156121805761216a6121657f88770dc862e47a7ed586907857eb1b75e4c5ffc8b707c7ee10eb74d6885fe5949460018060a01b03165f52606d60205260405f2090565b6124ac565b50505b604080519182526020820192909252a290565b5050505090565b505050612193816115f2565b61219d84826120a6565b938415612180576121e8826121e37f88770dc862e47a7ed586907857eb1b75e4c5ffc8b707c7ee10eb74d6885fe5949560018060a01b03165f52606d60205260405f2090565b6124d1565b505061216d565b9061220b6001600160e01b03612203611bb9565b1692836117c9565b9061221543612274565b6001600160e01b038311611d4c57612239906001600160e01b03841690606b612620565b505060408051848152602081018490527f86dcf86b12dfeedea74ae9300dbdaa193bcce5809369c8177ea2f4eaaa65729b9181908101612058565b63ffffffff81116122885763ffffffff1690565b60405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608490fd5b6001600160a01b03918216911610156122f157565b63ba50f91160e01b5f5260045ffd5b91909161230d8284612736565b9390926005851015612421576123369415938461240b575b50831561234b575b50505015151590565b61233c57565b638baa579f60e01b5f5260045ffd5b5f9350906123836123918594936040519283916020830195630b135d3f60e11b87526024840152604060448401526064830190611c35565b03601f198101835282610352565b51915afa3d15612404573d6123a58161055b565b906123b36040519283610352565b81523d5f602083013e5b816123f6575b816123d2575b505f808061232d565b90506123ef630b135d3f60e11b916020808251830101910161276b565b145f6123c9565b9050602081511015906123c3565b60606123bd565b6001600160a01b0384811691161493505f612325565b634e487b7160e01b5f52602160045260245ffd5b9063ffffffff1643811015611b8c57611fc49160018060a01b03165f52606d60205260405f20611a35565b9063ffffffff1643811015611b8c5761247881611841565b821161249d5761248790611968565b1161248e57565b63e121632f60e01b5f5260045ffd5b634b05a0f760e11b5f5260045ffd5b5f6124c0916124ba43612274565b90612620565b6001600160e01b0391821692911690565b6124da43612274565b6001600160e01b038311611d4c576124c0926001600160e01b031691612620565b515f919082805b82518210156125515761251b610c5e6116268486611410565b906001600160a01b03808316911610156122f1576125486001919561171461170260206116f38789611410565b91019093612502565b5050509061271014155f14612564575f90565b600190565b805490600160401b8210156103175760018201808255821015611424575f9081526020902001815160209283015190921b63ffffffff191663ffffffff92909216919091179055565b906040516125bf81610337565b602081935463ffffffff81168352811c910152565b156125db57565b60405162461bcd60e51b815260206004820152601b60248201527f436865636b706f696e743a2064656372656173696e67206b65797300000000006044820152606490fd5b909291928382548015155f1461270c579260209291846126586126536126486126d298611833565b855f5260205f200190565b6125b2565b9363ffffffff61267d61266f875163ffffffff1690565b8284169283911611156125d4565b61269761268e875163ffffffff1690565b63ffffffff1690565b036126d657506126c492611a776126ad92611833565b9063ffffffff82549181199060201b169116179055565b01516001600160e01b031690565b9190565b915050612707916126f46126e8610373565b63ffffffff9093168352565b6001600160e01b03881682860152612569565b6126c4565b50506127319161271d6126e8610373565b6001600160e01b0385166020830152612569565b5f9190565b9060418151145f146127625761275e91602082015190606060408401519301515f1a9061277a565b9091565b50505f90600290565b908160209103126104b9575190565b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116127ea576020935f9360ff60809460405194855216868401526040830152606082015282805260015afa15610cea575f516001600160a01b038116156127e257905f90565b505f90600190565b505050505f9060039056fe46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e94354a264697066735822122065228802ecf42e415d7efdffc5621990f8f9b914239e66be849ad464a8dd1c2164736f6c634300081c0033"; type ECDSAStakeRegistryConstructorParams = | [signer?: Signer] diff --git a/src/avs/contracts/factories/ERC20Mock__factory.ts b/src/avs/contracts/factories/ERC20Mock__factory.ts index 0b213021..bc83770a 100644 --- a/src/avs/contracts/factories/ERC20Mock__factory.ts +++ b/src/avs/contracts/factories/ERC20Mock__factory.ts @@ -302,7 +302,7 @@ const _abi = [ ] as const; const _bytecode = - "0x608080604052346102c557610012610312565b61001a610312565b81516001600160401b0381116101d857600354600181811c911680156102bb575b60208210146101ba57601f8111610258575b50602092601f82116001146101f757928192935f926101ec575b50508160011b915f199060031b1c1916176003555b80516001600160401b0381116101d857600454600181811c911680156101ce575b60208210146101ba57601f8111610157575b50602091601f82116001146100f7579181925f926100ec575b50508160011b915f199060031b1c1916176004555b604051610a4a90816103358239f35b0151905082806100c8565b601f1982169260045f52805f20915f5b85811061013f57508360019510610127575b505050811b016004556100dd565b01515f1960f88460031b161c19169055828080610119565b91926020600181928685015181550194019201610107565b60045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f830160051c810191602084106101b0575b601f0160051c01905b8181106101a557506100af565b5f8155600101610198565b909150819061018f565b634e487b7160e01b5f52602260045260245ffd5b90607f169061009d565b634e487b7160e01b5f52604160045260245ffd5b015190508380610067565b601f1982169360035f52805f20915f5b8681106102405750836001959610610228575b505050811b0160035561007c565b01515f1960f88460031b161c1916905583808061021a565b91926020600181928685015181550194019201610207565b60035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f830160051c810191602084106102b1575b601f0160051c01905b8181106102a6575061004d565b5f8155600101610299565b9091508190610290565b90607f169061003b565b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405190602082016001600160401b038111838210176101d8576040525f825256fe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b5f3560e01c806306fdde03146105a6578063095ea7b31461058057806318160ddd1461056357806323b872dd146104a6578063313ce5671461048b578063395093511461043d57806340c10f191461037957806370a082311461034257806395d89b4114610227578063a457c2d714610184578063a9059cbb146101535763dd62ed3e0361000e573461014e57604036600319011261014957610112610742565b61011a61075c565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b6106c8565b610678565b3461014e5760403660031901126101495761017961016f610742565b6024359033610897565b602060405160018152f35b3461014e5760403660031901126101495761019d610742565b60243590335f52600160205260405f2060018060a01b0382165f5260205260405f2054918083106101d45761017992039033610793565b60405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608490fd5b3461014e575f366003190112610149576040515f6004548060011c90600181168015610338575b6020831081146103245782855290811561030857506001146102b3575b50819003601f01601f191681019067ffffffffffffffff82118183101761029f5761029b82918260405282610718565b0390f35b634e487b7160e01b5f52604160045260245ffd5b905060045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5f905b8282106102f25750602091508201018261026b565b60018160209254838588010152019101906102dd565b90506020925060ff191682840152151560051b8201018261026b565b634e487b7160e01b5f52602260045260245ffd5b91607f169161024e565b3461014e576020366003190112610149576001600160a01b03610363610742565b165f525f602052602060405f2054604051908152f35b3461014e57604036600319011261014957610392610742565b6001600160a01b031660243581156103f8577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020826103d55f94600254610772565b600255848452838252604084206103ed828254610772565b9055604051908152a3005b60405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606490fd5b3461014e57604036600319011261014957610179610459610742565b335f52600160205260405f2060018060a01b0382165f5260205261048460405f206024359054610772565b9033610793565b3461014e575f36600319011261014957602060405160128152f35b3461014e576060366003190112610149576104bf610742565b6104c761075c565b6001600160a01b0382165f908152600160208181526040808420338552909152909120549260443592918401610502575b6101799350610897565b82841061051e576105198361017995033383610793565b6104f8565b60405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b3461014e575f366003190112610149576020600254604051908152f35b3461014e5760403660031901126101495761017961059c610742565b6024359033610793565b34610678575f366003190112610149576040515f6003548060011c9060018116801561066e575b6020831081146103245782855290811561030857506001146106195750819003601f01601f191681019067ffffffffffffffff82118183101761029f5761029b82918260405282610718565b905060035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5f905b8282106106585750602091508201018261026b565b6001816020925483858801015201910190610643565b91607f16916105cd565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361075857565b5f80fd5b602435906001600160a01b038216820361075857565b9190820180921161077f57565b634e487b7160e01b5f52601160045260245ffd5b6001600160a01b0316908115610846576001600160a01b03169182156107f65760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591835f526001825260405f20855f5282528060405f2055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b6001600160a01b03169081156109c1576001600160a01b031691821561097057815f525f60205260405f205481811061091c57817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f525f825260405f20610911828254610772565b9055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fdfea2646970667358221220e3950316135a8c39b3d8c2bce2400942278f8c1272f2e8ffe36e036dd524035f64736f6c634300081a0033"; + "0x608080604052346102c557610012610312565b61001a610312565b81516001600160401b0381116101d857600354600181811c911680156102bb575b60208210146101ba57601f8111610258575b50602092601f82116001146101f757928192935f926101ec575b50508160011b915f199060031b1c1916176003555b80516001600160401b0381116101d857600454600181811c911680156101ce575b60208210146101ba57601f8111610157575b50602091601f82116001146100f7579181925f926100ec575b50508160011b915f199060031b1c1916176004555b604051610a3c90816103358239f35b0151905082806100c8565b601f1982169260045f52805f20915f5b85811061013f57508360019510610127575b505050811b016004556100dd565b01515f1960f88460031b161c19169055828080610119565b91926020600181928685015181550194019201610107565b60045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f830160051c810191602084106101b0575b601f0160051c01905b8181106101a557506100af565b5f8155600101610198565b909150819061018f565b634e487b7160e01b5f52602260045260245ffd5b90607f169061009d565b634e487b7160e01b5f52604160045260245ffd5b015190508380610067565b601f1982169360035f52805f20915f5b8681106102405750836001959610610228575b505050811b0160035561007c565b01515f1960f88460031b161c1916905583808061021a565b91926020600181928685015181550194019201610207565b60035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f830160051c810191602084106102b1575b601f0160051c01905b8181106102a6575061004d565b5f8155600101610299565b9091508190610290565b90607f169061003b565b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405190602082016001600160401b038111838210176101d8576040525f825256fe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b5f3560e01c806306fdde031461059f578063095ea7b31461057957806318160ddd1461055c57806323b872dd1461049f578063313ce56714610484578063395093511461043657806340c10f191461037957806370a082311461034257806395d89b4114610227578063a457c2d714610184578063a9059cbb146101535763dd62ed3e0361000e573461014e5760403660031901126101495761011261073b565b61011a610755565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b6106c1565b610671565b3461014e5760403660031901126101495761017961016f61073b565b6024359033610890565b602060405160018152f35b3461014e5760403660031901126101495761019d61073b565b60243590335f52600160205260405f2060018060a01b0382165f5260205260405f2054918083106101d4576101799203903361078c565b60405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608490fd5b3461014e575f366003190112610149576040515f6004548060011c90600181168015610338575b6020831081146103245782855290811561030857506001146102b3575b50819003601f01601f191681019067ffffffffffffffff82118183101761029f5761029b82918260405282610711565b0390f35b634e487b7160e01b5f52604160045260245ffd5b905060045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5f905b8282106102f25750602091508201018261026b565b60018160209254838588010152019101906102dd565b90506020925060ff191682840152151560051b8201018261026b565b634e487b7160e01b5f52602260045260245ffd5b91607f169161024e565b3461014e576020366003190112610149576001600160a01b0361036361073b565b165f525f602052602060405f2054604051908152f35b3461014e5760403660031901126101495761039261073b565b6001600160a01b031660243581156103f1577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020826103d55f9460025461076b565b60025584845283825260408420818154019055604051908152a3005b60405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606490fd5b3461014e5760403660031901126101495761017961045261073b565b335f52600160205260405f2060018060a01b0382165f5260205261047d60405f20602435905461076b565b903361078c565b3461014e575f36600319011261014957602060405160128152f35b3461014e576060366003190112610149576104b861073b565b6104c0610755565b6001600160a01b0382165f9081526001602081815260408084203385529091529091205492604435929184016104fb575b6101799350610890565b82841061051757610512836101799503338361078c565b6104f1565b60405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b3461014e575f366003190112610149576020600254604051908152f35b3461014e5760403660031901126101495761017961059561073b565b602435903361078c565b34610671575f366003190112610149576040515f6003548060011c90600181168015610667575b6020831081146103245782855290811561030857506001146106125750819003601f01601f191681019067ffffffffffffffff82118183101761029f5761029b82918260405282610711565b905060035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5f905b8282106106515750602091508201018261026b565b600181602092548385880101520191019061063c565b91607f16916105c6565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361075157565b5f80fd5b602435906001600160a01b038216820361075157565b9190820180921161077857565b634e487b7160e01b5f52601160045260245ffd5b6001600160a01b031690811561083f576001600160a01b03169182156107ef5760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591835f526001825260405f20855f5282528060405f2055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b6001600160a01b03169081156109b3576001600160a01b031691821561096257815f525f60205260405f205481811061090e57817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fdfea26469706673582212203e3c704f1582f9a42519d44672ec33c5b3c97e0aee53fd51e9f68e4fb353cd4264736f6c634300081c0033"; type ERC20MockConstructorParams = | [signer?: Signer] diff --git a/src/avs/contracts/factories/ReclaimServiceManager__factory.ts b/src/avs/contracts/factories/ReclaimServiceManager__factory.ts index 79b29aeb..fbac7e73 100644 --- a/src/avs/contracts/factories/ReclaimServiceManager__factory.ts +++ b/src/avs/contracts/factories/ReclaimServiceManager__factory.ts @@ -15,44 +15,66 @@ const _abi = [ { name: "_avsDirectory", type: "address", - internalType: "address", + internalType: "contract IAVSDirectory", + }, + { + name: "_slashingRegistryCoordinator", + type: "address", + internalType: "contract ISlashingRegistryCoordinator", }, { name: "_stakeRegistry", type: "address", - internalType: "address", + internalType: "contract IStakeRegistry", }, { - name: "_rewardsCoordinator", + name: "rewards_coordinator", type: "address", internalType: "address", }, { - name: "_delegationManager", + name: "allocationManager", type: "address", - internalType: "address", + internalType: "contract IAllocationManager", + }, + { + name: "_permissionController", + type: "address", + internalType: "contract IPermissionController", + }, + { + name: "_taskManager", + type: "address", + internalType: "contract IReclaimTaskManager", }, ], stateMutability: "nonpayable", }, { type: "function", - name: "allTaskHashes", + name: "addOperatorToWhitelist", inputs: [ { - name: "", - type: "uint32", - internalType: "uint32", + name: "operator", + type: "address", + internalType: "address", }, ], - outputs: [ + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "addPendingAdmin", + inputs: [ { - name: "", - type: "bytes32", - internalType: "bytes32", + name: "admin", + type: "address", + internalType: "address", }, ], - stateMutability: "view", + outputs: [], + stateMutability: "nonpayable", }, { type: "function", @@ -74,12 +96,13 @@ const _abi = [ { name: "rewardsSubmissions", type: "tuple[]", - internalType: "struct IRewardsCoordinator.RewardsSubmission[]", + internalType: "struct IRewardsCoordinatorTypes.RewardsSubmission[]", components: [ { name: "strategiesAndMultipliers", type: "tuple[]", - internalType: "struct IRewardsCoordinator.StrategyAndMultiplier[]", + internalType: + "struct IRewardsCoordinatorTypes.StrategyAndMultiplier[]", components: [ { name: "strategy", @@ -119,56 +142,6 @@ const _abi = [ outputs: [], stateMutability: "nonpayable", }, - { - type: "function", - name: "createNewTask", - inputs: [ - { - name: "request", - type: "tuple", - internalType: "struct IReclaimServiceManager.ClaimRequest", - components: [ - { - name: "provider", - type: "string", - internalType: "string", - }, - { - name: "claimUserId", - type: "bytes32", - internalType: "bytes32", - }, - { - name: "claimHash", - type: "bytes32", - internalType: "bytes32", - }, - { - name: "requestedAt", - type: "uint32", - internalType: "uint32", - }, - { - name: "owner", - type: "address", - internalType: "address", - }, - { - name: "fee", - type: "uint256", - internalType: "uint256", - }, - ], - }, - { - name: "requestSignature", - type: "bytes", - internalType: "bytes", - }, - ], - outputs: [], - stateMutability: "nonpayable", - }, { type: "function", name: "createOperatorDirectedAVSRewardsSubmission", @@ -177,12 +150,13 @@ const _abi = [ name: "operatorDirectedRewardsSubmissions", type: "tuple[]", internalType: - "struct IRewardsCoordinator.OperatorDirectedRewardsSubmission[]", + "struct IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]", components: [ { name: "strategiesAndMultipliers", type: "tuple[]", - internalType: "struct IRewardsCoordinator.StrategyAndMultiplier[]", + internalType: + "struct IRewardsCoordinatorTypes.StrategyAndMultiplier[]", components: [ { name: "strategy", @@ -204,7 +178,7 @@ const _abi = [ { name: "operatorRewards", type: "tuple[]", - internalType: "struct IRewardsCoordinator.OperatorReward[]", + internalType: "struct IRewardsCoordinatorTypes.OperatorReward[]", components: [ { name: "operator", @@ -239,19 +213,6 @@ const _abi = [ outputs: [], stateMutability: "nonpayable", }, - { - type: "function", - name: "defaultStrategy", - inputs: [], - outputs: [ - { - name: "", - type: "address", - internalType: "address", - }, - ], - stateMutability: "view", - }, { type: "function", name: "deregisterOperatorFromAVS", @@ -267,92 +228,28 @@ const _abi = [ }, { type: "function", - name: "encodeClaimRequest", - inputs: [ - { - name: "request", - type: "tuple", - internalType: "struct IReclaimServiceManager.ClaimRequest", - components: [ - { - name: "provider", - type: "string", - internalType: "string", - }, - { - name: "claimUserId", - type: "bytes32", - internalType: "bytes32", - }, - { - name: "claimHash", - type: "bytes32", - internalType: "bytes32", - }, - { - name: "requestedAt", - type: "uint32", - internalType: "uint32", - }, - { - name: "owner", - type: "address", - internalType: "address", - }, - { - name: "fee", - type: "uint256", - internalType: "uint256", - }, - ], - }, - ], - outputs: [ - { - name: "", - type: "bytes", - internalType: "bytes", - }, - ], - stateMutability: "pure", - }, - { - type: "function", - name: "getMetadataForOperator", + name: "deregisterOperatorFromOperatorSets", inputs: [ { name: "operator", type: "address", internalType: "address", }, - ], - outputs: [ { - name: "", - type: "tuple", - internalType: "struct IReclaimServiceManager.OperatorMetadata", - components: [ - { - name: "addr", - type: "address", - internalType: "address", - }, - { - name: "url", - type: "string", - internalType: "string", - }, - ], + name: "operatorSetIds", + type: "uint32[]", + internalType: "uint32[]", }, ], - stateMutability: "view", + outputs: [], + stateMutability: "nonpayable", }, { type: "function", name: "getOperatorRestakedStrategies", inputs: [ { - name: "_operator", + name: "operator", type: "address", internalType: "address", }, @@ -379,19 +276,6 @@ const _abi = [ ], stateMutability: "view", }, - { - type: "function", - name: "getToken", - inputs: [], - outputs: [ - { - name: "", - type: "address", - internalType: "contract IERC20", - }, - ], - stateMutability: "view", - }, { type: "function", name: "initialize", @@ -402,7 +286,7 @@ const _abi = [ internalType: "address", }, { - name: "strategy", + name: "rewardsInitiator", type: "address", internalType: "address", }, @@ -431,57 +315,84 @@ const _abi = [ }, { type: "function", - name: "latestTaskNum", + name: "owner", inputs: [], outputs: [ { name: "", - type: "uint32", - internalType: "uint32", + type: "address", + internalType: "address", }, ], stateMutability: "view", }, { type: "function", - name: "operatorHasMinimumWeight", + name: "registerOperatorToAVS", inputs: [ { name: "operator", type: "address", internalType: "address", }, - ], - outputs: [ { - name: "", - type: "bool", - internalType: "bool", + name: "operatorSignature", + type: "tuple", + internalType: + "struct ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiry", + components: [ + { + name: "signature", + type: "bytes", + internalType: "bytes", + }, + { + name: "salt", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "expiry", + type: "uint256", + internalType: "uint256", + }, + ], }, ], - stateMutability: "view", + outputs: [], + stateMutability: "nonpayable", }, { type: "function", - name: "owner", - inputs: [], - outputs: [ + name: "removeAdmin", + inputs: [ { - name: "", + name: "admin", type: "address", internalType: "address", }, ], - stateMutability: "view", + outputs: [], + stateMutability: "nonpayable", }, { type: "function", - name: "pause", + name: "removeAppointee", inputs: [ { - name: "newPausedStatus", - type: "uint256", - internalType: "uint256", + name: "appointee", + type: "address", + internalType: "address", + }, + { + name: "target", + type: "address", + internalType: "address", + }, + { + name: "selector", + type: "bytes4", + internalType: "bytes4", }, ], outputs: [], @@ -489,86 +400,68 @@ const _abi = [ }, { type: "function", - name: "pauseAll", - inputs: [], + name: "removeOperatorFromWhitelist", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + ], outputs: [], stateMutability: "nonpayable", }, { type: "function", - name: "paused", + name: "removePendingAdmin", inputs: [ { - name: "index", - type: "uint8", - internalType: "uint8", - }, - ], - outputs: [ - { - name: "", - type: "bool", - internalType: "bool", + name: "pendingAdmin", + type: "address", + internalType: "address", }, ], - stateMutability: "view", + outputs: [], + stateMutability: "nonpayable", }, { type: "function", - name: "paused", + name: "renounceOwnership", inputs: [], - outputs: [ - { - name: "", - type: "uint256", - internalType: "uint256", - }, - ], - stateMutability: "view", + outputs: [], + stateMutability: "nonpayable", }, { type: "function", - name: "pauserRegistry", + name: "rewardsInitiator", inputs: [], outputs: [ { name: "", type: "address", - internalType: "contract IPauserRegistry", + internalType: "address", }, ], stateMutability: "view", }, { type: "function", - name: "registerOperatorToAVS", + name: "setAppointee", inputs: [ { - name: "operator", + name: "appointee", type: "address", internalType: "address", }, { - name: "operatorSignature", - type: "tuple", - internalType: "struct ISignatureUtils.SignatureWithSaltAndExpiry", - components: [ - { - name: "signature", - type: "bytes", - internalType: "bytes", - }, - { - name: "salt", - type: "bytes32", - internalType: "bytes32", - }, - { - name: "expiry", - type: "uint256", - internalType: "uint256", - }, - ], + name: "target", + type: "address", + internalType: "address", + }, + { + name: "selector", + type: "bytes4", + internalType: "bytes4", }, ], outputs: [], @@ -576,51 +469,7 @@ const _abi = [ }, { type: "function", - name: "registeredOperators", - inputs: [ - { - name: "", - type: "uint256", - internalType: "uint256", - }, - ], - outputs: [ - { - name: "addr", - type: "address", - internalType: "address", - }, - { - name: "url", - type: "string", - internalType: "string", - }, - ], - stateMutability: "view", - }, - { - type: "function", - name: "renounceOwnership", - inputs: [], - outputs: [], - stateMutability: "nonpayable", - }, - { - type: "function", - name: "rewardsInitiator", - inputs: [], - outputs: [ - { - name: "", - type: "address", - internalType: "address", - }, - ], - stateMutability: "view", - }, - { - type: "function", - name: "setClaimerFor", + name: "setClaimerFor", inputs: [ { name: "claimer", @@ -631,19 +480,6 @@ const _abi = [ outputs: [], stateMutability: "nonpayable", }, - { - type: "function", - name: "setPauserRegistry", - inputs: [ - { - name: "newPauserRegistry", - type: "address", - internalType: "contract IPauserRegistry", - }, - ], - outputs: [], - stateMutability: "nonpayable", - }, { type: "function", name: "setRewardsInitiator", @@ -659,147 +495,13 @@ const _abi = [ }, { type: "function", - name: "stakeRegistry", + name: "taskManager", inputs: [], outputs: [ { name: "", type: "address", - internalType: "address", - }, - ], - stateMutability: "view", - }, - { - type: "function", - name: "taskCompleted", - inputs: [ - { - name: "completedTask", - type: "tuple", - internalType: "struct IReclaimServiceManager.CompletedTask", - components: [ - { - name: "task", - type: "tuple", - internalType: "struct IReclaimServiceManager.Task", - components: [ - { - name: "request", - type: "tuple", - internalType: "struct IReclaimServiceManager.ClaimRequest", - components: [ - { - name: "provider", - type: "string", - internalType: "string", - }, - { - name: "claimUserId", - type: "bytes32", - internalType: "bytes32", - }, - { - name: "claimHash", - type: "bytes32", - internalType: "bytes32", - }, - { - name: "requestedAt", - type: "uint32", - internalType: "uint32", - }, - { - name: "owner", - type: "address", - internalType: "address", - }, - { - name: "fee", - type: "uint256", - internalType: "uint256", - }, - ], - }, - { - name: "createdAt", - type: "uint32", - internalType: "uint32", - }, - { - name: "expiresAt", - type: "uint32", - internalType: "uint32", - }, - { - name: "minimumSignatures", - type: "uint8", - internalType: "uint8", - }, - { - name: "operators", - type: "tuple[]", - internalType: "struct IReclaimServiceManager.Operator[]", - components: [ - { - name: "addr", - type: "address", - internalType: "address", - }, - { - name: "url", - type: "string", - internalType: "string", - }, - ], - }, - { - name: "feePaid", - type: "uint256", - internalType: "uint256", - }, - ], - }, - { - name: "signatures", - type: "bytes[]", - internalType: "bytes[]", - }, - ], - }, - { - name: "referenceTaskIndex", - type: "uint32", - internalType: "uint32", - }, - ], - outputs: [], - stateMutability: "nonpayable", - }, - { - type: "function", - name: "taskCreationMetadata", - inputs: [], - outputs: [ - { - name: "maxTaskLifetimeS", - type: "uint32", - internalType: "uint32", - }, - { - name: "minSignaturesPerTask", - type: "uint8", - internalType: "uint8", - }, - { - name: "maxTaskCreationDelayS", - type: "uint32", - internalType: "uint32", - }, - { - name: "minFee", - type: "uint256", - internalType: "uint256", + internalType: "contract IReclaimTaskManager", }, ], stateMutability: "view", @@ -817,19 +519,6 @@ const _abi = [ outputs: [], stateMutability: "nonpayable", }, - { - type: "function", - name: "unpause", - inputs: [ - { - name: "newPausedStatus", - type: "uint256", - internalType: "uint256", - }, - ], - outputs: [], - stateMutability: "nonpayable", - }, { type: "function", name: "updateAVSMetadataURI", @@ -843,84 +532,6 @@ const _abi = [ outputs: [], stateMutability: "nonpayable", }, - { - type: "function", - name: "updateOperatorMetadata", - inputs: [ - { - name: "metadata", - type: "tuple", - internalType: "struct IReclaimServiceManager.OperatorMetadata", - components: [ - { - name: "addr", - type: "address", - internalType: "address", - }, - { - name: "url", - type: "string", - internalType: "string", - }, - ], - }, - ], - outputs: [], - stateMutability: "nonpayable", - }, - { - type: "function", - name: "updateTaskCreationMetadata", - inputs: [ - { - name: "newMetadata", - type: "tuple", - internalType: "struct IReclaimServiceManager.TaskCreationMetadata", - components: [ - { - name: "maxTaskLifetimeS", - type: "uint32", - internalType: "uint32", - }, - { - name: "minSignaturesPerTask", - type: "uint8", - internalType: "uint8", - }, - { - name: "maxTaskCreationDelayS", - type: "uint32", - internalType: "uint32", - }, - { - name: "minFee", - type: "uint256", - internalType: "uint256", - }, - ], - }, - ], - outputs: [], - stateMutability: "nonpayable", - }, - { - type: "function", - name: "whitelistAddressAsOperator", - inputs: [ - { - name: "operator", - type: "address", - internalType: "address", - }, - { - name: "isWhitelisted", - type: "bool", - internalType: "bool", - }, - ], - outputs: [], - stateMutability: "nonpayable", - }, { type: "function", name: "whitelistedOperators", @@ -953,101 +564,6 @@ const _abi = [ ], anonymous: false, }, - { - type: "event", - name: "NewTaskCreated", - inputs: [ - { - name: "taskIndex", - type: "uint32", - indexed: true, - internalType: "uint32", - }, - { - name: "task", - type: "tuple", - indexed: false, - internalType: "struct IReclaimServiceManager.Task", - components: [ - { - name: "request", - type: "tuple", - internalType: "struct IReclaimServiceManager.ClaimRequest", - components: [ - { - name: "provider", - type: "string", - internalType: "string", - }, - { - name: "claimUserId", - type: "bytes32", - internalType: "bytes32", - }, - { - name: "claimHash", - type: "bytes32", - internalType: "bytes32", - }, - { - name: "requestedAt", - type: "uint32", - internalType: "uint32", - }, - { - name: "owner", - type: "address", - internalType: "address", - }, - { - name: "fee", - type: "uint256", - internalType: "uint256", - }, - ], - }, - { - name: "createdAt", - type: "uint32", - internalType: "uint32", - }, - { - name: "expiresAt", - type: "uint32", - internalType: "uint32", - }, - { - name: "minimumSignatures", - type: "uint8", - internalType: "uint8", - }, - { - name: "operators", - type: "tuple[]", - internalType: "struct IReclaimServiceManager.Operator[]", - components: [ - { - name: "addr", - type: "address", - internalType: "address", - }, - { - name: "url", - type: "string", - internalType: "string", - }, - ], - }, - { - name: "feePaid", - type: "uint256", - internalType: "uint256", - }, - ], - }, - ], - anonymous: false, - }, { type: "event", name: "OwnershipTransferred", @@ -1067,44 +583,6 @@ const _abi = [ ], 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: "contract IPauserRegistry", - }, - { - name: "newPauserRegistry", - type: "address", - indexed: false, - internalType: "contract IPauserRegistry", - }, - ], - anonymous: false, - }, { type: "event", name: "RewardsInitiatorUpdated", @@ -1125,135 +603,29 @@ const _abi = [ anonymous: false, }, { - type: "event", - name: "TaskCompleted", - inputs: [ - { - name: "taskIndex", - type: "uint32", - indexed: true, - internalType: "uint32", - }, - { - name: "task", - type: "tuple", - indexed: false, - internalType: "struct IReclaimServiceManager.CompletedTask", - components: [ - { - name: "task", - type: "tuple", - internalType: "struct IReclaimServiceManager.Task", - components: [ - { - name: "request", - type: "tuple", - internalType: "struct IReclaimServiceManager.ClaimRequest", - components: [ - { - name: "provider", - type: "string", - internalType: "string", - }, - { - name: "claimUserId", - type: "bytes32", - internalType: "bytes32", - }, - { - name: "claimHash", - type: "bytes32", - internalType: "bytes32", - }, - { - name: "requestedAt", - type: "uint32", - internalType: "uint32", - }, - { - name: "owner", - type: "address", - internalType: "address", - }, - { - name: "fee", - type: "uint256", - internalType: "uint256", - }, - ], - }, - { - name: "createdAt", - type: "uint32", - internalType: "uint32", - }, - { - name: "expiresAt", - type: "uint32", - internalType: "uint32", - }, - { - name: "minimumSignatures", - type: "uint8", - internalType: "uint8", - }, - { - name: "operators", - type: "tuple[]", - internalType: "struct IReclaimServiceManager.Operator[]", - components: [ - { - name: "addr", - type: "address", - internalType: "address", - }, - { - name: "url", - type: "string", - internalType: "string", - }, - ], - }, - { - name: "feePaid", - type: "uint256", - internalType: "uint256", - }, - ], - }, - { - name: "signatures", - type: "bytes[]", - internalType: "bytes[]", - }, - ], - }, - ], - anonymous: false, + type: "error", + name: "DelayPeriodNotPassed", + inputs: [], }, { - type: "event", - name: "Unpaused", - inputs: [ - { - name: "account", - type: "address", - indexed: true, - internalType: "address", - }, - { - name: "newPausedStatus", - type: "uint256", - indexed: false, - internalType: "uint256", - }, - ], - anonymous: false, + type: "error", + name: "OnlyRegistryCoordinator", + inputs: [], + }, + { + type: "error", + name: "OnlyRewardsInitiator", + inputs: [], + }, + { + type: "error", + name: "OnlyStakeRegistry", + inputs: [], }, ] as const; const _bytecode = - "0x610100806040523461024b57604051601f61530138819003918201601f19168301916001600160401b03831184841017610237578084926080946040528339810103126101e75761004f81610298565b9061005c60208201610298565b610074606061006d60408501610298565b9301610298565b9260a05260805260c05260e0525f5460ff8160081c166101925760ff80821610610158575b60405161505090816102b182396080518181816106a6015281816108ca01528181610d69015281816127a301528181612c4a01528181612fef0152614282015260a0518181816107db015281816108fa01528181610da0015261275f015260c051818181610265015281816109a101528181610c62015281816116d30152818161171501528181611750015281816117920152818161187b015281816118cc0152818161194d01528181611bb80152611bfb015260e05181612ce00152f35b60ff90811916175f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a180610099565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b51906001600160a01b03821682036102ac57565b5f80fdfe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b5f803560e01c806310d67a2f146131e4578063136439dd146130c157806316bd83c314612fbd5780631be785ac14612f8757806321df0da714612f5b5780632d89f6fc14612f265780632e8da82914612f0357806333cfb7b714612c2f5780633bc28c8c14612c04578063485cc95514612a06578063595c6a671461295b5780635ac86ab7146129285780635c975abb1461290b578063630868dc146128c957806367ab9809146127d2578063683048351461278e5780636b3aa72e1461274a578063715018a6146126ef578063762655e91461208a57806384681e4614612027578063886f119514611fff5780638b00ce7c14611fd95780638da5cb5b14611fb157806394bb371b14611f79578063964c586d14610e935780639926ee7d14610ccb578063a0169ddd14610c3e578063a20b99bf14610963578063a364f4da146108aa578063a551c1b814610848578063a98fb355146107a0578063d5dba76d14610773578063e481af9d14610693578063f289a7fb14610651578063f2fde38b146105c0578063fabc1cbc14610478578063fac5bb9b14610450578063fc299dee146104285763fce36c7d14610229575061000e565b34610423576020366003190112610308576004356001600160401b03811161041e5761025990369060040161389c565b9190610263614666565b7f0000000000000000000000000000000000000000000000000000000000000000825b8481106103ba57506001600160a01b031690813b156103b5576040519363fce36c7d60e01b855280602486016020600488015252604485019060448160051b8701019280928690609e1983360301905b8483106103185788808b8181808c0381838f5af1801561030d576102f75750f35b81610301916134dd565b6103085780f35b613387565b6040513d84823e3d90fd5b9091929394956043198a8203018252863590838212156103b05760208091876001940190608063ffffffff61039c82610362610354878061490d565b60a0885260a0880191614941565b95898060a01b03610374898301613565565b16888701526040810135604087015283610390606083016136e5565b166060870152016136e5565b1691015298019201930191909493926102d6565b6148c8565b613a19565b806103ef6103d660206103d06001958a896149a0565b0161482a565b60406103e3848a896149a0565b01359030903390614ab0565b61041861040260206103d0848a896149a0565b846040610410858b8a6149a0565b013591614b01565b01610286565b6133d7565b613337565b503461042357366003190112610308576065546040516001600160a01b039091168152602090f35b5034610423573660031901126103085760c9546040516001600160a01b039091168152602090f35b503461042357602036600319011261030857609754600435906001600160a01b0316803b156103b55760206004916040519283809263755b36bd60e11b82525afa80156105b5576104db918491610586575b506001600160a01b03163314613a8b565b60985419811981160361051b57806098556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a280f35b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b6105a8915060203d6020116105ae575b6105a081836134dd565b810190613a6c565b5f6104ca565b503d610596565b6040513d85823e3d90fd5b5034610423576020366003190112610308576105da61354f565b6105e2614380565b6001600160a01b038116156105fd576105fa90614541565b80f35b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b50346104235736600319011261030857608060ca5460cb5463ffffffff60405192818116845260ff8160201c16602085015260281c1660408301526060820152f35b50346104235780600319360112610308577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103b55781600491604051928380926302e0740360e31b82525afa90811561030d578291610751575b506107068151516141a8565b915b8151805182101561073f57600191906001600160a01b039061072b9083906141e7565b51511661073882866141e7565b5201610708565b6040518061074d86826136f6565b0390f35b61076d91503d8084833e61076581836134dd565b8101906143d8565b5f6106fa565b3461042357602036600319011261030857602061079661079161354f565b614280565b6040519015158152f35b5034610423576020366003190112610308576004356001600160401b03811161041e576107d19036906004016135ed565b6107d9614380565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103b557826108378193829360405194858094819363a98fb35560e01b83526020600484015260248301906137e0565b03925af1801561030d576102f75750f35b50346104235760203660031901126103085760043560ce548110156108a65761087090613925565b5080546001600160a01b03169061088990600101613979565b9061074d60405192839283526040602084015260408301906137e0565b5080fd5b5034610423576020366003190112610308576108c461354f565b6108f8337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146141fb565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103b5576040516351b27a6d60e11b81526001600160a01b03909216600483015282919082908290602490829084905af1801561030d576102f75750f35b5034610423576020366003190112610308576004356001600160401b03811161041e5761099490369060040161389c565b61099f929192614666565b7f0000000000000000000000000000000000000000000000000000000000000000825b828110610b8957506001600160a01b0316803b156103b55760405191634e5cd2fd60e11b835280604484013060048601526040602486015252606483019460648260051b8501019181869060be19813603015b838310610a36578880898181808b0381838e5af1801561030d576102f75750f35b9091929394606319888203018a528535828112156103b057830190610a6c610a5e838061490d565b60c0845260c0840191614941565b916001600160a01b03610a8160208301613565565b1660208301526020610a96604083018361490d565b848603604086015280865294909101938c905b808210610b595750505063ffffffff610ac4606083016136e5565b16606083015263ffffffff610adb608083016136e5565b16608083015260a0810135601e19823603018112156103b05701906020823592016001600160401b038311610b54578236038113610b4f5783836020948594938460a0879660019a03910152818452848401378d838284010152601f8019910116010197019a019301919098939298610a15565b614883565b61483e565b909194604080600192838060a01b03610b718a613565565b16815260208901356020820152019601920190610aa9565b909291829483955b610ba9610b9f858585614744565b604081019061476b565b9050871015610bf957610bc0610b9f858585614744565b881015610be5576001916020610bdd928a60061b01013590614629565b960195610b91565b634e487b7160e01b86526032600452602486fd5b600192949593919650610c3890610c2281308a610c1d60206103d0898d3395614744565b614ab0565b84610c3360206103d0868a8d614744565b614b01565b016109c2565b503461042357602036600319011261030857610c5861354f565b610c60614380565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103b55760405163a0169ddd60e01b81526001600160a01b03909216600483015282919082908290602490829084905af1801561030d576102f75750f35b503461042357604036600319011261030857610ce561354f565b6024356001600160401b03811161041e5760606003198236030112610e8e5760405191606083018381106001600160401b03821117610e7a5760405281600401356001600160401b038111610e7557610d4490600436918501016135ed565b83526020830190602483013582526044604085019301358352610d9060018060a01b037f00000000000000000000000000000000000000000000000000000000000000001633146141fb565b610d9981613f72565b15610e30577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103b557859485610e1293819560405197889687958694639926ee7d60e01b865260018060a01b0316600486015260406024860152516060604486015260a48501906137e0565b9151606484015251608483015203925af1801561030d576102f75750f35b60405162461bcd60e51b815260206004820152601860248201527f4f70657261746f72206e6f742077686974656c697374656400000000000000006044820152606490fd5b6134fe565b634e487b7160e01b85526041600452602485fd5b613427565b503461042357604036600319011261030857600435906001600160401b03821161041e5760406003198336030112610e8e5760405191610ed2836134c2565b80600401356001600160401b038111610e7557810160c06003198236030112610e8e5760405190610f02826134a7565b60048101356001600160401b038111610e7557610f259060043691840101613764565b8252610f33602482016136e5565b6020830152610f44604482016136e5565b6040830152606481013560ff81168103611f0c57606083015260848101356001600160401b038111610e755760049082010136601f82011215611f41578035610f8c8161382c565b91610f9a60405193846134dd565b81835260208084019260051b82010190368211611f465760208101925b828410611f4b5750505050608083015260a4013560a082015283526024810135906001600160401b038211610e75570136602382011215611f415760048101356110008161382c565b9161100e60405193846134dd565b818352602060048185019360051b8301010190368211611f465760248101925b828410611f10575050505060208301526024359063ffffffff82168203611f0c57825160405161107c8161106e602082019460208652604083019061402a565b03601f1981018352826134dd565b51902063ffffffff83165f5260cc60205260405f205403611ea15763ffffffff6040845101511663ffffffff42161015611e695782519182519263ffffffff6020604086015195608060018060a01b03910151169201511690604051946110e286613478565b8552602085015260408401526001606084015260208401519160405193611108856134c2565b845260208401928352611120608086510151516141a8565b925f5b845181101561115857600190818060a01b036111448260808b5101516141e7565b51511661115182886141e7565b5201611123565b50909291949381515115611e34575193845195604051966020880152602087526111836040886134dd565b86518060011b908082046002149015171561127a576111a1906149c2565b9460408051956111b182886134dd565b601087526f181899199a1a9b1b9c1cb0b131b232b360811b60208801525f5b8a5181101561128e576111e3818c6149ea565b5188516001600160f81b031991611206916112009160f81c614640565b8a6149ea565b5116908060011b918183046002148215171561127a575f1a611228838c6149ea565b53611233818d6149ea565b5189516001600160f81b031991611256916112509160f81c614636565b8b6149ea565b5116916001810180911161127a576112736001935f1a918c6149ea565b53016111d0565b634e487b7160e01b5f52601160045260245ffd5b5061060f60f31b96508860206112cb60228b86519384918183019d8e528051918291018484015e81015f838201520301601f1981018352826134dd565b60018060a01b0360208301511660609285516112e785826134dd565b602881526020810192601f1986013685375f5b60148110611d6c57505086518093602082019261060f60f31b8452518091602284015e8101602281015f905203602201601f198101845261133b90846134dd565b848783015163ffffffff1661134f906149fb565b92015161135b906149fb565b9287519c8d95518091602088015e850190600560f91b6020830152518092602183015e01602001600560f91b600182015281516020819301600283015e01600101600560f91b600182015281516020819301600283015e01600101600181015f905203600101601f19810189526113d290896134dd565b8651516113de906141a8565b955f5b8851805182101561141d57906114036113fc826001946141e7565b518c614589565b61140d828b6141e7565b90838060a01b03169052016113e1565b505093948691955f965b84518810156114df575f965f5b85518110156114d3576001600160a01b0361144f82886141e7565b51166001600160a01b036114638c8a6141e7565b51161461147257600101611434565b509291979093965060015b1561148f576001019690919592611427565b855162461bcd60e51b815260206004820152601a60248201527f4d697373696e67206174746573746f72207369676e61747572650000000000006044820152606490fd5b5092919790939661147d565b918691935063ffffffff81165f5260cc6020525f8681205560a0825101515f945b865186101561159e576001860180871161127a575b8751811015611592576001906001600160a01b03611533898b6141e7565b5116828060a01b03611545838c6141e7565b511610611553575b01611515565b818060a01b03611563898b6141e7565b5116828060a01b03611575838c6141e7565b51166115818a8c6141e7565b5261158c828b6141e7565b5261154d565b50600190950194611500565b869088866115aa613ef7565b958251976115b8848a6134dd565b600189525f5b601f1985018110611d4a575060c9546001600160a01b03166115df8a6141da565b5152600160206115ee8b6141da565b5101528551986115fd8a61382c565b9961160a86519b8c6134dd565b808b52611619601f199161382c565b015f5b818110611d27575050611630875189614640565b975f5b885181101561167557808a602061166c8f946001958e61165983898060a01b03926141e7565b511661166583836141e7565b51526141e7565b51015201611633565b50898b87519361168589866134dd565b600185525f5b601f198a018110611cef57506116a0856141da565b51526116aa613ef7565b60206116b5866141da565b516001600160a01b03909216910152876116ce856141da565b5101527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b156103b5578651639d45c28160e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115611ce5575f91611cc6575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b156103b5578751634d18cc3560e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115611cbc575f91611c9d575b5063ffffffff8116611bb6575063ffffffff168015611ba2576117fb9063ffffffff42160663ffffffff421661460f565b63ffffffff8761180a866141da565b5101911690525b5f608061181d856141da565b51015260a061182b846141da565b510187519061183a89836134dd565b6015825274436c61696d206372656174696f6e206f6e2041565360581b6020830152526001600160a01b0316803b156103b557865163095ea7b360e01b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660048201526024810192909252602090829060449082905f905af18015611b9857611b6b575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b156103b557845190634e5cd2fd60e11b8252816044810130600483015287602483015282518091526064820190602060648260051b8501019401915f905b828210611a435750505050805f9203818360018060a01b037f0000000000000000000000000000000000000000000000000000000000000000165af18015611a3957611a24575b506020611996855194828652835190878488015286019061402a565b91015193601f198483030190840152835180825260208201916020808360051b83010196019287915b8383106119f7578863ffffffff87167fb89b185f8ff547f2adc139e96d9ffe3ce49fac1d57931be0788b58aa670850cb898b038aa280f35b9091929396602080611a15600193601f198682030187528b516137e0565b990193019301919392906119bf565b611a319195505f906134dd565b5f938561197a565b85513d5f823e3d90fd5b919350919360631986820301825284519060c081019180519260c0835283518091528c602060e085019501915f915b818310611b3557505050506020818101516001600160a01b0316838201528c8201518385038e8501528051808652948201948d9291909101905f908f5b818310611b05575050505060019360209360a0848463ffffffff611af69689980151169084015263ffffffff608082015116608084015201519060a08184039101526137e0565b96019201920185939192611933565b835180516001600160a01b03168952602090810151818a01529701968f945090920191600191909101908f611aaf565b835180516001600160a01b031688526020908101516001600160601b03168189015296019590920191600191909101908e611a72565b611b8c9060203d602011611b91575b611b8481836134dd565b810190613aea565b6118c9565b503d611b7a565b86513d5f823e3d90fd5b634e487b7160e01b5f52601260045260245ffd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b156103b5578851635f90d45560e11b8152906020826004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa918215611c935791611c4391611c4894935f92611c62575b5061460f565b614010565b63ffffffff87611c57866141da565b510191169052611811565b611c8591925060203d602011611c8c575b611c7d81836134dd565b81019061464a565b908d611c3d565b503d611c73565b8a513d5f823e3d90fd5b611cb6915060203d602011611c8c57611c7d81836134dd565b8a6117ca565b89513d5f823e3d90fd5b611cdf915060203d602011611c8c57611c7d81836134dd565b8961174d565b88513d5f823e3d90fd5b6020908a51611cfd816134a7565b8a81525f838201528a8c8201525f8b8201525f60808201528a60a08201528282890101520161168b565b6020908c82828a5192611d39846134c2565b5f84525f838501520101520161161c565b6020908551611d58816134c2565b5f81525f8382015282828d010152016115be565b806013036013811161127a57600381901b906001600160fd1b0381160361127a5760ff811161127a5760ff611da5600182931b85614640565b161660f481901b600f60f81b16919060f081169060ff16039160ff831161127a57611dd9906001600160f81b031916614f98565b600182901b926001600160ff1b038316830361127a57611e12915f1a611dff85886149ea565b5360f81b6001600160f81b031916614f98565b916001810180911161127a57611e2d6001935f1a91866149ea565b53016112fa565b60405162461bcd60e51b815260206004820152600d60248201526c4e6f207369676e61747572657360981b6044820152606490fd5b60405162461bcd60e51b815260206004820152601060248201526f15185cdac81a185cc8195e1c1a5c995960821b6044820152606490fd5b60405162461bcd60e51b815260206004820152603d60248201527f737570706c696564207461736b20646f6573206e6f74206d617463682074686560448201527f206f6e65207265636f7264656420696e2074686520636f6e74726163740000006064820152608490fd5b5f80fd5b83356001600160401b038111611f4157602091611f3683928360043692880101016135ed565b81520193019261102e565b613579565b613843565b83356001600160401b038111611f4157602091611f6e8392833691870101613686565b815201930192610fb7565b346104235760203660031901126103085761074d611f9d611f9861354f565b61411e565b604051918291602083526020830190613804565b34610423575f366003190112610308576033546040516001600160a01b039091168152602090f35b34610423575f36600319011261030857602063ffffffff60c95460a01c16604051908152f35b34610423575f366003190112610308576097546040516001600160a01b039091168152602090f35b34610423576020366003190112610308576004356001600160401b03811161041e5761106e61207661206061074d933690600401613764565b6040519283916020808401526040830190613fbb565b6040519182916020835260208301906137e0565b34610423576040366003190112610308576004356001600160401b03811161041e576120ba903690600401613764565b6024356001600160401b03811161041e576120d99036906004016135ed565b9060cb549160a08201928351106126bc576080820180519091906001600160a01b03163303612621575b505063ffffffff6060820151169063ffffffff421691828082115f146126125761212c9161460f565b63ffffffff8060ca5460281c169116116125cd576001600160a01b03612150613ef7565b16835190803b156103b5576040516323b872dd60e01b81523360048201523060248201526044810192909252602090829060649082905f905af19081156125c2575f916125a3575b501561256557604051906121ab826134a7565b5f60a06040516121ba816134a7565b60608152826020820152826040820152826060820152826080820152015260408201935f855260ff60608401945f865260808501966060885260a08601945f8652865281602087015263ffffffff61221860ca549382851690614010565b16905260201c168094525190526040516020810190602082526122428161106e604082018661402a565b5190209060ce54918284116125205761225a8361382c565b9261226860405194856134dd565b8084526020840160ce5f527fd36cd1c74ef8d7326d8021b776c18fb5a5724b7f7bc93c2f42e43e10ef27d12a5f915b83831061250257505050508251916122ae8561382c565b946122bc60405196876134dd565b8086526122cb601f199161382c565b015f5b8181106124eb5750505f925b85519060ff8516918210156124345780156123c95761232a816122fd8487614629565b60405160208101914483524260408301526060820152606081526123226080826134dd565b519020614636565b9061233582886141e7565b51915f19820191821161127a5761236290612350838a6141e7565b5161235b828b6141e7565b52886141e7565b50815190959061237a906001600160a01b0316614280565b156123c057508051602091906001600160a01b0316612399848a6141e7565b5152015160206123a983896141e7565b51015260ff811461127a57600101955b95926122da565b979150506123b9565b60405162461bcd60e51b815260206004820152603760248201527f496e7465726e616c3a204665657320746f6f206c6f772e204e6f206f7065726160448201527f746f7273206c65667420746f207069636b2066726f6d2e0000000000000000006064820152608490fd5b828789526040516020810190602082526124558161106e604082018661402a565b51902063ffffffff60c95460a01c165f5260cc60205260405f205560016124bb60c954927f07a2aac65c6401a6cbb0fa80ff456ec88725098383c7e585ee342ae74505c98b63ffffffff8560a01c1692839260405191829160208352602083019061402a565b0390a20163ffffffff811161127a5763ffffffff60a01b1990911660a09190911b63ffffffff60a01b161760c955005b6020906124f66140d9565b82828a010152016122ce565b60026020600192612512856140f2565b815201920192019190612297565b60405162461bcd60e51b815260206004820152601e60248201527f496e7465726e616c3a204e6f7420656e6f756768206f70657261746f727300006044820152606490fd5b60405162461bcd60e51b81526020600482015260166024820152754661696c656420746f207472616e736665722066656560501b6044820152606490fd5b6125bc915060203d602011611b9157611b8481836134dd565b84612198565b6040513d5f823e3d90fd5b60405162461bcd60e51b815260206004820152601e60248201527f526571756573742074696d657374616d7020746f6f20666172206177617900006044820152606490fd5b9061261c9161460f565b61212c565b6126449060405160208082015261263f8161106e6040820188613fbb565b614589565b90516001600160a01b0390811691160361265f578280612103565b60405162461bcd60e51b815260206004820152602f60248201527f5369676e6572206f6620726571756573745369676e6174757265206973206e6f60448201526e3a103932b8bab2b9ba1737bbb732b960891b6064820152608490fd5b60405162461bcd60e51b815260206004820152600b60248201526a46656520746f6f206c6f7760a81b6044820152606490fd5b34610423575f36600319011261030857612707614380565b603380546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b34610423575f366003190112610308576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610423575f366003190112610308576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610423576080366003190112610308576040516127ef81613478565b6127f76136d2565b815260243560ff81168103611f0c57602082019081526044359063ffffffff82168203611f0c576040830191825263ffffffff6060840193606435855261283c614380565b5116806128b5575b505160ff8116612894575b505163ffffffff811661286b575b50518061286657005b60cb55005b68ffffffff000000000060ca549160281b169068ffffffff000000000019161760ca558161285d565b64ff0000000060ca549160201b169064ff0000000019161760ca558261284f565b63ffffffff1960ca54161760ca5583612844565b346104235760203660031901126103085760043560cd54811015611f0c576128f2602091613738565b905460405160039290921b1c6001600160a01b03168152f35b34610423575f366003190112610308576020609854604051908152f35b346104235760203660031901126103085760043560ff8116809103611f0c5760016020911b806098541614604051908152f35b34610423575f366003190112610308576097546001600160a01b0316803b156103b55760206024916040519283809263237dfb4760e11b82523360048301525afa80156125c2576129b3915f916129e7575b50613b02565b5f196098556040515f1981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2005b612a00915060203d602011611b9157611b8481836134dd565b826129ad565b3461042357604036600319011261030857612a1f61354f565b6024356001600160a01b03811690819003611f0c575f549160ff8360081c161592838094612bf7575b8015612be0575b15612b845760ff1981166001175f5583612b73575b5060ff5f5460081c1615612b1a57612a7b90614541565b612a84306144e3565b60026060604051612a9481613478565b61070881526001602082015261012c6040820152015260ca805468ffffffffffffffffff191666012c0100000708179055600260cb5560c980546001600160a01b031916919091179055612ae457005b61ff00195f54165f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a1005b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b61ffff1916610101175f5583612a64565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b158015612a4f5750600160ff821614612a4f565b50600160ff821610612a48565b3461042357602036600319011261030857612c2d612c2061354f565b612c28614380565b6144e3565b005b3461042357602036600319011261030857612c4861354f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103b5575f600491604051928380926302e0740360e31b82525afa9081156125c2575f91612ee9575b5080515190612cac8261382c565b90612cba60405192836134dd565b828252612cc68361382c565b602083019190601f19013683375f5b848110612ec15750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103b55760408051639004134760e01b81526001600160a01b0390961660048701526024860152825160448601819052859160648301915f5b818110612e9f575050509181805f9403915afa9283156125c2575f93612e0d575b505f805b838110612de15750612d7b906141a8565b925f905f5b848110612d95576040518061074d88826136f6565b612d9f81836141e7565b51612dad575b600101612d80565b91600190612dd9906001600160a01b03612dc786886141e7565b5116612dd3828a6141e7565b526144d5565b929050612da5565b612deb81866141e7565b51612df9575b600101612d6a565b90612e056001916144d5565b919050612df1565b9092503d805f833e612e1f81836134dd565b810190602081830312610308578051906001600160401b03821161041e57019080601f83011215611f41578151612e558161382c565b92612e6360405194856134dd565b81845260208085019260051b820101928311611f4657602001905b828210612e8f575050509183612d66565b8151815260209182019101612e7e565b82516001600160a01b0316845288945060209384019390920191600101612d45565b600190818060a01b03612ed58285516141e7565b515116612ee282876141e7565b5201612cd5565b612efd91503d805f833e61076581836134dd565b82612c9e565b34610423576020366003190112610308576020610796612f2161354f565b613f72565b346104235760203660031901126103085763ffffffff612f446136d2565b165f5260cc602052602060405f2054604051908152f35b34610423575f366003190112610308576020612f75613ef7565b6040516001600160a01b039091168152f35b3461042357604036600319011261030857612fa061354f565b6024358015158103611f0c57612c2d91612fb8614380565b613e57565b34610423576020366003190112610308576004356001600160401b03811161041e57612fed903690600401613686565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103b55760206024916040519283809263ec7fbb3160e01b82523360048301525afa80156125c2576001915f916130a2575b5015150361305d57612c2d90613ca9565b60405162461bcd60e51b815260206004820152601b60248201527f4f70657261746f72206d757374206265207468652063616c6c657200000000006044820152606490fd5b6130bb915060203d602011611b9157611b8481836134dd565b8361304c565b3461042357602036600319011261030857609754600435906001600160a01b0316803b156103b55760206024916040519283809263237dfb4760e11b82523360048301525afa80156125c25761311d915f916131c55750613b02565b6098548181160361315a57806098556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2005b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b6131de915060203d602011611b9157611b8481836134dd565b836129ad565b34613337576020366003190112610308576004356001600160a01b03811690819003611f0c576097546001600160a01b038116803b156103b55760405163755b36bd60e11b8152602081600481855afa80156125c257613255915f9161331857506001600160a01b03163314613a8b565b821561329b5760407f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6918151908152846020820152a16001600160a01b03191617609755005b60405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a490fd5b613331915060203d6020116105ae576105a081836134dd565b856104ca565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b608081019081106001600160401b0382111761349357604052565b634e487b7160e01b5f52604160045260245ffd5b60c081019081106001600160401b0382111761349357604052565b604081019081106001600160401b0382111761349357604052565b90601f801991011681019081106001600160401b0382111761349357604052565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b600435906001600160a01b0382168203611f0c57565b35906001600160a01b0382168203611f0c57565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b6001600160401b03811161349357601f01601f191660200190565b81601f82011215611f4157602081359101613607826135d2565b9261361560405194856134dd565b8284528282011161363157815f92602092838601378301015290565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b9190604083820312610e8e576040519061369f826134c2565b81936136aa81613565565b83526020810135916001600160401b038311610e75576020926136cd92016135ed565b910152565b6004359063ffffffff82168203611f0c57565b359063ffffffff82168203611f0c57565b60206040818301928281528451809452019201905f5b8181106137195750505090565b82516001600160a01b031684526020938401939092019160010161370c565b60cd548110156137505760cd5f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b91909160c081840312610e8e576040519061377e826134a7565b81938135916001600160401b038311610e75576137a160a09392849383016135ed565b845260208101356020850152604081013560408501526137c3606082016136e5565b60608501526137d460808201613565565b60808501520135910152565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b90604060206138299360018060a01b03815116845201519181602082015201906137e0565b90565b6001600160401b0381116134935760051b60200190565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b9181601f84011215611f41578235916001600160401b0383116138cc576020808501948460051b010111611f4657565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b60ce548110156137505760ce5f5260205f209060011b01905f90565b90600182811c9216801561396f575b602083101461395b57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691613950565b9060405191825f82549261398c84613941565b80845293600181169081156139f757506001146139b3575b506139b1925003836134dd565b565b90505f9291925260205f20905f915b8183106139db5750509060206139b1928201015f6139a4565b60209193508060019154838589010152019101909184926139c2565b9050602092506139b194915060ff191682840152151560051b8201015f6139a4565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b9081602091031261030857516001600160a01b0381168103611f0c5790565b15613a9257565b60405162461bcd60e51b815260206004820152602a60248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526939903ab73830bab9b2b960b11b6064820152608490fd5b9081602091031261030857518015158103611f0c5790565b15613b0957565b60405162461bcd60e51b815260206004820152602860248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526739903830bab9b2b960c11b6064820152608490fd5b818110613b6a575050565b5f8155600101613b5f565b90929192613c96576001602091818060a01b038551166001600160601b0360a01b825416178155019201519182516001600160401b03811161349357613bbb8254613941565b601f8111613c5b575b506020601f8211600114613bfd57819293945f92613bf2575b50508160011b915f199060031b1c1916179055565b015190505f80613bdd565b601f19821690835f52805f20915f5b818110613c4357509583600195969710613c2b575b505050811b019055565b01515f1960f88460031b161c191690555f8080613c21565b9192602060018192868b015181550194019201613c0c565b613c8690835f5260205f20601f840160051c81019160208510613c8c575b601f0160051c0190613b5f565b5f613bc4565b9091508190613c79565b634e487b7160e01b5f525f60045260245ffd5b80516001600160a01b03163303613e035760208101515115613d2f575f5b60ce54811015613d0b57613cda81613925565b505482516001600160a01b03908116911614613cf857600101613cc7565b90613d056139b192613925565b90613b75565b5060ce5490600160401b82101561349357613d058260016139b1940160ce55613925565b5f5b60ce54811015613dc557613d4481613925565b505482516001600160a01b03908116911614613d6257600101613d31565b613d6c9150613925565b613c9657805f6001925501613d818154613941565b9081613d8b575050565b81601f5f9311600114613d9c575055565b81835260208320613db891601f0160051c810190600101613b5f565b8082528160208120915555565b60405162461bcd60e51b815260206004820152601260248201527113dc195c985d1bdc881b9bdd08199bdd5b9960721b6044820152606490fd5b0390fd5b60405162461bcd60e51b815260206004820152602660248201527f4d657461646174612061646472657373206d757374206d61746368207468652060448201526531b0b63632b960d11b6064820152608490fd5b90613eb4575f5b60cd54811015613dc557613e7181613738565b905460039190911b1c6001600160a01b0390811690831614613e9557600101613e5e565b613e9f9150613738565b81549060018060a01b039060031b1b19169055565b60cd54600160401b81101561349357806001613ed3920160cd55613738565b81546001600160a01b0393841660039290921b91821b9390911b1916919091179055565b60c9546001600160a01b0316803b156103b557602060049160405192838092632495a59960e01b82525afa9081156125c2575f91613f33575090565b90506020813d602011613f6a575b81613f4e602093836134dd565b8101031261030857516001600160a01b0381168103611f0c5790565b3d9150613f41565b60cd54905f5b828110613f86575050505f90565b613f8f81613738565b905460039190911b1c6001600160a01b0390811690831614613fb357600101613f78565b505050600190565b9060a080613fd2845160c0855260c08501906137e0565b93602081015160208501526040810151604085015263ffffffff6060820151166060850152600180831b036080820151166080850152015191015290565b9063ffffffff8091169116019063ffffffff821161127a57565b9061403e825160c0835260c0830190613fbb565b9163ffffffff602082015116602083015263ffffffff604082015116604083015260ff60608201511660608301526080810151928281036080840152835180825260208201916020808360051b8301019601925f915b8383106140ac57505050505060a08091015191015290565b90919293966020806140ca600193601f198682030187528b51613804565b99019301930191939290614094565b604051906140e6826134c2565b60606020835f81520152565b906040516140ff816134c2565b82546001600160a01b031681529182906020906136cd90600101613979565b6141266140d9565b5060ce54905f5b82811061416e5760405162461bcd60e51b815260206004820152601260248201527113dc195c985d1bdc881b9bdd08199bdd5b9960721b6044820152606490fd5b61417781613925565b50546001600160a01b038381169116146141935760010161412d565b61382992506141a29150613925565b506140f2565b906141b28261382c565b6141bf60405191826134dd565b82815280926141d0601f199161382c565b0190602036910137565b8051156137505760200190565b80518210156137505760209160051b010190565b1561420257565b60405162461bcd60e51b815260206004820152604a60248201527f4543445341536572766963654d616e61676572426173652e6f6e6c795374616b60448201527f6552656769737472793a2063616c6c6572206973206e6f7420746865207374616064820152696b65526567697374727960b01b608482015260a490fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103b5576040516398ec1ac960e01b81526001600160a01b039091166004820152602081602481855afa9081156125c2575f9161434e575b50813b156103b5576020600492604051938480926340bf2fb760e01b82525afa9182156125c2575f9261431a575b50101590565b9091506020813d602011614346575b81614336602093836134dd565b810103126103085751905f614314565b3d9150614329565b90506020813d602011614378575b81614369602093836134dd565b8101031261030857515f6142e6565b3d915061435c565b6033546001600160a01b0316330361439457565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b602081830312610308578051906001600160401b03821161041e570190602082820312610e8e5760405191602083018381106001600160401b03821117613493576040528051906001600160401b038211610e75570181601f82011215611f41578051906144458261382c565b9261445360405194856134dd565b82845260208085019360061b83010191818311611f4657602001925b82841061447f5750505050815290565b604084830312610e8e5760405190614496826134c2565b84516001600160a01b0381168103611f0c5782526020850151906001600160601b0382168203611f0c578260209283604095015281520193019261446f565b5f19811461127a5760010190565b606554604080516001600160a01b038084168252841660208201529192917fe11cddf1816a43318ca175bbc52cd0185436e9cbead7c83acc54a73e461717e39190a16001600160a01b03166001600160a01b03199190911617606555565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b613829916146079160206145ff6145a083516149fb565b92603a60405193849281808501977f19457468657265756d205369676e6564204d6573736167653a0a00000000000089528051918291018587015e8401908382015f8152815193849201905e01015f815203601f1981018352826134dd565b519020614bc6565b919091614c34565b9063ffffffff8091169116039063ffffffff821161127a57565b9190820180921161127a57565b8115611ba2570690565b8115611ba2570490565b90816020910312610308575163ffffffff81168103611f0c5790565b6065546001600160a01b0316330361467a57565b60405162461bcd60e51b815260206004820152605160248201527f4543445341536572766963654d616e61676572426173652e6f6e6c795265776160448201527f726473496e69746961746f723a2063616c6c6572206973206e6f7420746865206064820152703932bbb0b932399034b734ba34b0ba37b960791b608482015260a490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206f6666736574000000006044820152606490fd5b91908110156137505760051b8101359060be1981360301821215614766570190565b6146ff565b903590601e198136030182121561476657018035906001600160401b0382116147e557602001918160061b360383136147a057565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c64617461207461696c20746f6f2073686f72740000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206c656e677468000000006044820152606490fd5b356001600160a01b0381168103611f0c5790565b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206c656e67746800006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c64617461206163636573732073747269646500006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206f666673657400006044820152606490fd5b9035601e19823603018112156103b05701602081359101916001600160401b038211610b54578160061b36038313610b4f57565b916020908281520191905f905b80821061495b5750505090565b909192833560018060a01b038116809103611f0c5781526020840135906001600160601b038216809203611f0c5760408160019360208394015201940192019061494e565b91908110156137505760051b81013590609e1981360301821215614766570190565b906149cc826135d2565b6149d960405191826134dd565b82815280926141d0601f19916135d2565b908151811015613750570160200190565b8015614a905780815f925b614a7c575080614a15836149c2565b92915b614a2157505090565b5f19820191821161127a5781600a820491600a8302838104600a148415171561127a57810390811161127a5760ff1660300160ff811161127a5760f81b6001600160f81b0319165f1a90614a7590856149ea565b5380614a18565b91614a88600a916144d5565b920480614a06565b50604051614a9f6040826134dd565b60018152600360fc1b602082015290565b6040516323b872dd60e01b60208201526001600160a01b03928316602482015292909116604483015260648201929092526139b191614afc82608481015b03601f1981018452836134dd565b614da4565b6001600160a01b03811692833b156103b557604051636eb1769f60e11b81523060048201526001600160a01b038416602482015293602090859060449082905afa9384156125c2575f94614b90575b50614b61614afc916139b195614629565b60405163095ea7b360e01b60208201526001600160a01b03909416602485015260448401528260648101614aee565b93506020843d602011614bbe575b81614bab602093836134dd565b8101031261030857925192614b61614b50565b3d9150614b9e565b815160418103614bf2575090614bee91602082015190606060408401519301515f1a90614ef6565b9091565b604003614c2b5760406020830151920151918260ff1c91601b830180931161127a57614bee936001600160ff1b03169260ff1690614ef6565b50505f90600290565b6005811015614d905780614c455750565b60018103614c925760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b60028103614cdf5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b60038103614d375760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b600414614d4057565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608490fd5b634e487b7160e01b5f52602160045260245ffd5b60408051909290916001600160a01b0316614dbf84846134dd565b602083527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020840152803b15614eb2575f828192826020614e2e9796519301915af13d15614eaa573d90614e13826135d2565b91614e20865193846134dd565b82523d5f602084013e614fda565b80519081614e3b57505050565b602080614e4c938301019101613aea565b15614e545750565b5162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b606090614fda565b835162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411614f8d5760ff1690601b82141580614f82575b614f77576020935f93608093604051938452868401526040830152606082015282805260015afa156125c2575f516001600160a01b03811615614f6f57905f90565b505f90600190565b505050505f90600490565b50601c821415614f2d565b505050505f90600390565b60f81c600a811015614fbf5760300160ff811161127a5760f81b6001600160f81b03191690565b60570160ff811161127a5760f81b6001600160f81b03191690565b90919015614fe6575090565b815115614ff65750805190602001fd5b60405162461bcd60e51b815260206004820152908190613dff9060248301906137e056fea2646970667358221220765534608bc17f5638eba37dd7a514c65dadea90fee0a6296cc805fb2394137664736f6c634300081a0033"; + "0x61016080604052346102b857604051601f612d9438819003918201601f19168301916001600160401b038311848410176102a45780849260e094604052833981010312610254578051906001600160a01b0382168203610250576020810151906001600160a01b03821682036102505760408101516001600160a01b03811681036102505760608201516001600160a01b0381169390849003610250576080830151936001600160a01b03851685036102505760a0840151936001600160a01b03851685036102505760c00151956001600160a01b03871687036102505760805260c05260e052610100526101205260a0525f5460ff8160081c166101fb5760ff808216036101c1575b5061014052604051612a8e908161030682396080518181816107300152818161081c01528181610d3a015261109e015260a05181610554015260c0518181816101d6015281816108c30152610b84015260e0518181816104fb015281816107ec01528181610d1201528181611c9801526123d6015261010051818181611de5015261243501526101205181818161065a01528181610c1101528181611525015281816115a40152611645015261014051816107a10152f35b60ff90811916175f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a181610109565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b5f80fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fdfe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b5f5f3560e01c80631785f53c146116215780631fdb0cfd1461158a578063279432eb146115015780632e8da829146114d457806333cfb7b7146114b05780633bc28c8c1461148b578063485cc955146111dc57806352efdca014611114578063630868dc146110cd5780636b3aa72e14611089578063715018a61461102c5780638da5cb5b1461100457806396d356c514610e7b5780639926ee7d14610c765780639da16d8e14610bed578063a0169ddd14610b60578063a20b99bf14610885578063a364f4da146107d0578063a50a640e1461078c578063a98fb355146106e4578063ba55088014610640578063c1a8e2c51461047d578063e481af9d14610452578063f2fde38b146103c1578063fc299dee146103995763fce36c7d1461019a575061000e565b34610394576020366003190112610279576004356001600160401b03811161038f576101ca903690600401611a4b565b91906101d4612773565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690825b84811061032b5750813b15610326576040519363fce36c7d60e01b855280602486016020600488015252604485019060448160051b8701019280928690609e1983360301905b8483106102895788808b8181808c0381838f5af1801561027e576102685750f35b81610272916118d2565b6102795780f35b61171c565b6040513d84823e3d90fd5b9091929394956043198a8203018252863590838212156103215760208091876001940190608063ffffffff61030d826102d36102c5878061233c565b60a0885260a0880191612370565b95898060a01b036102e58983016117d6565b1688870152604081013560408701528361030160608301611aeb565b16606087015201611aeb565b169101529801920193019190949392610247565b6122f7565b611afc565b8061036061034760206103416001958a88612653565b01612259565b6040610354848a88612653565b01359030903390612796565b6103896103736020610341848a88612653565b856040610381858b89612653565b0135916127e1565b01610201565b61176c565b6116cc565b503461039457366003190112610279576065546040516001600160a01b039091168152602090f35b5034610394576020366003190112610279576103db6117bc565b6103e3612675565b6001600160a01b038116156103fe576103fb9061272b565b80f35b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b5034610394573660031901126102795761047961046d6123d4565b60405191829182611835565b0390f35b5034610394576040366003190112610279576104976117bc565b90602435916001600160401b03831161038f573660238401121561063b578260040135926104c484611ad4565b936104d260405195866118d2565b8085526024602086019160051b8301019136831161063657602401905b82821061061e575050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361060f5760405190610536826118a3565b6001600160a01b0390811682523060208301908152604083019485527f000000000000000000000000000000000000000000000000000000000000000090911693909190843b1561032657604051636e3492b560e01b815260206004820181905292516001600160a01b03908116602483015293519093166044840152516060606484015280516084840181905260a48401929190910190845b8181106105f357505050818394818581819503925af1801561027e576102685750f35b825163ffffffff168452602093840193909201916001016105d0565b634394dbdf60e11b8252600482fd5b6020809161062b84611aeb565b8152019101906104ef565b6119f2565b6118f3565b50346103945761064f366117ea565b91610658612675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692833b1561032657604051630664120160e01b81523060048201526001600160a01b0392831660248201529290911660448301526001600160e01b0319166064820152829182908290818381608481015b03925af1801561027e576102685750f35b5034610394576020366003190112610279576004356001600160401b03811161038f573660238201121561063b57610726903690602481600401359101611967565b61072e612675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561032657826106d38193829360405194858094819363a98fb35560e01b835260206004840152602483019061210a565b503461039457366003190112610279576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5034610394576020366003190112610279576107ea6117bc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361060f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610326576040516351b27a6d60e11b81526001600160a01b03909216600483015282919082908290602490829084905af1801561027e576102685750f35b5034610394576020366003190112610279576004356001600160401b03811161038f576108b6903690600401611a4b565b6108c1929192612773565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316825b828110610aab5750803b156103265760405191634e5cd2fd60e11b835280604484013060048601526040602486015252606483019460648260051b8501019181869060be19813603015b838310610958578880898181808b0381838e5af1801561027e576102685750f35b9091929394606319888203018a528535828112156103215783019061098e610980838061233c565b60c0845260c0840191612370565b916001600160a01b036109a3602083016117d6565b16602083015260206109b8604083018361233c565b848603604086015280865294909101938c905b808210610a7b5750505063ffffffff6109e660608301611aeb565b16606083015263ffffffff6109fd60808301611aeb565b16608083015260a0810135601e19823603018112156103215701906020823592016001600160401b038311610a76578236038113610a715783836020948594938460a0879660019a03910152818452848401378d838284010152601f8019910116010197019a019301919098939298610937565b6122b2565b61226d565b909194604080600192838060a01b03610a938a6117d6565b168152602089013560208201520196019201906109cb565b909291829483955b610acb610ac1858585612173565b604081019061219a565b9050871015610b1b57610ae2610ac1858585612173565b881015610b07576001916020610aff928a60061b01013590611bf4565b960195610ab3565b634e487b7160e01b86526032600452602486fd5b600192949593919650610b5a90610b4481308a610b3f6020610341898d3395612173565b612796565b84610b556020610341868a8d612173565b6127e1565b016108ed565b503461039457602036600319011261027957610b7a6117bc565b610b82612675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103265760405163a0169ddd60e01b81526001600160a01b03909216600483015282919082908290602490829084905af1801561027e576102685750f35b503461039457602036600319011261027957610c076117bc565b610c0f612675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561032657604051634f906cf960e01b81523060048201526001600160a01b039091166024820152829182908290818381604481016106d3565b503461039457604036600319011261027957610c906117bc565b6024356001600160401b03811161038f5760606003198236030112610e2a5760405191610cbc836118a3565b81600401356001600160401b038111610dd95782013660238201121561063b57610cf0903690602460048201359101611967565b8352602083019060248301358252604460408501930135835260018060a01b037f0000000000000000000000000000000000000000000000000000000000000000163303610dca577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561032657859485610dac93819560405197889687958694639926ee7d60e01b865260018060a01b0316600486015260406024860152516060604486015260a485019061210a565b9151606484015251608483015203925af1801561027e576102685750f35b634394dbdf60e11b8552600485fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b503461039457602036600319011261027957610e956117bc565b610e9d612675565b610ea681611b4f565b15610fa1576001600160a01b0316815b60975480821015610f9b5782610ecb83611877565b905460039190911b1c6001600160a01b031614610eeb5750600101610eb6565b9091505f198101908111610f875790610f21610f09610f4593611877565b905460039190911b1c6001600160a01b031691611877565b81546001600160a01b0393841660039290921b91821b9390911b1916919091179055565b6097548015610f73575f1901610f5a81611877565b81549060018060a01b039060031b1b1916905560975580f35b634e487b7160e01b82526031600452602482fd5b634e487b7160e01b83526011600452602483fd5b50505080f35b60405162461bcd60e51b815260206004820152603560248201527f72656d6f76654f70657261746f7246726f6d57686974656c6973743a206f70656044820152741c985d1bdc881b9bdd081dda1a5d195b1a5cdd1959605a1b6064820152608490fd5b503461039457366003190112610279576033546040516001600160a01b039091168152602090f35b5034610394578060031936011261027957611045612675565b603380546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461039457366003190112610279576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461039457602036600319011261027957600435906097548210156111115760206110f883611877565b905460405160039290921b1c6001600160a01b03168152f35b80fd5b50346103945760203660031901126102795761112e6117bc565b611136612675565b61113f81611b4f565b61117a57609754600160401b8110156111665790610f218260016103fb9401609755611877565b634e487b7160e01b83526041600452602483fd5b60405162461bcd60e51b815260206004820152603460248201527f6164644f70657261746f72546f57686974656c6973743a206f70657261746f7260448201527308185b1c9958591e481dda1a5d195b1a5cdd195960621b6064820152608490fd5b5034610394576040366003190112610279576111f66117bc565b602435906001600160a01b03821682036114875782549160ff8360081c16159283809461147a575b8015611463575b156114075760ff1981166001178555836113f6575b5060ff845460081c161561139d576112546112599261272b565b6126cd565b60209060405161126983826118d2565b8381525f3681378051906001600160401b03821161138957600160401b821161138957839060975483609755808410611328575b500160978552845b8281106112ed575050506112b7575080f35b7f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989061ff0019835416835560405160018152a180f35b81516001600160a01b03167f354a83ed9988f79f6038d4c7a7dadbad8af32f4ad6df893e0e5807a1b1944ff9820155908401906001016112a5565b7f354a83ed9988f79f6038d4c7a7dadbad8af32f4ad6df893e0e5807a1b1944ff901837f354a83ed9988f79f6038d4c7a7dadbad8af32f4ad6df893e0e5807a1b1944ff9015b81811061137b575061129d565b87815586935060010161136e565b634e487b7160e01b85526041600452602485fd5b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b61ffff19166101011784555f61123a565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b1580156112255750600160ff821614611225565b50600160ff82161061121e565b8280fd5b5034610394576020366003190112610279576103fb6114a86117bc565b611254612675565b346103945760203660031901126102795761047961046d6114cf6117bc565b611c96565b346103945760203660031901126102795760206114f76114f26117bc565b611b4f565b6040519015158152f35b50346103945760203660031901126102795761151b6117bc565b611523612675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103265760405163eb5a4e8760e01b81523060048201526001600160a01b039091166024820152829182908290818381604481016106d3565b503461039457611599366117ea565b916115a2612675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692833b1561032657604051634a86c03760e11b81523060048201526001600160a01b0392831660248201529290911660448301526001600160e01b0319166064820152829182908290818381608481016106d3565b50346116cc5760203660031901126102795761163b6117bc565b611643612675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103265760405163268959e560e01b81523060048201526001600160a01b039290921660248301525f908290604490829084905af180156116c1576116b3575080f35b6116bf91505f906118d2565b005b6040513d5f823e3d90fd5b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b600435906001600160a01b03821682036117d257565b5f80fd5b35906001600160a01b03821682036117d257565b6060906003190112610279576004356001600160a01b03811681036117d257906024356001600160a01b03811681036117d257906044356001600160e01b0319811681036117d25790565b60206040818301928281528451809452019201905f5b8181106118585750505090565b82516001600160a01b031684526020938401939092019160010161184b565b60975481101561188f5760975f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b606081019081106001600160401b038211176118be57604052565b634e487b7160e01b5f52604160045260245ffd5b90601f801991011681019081106001600160401b038211176118be57604052565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b6001600160401b0381116118be57601f01601f191660200190565b9291926119738261194c565b9161198160405193846118d2565b82948184528183011161199d578281602093845f960137010152565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b9181601f8401121561063b578235916001600160401b038311611a7b576020808501948460051b01011161063657565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b6001600160401b0381116118be5760051b60200190565b359063ffffffff821682036117d257565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b609754905f5b828110611b63575050505f90565b611b6c81611877565b905460039190911b1c6001600160a01b0390811690831614611b9057600101611b55565b505050600190565b90816020910312610279575160ff811681036117d25790565b90611bbb82611ad4565b611bc860405191826118d2565b8281528092611bd9601f1991611ad4565b0190602036910137565b90815181101561188f570160200190565b91908201809211611c0157565b634e487b7160e01b5f52601160045260245ffd5b908160409103126102795760405190604082018281106001600160401b038211176118be576040528051906001600160a01b03821682036117d257602091835201516bffffffffffffffffffffffff811681036117d257602082015290565b805182101561188f5760209160051b010190565b5f198114611c015760010190565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610326576040516309aa152760e11b81526001600160a01b039092166004830152602082602481845afa9182156116c1575f926120d6575b50803b15610326576040519163871ef04960e01b83526004830152602082602481845afa9182156116c1575f92612092575b506001600160c01b038216908115908115612029575b5061200f57805f915b611fea575061ffff16611d5e8161194c565b90611d6c60405192836118d2565b808252611d7b601f199161194c565b013660208301375f5f5b8251821080611fdf575b15611ddd576001811b84166001600160c01b0316611db6575b611db190611c88565b611d85565b906001611db19160ff60f81b8460f81b165f1a611dd38287611be3565b5301919050611da8565b505f939250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690835b8151851015611e9f57611e238583611be3565b5160f81c833b156103265760405190633ca5a5f560e01b82526004820152602081602481875afa9081156116c1575f91611e6d575b50611e6590600192611bf4565b940193611e10565b90506020813d8211611e97575b81611e87602093836118d2565b8101031261027957516001611e58565b3d9150611e7a565b611eaa919450611bb1565b925f905f5b8151811015611fd957611ec28183611be3565b5160f81c843b1561032657604051633ca5a5f560e01b81526004810182905290602082602481895afa9182156116c1575f92611fa6575b50905f915b818310611f1057505050600101611eaf565b909194863b1561032657604080516356e4026d60e11b815260ff841660048201526024810188905290816044818b5afa9182156116c157600192611f6f925f91611f78575b50838060a01b03905116611f69828d611c74565b52611c88565b95019190611efe565b611f99915060403d8111611f9f575b611f9181836118d2565b810190611c15565b5f611f55565b503d611f87565b9091506020813d8211611fd1575b81611fc1602093836118d2565b810103126102795751905f611ef9565b3d9150611fb4565b50505050565b506101008110611d8f565b5f198101818111611c015761ffff9116911661ffff8114611c01576001019080611d4c565b505060405161201f6020826118d2565b5f81525f36813790565b8091503b1561032657602060049160405192838092639aa1653d60e01b82525afa80156116c15760ff915f91612063575b5016155f611d43565b612085915060203d60201161208b575b61207d81836118d2565b810190611b98565b5f61205a565b503d612073565b9091506020813d6020116120ce575b816120ae602093836118d2565b8101031261027957516001600160c01b03811681036117d257905f611d2d565b3d91506120a1565b9091506020813d602011612102575b816120f2602093836118d2565b810103126102795751905f611cfb565b3d91506120e5565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206f6666736574000000006044820152606490fd5b919081101561188f5760051b8101359060be1981360301821215612195570190565b61212e565b903590601e198136030182121561219557018035906001600160401b03821161221457602001918160061b360383136121cf57565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c64617461207461696c20746f6f2073686f72740000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206c656e677468000000006044820152606490fd5b356001600160a01b03811681036117d25790565b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206c656e67746800006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c64617461206163636573732073747269646500006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206f666673657400006044820152606490fd5b9035601e19823603018112156103215701602081359101916001600160401b038211610a76578160061b36038313610a7157565b916020908281520191905f905b80821061238a5750505090565b909192833560018060a01b0381168091036117d25781526020840135906bffffffffffffffffffffffff82168092036117d25760408160019360208394015201940192019061237d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561032657604051639aa1653d60e01b8152602081600481855afa80156116c15760ff915f91612634575b5016801561200f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316905f9081905b8083106125b757506124759150611bb1565b925f905f5b843b1561032657604051639aa1653d60e01b8152602081600481895afa80156116c15760ff915f91612599575b50168110156125925760ff8116843b1561032657604051633ca5a5f560e01b81526004810182905290602082602481895afa9182156116c1575f9261255f575b50905f915b8183106124fe5750505060010161247a565b909194863b1561032657604080516356e4026d60e11b815260ff841660048201526024810188905290816044818b5afa9182156116c157600192612556925f91611f785750838060a01b03905116611f69828d611c74565b950191906124ec565b9091506020813d821161258a575b8161257a602093836118d2565b810103126102795751905f6124e7565b3d915061256d565b5092505050565b6125b1915060203d811161208b5761207d81836118d2565b5f6124a7565b90833b1561032657604051633ca5a5f560e01b815260ff84166004820152602081602481885afa9081156116c1575f91612602575b506125f990600192611bf4565b92019190612463565b90506020813d821161262c575b8161261c602093836118d2565b81010312610279575160016125ec565b3d915061260f565b61264d915060203d60201161208b5761207d81836118d2565b5f61242b565b919081101561188f5760051b81013590609e1981360301821215612195570190565b6033546001600160a01b0316330361268957565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b606554604080516001600160a01b038084168252841660208201529192917fe11cddf1816a43318ca175bbc52cd0185436e9cbead7c83acc54a73e461717e39190a16001600160a01b03166001600160a01b03199190911617606555565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b6065546001600160a01b0316330361278757565b638e79fdb560e01b5f5260045ffd5b6040516323b872dd60e01b60208201526001600160a01b0392831660248201529290911660448301526064808301939093529181526127df916127da6084836118d2565b6128a7565b565b6001600160a01b038116803b1561032657604051636eb1769f60e11b81523060048201526001600160a01b038416602482015290602090829060449082905afa9081156116c1575f91612873575b506127df9361283d91611bf4565b60405163095ea7b360e01b60208201526001600160a01b03909316602484015260448084019190915282526127da6064836118d2565b90506020813d60201161289f575b8161288e602093836118d2565b8101031261027957516127df61282f565b3d9150612881565b906129269160018060a01b03165f80604051936128c56040866118d2565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564602086015260208151910182855af13d156129b7573d9161290a8361194c565b9261291860405194856118d2565b83523d5f602085013e6129bb565b8051908115918215612994575b50501561293c57565b60405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b8192509060209181010312610279576020015180151581036117d2575f80612933565b6060915b91929015612a1d57508151156129cf575090565b3b156129d85790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015612a305750805190602001fd5b60405162461bcd60e51b815260206004820152908190612a5490602483019061210a565b0390fdfea2646970667358221220780b7f5cce86a9ceeca17d131f92c3785d83874c73b2d3acf66d994f2222223964736f6c634300081c0033"; type ReclaimServiceManagerConstructorParams = | [signer?: Signer] @@ -1274,31 +646,43 @@ export class ReclaimServiceManager__factory extends ContractFactory { override deploy( _avsDirectory: string, + _slashingRegistryCoordinator: string, _stakeRegistry: string, - _rewardsCoordinator: string, - _delegationManager: string, + rewards_coordinator: string, + allocationManager: string, + _permissionController: string, + _taskManager: string, overrides?: Overrides & { from?: string } ): Promise { return super.deploy( _avsDirectory, + _slashingRegistryCoordinator, _stakeRegistry, - _rewardsCoordinator, - _delegationManager, + rewards_coordinator, + allocationManager, + _permissionController, + _taskManager, overrides || {} ) as Promise; } override getDeployTransaction( _avsDirectory: string, + _slashingRegistryCoordinator: string, _stakeRegistry: string, - _rewardsCoordinator: string, - _delegationManager: string, + rewards_coordinator: string, + allocationManager: string, + _permissionController: string, + _taskManager: string, overrides?: Overrides & { from?: string } ): TransactionRequest { return super.getDeployTransaction( _avsDirectory, + _slashingRegistryCoordinator, _stakeRegistry, - _rewardsCoordinator, - _delegationManager, + rewards_coordinator, + allocationManager, + _permissionController, + _taskManager, overrides || {} ); } diff --git a/src/avs/contracts/factories/ReclaimSlashingRegistryCoordinator__factory.ts b/src/avs/contracts/factories/ReclaimSlashingRegistryCoordinator__factory.ts new file mode 100644 index 00000000..8d83ca4a --- /dev/null +++ b/src/avs/contracts/factories/ReclaimSlashingRegistryCoordinator__factory.ts @@ -0,0 +1,1795 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { + ReclaimSlashingRegistryCoordinator, + ReclaimSlashingRegistryCoordinatorInterface, +} from "../ReclaimSlashingRegistryCoordinator"; + +const _abi = [ + { + type: "constructor", + inputs: [ + { + name: "_stakeRegistry", + type: "address", + internalType: "contract IStakeRegistry", + }, + { + name: "_blsApkRegistry", + type: "address", + internalType: "contract IBLSApkRegistry", + }, + { + name: "_indexRegistry", + type: "address", + internalType: "contract IIndexRegistry", + }, + { + name: "_socketRegistry", + type: "address", + internalType: "contract ISocketRegistry", + }, + { + name: "_allocationManager", + type: "address", + internalType: "contract IAllocationManager", + }, + { + name: "_pauserRegistry", + type: "address", + internalType: "contract IPauserRegistry", + }, + { + name: "_version", + type: "string", + internalType: "string", + }, + ], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "OPERATOR_CHURN_APPROVAL_TYPEHASH", + inputs: [], + outputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "PUBKEY_REGISTRATION_TYPEHASH", + inputs: [], + outputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "allocationManager", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IAllocationManager", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "avs", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "blsApkRegistry", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IBLSApkRegistry", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "calculateOperatorChurnApprovalDigestHash", + inputs: [ + { + name: "registeringOperator", + type: "address", + internalType: "address", + }, + { + name: "registeringOperatorId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "operatorKickParams", + type: "tuple[]", + internalType: + "struct ISlashingRegistryCoordinatorTypes.OperatorKickParam[]", + components: [ + { + name: "quorumNumber", + type: "uint8", + internalType: "uint8", + }, + { + name: "operator", + 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: "calculatePubkeyRegistrationMessageHash", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "churnApprover", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "createSlashableStakeQuorum", + inputs: [ + { + name: "operatorSetParams", + type: "tuple", + internalType: + "struct ISlashingRegistryCoordinatorTypes.OperatorSetParam", + components: [ + { + name: "maxOperatorCount", + type: "uint32", + internalType: "uint32", + }, + { + name: "kickBIPsOfOperatorStake", + type: "uint16", + internalType: "uint16", + }, + { + name: "kickBIPsOfTotalStake", + type: "uint16", + internalType: "uint16", + }, + ], + }, + { + name: "minimumStake", + type: "uint96", + internalType: "uint96", + }, + { + name: "strategyParams", + type: "tuple[]", + internalType: "struct IStakeRegistryTypes.StrategyParams[]", + components: [ + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + { + name: "multiplier", + type: "uint96", + internalType: "uint96", + }, + ], + }, + { + name: "lookAheadPeriod", + type: "uint32", + internalType: "uint32", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "createTotalDelegatedStakeQuorum", + inputs: [ + { + name: "operatorSetParams", + type: "tuple", + internalType: + "struct ISlashingRegistryCoordinatorTypes.OperatorSetParam", + components: [ + { + name: "maxOperatorCount", + type: "uint32", + internalType: "uint32", + }, + { + name: "kickBIPsOfOperatorStake", + type: "uint16", + internalType: "uint16", + }, + { + name: "kickBIPsOfTotalStake", + type: "uint16", + internalType: "uint16", + }, + ], + }, + { + name: "minimumStake", + type: "uint96", + internalType: "uint96", + }, + { + name: "strategyParams", + type: "tuple[]", + internalType: "struct IStakeRegistryTypes.StrategyParams[]", + components: [ + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + { + name: "multiplier", + type: "uint96", + internalType: "uint96", + }, + ], + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "deregisterOperator", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "operatorSetIds", + type: "uint32[]", + internalType: "uint32[]", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "domainSeparator", + inputs: [], + outputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "view", + }, + { + 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: "ejectOperator", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "quorumNumbers", + type: "bytes", + internalType: "bytes", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "ejectionCooldown", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "ejector", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getCurrentQuorumBitmap", + inputs: [ + { + name: "operatorId", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "", + type: "uint192", + internalType: "uint192", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getOperator", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct ISlashingRegistryCoordinatorTypes.OperatorInfo", + components: [ + { + name: "operatorId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "status", + type: "uint8", + internalType: + "enum ISlashingRegistryCoordinatorTypes.OperatorStatus", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getOperatorFromId", + inputs: [ + { + name: "operatorId", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getOperatorId", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getOperatorSetParams", + inputs: [ + { + name: "quorumNumber", + type: "uint8", + internalType: "uint8", + }, + ], + outputs: [ + { + name: "", + type: "tuple", + internalType: + "struct ISlashingRegistryCoordinatorTypes.OperatorSetParam", + components: [ + { + name: "maxOperatorCount", + type: "uint32", + internalType: "uint32", + }, + { + name: "kickBIPsOfOperatorStake", + type: "uint16", + internalType: "uint16", + }, + { + name: "kickBIPsOfTotalStake", + type: "uint16", + internalType: "uint16", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getOperatorStatus", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "uint8", + internalType: "enum ISlashingRegistryCoordinatorTypes.OperatorStatus", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getQuorumBitmapAtBlockNumberByIndex", + inputs: [ + { + name: "operatorId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "blockNumber", + type: "uint32", + internalType: "uint32", + }, + { + name: "index", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "uint192", + internalType: "uint192", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getQuorumBitmapHistoryLength", + inputs: [ + { + name: "operatorId", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getQuorumBitmapIndicesAtBlockNumber", + inputs: [ + { + name: "blockNumber", + type: "uint32", + internalType: "uint32", + }, + { + name: "operatorIds", + type: "bytes32[]", + internalType: "bytes32[]", + }, + ], + outputs: [ + { + name: "", + type: "uint32[]", + internalType: "uint32[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getQuorumBitmapUpdateByIndex", + inputs: [ + { + name: "operatorId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "index", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "tuple", + internalType: + "struct ISlashingRegistryCoordinatorTypes.QuorumBitmapUpdate", + components: [ + { + name: "updateBlockNumber", + type: "uint32", + internalType: "uint32", + }, + { + name: "nextUpdateBlockNumber", + type: "uint32", + internalType: "uint32", + }, + { + name: "quorumBitmap", + type: "uint192", + internalType: "uint192", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "indexRegistry", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IIndexRegistry", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "initialize", + inputs: [ + { + name: "initialOwner", + type: "address", + internalType: "address", + }, + { + name: "churnApprover", + type: "address", + internalType: "address", + }, + { + name: "ejector", + type: "address", + internalType: "address", + }, + { + name: "initialPausedStatus", + type: "uint256", + internalType: "uint256", + }, + { + name: "avs", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "isChurnApproverSaltUsed", + inputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "lastEjectionTimestamp", + 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: "contract IPauserRegistry", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "pubkeyRegistrationMessageHash", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct BN254.G1Point", + components: [ + { + name: "X", + type: "uint256", + internalType: "uint256", + }, + { + name: "Y", + type: "uint256", + internalType: "uint256", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "quorumCount", + inputs: [], + outputs: [ + { + name: "", + type: "uint8", + internalType: "uint8", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "quorumUpdateBlockNumber", + inputs: [ + { + name: "", + type: "uint8", + internalType: "uint8", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "registerOperator", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "operatorSetIds", + type: "uint32[]", + internalType: "uint32[]", + }, + { + name: "data", + type: "bytes", + internalType: "bytes", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "renounceOwnership", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setAVS", + inputs: [ + { + name: "_avs", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setChurnApprover", + inputs: [ + { + name: "_churnApprover", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setEjectionCooldown", + inputs: [ + { + name: "_ejectionCooldown", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setEjector", + inputs: [ + { + name: "_ejector", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setOperatorSetParams", + inputs: [ + { + name: "quorumNumber", + type: "uint8", + internalType: "uint8", + }, + { + name: "operatorSetParams", + type: "tuple", + internalType: + "struct ISlashingRegistryCoordinatorTypes.OperatorSetParam", + components: [ + { + name: "maxOperatorCount", + type: "uint32", + internalType: "uint32", + }, + { + name: "kickBIPsOfOperatorStake", + type: "uint16", + internalType: "uint16", + }, + { + name: "kickBIPsOfTotalStake", + type: "uint16", + internalType: "uint16", + }, + ], + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "socketRegistry", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract ISocketRegistry", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "stakeRegistry", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IStakeRegistry", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "supportsAVS", + inputs: [ + { + name: "_avs", + type: "address", + internalType: "address", + }, + ], + 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: "updateOperators", + inputs: [ + { + name: "operators", + type: "address[]", + internalType: "address[]", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "updateOperatorsForQuorum", + inputs: [ + { + name: "operatorsPerQuorum", + type: "address[][]", + internalType: "address[][]", + }, + { + name: "quorumNumbers", + type: "bytes", + internalType: "bytes", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "updateSocket", + inputs: [ + { + name: "socket", + type: "string", + internalType: "string", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "version", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "event", + name: "AVSUpdated", + inputs: [ + { + name: "prevAVS", + type: "address", + indexed: false, + internalType: "address", + }, + { + name: "newAVS", + type: "address", + indexed: false, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "ChurnApproverUpdated", + inputs: [ + { + name: "prevChurnApprover", + type: "address", + indexed: false, + internalType: "address", + }, + { + name: "newChurnApprover", + type: "address", + indexed: false, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "EIP712DomainChanged", + inputs: [], + anonymous: false, + }, + { + type: "event", + name: "EjectionCooldownUpdated", + inputs: [ + { + name: "prevEjectionCooldown", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "newEjectionCooldown", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "EjectorUpdated", + inputs: [ + { + name: "prevEjector", + type: "address", + indexed: false, + internalType: "address", + }, + { + name: "newEjector", + type: "address", + indexed: false, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Initialized", + inputs: [ + { + name: "version", + type: "uint8", + indexed: false, + internalType: "uint8", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OperatorDeregistered", + inputs: [ + { + name: "operator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "operatorId", + type: "bytes32", + indexed: true, + internalType: "bytes32", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OperatorRegistered", + inputs: [ + { + name: "operator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "operatorId", + type: "bytes32", + indexed: true, + internalType: "bytes32", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OperatorSetParamsUpdated", + inputs: [ + { + name: "quorumNumber", + type: "uint8", + indexed: true, + internalType: "uint8", + }, + { + name: "operatorSetParams", + type: "tuple", + indexed: false, + internalType: + "struct ISlashingRegistryCoordinatorTypes.OperatorSetParam", + components: [ + { + name: "maxOperatorCount", + type: "uint32", + internalType: "uint32", + }, + { + name: "kickBIPsOfOperatorStake", + type: "uint16", + internalType: "uint16", + }, + { + name: "kickBIPsOfTotalStake", + type: "uint16", + internalType: "uint16", + }, + ], + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OperatorSocketUpdate", + inputs: [ + { + name: "operatorId", + type: "bytes32", + indexed: true, + internalType: "bytes32", + }, + { + name: "socket", + type: "string", + indexed: false, + internalType: "string", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OwnershipTransferred", + inputs: [ + { + name: "previousOwner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newOwner", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Paused", + inputs: [ + { + name: "account", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newPausedStatus", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "QuorumBlockNumberUpdated", + inputs: [ + { + name: "quorumNumber", + type: "uint8", + indexed: true, + internalType: "uint8", + }, + { + name: "blocknumber", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "QuorumCreated", + inputs: [ + { + name: "quorumNumber", + type: "uint8", + indexed: true, + internalType: "uint8", + }, + { + name: "operatorSetParams", + type: "tuple", + indexed: false, + internalType: + "struct ISlashingRegistryCoordinatorTypes.OperatorSetParam", + components: [ + { + name: "maxOperatorCount", + type: "uint32", + internalType: "uint32", + }, + { + name: "kickBIPsOfOperatorStake", + type: "uint16", + internalType: "uint16", + }, + { + name: "kickBIPsOfTotalStake", + type: "uint16", + internalType: "uint16", + }, + ], + }, + { + name: "minimumStake", + type: "uint96", + indexed: false, + internalType: "uint96", + }, + { + name: "strategyParams", + type: "tuple[]", + indexed: false, + internalType: "struct IStakeRegistryTypes.StrategyParams[]", + components: [ + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + { + name: "multiplier", + type: "uint96", + internalType: "uint96", + }, + ], + }, + { + name: "stakeType", + type: "uint8", + indexed: false, + internalType: "enum IStakeRegistryTypes.StakeType", + }, + { + name: "lookAheadPeriod", + type: "uint32", + indexed: false, + internalType: "uint32", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Unpaused", + inputs: [ + { + name: "account", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newPausedStatus", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "AlreadyRegisteredForQuorums", + inputs: [], + }, + { + type: "error", + name: "BitmapCannotBeZero", + inputs: [], + }, + { + type: "error", + name: "BitmapEmpty", + inputs: [], + }, + { + type: "error", + name: "BitmapUpdateIsAfterBlockNumber", + inputs: [], + }, + { + type: "error", + name: "BitmapValueTooLarge", + inputs: [], + }, + { + type: "error", + name: "BytesArrayLengthTooLong", + inputs: [], + }, + { + type: "error", + name: "BytesArrayNotOrdered", + inputs: [], + }, + { + type: "error", + name: "CannotChurnSelf", + inputs: [], + }, + { + type: "error", + name: "CannotKickOperatorAboveThreshold", + inputs: [], + }, + { + type: "error", + name: "CannotReregisterYet", + inputs: [], + }, + { + type: "error", + name: "ChurnApproverSaltUsed", + inputs: [], + }, + { + type: "error", + name: "CurrentlyPaused", + inputs: [], + }, + { + type: "error", + name: "ExpModFailed", + inputs: [], + }, + { + type: "error", + name: "InputAddressZero", + inputs: [], + }, + { + type: "error", + name: "InputLengthMismatch", + inputs: [], + }, + { + type: "error", + name: "InsufficientStakeForChurn", + inputs: [], + }, + { + type: "error", + name: "InvalidAVS", + inputs: [], + }, + { + type: "error", + name: "InvalidNewPausedStatus", + inputs: [], + }, + { + type: "error", + name: "InvalidRegistrationType", + inputs: [], + }, + { + type: "error", + name: "InvalidShortString", + inputs: [], + }, + { + type: "error", + name: "InvalidSignature", + inputs: [], + }, + { + type: "error", + name: "InvalidSignature", + inputs: [], + }, + { + type: "error", + name: "LookAheadPeriodTooLong", + inputs: [], + }, + { + type: "error", + name: "MaxOperatorCountReached", + inputs: [], + }, + { + type: "error", + name: "MaxQuorumsReached", + inputs: [], + }, + { + type: "error", + name: "NextBitmapUpdateIsBeforeBlockNumber", + inputs: [], + }, + { + type: "error", + name: "NotRegistered", + inputs: [], + }, + { + type: "error", + name: "NotRegisteredForQuorum", + inputs: [], + }, + { + type: "error", + name: "NotSorted", + inputs: [], + }, + { + type: "error", + name: "OnlyAllocationManager", + inputs: [], + }, + { + type: "error", + name: "OnlyEjector", + inputs: [], + }, + { + type: "error", + name: "OnlyPauser", + inputs: [], + }, + { + type: "error", + name: "OnlyUnpauser", + inputs: [], + }, + { + type: "error", + name: "OperatorNotRegistered", + inputs: [], + }, + { + type: "error", + name: "QuorumDoesNotExist", + inputs: [], + }, + { + type: "error", + name: "QuorumOperatorCountMismatch", + inputs: [], + }, + { + type: "error", + name: "SignatureExpired", + inputs: [], + }, + { + type: "error", + name: "StringTooLong", + inputs: [ + { + name: "str", + type: "string", + internalType: "string", + }, + ], + }, +] as const; + +const _bytecode = + "0x61016080604052346104c457615e7e8038038061001b81610511565b92833981019060e081830312610474578051916001600160a01b0383168303610470576020820151926001600160a01b03841684036104705760408301516001600160a01b03811681036104705760608401516001600160a01b0381168103610470576080850151916001600160a01b03831683036104705760a0860151966001600160a01b038816968789036104705760c0810151906001600160401b03821161042057019486601f870112156103c75785516001600160401b0381116103b3576100f0601f8201601f1916602001610511565b9681885260208801986020838301011161035e57815f9260208093018b5e8801015260c05260a05260e05260805261010052601f8151116103225751905160208210610312575b176101205215610303576101405260325460ff8160081c166102ae5760ff80821603610273575b604051615947908161053782396080518181816127e801526137d8015260a051818181610cf701528181610f920152818161158b01528181611bd601528181611f7401528181614323015281816148290152614ab8015260c051818181610ff7015281816114c601528181611c1a01528181611eb0015281816136e60152818161488b01528181614b1a0152615391015260e0518181816110590152818161152a01528181611f130152818161232c01528181612c7c015281816149000152614b8f01526101005181818161141001528181611e46015281816126de01528181613a1101526150710152610120518161193d015261014051818181610b1a01528181611a76015281816122a101526128d80152f35b60ff90811916176032557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a18061015e565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b6339b190bb60e11b5f5260045ffd5b5f198260200360031b1b16610137565b60449060405192839163305a27a960e01b8352602060048401525180918160248501528484015e5f828201840152601f01601f19168101030190fd5b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b5f80fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b6040519190601f01601f191682016001600160401b038111838210176103b35760405256fe6080604052600436106129ba575f3560e01c8062cf2ab51461037a57806303fd34921461037557806304ec635114610370578063054310e61461036b5780630cf4b767146103665780630d3f213414610361578063125e05841461035c57806313542a4e14610357578063136439dd146103525780631478851f1461034d5780631eb812da14610348578063249a0c421461034357806328f61b311461033e578063296bb0641461033957806329d1e0c3146103345780632cdd1e861461032f578063303ca9561461032a5780633c2a7f4c146103255780633eef3a51146103205780635140a5481461031b578063530b97a41461031657806354fd4d50146103115780635865c60c1461030c578063595c6a67146103075780635ac86ab7146103025780635b0b829f146102fd5780635c975abb146102f85780635df45946146102f357806368304835146102ee5780636e3b17db146102e9578063715018a6146102e457806373447992146102df5780638281ab75146102da57806384b0196e146102d557806384ca5213146102d0578063871ef049146102cb578063886f1195146102c65780638da5cb5b146102c15780639aa1653d146102bc5780639e9923c2146102b75780639feab859146102b2578063a65497c6146102ad578063a96f783e146102a8578063b5265787146102a3578063c391425e1461029e578063c63fd50214610299578063ca0de88214610294578063ca8aa7c71461028f578063de1164bb1461028a578063e65797ad14610285578063ea32afae14610280578063f2fde38b1461027b578063f698da2514610276578063fabc1cbc146102715763fd39105a036129ba57612974565b6128c2565b6128a8565b612817565b6127d3565b612766565b61270d565b6126c9565b61268f565b6124fb565b612457565b6123df565b6123c2565b612395565b61235b565b612317565b6122f8565b6122d0565b61228c565b61225c565b612208565b6120d6565b611d53565b611d24565b611cc9565b611c49565b611c05565b611bc1565b611ba4565b611b10565b611ae1565b611a64565b6119f4565b61192b565b6117f0565b61172a565b6112f0565b611157565b610e5a565b610dc6565b610d99565b610cdc565b610cb4565b610c82565b610bfa565b610bcb565b610aff565b610ac4565b610a89565b610a35565b6109c2565b6108d6565b6107f6565b6107be565b61064e565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b038211176104f757604052565b6104c8565b604081019081106001600160401b038211176104f757604052565b90601f801991011681019081106001600160401b038211176104f757604052565b60405190610547604083610517565b565b60405190610547606083610517565b6001600160401b0381116104f75760051b60200190565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b6001600160a01b038116036105d957565b5f80fd5b9080601f830112156106495781356105f481610558565b926106026040519485610517565b81845260208085019260051b82010192831161064457602001905b82821061062a5750505090565b602080918335610639816105c8565b81520191019061061d565b61056f565b61046f565b346107b95760203660031901126107b4576004356001600160401b0381116107af5761067e9036906004016105dd565b61069561068f600480603354161490565b15612a1d565b6040905f60205b82518210156107ad578351906106b28583610517565b60018252803660208401376106f26106da6106cd8587612a59565b516001600160a01b031690565b6106e384612a47565b6001600160a01b039091169052565b6106fa612a6d565b9061072461070b6106cd8688612a59565b6001600160a01b03165f90815260036020526040902090565b5461072e83612a47565b5261075861075361074761074185612a47565b51614c90565b6001600160c01b031690565b61350f565b945f5b865181101561079b578061079561078e61078861077a6001958c612ac1565b516001600160f81b03191690565b60f81c90565b86886136bc565b0161075b565b509450600190930192915061069c9050565b005b61041f565b6103cf565b61037f565b346107b95760203660031901126107b4576004355f526002602052602060405f2054604051908152f35b63ffffffff8116036105d957565b346107b95760603660031901126107b45760243561083661083060043561081c846107e8565b604435905f52600260205260405f20612bb1565b50612bc6565b63ffffffff8082511692169182106108bd5760408161087261089a9460206108809501519063ffffffff82161591821561089e575b50506137bf565b01516001600160c01b031690565b6040516001600160c01b0390911681529081906020820190565b0390f35b9091506108b59063ffffffff165b63ffffffff1690565b115f8061086b565b636cb19aff60e01b5f5260045ffd5b5f9103126107b457565b346107b9575f3660031901126107b4576007546040516001600160a01b039091168152602090f35b6001600160401b0381116104f757601f01601f191660200190565b929192610925826108fe565b916109336040519384610517565b82948184528183011161094f578281602093845f960137010152565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b9080601f83011215610649578160206109bf93359101610919565b90565b346107b95760203660031901126107b4576004356001600160401b0381116107af576109f29036906004016109a4565b335f52600360205260ff600160405f20015416906003821015610a3057610a1e60016107ad9314612ad2565b335f52600360205260405f20546137d5565b6119ae565b346107b95760203660031901126107b4577fa77a91bea7b6d95a8eb5a54878a1d9e3c875e26c86a9b70e3420c5c5db193b626040600435610a74613895565b600a549080600a5582519182526020820152a1005b346107b95760203660031901126107b457600435610aa6816105c8565b60018060a01b03165f526009602052602060405f2054604051908152f35b346107b95760203660031901126107b457600435610ae1816105c8565b60018060a01b03165f526003602052602060405f2054604051908152f35b346107b95760203660031901126107b4576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600435813b15610bc65760206024926040519384809263237dfb4760e11b82523360048301525afa918215610bc1576107ad92610b7e915f91610b92575b50612b67565b610b8d60335482811614612b7d565b613921565b610bb4915060203d602011610bba575b610bac8183610517565b810190612b48565b5f610b78565b503d610ba2565b612b5c565b612ae8565b346107b95760203660031901126107b4576004355f526004602052602060ff60405f2054166040519015158152f35b346107b95760403660031901126107b4576060610c32610830602435600435610c21612b93565b505f52600260205260405f20612bb1565b6040519063ffffffff815116825263ffffffff6020820151166020830152604060018060c01b03910151166040820152f35b6004359060ff821682036105d957565b359060ff821682036105d957565b346107b95760203660031901126107b45760ff610c9d610c64565b165f526005602052602060405f2054604051908152f35b346107b9575f3660031901126107b4576008546040516001600160a01b039091168152602090f35b346107b95760203660031901126107b4576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600435813b15610bc6576020906024604051809481936308f6629d60e31b835260048301525afa8015610bc15761089a915f91610d6a575b506040516001600160a01b0390911681529081906020820190565b610d8c915060203d602011610d92575b610d848183610517565b810190612bf7565b5f610d4f565b503d610d7a565b346107b95760203660031901126107b4576107ad600435610db9816105c8565b610dc1613895565b613953565b346107b95760203660031901126107b4576107ad600435610de6816105c8565b610dee613895565b6139b1565b9080601f83011215610649578135610e0a81610558565b92610e186040519485610517565b81845260208085019260051b82010192831161064457602001905b828210610e405750505090565b602080918335610e4f816107e8565b815201910190610e33565b346107b95760603660031901126107b457600435610e77816105c8565b602435610e83816105c8565b604435906001600160401b0382116107af57610ed9610ea9610ede933690600401610df3565b91610eb2613a0f565b610ec361068f600280603354161490565b600b546001600160a01b03918216911614612c0c565b613a50565b6001600160a01b0382165f9081526003602052604090209091610f77825492610f276001610f1881610f0f88614c90565b94015460ff1690565b610f21816119c2565b14612ad2565b610f41610747610747610f3b5f5460ff1690565b88613e7c565b90610f4d821515613a99565b610f688282166001600160c01b03168314612ea0565b612ea0565b9019166001600160c01b031690565b610f818184614cd4565b6001600160c01b0316156110f8575b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc657835f91610fe5938360405180968195829463f4e24fe560e01b845260048401613aaf565b03925af18015610bc1576110e4575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc6575f604051809263bd29b8cd60e01b8252818381611047898960048401613ad1565b03925af18015610bc1576110d0575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691823b15610bc6576110ac925f928360405180968195829463bd29b8cd60e01b845260048401613ad1565b03925af18015610bc1576110bc57005b806110ca5f6107ad93610517565b806108cc565b806110ca5f6110de93610517565b5f611056565b806110ca5f6110f293610517565b5f610ff4565b6001600160a01b0381165f90815260036020526040902061112390600101805460ff19166002179055565b816001600160a01b0382167f396fdcb180cb0fea26928113fb0fd1c3549863f9cd563e6a184f1d578116c8e45f80a3610f90565b346107b95760203660031901126107b457604061118f61118a60043561117c816105c8565b611184612c22565b506130ce565b613afc565b6111a58251809260208091805184520151910152565bf35b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b60609060031901126112485760405190611211826104dc565b8160043561121e816107e8565b815260243561ffff811681036105d95760208201526044359061ffff821682036105d95760400152565b6111a7565b6001600160601b038116036105d957565b81601f820112156106495780359061127582610558565b926112836040519485610517565b82845260208085019360061b8301019181831161064457602001925b8284106112ad575050505090565b60408483031261124857602060409182516112c7816104fc565b86356112d2816105c8565b8152828701356112e18161124d565b8382015281520193019261129f565b346107b95760c03660031901126107b45761130a366111f8565b6064356113168161124d565b6084356001600160401b0381116107af5761133590369060040161125e565b60a43592611342846107e8565b61134a613895565b5f5460ff1692839161135e60c08410613c1a565b61137861136a86613c30565b60ff1660ff195f5416175f55565b6113828186613fad565b61138a613c42565b946113958551612a8f565b965f5b86518110156113d257806113cc6113c26113b46001948b612a59565b51516001600160a01b031690565b6106e3838d612a59565b01611398565b5086889695966113e0610538565b63ffffffff891681529060208201526113f882612a47565b5261140281612a47565b50600b546001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116929116823b15610bc657604051630130fc2760e51b8152915f918391829161145d919060048401613c8f565b038183865af18015610bc157611690575b506114796001613312565b6114836001613312565b803b15610bc657602060049160405192838092632981eb7760e01b82525afa8015610bc1576114c4915f91611661575b5063ffffffff808416911611613d4a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc6575f6040518092630662d3e160e51b82528183816115188c898d8c60048601613db1565b03925af18015610bc15761164d575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc65760405163136ca0f960e11b815260ff84166004820152905f908290602490829084905af18015610bc157611639575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc65760405163136ca0f960e11b815260ff9390931660048401525f908390602490829084905af18015610bc1577fa34835bc2b673ec37fcf1591a91295b163fc2e181e4ea4e733beb27de1ceac4c9561162093600192611625575b5060405195869586613e0e565b0390a2005b806110ca5f61163393610517565b88611613565b806110ca5f61164793610517565b86611588565b806110ca5f61165b93610517565b86611527565b611683915060203d602011611689575b61167b8183610517565b810190612e75565b886114b3565b503d611671565b806110ca5f61169e93610517565b8761146e565b9181601f84011215610649578235916001600160401b0383116116d1576020838186019501011161064457565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b346107b95760403660031901126107b4576004356001600160401b0381116107af573660238201121561064957806004013561176581610558565b916117736040519384610517565b8183526024602084019260051b820101903682116106445760248101925b8284106117c157602435856001600160401b0382116107af576117bb6107ad9236906004016116a4565b91612c3a565b83356001600160401b038111610649576020916117e58392602436918701016105dd565b815201930192611791565b346107b95760a03660031901126107b45760043561180d816105c8565b61187b60243561181c816105c8565b604435611828816105c8565b6064359060843592611839846105c8565b6032549561185f60ff600889901c1615809881996118f9575b81156118d9575b50612ecc565b86611872600160ff196032541617603255565b6118c057612f2f565b61188157005b61189161ff001960325416603255565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1005b6118d461010061ff00196032541617603255565b612f2f565b303b159150816118eb575b505f611859565b60ff1660011490505f6118e4565b600160ff8216109150611852565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b346107b9575f3660031901126107b4577f000000000000000000000000000000000000000000000000000000000000000060ff8116601f811161199f5761089a916040519161197b604084610517565b60208084528381019190368337835252604051918291602083526020830190611907565b632cd44ac360e21b5f5260045ffd5b634e487b7160e01b5f52602160045260245ffd5b60031115610a3057565b906003821015610a305752565b815181526020918201516040820193926105479201906119cc565b346107b95760203660031901126107b457600435611a11816105c8565b611a19612c22565b5060018060a01b03165f52600360205260405f2060ff600160405192611a3e846104fc565b80548452015416906003821015610a305761089a916020820152604051918291826119d9565b346107b9575f3660031901126107b4577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc65760206024916040519283809263237dfb4760e11b82523360048301525afa8015610bc157611ad9915f91610b925750612b67565b6107ad6138ed565b346107b95760203660031901126107b4576020600160ff611b00610c64565b161b806033541614604051908152f35b346107b95760803660031901126107b457611b29610c64565b606036602319011261124857604051611b41816104dc565b602435611b4d816107e8565b815260443561ffff811681036105d957602082015260643561ffff811681036105d9576040820152611b7d613895565b60ff5f541660ff83161015611b95576107ad91613fad565b637310cff560e11b5f5260045ffd5b346107b9575f3660031901126107b4576020603354604051908152f35b346107b9575f3660031901126107b4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346107b9575f3660031901126107b4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346107b95760403660031901126107b457600435611c66816105c8565b6024356001600160401b0381116107af57611c859036906004016109a4565b6008546001600160a01b03163303611cba576001600160a01b0382165f9081526009602052604090204290556107ad91614068565b6376d8ab1760e11b5f5260045ffd5b346107b9575f3660031901126107b457611ce1613895565b609680546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346107b95760203660031901126107b4576020611d4b600435611d46816105c8565b6130ce565b604051908152f35b346107b95760a03660031901126107b457611d6d366111f8565b606435611d798161124d565b6084356001600160401b0381116107af57611d9890369060040161125e565b611da0613895565b5f5460ff1680611db260c08210613c1a565b611dbe61136a82613c30565b611dc88582613fad565b611dd0613c42565b93611ddb8451612a8f565b955f5b8551811015611e0a5780611e04611dfa6113b46001948a612a59565b6106e3838c612a59565b01611dde565b50848688611e16610538565b63ffffffff88168152906020820152611e2e82612a47565b52611e3881612a47565b50600b546001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811692911690823b15610bc657611e95925f9283604051809681958294630130fc2760e51b845260048401613c8f565b03925af18015610bc15761203f575b50611eae5f613312565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc6575f6040518092633aea0b9d60e11b8252818381611f01888b8d60048501613de6565b03925af18015610bc15761202b575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc65760405163136ca0f960e11b815260ff86166004820152905f908290602490829084905af18015610bc157612017575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc65760405163136ca0f960e11b815260ff9590951660048601525f908590602490829084905af1938415610bc1575f6116209281927fa34835bc2b673ec37fcf1591a91295b163fc2e181e4ea4e733beb27de1ceac4c97612009575060405195869586613e0e565b806110ca8461163393610517565b806110ca5f61202593610517565b85611f71565b806110ca5f61203993610517565b85611f10565b806110ca5f61204d93610517565b85611ea4565b92939161207561208392600f60f81b865260e0602087015260e0860190611907565b908482036040860152611907565b92606083015260018060a01b031660808201525f60a082015260c0818303910152602080835192838152019201905f5b8181106120c05750505090565b82518452602093840193909201916001016120b3565b346107b9575f3660031901126107b45760c854158061216e575b15612131576120fd61414f565b612105614204565b9061089a604051612117602082610517565b5f8082523660208301376040519384933091469186612053565b60405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606490fd5b5060c954156120f0565b81601f820112156106495780359061218f82610558565b9261219d6040519485610517565b82845260208085019360061b8301019181831161064457602001925b8284106121c7575050505090565b60408483031261124857602060409182516121e1816104fc565b6121ea87610c74565b8152828701356121f9816105c8565b838201528152019301926121b9565b346107b95760a03660031901126107b457600435612225816105c8565b60243590604435906001600160401b0382116107af5760209261224f611d4b933690600401612178565b6064359160843593613121565b346107b95760203660031901126107b457602061227a600435614c90565b6040516001600160c01b039091168152f35b346107b9575f3660031901126107b4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346107b9575f3660031901126107b4576096546040516001600160a01b039091168152602090f35b346107b9575f3660031901126107b457602060ff5f5416604051908152f35b346107b9575f3660031901126107b4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346107b9575f3660031901126107b45760206040517f2bd82124057f0913bc3b772ce7b83e8057c1ad1f3510fc83778be20f10ec5de68152f35b346107b95760203660031901126107b4576107ad6004356123b5816105c8565b6123bd613895565b613f4f565b346107b9575f3660031901126107b4576020600a54604051908152f35b346107b95760203660031901126107b45760206004356123fe816105c8565b600b546040516001600160a01b0392831691909216148152f35b60206040818301928281528451809452019201905f5b81811061243b5750505090565b825163ffffffff1684526020938401939092019160010161242e565b346107b95760403660031901126107b457600435612474816107e8565b602435906001600160401b0382116107af5736602383011215610649578160040135916124a083610558565b926124ae6040519485610517565b8084526024602085019160051b8301019136831161064457602401905b8282106124eb5761089a6124df8686614299565b60405191829182612418565b81358152602091820191016124cb565b346107b95760803660031901126107b457600435612518816105c8565b602435612524816105c8565b6044356001600160401b0381116107af57612543903690600401610df3565b90606435916001600160401b0383116107af576125a76125bf9161256e610ed99536906004016116a4565b959094612579613a0f565b61258a61068f600180603354161490565b600b546001600160a01b03166001600160a01b0390911614612c0c565b9282016125b481846132cf565b879592949195614320565b926125c981613312565b8061265057505050916125dd928194614751565b51905f5b81518110156107ad578061264a61260061078861077a60019587612ac1565b63ffffffff6126416108ac61263761262561261b888c612a59565b5163ffffffff1690565b9460ff165f52600160205260405f2090565b5463ffffffff1690565b91161115613435565b016125e1565b80612662600192989695979498613312565b03612680576107ad956126749161331c565b97935095915050614431565b63354bb8ab60e01b5f5260045ffd5b346107b9575f3660031901126107b45760206040517f4d404e3276e7ac2163d8ee476afa6a41d1f68fb71f2d8b6546b24e55ce01b72a8152f35b346107b9575f3660031901126107b4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346107b9575f3660031901126107b457600b546040516001600160a01b039091168152602090f35b61054790929192606081019361ffff6040809263ffffffff8151168552826020820151166020860152015116910152565b346107b95760203660031901126107b45760ff612781610c64565b612789612b93565b50165f52600160205261089a60405f2061ffff604051916127a9836104dc565b5463ffffffff81168352818160201c16602084015260301c16604082015260405191829182612735565b346107b9575f3660031901126107b4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346107b95760203660031901126107b457600435612834816105c8565b61283c613895565b6001600160a01b03811615612854576107ad90613f07565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346107b9575f3660031901126107b4576020611d4b615568565b346107b95760203660031901126107b4576004357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc65760206004916040519283809263755b36bd60e11b82525afa908115610bc1575f91612955575b506001600160a01b03163303612946576107ad9061347d565b63794821ff60e01b5f5260045ffd5b61296e915060203d602011610d9257610d848183610517565b5f61292d565b346107b95760203660031901126107b457600435612991816105c8565b60018060a01b03165f526003602052602060ff600160405f200154166111a560405180926119cc565b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b15612a2457565b63840a48d560e01b5f5260045ffd5b634e487b7160e01b5f52603260045260245ffd5b805115612a545760200190565b612a33565b8051821015612a545760209160051b010190565b60408051909190612a7e8382610517565b6001815291601f1901366020840137565b90612a9982610558565b612aa66040519182610517565b8281528092612ab7601f1991610558565b0190602036910137565b908151811015612a54570160200190565b15612ad957565b63aba4733960e01b5f5260045ffd5b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b519081151582036105d957565b908160209103126107b4576109bf90612b3b565b6040513d5f823e3d90fd5b15612b6e57565b631d77d47760e21b5f5260045ffd5b15612b8457565b63c61dca5d60e01b5f5260045ffd5b60405190612ba0826104dc565b5f6040838281528260208201520152565b8054821015612a54575f5260205f2001905f90565b90604051612bd3816104dc565b604081935463ffffffff8116835263ffffffff8160201c166020840152811c910152565b908160209103126107b457516109bf816105c8565b15612c1357565b6366e565df60e01b5f5260045ffd5b60405190612c2f826104fc565b5f6020838281520152565b9190612c4d61068f600480603354161490565b612c6b612c5b5f5460ff1690565b612c66368585610919565b613e7c565b50612c7882845114612e53565b5f917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165b818410612cb3575050505050565b612cd7610788612cc986858798999a9697612e69565b356001600160f81b03191690565b91612ce28688612a59565b51918251813b15610bc6576040516379a0849160e11b815260ff8616600482015290602082602481865afa918215610bc157612d2d9263ffffffff915f91612e35575b501614612e8a565b612d378351612a8f565b955f985f995b85518b1015612dc35788612dbb600192612da6610f638f612d986107476107418f938f6106cd82612d6d92612a59565b6001600160a01b0381165f908152600360205260409020909a9054612d928383612a59565b52612a59565b60ff600192161c1660011490565b838060a01b0316838060a01b03831611612eb6565b9a0199612d3d565b509594809298939950612dd991976001956136bc565b43612def8260ff165f52600560205260405f2090565b557f46077d55330763f16269fd75e5761663f4192d2791747c0189b16ad31db07db460ff60405192169180612e2943829190602083019252565b0390a201929193612ca5565b612e4d915060203d81116116895761167b8183610517565b5f612d25565b15612e5a57565b63aaad13f760e01b5f5260045ffd5b90821015612a54570190565b908160209103126107b457516109bf816107e8565b15612e9157565b638e5aeee760e01b5f5260045ffd5b15612ea757565b63d053aa2160e01b5f5260045ffd5b15612ebd57565b63ba50f91160e01b5f5260045ffd5b15612ed357565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b92919260408051612f408282610517565b601681527520ab29a932b3b4b9ba393ca1b7b7b93234b730ba37b960511b6020820152612f6f82519283610517565b600682526576302e302e3160d01b6020830152612f9c60ff60325460081c16612f9781613ea7565b613ea7565b8051906001600160401b0382116104f757612fc182612fbc60ca54614117565b614e7c565b602090601f831160011461303357610dee946130116123bd989561300986610b8d976105479e9d9b97610dc1975f92613028575b50508160011b915f199060031b1c19161790565b60ca55614f1b565b61301a5f60c855565b6130235f60c955565b613f07565b015190505f80612ff5565b60ca5f52601f19831691907f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee1925f5b8181106130b657506123bd98956001866105479d9c9a96610dc196610dee9b96610b8d9a613011971061309e575b505050811b0160ca55614f1b565b01515f1960f88460031b161c191690555f8080613090565b92936020600181928786015181550195019301613062565b6109bf9060405160208101917f2bd82124057f0913bc3b772ce7b83e8057c1ad1f3510fc83778be20f10ec5de6835260018060a01b0316604082015260408152613119606082610517565b5190206140f1565b919493909260405192602084019460e08501917f4d404e3276e7ac2163d8ee476afa6a41d1f68fb71f2d8b6546b24e55ce01b72a875260018060a01b03166040860152606085015260c060808501528651809152602061010085019701905f5b8181106131ae575050506109bf949561311992849260a084015260c083015203601f198101835282610517565b8251805160ff168a526020908101516001600160a01b0316818b015260409099019890920191600101613181565b359060028210156105d957565b919082604091031261124857604051613201816104fc565b6020808294803584520135910152565b9080601f83011215610649576040519161322c604084610517565b82906040810192831161064457905b8282106132485750505090565b813581526020918201910161323b565b8082039291610100841261124857604051613272816104dc565b6080819561328084866131e9565b835261328f84604087016131e9565b6020840152607f190112611248576132c660409260c08451956132b1876104fc565b6132be8360808301613211565b875201613211565b60208401520152565b9091610140828403126107b4576132e5826131dc565b926020830135906001600160401b0382116107af57604061330b826109bf9487016109a4565b9401613258565b60021115610a3057565b9190610180838203126107b457613332836131dc565b9260208101356001600160401b0381116107af57826133529183016109a4565b926133608360408401613258565b926101408301356001600160401b0381116107af5781613381918501612178565b92610160810135906001600160401b0382116107af57019060608282031261124857604051916133b0836104dc565b80356001600160401b0381116133e4576040926133ce9183016109a4565b8352602081013560208401520135604082015290565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b1561343c57565b63c6b9e76760e01b5f5260045ffd5b90604051613458816104dc565b604061ffff82945463ffffffff81168452818160201c16602085015260301c16910152565b61348e603354198219811614612b7d565b806033556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a2565b906134ca826108fe565b6134d76040519182610517565b8281528092612ab7601f19916108fe565b634e487b7160e01b5f52601160045260245ffd5b5f19811461350a5760010190565b6134e8565b5f81805b61358957506135259061ffff166134c0565b5f5f5b825182108061357e575b15613577576001811b8416613550575b61354b906134fc565b613528565b90600161354b9160ff60f81b8460f81b165f1a61356d8287612ac1565b5301919050613542565b5050905090565b506101008110613532565b5f19810181811161350a5761ffff9116911661ffff811461350a576001019080613513565b6020818303126107b4578051906001600160401b0382116107af57019080601f830112156106495781516135e181610558565b926135ef6040519485610517565b81845260208085019260051b82010192831161064457602001905b8282106136175750505090565b6020809161362484612b3b565b81520191019061360a565b93929190606085016060865281518091526020608087019201905f5b81811061369d575050508481036020860152602080835192838152019201905f5b818110613687575050509060406105479294019060ff169052565b825184526020938401939092019160010161366c565b82516001600160a01b031684526020938401939092019160010161364b565b909291926136c8612a6d565b9060f885901b6001600160f81b0319165f1a6136e383612a47565b537f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031694853b15610bc65761373a955f9283604051809981958294636c3fb4bf60e01b84528a6004850161362f565b03925af1938415610bc1575f9461379b575b505f5b8251811015613794578061376e61376860019388612a59565b51151590565b613779575b0161374f565b61378f8361378a6106cd8488612a59565b614068565b613773565b5050509050565b6137b89194503d805f833e6137b08183610517565b8101906135ae565b925f61374c565b156137c657565b63bbba60cb60e01b5f5260045ffd5b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b15610bc6575f60405180936378219b3f60e11b8252856004830152604060248301528183816138356044820188611907565b03925af1908115610bc1577fec2963ab21c1e50e1e582aa542af2e4bf7bf38e6e1403c27b42e1c5d6e621eaa9261388092613885575b50604051918291602083526020830190611907565b0390a2565b5f61388f91610517565b5f61386b565b6096546001600160a01b031633036138a957565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b5f196033556040515f1981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2565b806033556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2565b600754604080516001600160a01b038084168252841660208201529192917f315457d8a8fe60f04af17c16e2f5a5e1db612b31648e58030360759ef8f3528c9190a16001600160a01b03166001600160a01b03199190911617600755565b600854604080516001600160a01b038084168252841660208201529192917f8f30ab09f43a6c157d7fce7e0a13c003042c1c95e8a72e7a146a21c0caa24dc99190a16001600160a01b03166001600160a01b03199190911617600855565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303613a4157565b6323d871a560e01b5f5260045ffd5b90613a5b82516134c0565b5f5b8351811015613a94576001906001600160f81b0319613a7c8287612a59565b5160f81b165f1a613a8d8285612ac1565b5301613a5d565b509150565b15613aa057565b6368b6a87560e11b5f5260045ffd5b6001600160a01b0390911681526040602082018190526109bf92910190611907565b6040906109bf939281528160208201520190611907565b634e487b7160e01b5f52601260045260245ffd5b5f5160206158f25f395f51905f5290613b13612c22565b505f919006602060c0835b613c13575f935f5160206158f25f395f51905f5260038186818180090908604051613b498582610517565b84368237848185604051613b5d8282610517565b813682378381528360208201528360408201528560608201527f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f5260808201525f5160206158f25f395f51905f5260a082015260056107cf195a01fa8015613c1857613bc790615642565b5191613c13575f5160206158f25f395f51905f5282800914613bfe57505f5160206158f25f395f51905f5260015f94089293613b1e565b92935050613c0a610538565b92835282015290565b613ae8565bfe5b15613c2157565b633cb89c9760e01b5f5260045ffd5b60ff60019116019060ff821161350a57565b60408051909190613c538382610517565b6001815291601f1901825f5b828110613c6b57505050565b602090604051613c7a816104fc565b5f815260608382015282828501015201613c5f565b90604082019060018060a01b031682526040602083015282518091526060820191602060608360051b8301019401925f915b838310613cd057505050505090565b9091929394605f1982820301835285516020606081604085019363ffffffff81511686520151936040838201528451809452019201905f905b808210613d285750505060208060019297019301930191939290613cc1565b82516001600160a01b0316845260209384019390920191600190910190613d09565b15613d5157565b630bd441b960e21b5f5260045ffd5b90602080835192838152019201905f5b818110613d7d5750505090565b825180516001600160a01b031685526020908101516001600160601b03168186015260409094019390920191600101613d70565b906109bf94936001600160601b0360809460ff63ffffffff941685521660208401521660408201528160608201520190613d60565b6001600160601b036109bf949360ff6060941683521660208201528160408201520190613d60565b9395949060c0936001600160601b0363ffffffff94613e5088613e679561ffff6040809263ffffffff8151168552826020820151166020860152015116910152565b16606087015260e0608087015260e0860190613d60565b95613e7181613312565b60a085015216910152565b906001613e8a60ff93614e04565b928392161b1115613e985790565b63ca95733360e01b5f5260045ffd5b15613eae57565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b609680546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b600b54604080516001600160a01b038084168252841660208201529192917f9770f3cadfdcbb6f93af935e86047111590c3768271d237e4a2bc0b874bed6939190a16001600160a01b03166001600160a01b03199190911617600b55565b60ff7f3ee6fe8d54610244c3e9d3c066ae4aee997884aa28f10616ae821925401318ac911691825f52600160205260405f2061400063ffffffff835116829063ffffffff1663ffffffff19825416179055565b6020820151815465ffff0000000067ffff000000000000604086015160301b169260201b169067ffffffff00000000191617179055604051809161388082606081019261ffff6040809263ffffffff8151168552826020820151166020860152015116910152565b9060018060a01b0382165f52600360205260405f2060ff6001820154166003811015610a30576001036140e2576140d190546140a860ff5f541684613e7c565b6001600160c01b03908116916140bd90614c90565b1681166001600160c01b0390811691161490565b6140d9575050565b6105479161505c565b6325ec6c1f60e01b5f5260045ffd5b6042906140fc615568565b906040519161190160f01b8352600283015260228201522090565b90600182811c92168015614145575b602083101461413157565b634e487b7160e01b5f52602260045260245ffd5b91607f1691614126565b604051905f8260ca549161416283614117565b80835292600181169081156141e55750600114614186575b61054792500383610517565b5060ca5f90815290917f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee15b8183106141c95750509060206105479282010161417a565b60209193508060019154838589010152019101909184926141b1565b6020925061054794915060ff191682840152151560051b82010161417a565b604051905f8260cb549161421783614117565b80835292600181169081156141e5575060011461423a5761054792500383610517565b5060cb5f90815290917fa7ce836d032b2bf62b7e2097a8e0a6d8aeb35405ad15271e96d3b0188a1d06fb5b81831061427d5750509060206105479282010161417a565b6020919350806001915483858901015201910190918492614265565b91906142a58151612a8f565b905f5b81518110156142e357806142ca6142c160019385612a59565b51876002615151565b63ffffffff6142d98387612a59565b91169052016142a8565b5090925050565b908160209103126107b4575190565b905f905b6002821061430a57505050565b60208060019285518152019301910190916142fd565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690614354612c22565b5061436161118a846130ce565b91803b15610bc6576040935f610164926143f56020966143e1888a519a8b998a986301e2d35b60e11b8a5260018060a01b031660048a01526143b160248a01825160208091805184520151910152565b80830151805160648b01526020015160848a015201516143d560a4890182516142f9565b015160e48701906142f9565b805161012486015260200151610144850152565b5af1908115610bc1575f91614408575090565b6109bf915060203d60201161442a575b6144228183610517565b8101906142ea565b503d614418565b94918093916144526144589461444a8851855114612e53565b87838a61525b565b86614a7c565b5f5b8251811015614563578061449261448d61447c61078861077a60019689612ac1565b60ff165f52600160205260405f2090565b61344b565b6144a061261b838651612a59565b63ffffffff6144b66108ac845163ffffffff1690565b9116116144c5575b500161445a565b61451b906144d961078861077a8589612ac1565b6144f76144ea856040890151612a59565b516001600160601b031690565b896145096144ea8760208b0151612a59565b91614514878c612a59565b519361533c565b61455d614526612a6d565b61453361077a8488612ac1565b5f1a61453e82612a47565b5361378a602061454e858a612a59565b5101516001600160a01b031690565b5f6144be565b5050505050565b60405190614577826104dc565b60606040838281528260208201520152565b1561459057565b6313ca465760e01b5f5260045ffd5b156145a657565b630c6816cd60e01b5f5260045ffd5b9190820180921161350a57565b156145c957565b631968677d60e11b5f5260045ffd5b600160209183518155019101516003811015610a305760ff80198354169116179055565b9080601f8301121561064957815161461381610558565b926146216040519485610517565b81845260208085019260051b82010192831161064457602001905b8282106146495750505090565b6020809183516146588161124d565b81520191019061463c565b9190916040818403126107b45780516001600160401b0381116107af578361468c9183016145fc565b9260208201516001600160401b0381116107af576109bf92016145fc565b6109bf939260609260018060a01b0316825260208201528160408201520190611907565b6020818303126107b4578051906001600160401b0382116107af57019080601f8301121561064957815161470181610558565b9261470f6040519485610517565b81845260208085019260051b82010192831161064457602001905b8282106147375750505090565b602080918351614746816107e8565b81520191019061472a565b6147f061475c61456a565b946147ea614771610747610f3b5f5460ff1690565b61477a86614c90565b906147848661548b565b6001600160c01b031690614799821515614589565b60018060c01b03166147b36147ae8284161590565b61459f565b6001600160a01b0386165f9081526009602052604090206147e3906147dc9054600a54906145b5565b42116145c2565b1785614cd4565b836137d5565b6001614818816148108460018060a01b03165f52600360205260405f2090565b015460ff1690565b614821816119c2565b03614a17575b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc6575f6040518092631fd93ca960e11b82528183816148798a8960048401613aaf565b03925af18015610bc157614a03575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc657835f9184836148e09560405196879586948593632550477760e01b8552600485016146aa565b03925af18015610bc1575f915f916149df575b50604085015260208401527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc657825f91614952938360405180968195829462bff04d60e01b845260048401613ad1565b03925af1908115610bc1575f916149bd575b5082525f5b81518110156149b857806149b261498e61448d61447c61078861077a60019789612ac1565b63ffffffff6126416108ac6149a761261b878b51612a59565b935163ffffffff1690565b01614969565b505090565b6149d991503d805f833e6149d18183610517565b8101906146ce565b5f614964565b90506149fd91503d805f833e6149f58183610517565b810190614663565b5f6148f3565b806110ca5f614a1193610517565b5f614888565b614a48614a22610538565b838152600160208201526001600160a01b0383165f9081526003602052604090206145d8565b816001600160a01b0382167fe8e68cef1c3a761ed7be7e8463a375f27f7bc335e51824223cacce636ec5c3fe5f80a3614827565b614a8761475c61456a565b6001614aa7816148108460018060a01b03165f52600360205260405f2090565b614ab0816119c2565b03614c43575b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc6575f6040518092631fd93ca960e11b8252818381614b088a8960048401613aaf565b03925af18015610bc157614c2f575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc657835f918483614b6f9560405196879586948593632550477760e01b8552600485016146aa565b03925af18015610bc1575f915f91614c13575b50604085015260208401527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691823b15610bc657614be1925f928360405180968195829462bff04d60e01b845260048401613ad1565b03925af1908115610bc1575f91614bf9575b50815290565b614c0d91503d805f833e6149d18183610517565b5f614bf3565b9050614c2991503d805f833e6149f58183610517565b5f614b82565b806110ca5f614c3d93610517565b5f614b17565b614c4e614a22610538565b816001600160a01b0382167fe8e68cef1c3a761ed7be7e8463a375f27f7bc335e51824223cacce636ec5c3fe5f80a3614ab6565b5f1981019190821161350a57565b805f52600260205260405f20549081155f14614cac5750505f90565b5f52600260205260405f20905f19810190811161350a57614ccc91612bb1565b505460401c90565b90614ce7825f52600260205260405f2090565b5480614d345750614d03610547925f52600260205260405f2090565b614d2f614d0e610549565b4363ffffffff168152925b5f60208501526001600160c01b03166040840152565b6155cf565b91614d5f63ffffffff93614d59614d53845f52600260205260405f2090565b91614c82565b90612bb1565b5090614d6f825463ffffffff1690565b43851694168403614d9a57506105479250906001600160401b0382549181199060401b169116179055565b815467ffffffff000000001916602085901b67ffffffff000000001617909155610547929190614d2f90614dd6905f52600260205260405f2090565b91614d19614de2610549565b63ffffffff9095168552565b15614df557565b631019106960e31b5f5260045ffd5b90610100825111614e6d57815115614e6857602082015160019060f81c81901b5b8351821015614e6357600190614e4e614e4461078861077a8689612ac1565b60ff600191161b90565b90614e5a818311614dee565b17910190614e25565b925050565b5f9150565b637da54e4760e11b5f5260045ffd5b601f8111614e88575050565b60ca5f5260205f20906020601f840160051c83019310614ec2575b601f0160051c01905b818110614eb7575050565b5f8155600101614eac565b9091508190614ea3565b601f8211614ed957505050565b5f5260205f20906020601f840160051c83019310614f11575b601f0160051c01905b818110614f06575050565b5f8155600101614efb565b9091508190614ef2565b9081516001600160401b0381116104f757614f4281614f3b60cb54614117565b60cb614ecc565b602092601f8211600114614f7657614f71929382915f926130285750508160011b915f199060031b1c19161790565b60cb55565b60cb5f52601f198216937fa7ce836d032b2bf62b7e2097a8e0a6d8aeb35405ad15271e96d3b0188a1d06fb915f5b868110614fda5750836001959610614fc2575b505050811b0160cb55565b01515f1960f88460031b161c191690555f8080614fb7565b91926020600181928685015181550194019201614fa4565b602080825282516001600160a01b039081168284015281840151166040808401919091529092015160608083015280516080830181905260a09092019201905f5b8181106150405750505090565b825163ffffffff16845260209384019390920191600101615033565b600b54825192936001600160a01b03918216937f000000000000000000000000000000000000000000000000000000000000000090921692909161509f90612a8f565b925f5b86518110156150cd57806150b860019289612ac1565b5160f81c6150c68288612a59565b52016150a2565b509291945092615101906150f16150e2610549565b6001600160a01b039096168652565b6001600160a01b03166020850152565b6040830152803b15610bc657604051636e3492b560e01b8152915f9183918290849082906151329060048301614ff2565b03925af18015610bc1576151435750565b806110ca5f61054793610517565b9190815f528260205260405f2054925f5b8481106151fa5760405162461bcd60e51b815260206004820152605c60248201527f5265676973747279436f6f7264696e61746f722e67657451756f72756d42697460448201527f6d6170496e6465784174426c6f636b4e756d6265723a206e6f206269746d617060648201527f2075706461746520666f756e6420666f72206f70657261746f72496400000000608482015260a490fd5b80850385811161350a576108ac61521091614c82565b61523961522e826152298887905f5260205260405f2090565b612bb1565b505463ffffffff1690565b63ffffffff808616911611156152525750600101615162565b94505050505090565b919290602082019283515f52600460205260ff60405f2054166152d65760408301805142116152c757610547956152bf9386515f5260046020526152a960405f20600160ff19825416179055565b6007546001600160a01b03169651925193613121565b905191615658565b630819bdcd60e01b5f5260045ffd5b636fbefec360e11b5f5260045ffd5b156152ec57565b6356168b4160e11b5f5260045ffd5b908160209103126107b457516109bf8161124d565b1561531757565b634c44995d60e01b5f5260045ffd5b1561532d57565b63b187e86960e01b5f5260045ffd5b6020858101516001600160a01b039081165f8181526003909352604090922054929795969394929361538f9361538293919261537b92911614156152e5565b5160ff1690565b60ff808816911614612e8a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031694853b15610bc657604051635401ed2760e01b8152600481019290925260ff16602482015293602090859060449082905afa928315610bc157610547945f94615441575b508261543992615434615420936001600160601b0361542c61542082998b61578f565b6001600160601b031690565b911611615310565b6157b2565b911610615326565b61542091945092615439926154346154786001600160601b039660203d602011615484575b6154708183610517565b8101906152fb565b969350509250926153fd565b503d615466565b600b546001600160a01b0316803b15610bc657604051632e8da82960e01b81526001600160a01b03929092166004830152602090829060249082905afa908115610bc1575f91615549575b50156154de57565b60405162461bcd60e51b815260206004820152603c60248201527f5265636c61696d536c617368696e675265676973747279436f6f7264696e617460448201527f6f723a206f70657261746f72206e6f742077686974656c6973746564000000006064820152608490fd5b615562915060203d602011610bba57610bac8183610517565b5f6154d6565b6155706157d0565b61557861581b565b6040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a081526155c960c082610517565b51902090565b8054680100000000000000008110156104f7576155f191600182018155612bb1565b61562f57815160208084015160409485015163ffffffff909316911b67ffffffff00000000161767ffffffffffffffff199190931b16919091179055565b634e487b7160e01b5f525f60045260245ffd5b1561564957565b63d51edae360e01b5f5260045ffd5b9190916156658284615841565b9390926005851015610a305761568e94159384615756575b5083156156a3575b50505015151590565b61569457565b638baa579f60e01b5f5260045ffd5b5f9350906156ce6156dc8594936040519283916020830195630b135d3f60e11b875260248401613ad1565b03601f198101835282610517565b51915afa3d1561574f573d6156f0816108fe565b906156fe6040519283610517565b81523d5f602083013e5b81615741575b8161571d575b505f8080615685565b905061573a630b135d3f60e11b91602080825183010191016142ea565b145f615714565b90506020815110159061570e565b6060615708565b6001600160a01b0384811691161493505f61567d565b906001600160601b03809116911602906001600160601b03821691820361350a57565b6157ad6001600160601b039161ffff6020612710950151169061576c565b160490565b6157ad6001600160601b039161ffff6040612710950151169061576c565b6157d861414f565b80519081156157e8576020012090565b505060c85480156157f65790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b615823614204565b8051908115615833576020012090565b505060c95480156157f65790565b9060418151145f1461586d5761586991602082015190606060408401519301515f1a90615876565b9091565b50505f90600290565b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116158e6576020935f9360ff60809460405194855216868401526040830152606082015282805260015afa15610bc1575f516001600160a01b038116156158de57905f90565b505f90600190565b505050505f9060039056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a264697066735822122004127eee325cb278ea09a4373f754f8c97e50a28c8c8096d4fe9865332ecc25a64736f6c634300081c0033"; + +type ReclaimSlashingRegistryCoordinatorConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: ReclaimSlashingRegistryCoordinatorConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class ReclaimSlashingRegistryCoordinator__factory extends ContractFactory { + constructor(...args: ReclaimSlashingRegistryCoordinatorConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + _stakeRegistry: string, + _blsApkRegistry: string, + _indexRegistry: string, + _socketRegistry: string, + _allocationManager: string, + _pauserRegistry: string, + _version: string, + overrides?: Overrides & { from?: string } + ): Promise { + return super.deploy( + _stakeRegistry, + _blsApkRegistry, + _indexRegistry, + _socketRegistry, + _allocationManager, + _pauserRegistry, + _version, + overrides || {} + ) as Promise; + } + override getDeployTransaction( + _stakeRegistry: string, + _blsApkRegistry: string, + _indexRegistry: string, + _socketRegistry: string, + _allocationManager: string, + _pauserRegistry: string, + _version: string, + overrides?: Overrides & { from?: string } + ): TransactionRequest { + return super.getDeployTransaction( + _stakeRegistry, + _blsApkRegistry, + _indexRegistry, + _socketRegistry, + _allocationManager, + _pauserRegistry, + _version, + overrides || {} + ); + } + override attach(address: string): ReclaimSlashingRegistryCoordinator { + return super.attach(address) as ReclaimSlashingRegistryCoordinator; + } + override connect( + signer: Signer + ): ReclaimSlashingRegistryCoordinator__factory { + return super.connect(signer) as ReclaimSlashingRegistryCoordinator__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): ReclaimSlashingRegistryCoordinatorInterface { + return new utils.Interface( + _abi + ) as ReclaimSlashingRegistryCoordinatorInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): ReclaimSlashingRegistryCoordinator { + return new Contract( + address, + _abi, + signerOrProvider + ) as ReclaimSlashingRegistryCoordinator; + } +} diff --git a/src/avs/contracts/factories/ReclaimTaskManager__factory.ts b/src/avs/contracts/factories/ReclaimTaskManager__factory.ts new file mode 100644 index 00000000..4f9a81bb --- /dev/null +++ b/src/avs/contracts/factories/ReclaimTaskManager__factory.ts @@ -0,0 +1,1207 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { + ReclaimTaskManager, + ReclaimTaskManagerInterface, +} from "../ReclaimTaskManager"; + +const _abi = [ + { + type: "constructor", + inputs: [ + { + name: "_stakeRegistry", + type: "address", + internalType: "contract IStakeRegistry", + }, + { + name: "_rewardsCoordinator", + type: "address", + internalType: "contract IRewardsCoordinator", + }, + { + name: "_pauserRegistry", + type: "address", + internalType: "contract IPauserRegistry", + }, + ], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "allTaskHashes", + inputs: [ + { + name: "", + type: "uint32", + internalType: "uint32", + }, + ], + outputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "createNewTask", + inputs: [ + { + name: "request", + type: "tuple", + internalType: "struct IReclaimTaskManager.ClaimRequest", + components: [ + { + name: "provider", + type: "string", + internalType: "string", + }, + { + name: "claimUserId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "claimHash", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "requestedAt", + type: "uint32", + internalType: "uint32", + }, + { + name: "owner", + type: "address", + internalType: "address", + }, + { + name: "fee", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "requestSignature", + type: "bytes", + internalType: "bytes", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "defaultStrategy", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "encodeClaimRequest", + inputs: [ + { + name: "request", + type: "tuple", + internalType: "struct IReclaimTaskManager.ClaimRequest", + components: [ + { + name: "provider", + type: "string", + internalType: "string", + }, + { + name: "claimUserId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "claimHash", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "requestedAt", + type: "uint32", + internalType: "uint32", + }, + { + name: "owner", + type: "address", + internalType: "address", + }, + { + name: "fee", + type: "uint256", + internalType: "uint256", + }, + ], + }, + ], + outputs: [ + { + name: "", + type: "bytes", + internalType: "bytes", + }, + ], + stateMutability: "pure", + }, + { + type: "function", + name: "getBatchOperatorFromId", + inputs: [ + { + name: "registryCoordinator", + type: "address", + internalType: "contract ISlashingRegistryCoordinator", + }, + { + name: "operatorIds", + type: "bytes32[]", + internalType: "bytes32[]", + }, + ], + outputs: [ + { + name: "operators", + type: "address[]", + internalType: "address[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getBatchOperatorId", + inputs: [ + { + name: "registryCoordinator", + type: "address", + internalType: "contract ISlashingRegistryCoordinator", + }, + { + name: "operators", + type: "address[]", + internalType: "address[]", + }, + ], + outputs: [ + { + name: "operatorIds", + type: "bytes32[]", + internalType: "bytes32[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getCheckSignaturesIndices", + inputs: [ + { + name: "registryCoordinator", + type: "address", + internalType: "contract ISlashingRegistryCoordinator", + }, + { + name: "referenceBlockNumber", + type: "uint32", + internalType: "uint32", + }, + { + name: "quorumNumbers", + type: "bytes", + internalType: "bytes", + }, + { + name: "nonSignerOperatorIds", + type: "bytes32[]", + internalType: "bytes32[]", + }, + ], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct OperatorStateRetriever.CheckSignaturesIndices", + components: [ + { + name: "nonSignerQuorumBitmapIndices", + type: "uint32[]", + internalType: "uint32[]", + }, + { + name: "quorumApkIndices", + type: "uint32[]", + internalType: "uint32[]", + }, + { + name: "totalStakeIndices", + type: "uint32[]", + internalType: "uint32[]", + }, + { + name: "nonSignerStakeIndices", + type: "uint32[][]", + internalType: "uint32[][]", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getLatestTaskNum", + inputs: [], + outputs: [ + { + name: "", + type: "uint32", + internalType: "uint32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getOperatorState", + inputs: [ + { + name: "registryCoordinator", + type: "address", + internalType: "contract ISlashingRegistryCoordinator", + }, + { + name: "quorumNumbers", + type: "bytes", + internalType: "bytes", + }, + { + name: "blockNumber", + type: "uint32", + internalType: "uint32", + }, + ], + outputs: [ + { + name: "", + type: "tuple[][]", + internalType: "struct OperatorStateRetriever.Operator[][]", + components: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "operatorId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "stake", + type: "uint96", + internalType: "uint96", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getOperatorState", + inputs: [ + { + name: "registryCoordinator", + type: "address", + internalType: "contract ISlashingRegistryCoordinator", + }, + { + name: "operatorId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "blockNumber", + type: "uint32", + internalType: "uint32", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + { + name: "", + type: "tuple[][]", + internalType: "struct OperatorStateRetriever.Operator[][]", + components: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "operatorId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "stake", + type: "uint96", + internalType: "uint96", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getQuorumBitmapsAtBlockNumber", + inputs: [ + { + name: "registryCoordinator", + type: "address", + internalType: "contract ISlashingRegistryCoordinator", + }, + { + name: "operatorIds", + type: "bytes32[]", + internalType: "bytes32[]", + }, + { + name: "blockNumber", + type: "uint32", + internalType: "uint32", + }, + ], + outputs: [ + { + name: "", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getTaskCreationMetadata", + inputs: [], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct IReclaimTaskManager.TaskCreationMetadata", + components: [ + { + name: "maxTaskLifetimeS", + type: "uint32", + internalType: "uint32", + }, + { + name: "minSignaturesPerTask", + type: "uint8", + internalType: "uint8", + }, + { + name: "maxTaskCreationDelayS", + type: "uint32", + internalType: "uint32", + }, + { + name: "minFee", + type: "uint256", + internalType: "uint256", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getToken", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IERC20", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "initialize", + inputs: [ + { + name: "initialOwner", + type: "address", + internalType: "address", + }, + { + name: "strategy", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "latestTaskNum", + inputs: [], + outputs: [ + { + name: "", + type: "uint32", + internalType: "uint32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "operatorHasMinimumWeight", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + 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: "contract IPauserRegistry", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "renounceOwnership", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "rewardsCoordinator", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IRewardsCoordinator", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "setRewardsCoordinator", + inputs: [ + { + name: "_rewardsCoordinator", + type: "address", + internalType: "contract IRewardsCoordinator", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setStakeRegistry", + inputs: [ + { + name: "_stakeRegistry", + type: "address", + internalType: "contract IStakeRegistry", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "stakeRegistry", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IStakeRegistry", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "taskCompleted", + inputs: [ + { + name: "completedTask", + type: "tuple", + internalType: "struct IReclaimTaskManager.CompletedTask", + components: [ + { + name: "task", + type: "tuple", + internalType: "struct IReclaimTaskManager.Task", + components: [ + { + name: "request", + type: "tuple", + internalType: "struct IReclaimTaskManager.ClaimRequest", + components: [ + { + name: "provider", + type: "string", + internalType: "string", + }, + { + name: "claimUserId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "claimHash", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "requestedAt", + type: "uint32", + internalType: "uint32", + }, + { + name: "owner", + type: "address", + internalType: "address", + }, + { + name: "fee", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "createdAt", + type: "uint32", + internalType: "uint32", + }, + { + name: "expiresAt", + type: "uint32", + internalType: "uint32", + }, + { + name: "minimumSignatures", + type: "uint8", + internalType: "uint8", + }, + { + name: "operators", + type: "tuple[]", + internalType: "struct IReclaimTaskManager.ReclaimOperator[]", + components: [ + { + name: "addr", + type: "address", + internalType: "address", + }, + { + name: "url", + type: "string", + internalType: "string", + }, + ], + }, + { + name: "feePaid", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "signatures", + type: "bytes[]", + internalType: "bytes[]", + }, + ], + }, + { + name: "referenceTaskIndex", + type: "uint32", + internalType: "uint32", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "taskCreationMetadata", + inputs: [], + outputs: [ + { + name: "maxTaskLifetimeS", + type: "uint32", + internalType: "uint32", + }, + { + name: "minSignaturesPerTask", + type: "uint8", + internalType: "uint8", + }, + { + name: "maxTaskCreationDelayS", + type: "uint32", + internalType: "uint32", + }, + { + name: "minFee", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "transferOwnership", + inputs: [ + { + name: "newOwner", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "unpause", + inputs: [ + { + name: "newPausedStatus", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "updateTaskCreationMetadata", + inputs: [ + { + name: "newMetadata", + type: "tuple", + internalType: "struct IReclaimTaskManager.TaskCreationMetadata", + components: [ + { + name: "maxTaskLifetimeS", + type: "uint32", + internalType: "uint32", + }, + { + name: "minSignaturesPerTask", + type: "uint8", + internalType: "uint8", + }, + { + name: "maxTaskCreationDelayS", + type: "uint32", + internalType: "uint32", + }, + { + name: "minFee", + 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: "NewTaskCreated", + inputs: [ + { + name: "taskIndex", + type: "uint32", + indexed: true, + internalType: "uint32", + }, + { + name: "task", + type: "tuple", + indexed: false, + internalType: "struct IReclaimTaskManager.Task", + components: [ + { + name: "request", + type: "tuple", + internalType: "struct IReclaimTaskManager.ClaimRequest", + components: [ + { + name: "provider", + type: "string", + internalType: "string", + }, + { + name: "claimUserId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "claimHash", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "requestedAt", + type: "uint32", + internalType: "uint32", + }, + { + name: "owner", + type: "address", + internalType: "address", + }, + { + name: "fee", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "createdAt", + type: "uint32", + internalType: "uint32", + }, + { + name: "expiresAt", + type: "uint32", + internalType: "uint32", + }, + { + name: "minimumSignatures", + type: "uint8", + internalType: "uint8", + }, + { + name: "operators", + type: "tuple[]", + internalType: "struct IReclaimTaskManager.ReclaimOperator[]", + components: [ + { + name: "addr", + type: "address", + internalType: "address", + }, + { + name: "url", + type: "string", + internalType: "string", + }, + ], + }, + { + name: "feePaid", + type: "uint256", + 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: "TaskCompleted", + inputs: [ + { + name: "taskIndex", + type: "uint32", + indexed: true, + internalType: "uint32", + }, + { + name: "task", + type: "tuple", + indexed: false, + internalType: "struct IReclaimTaskManager.CompletedTask", + components: [ + { + name: "task", + type: "tuple", + internalType: "struct IReclaimTaskManager.Task", + components: [ + { + name: "request", + type: "tuple", + internalType: "struct IReclaimTaskManager.ClaimRequest", + components: [ + { + name: "provider", + type: "string", + internalType: "string", + }, + { + name: "claimUserId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "claimHash", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "requestedAt", + type: "uint32", + internalType: "uint32", + }, + { + name: "owner", + type: "address", + internalType: "address", + }, + { + name: "fee", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "createdAt", + type: "uint32", + internalType: "uint32", + }, + { + name: "expiresAt", + type: "uint32", + internalType: "uint32", + }, + { + name: "minimumSignatures", + type: "uint8", + internalType: "uint8", + }, + { + name: "operators", + type: "tuple[]", + internalType: "struct IReclaimTaskManager.ReclaimOperator[]", + components: [ + { + name: "addr", + type: "address", + internalType: "address", + }, + { + name: "url", + type: "string", + internalType: "string", + }, + ], + }, + { + name: "feePaid", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "signatures", + type: "bytes[]", + internalType: "bytes[]", + }, + ], + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Unpaused", + inputs: [ + { + name: "account", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newPausedStatus", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "CurrentlyPaused", + inputs: [], + }, + { + type: "error", + name: "InputAddressZero", + inputs: [], + }, + { + type: "error", + name: "InvalidNewPausedStatus", + inputs: [], + }, + { + type: "error", + name: "OnlyPauser", + inputs: [], + }, + { + type: "error", + name: "OnlyUnpauser", + inputs: [], + }, + { + type: "error", + name: "OperatorNotRegistered", + inputs: [], + }, +] as const; + +const _bytecode = + "0x60a0806040523461015357604051601f6141c238819003918201601f19168301916001600160401b0383118484101761013f578084926060946040528339810103126100ef5780516001600160a01b03811691908290036100eb5760208101516001600160a01b03811691908290036100eb57604001516001600160a01b0381168082036100eb57156100dc5760805260018060a01b0319609754161760975560018060a01b0319609854161760985560405161402190816101a182396080518181816102240152818161180101528181611fb40152612c4d0152f35b6339b190bb60e11b5f5260045ffd5b5f80fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fdfe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b5f5f3560e01c8063136439dd14612c3757806321df0da714612c0b5780632a982e7414612b7d5780632d89f6fc14612b4857806331b36bd9146129f45780633563b0d114612993578063485cc9551461280c5780634d2b57fe146126ed5780634f739f7414612077578063595c6a6714611fa25780635ac86ab714611f6f5780635c15566214611db15780635c975abb14611d9457806367ab980914611ca55780636830483514611c7d578063715018a614611c22578063762655e91461189357806384681e4614611830578063886f1195146117ec5780638a2fc4e3146117c45780638b00ce7c1461179e5780638da5cb5b14611776578063964c586d1461075a578063a3789c3814610734578063bef4b8bd146106ef578063cefdc1d41461049f578063d5dba76d1461047a578063e3b05f2f14610431578063f289a7fb146103ef578063f2fde38b14610326578063fabc1cbc1461020d5763fac5bb9b146101dc575061000e565b3461020857366003190112610203576096546040516001600160a01b039091168152602090f35b612d69565b612d19565b5034610208576020366003190112610203576004357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103215760206004916040519283809263755b36bd60e11b82525afa9081156103165783916102e7575b506001600160a01b031633036102d8576001541981198116036102c957806001556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a280f35b63c61dca5d60e01b8252600482fd5b63794821ff60e01b8252600482fd5b610309915060203d60201161030f575b6103018183612f42565b8101906134f3565b5f610279565b503d6102f7565b6040513d85823e3d90fd5b6133a6565b503461020857602036600319011261020357610340612e53565b610348613c02565b6001600160a01b0316801561039b57606480546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b503461020857366003190112610203576080609954609a5463ffffffff60405192818116845260ff8160201c16602085015260281c1660408301526060820152f35b5034610208576020366003190112610203576004356001600160a01b0381169081900361047657610460613c02565b6001600160601b0360a01b609854161760985580f35b5080fd5b3461020857602036600319011261020357610493612e53565b50602060405160018152f35b5034610208576060366003190112610203576104b9612e53565b602435916104c5612e1c565b6040938451906104d58683612f42565b60018252601f198601366020840137806104ee836134be565b526001600160a01b03851691823b156103215784610520918851809381926361c8a12f60e11b83528860048401613aac565b0381865afa9081156106e55763ffffffff916105439187916106c3575b506134be565b5116823b15610321576064602092885194859384926304ec635160e01b8452600484015263ffffffff8816602484015260448301525afa9081156106b957839161068a575b506001600160c01b038116908382805b61063b575061ffff6105aa9116613d04565b918493855b8451861080610630575b15610607576001811b84166001600160c01b03166105e0575b6105db90613a9e565b6105af565b9460016105db9160ff60f81b8860f81b16891a6105fd828961352e565b53019590506105d2565b888361062c61061785898d61353f565b835193849384528060208501528301906130ce565b0390f35b5061010081106105b9565b5f19810190808211610676579061ffff9116911661ffff8114610662576001019080610598565b634e487b7160e01b86526011600452602486fd5b634e487b7160e01b87526011600452602487fd5b6106ac915060203d6020116106b2575b6106a48183612f42565b810190613a73565b5f610588565b503d61069a565b85513d85823e3d90fd5b6106df91503d8089833e6106d78183612f42565b8101906139c2565b5f61053d565b87513d87823e3d90fd5b5034610208576020366003190112610203576004356001600160a01b038116908190036104765761071e613c02565b6001600160601b0360a01b609754161760975580f35b50346102085736600319011261020357602063ffffffff60985460a01c16604051908152f35b503461020857604036600319011261020357600435906001600160401b0382116117715760406003198336030112611768576040519161079983612f0c565b80600401356001600160401b0381116116f257810160c0600319823603011261176857604051906107c982612ef1565b60048101356001600160401b0381116116f2576107ec9060043691840101613306565b82526107fa60248201612e42565b602083015261080b60448201612e42565b6040830152606481013560ff8116810361176d57606083015260848101356001600160401b0381116116f25760049082010136601f820112156116e857803561085381612f63565b916108616040519384612f42565b81835260208084019260051b820101903682116116ed5760208101925b8284106116f75750505050608083015260a4013560a082015283526024810135906001600160401b0382116116f2570191366023840112156116e85760048301356108c881612f63565b936108d66040519586612f42565b818552602060048187019360051b83010101903682116116ed5760248101925b8284106116b7575050505060208101928352610910612e2f565b9063ffffffff8151604051610943816109356020820194602086526040830190613b3b565b03601f198101835282612f42565b519020921691825f52609b60205260405f20540361164c5763ffffffff6040825101511663ffffffff4216809111156116145781519384519463ffffffff6020604088015197608060018060a01b03910151169201511690604051966109a888612ec2565b87526020870152604086015260016060860152855190604051956109cb87612f0c565b8652602086019182526109e36080855101515161348c565b945f5b8651811015610a1b57600190818060a01b03610a078260808a5101516134df565b515116610a14828a6134df565b52016109e6565b5090919295835151156115df5751938451976040519860208a015260208952610a4560408a612f42565b88518060011b9080820460021490151715610b3f57610a6390613d04565b96604091825197610a74848a612f42565b601089526f181899199a1a9b1b9c1cb0b131b232b360811b60208a01525f5b8c51811015610b6757610aa6818e61352e565b518a516001600160f81b031991610ac991610ac39160f81c613cfa565b8c61352e565b5116908060011b9181830460021482151715610b3f57818f8e610af286610af8955f1a9261352e565b5361352e565b5160f81c8b518015610b53576001600160f81b031991610b1a9190068d61352e565b51169160018101809111610b3f57610b388d916001945f1a9261352e565b5301610a93565b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b508998508a845180602081019b61060f60f31b8d5280516020819201602284015e8101602281015f905203602201601f1981018252610ba69082612f42565b600160a01b600190036020840151166060938751610bc48682612f42565b602881526020810192601f1987013685375f5b6014811061151757505088518093602082019261060f60f31b8452518091602284015e8101602281015f905203602201601f1981018452610c189084612f42565b858983015163ffffffff16610c2c90613d2c565b920151610c3890613d2c565b9289519e8f95518091602088015e850190600560f91b6020830152518092602183015e01602001600560f91b600182015281516020819301600283015e01600101600560f91b600182015281516020819301600283015e01600101600181015f905203600101601f1981018b52610caf908b612f42565b885151610cbb9061348c565b975f5b8a518051821015610cfb5790610ce18d610cda836001956134df565b5190613c5a565b610ceb828d6134df565b90838060a01b0316905201610cbe565b5050959096919288935f985b86518a1015610dc9575f985f5b8751811015610db9576001600160a01b03610d2f828a6134df565b51166001600160a01b03610d438e8c6134df565b511614610d5257600101610d14565b5092959850929860019491945b15610d7557600101989297949197939093610d07565b875162461bcd60e51b815260206004820152601a60248201527f4d697373696e67206174746573746f72207369676e61747572650000000000006044820152606490fd5b5092959899909399949194610d5f565b938693929188958a835f52609b6020525f8881205560a086510151935f965b8851881015610e885760018801808911610b3f575b8951811015610e7c576001906001600160a01b03610e1b8b8d6134df565b51168b610e2e83858060a01b03926134df565b511610610e3c575b01610dfd565b818060a01b03610e4c8b8d6134df565b51168b610e6b8c858060a01b03610e6386856134df565b5116926134df565b52610e76828d6134df565b52610e36565b50600190970196610de8565b89899495969760018060a01b036097541697610ea2613411565b99835199610eb0858c612f42565b60018b52601f198501915f5b8381106114f457506096546001600160a01b0316610ed98d6134be565b5152610ee48c6134be565b516020016001905289519c610ef88e612f63565b87519e8f91610f079083612f42565b808252601f1990610f1790612f63565b01905f5b8281106114d057505050610f308b5183613cfa565b9b5f5b8c51811015610f76578f908e60208f83600195610f6d92610f5a83898060a01b03926134df565b5116610f6683836134df565b51526134df565b51015201610f33565b508e8e895196610f868b89612f42565b600188525f5b818110611497575050610f9e876134be565b5152610fa8613411565b6020610fb3886134be565b516001600160a01b0390921691015288610fcc876134be565b510152833b15610321578751639d45c28160e01b8152602081600481885afa90811561148d575f91611453575b50843b15610321578851634d18cc3560e01b8152602081600481895afa90811561140f575f91611419575b5063ffffffff8116611373575063ffffffff16908115610b535761104a91810690613ce0565b63ffffffff86611059876134be565b5101911690525b5f608061106c866134be565b51015260a061107a856134be565b51018751906110898983612f42565b6015825274436c61696d206372656174696f6e206f6e2041565360581b6020830152526001600160a01b031690813b15610321575f9160446020928951948593849263095ea7b360e01b845288600485015260248401525af180156113695761133c575b50803b156103215784518092634e5cd2fd60e11b82526044820130600484015287602484015281518091526064830190602060648260051b8601019301915f905b828210611212575050505091815f81819503925af18015611208576111f1575b5061116a90835194602086525190846020870152850190613b3b565b905191601f198483030190840152815180825260208201916020808360051b83010194019287915b8383106111c45788887fb89b185f8ff547f2adc139e96d9ffe3ce49fac1d57931be0788b58aa670850cb8989038aa280f35b90919293946020806111e2600193601f198682030187528951613382565b97019301930191939290611192565b6111fe9196505f90612f42565b5f9461116a61114e565b84513d5f823e3d90fd5b91939092945060631987820301825284519060c081019180519260c0835283518091528c602060e085019501915f915b81831061130657505050506020818101516001600160a01b0316838201528c8201518385038e8501528051808652948201948c9291909101905f908f5b8183106112d6575050505060019360209360a0848463ffffffff6112c69689980151169084015263ffffffff608082015116608084015201519060a0818403910152613382565b960192019201869493919261112e565b835180516001600160a01b03168952602090810151818a01529701968e945090920191600191909101908f61127f565b835180516001600160a01b031688526020908101516001600160601b03168189015296019590920191600191909101908e611242565b61135d9060203d602011611362575b6113558183612f42565b8101906133f9565b6110ed565b503d61134b565b86513d5f823e3d90fd5b9150843b15610321578851635f90d45560e11b8152602081600481895afa90811561140f575f916113cc575b506113ad906113b293613ce0565b613b21565b63ffffffff866113c1876134be565b510191169052611060565b90506020813d602011611407575b816113e760209383612f42565b81010312610203576113b2926113ff6113ad926139b1565b91509261139f565b3d91506113da565b8a513d5f823e3d90fd5b90506020813d60201161144b575b8161143460209383612f42565b8101031261020357611445906139b1565b8d611024565b3d9150611427565b90506020813d602011611485575b8161146e60209383612f42565b810103126102035761147f906139b1565b8c610ff9565b3d9150611461565b89513d5f823e3d90fd5b6020908c8b8151916114a883612ef1565b8183525f858401528201525f8c8201525f60808201528b60a082015282828c01015201610f8c565b60209182828c51926114e184612f0c565b5f84525f83850152010152018f90610f1b565b6020908d82828a519261150684612f0c565b5f84525f8385015201015201610ebc565b8060130360138111610b3f57600381901b906001600160fd1b03811603610b3f5760ff8111610b3f5760ff611550600182931b85613cfa565b161660f481901b600f60f81b16919060f081169060ff16039160ff8311610b3f57611584906001600160f81b031916613fa9565b600182901b926001600160ff1b0383168303610b3f576115bd915f1a6115aa858861352e565b5360f81b6001600160f81b031916613fa9565b9160018101809111610b3f576115d86001935f1a918661352e565b5301610bd7565b60405162461bcd60e51b815260206004820152600d60248201526c4e6f207369676e61747572657360981b6044820152606490fd5b60405162461bcd60e51b815260206004820152601060248201526f15185cdac81a185cc8195e1c1a5c995960821b6044820152606490fd5b60405162461bcd60e51b815260206004820152603d60248201527f737570706c696564207461736b20646f6573206e6f74206d617463682074686560448201527f206f6e65207265636f7264656420696e2074686520636f6e74726163740000006064820152608490fd5b83356001600160401b0381116116e8576020916116dd8392836004369288010101613035565b8152019301926108f6565b612e69565b612f7a565b6132b5565b83356001600160401b0381116116e85782016040601f198236030112611768576040519161172483612f0c565b61173060208301612fd3565b83526040820135926001600160401b0384116116f2576117596020949385809536920101613035565b8382015281520193019261087e565b613264565b5f80fd5b612db9565b34610208575f366003190112610203576064546040516001600160a01b039091168152602090f35b34610208575f36600319011261020357602063ffffffff60985460a01c16604051908152f35b34610208575f366003190112610203576097546040516001600160a01b039091168152602090f35b34610208575f366003190112610203576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610208576020366003190112610203576004356001600160401b0381116117715761093561187f61186961062c933690600401613306565b6040519283916020808401526040830190613acc565b604051918291602083526020830190613382565b34610208576040366003190112610203576004356001600160401b038111611771576118c3903690600401613306565b6024356001600160401b038111611771576118e2903690600401613035565b609a549060a0830191825110611bef576080830180519091906001600160a01b03163303611b54575b505063ffffffff60608301511663ffffffff421690818082115f14611b455761193391613ce0565b63ffffffff8060995460281c16911611611b00576001600160a01b03611957613411565b168251813b15610321575f91606460209260405194859384926323b872dd60e01b845233600485015230602485015260448401525af1908115611af5575f91611ad6575b5015611a9857611a5192611a4392604051926119b684612ef1565b5f60a06040516119c581612ef1565b60608152826020820152826040820152826060820152826080820152015260ff60408501915f835260608601925f84526060608088015260a08701955f8752875281602088015263ffffffff611a216099549382851690613b21565b16905260201c1690525190526040519182916020808401526040830190613b3b565b0390601f1982018152612f42565b5f604051611a60602082612f42565b5260405162461bcd60e51b815260206004820152600f60248201526e139bdd081a5b5c1b195b595b9d1959608a1b6044820152606490fd5b60405162461bcd60e51b81526020600482015260166024820152754661696c656420746f207472616e736665722066656560501b6044820152606490fd5b611aef915060203d602011611362576113558183612f42565b8461199b565b6040513d5f823e3d90fd5b60405162461bcd60e51b815260206004820152601e60248201527f526571756573742074696d657374616d7020746f6f20666172206177617900006044820152606490fd5b90611b4f91613ce0565b611933565b611b7790604051602080820152611b72816109356040820189613acc565b613c5a565b90516001600160a01b03908116911603611b9257828061190b565b60405162461bcd60e51b815260206004820152602f60248201527f5369676e6572206f6620726571756573745369676e6174757265206973206e6f60448201526e3a103932b8bab2b9ba1737bbb732b960891b6064820152608490fd5b60405162461bcd60e51b815260206004820152600b60248201526a46656520746f6f206c6f7760a81b6044820152606490fd5b34610208575f36600319011261020357611c3a613c02565b606480546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b34610208575f366003190112610203576098546040516001600160a01b039091168152602090f35b3461020857608036600319011261020357604051611cc281612ec2565b611cca612e09565b815260243560ff8116810361176d5760208201908152611ce8612e1c565b906040830191825263ffffffff60608401936064358552611d07613c02565b511680611d80575b505160ff8116611d5f575b505163ffffffff8116611d36575b505180611d3157005b609a55005b68ffffffff00000000006099549160281b169068ffffffff000000000019161760995581611d28565b64ff000000006099549160201b169064ff0000000019161760995582611d1a565b63ffffffff19609954161760995583611d0f565b34610208575f366003190112610203576020600154604051908152f35b3461020857606036600319011261020357611dca612e53565b6024356001600160401b03811161177157611de9903690600401613175565b611df1612e1c565b916001600160a01b0316803b15610321576040516361c8a12f60e11b81525f8180611e20868860048401613aac565b0381855afa908115611af5575f91611f55575b50825191611e59611e4384612f63565b93611e516040519586612f42565b808552612f63565b602084019490601f19013686375f5b8151811015611f1157611e7b81836134df565b519063ffffffff611e8c82876134df565b511691843b15610321576040516304ec635160e01b8152600481019190915263ffffffff8981166024830152929092166044830152602082606481875afa8015611af5576001925f91611ef3575b50828060c01b0316611eec82886134df565b5201611e68565b611f0b915060203d81116106b2576106a48183612f42565b89611eda565b8585604051918291602083019060208452518091526040830191905f5b818110611f3c575050500390f35b8251845285945060209384019390920191600101611f2e565b611f6991503d805f833e6106d78183612f42565b84611e33565b346102085760203660031901126102035760043560ff811680910361176d5760016020911b806001541614604051908152f35b34610208575f366003190112610203577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103215760206024916040519283809263237dfb4760e11b82523360048301525afa908115611af5575f91612058575b5015612049575f196001556040515f1981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2005b631d77d47760e21b5f5260045ffd5b612071915060203d602011611362576113558183612f42565b8161200f565b3461020857608036600319011261020357612090612e53565b612098612e2f565b6044356001600160401b03811161177157366023820112156116e8578060040135926001600160401b0384116126e857602482019160248536920101116116ed57606435926001600160401b03841161177157366023850112156116e8578360040135946001600160401b0386116126e85760248501928660051b9560248736920101116116ed5761212861398d565b506001600160a01b031693843b1561032157604051636830483560e01b815292602084600481895afa938415611af5575f946126c7575b5061216861398d565b93863b15610321576040516361c8a12f60e11b815263ffffffff831698896004830152604060248301528a604483015260018060fb1b038b116126785781606481835f948c8484013781010301818b5afa908115611af5575f9161265e575b5085526001600160a01b031692833b1561032157604051986340e03a8160e11b8a528860048b0152604060248b01525f8a80612207604482018689613a43565b0381885afa998a15611af5575f9a612642575b5060408601998a5261222b82612f63565b966122396040519889612f42565b828852612255601f1961224b85612f63565b0160208a01613512565b606087019788525f5b60ff8116848110156124be575f61228b826122788761348c565b8d519061228583836134df565b526134df565b505f5b858110612304575061229f8161348c565b905f5b8c8282106122d45760ff959492506122c2939150519061228583836134df565b501660ff8114610b3f5760010161225e565b9063ffffffff6122f1826122eb88600196516134df565b516134df565b51166122fd82866134df565b52016122a2565b8c8b63ffffffff6123228461231a818c8c613a63565b3593516134df565b5116913b15610321576040516304ec635160e01b8152600481019190915263ffffffff808b16602483015290911660448201526020818f81806064810103915afa908115611af5575f916124a0575b506001600160c01b031680156124915760018091612390868b8e613a92565b3560f81c1c16146123a4575b60010161228e565b906123b0828787613a63565b356123bc84898c613a92565b3560f81c908b3b156103215760405163dd9846b960e01b8152600481019190915260ff91909116602482015263ffffffff891660448201526020816064818e5afa908115611af5578d85915f9361243b575b509163ffffffff61242a856122eb6001979561243397516134df565b91169052613a9e565b91905061239c565b925050506020813d8211612489575b8161245760209383612f42565b8101031261020357818d63ffffffff61242a6001956122eb8961247c612433986139b1565b975095505095505061240e565b3d915061244a565b6325ec6c1f60e01b5f5260045ffd5b6124b8915060203d81116106b2576106a48183612f42565b5f612371565b5087898c8e89888f803b1561032157602060049160405192838092632efa2ca360e11b82525afa908115611af5575f91612623575b506001600160a01b0316803b15610321575f9261252f926040519687948593849363354952a360e21b8552604060048601526044850191613a43565b90602483015203915afa918215611af5576125a29261258f915f91612609575b50908594939291602061257c970190815260405196879660208852516080602089015260a088019061322b565b9051868203601f1901604088015261322b565b9051848203601f1901606086015261322b565b905190601f19838203016080840152815180825260208201916020808360051b8301019401925f915b8383106125d85786860387f35b9193955091936020806125f7600193601f19868203018752895161322b565b970193019301909286959492936125cb565b61261d91503d805f833e6106d78183612f42565b8661254f565b61263c915060203d60201161030f576103018183612f42565b876124f3565b612657919a503d805f833e6106d78183612f42565b988a61221a565b61267291503d805f833e6106d78183612f42565b8a6121c7565b60405162461bcd60e51b815260206004820152602160248201527f41424920656e636f64696e673a206172726179206461746120746f6f206c6f6e6044820152606760f81b6064820152608490fd5b6126e191945060203d60201161030f576103018183612f42565b928861215f565b6131d2565b3461020857604036600319011261020357612706612e53565b6024356001600160401b03811161177157612725903690600401613175565b61272f815161348c565b6001600160a01b03909216915f5b82518110156127be5761275081846134df565b5190843b156103215760405191630a5aec1960e21b83526004830152602082602481885afa8015611af5576001925f916127a0575b5061279082856134df565b90838060a01b031690520161273d565b6127b8915060203d811161030f576103018183612f42565b86612785565b506040518091602082016020835281518091526020604084019201905f5b8181106127ea575050500390f35b82516001600160a01b03168452859450602093840193909201916001016127dc565b3461020857604036600319011261020357612825612e53565b506024356001600160a01b0381169081900361176d575f549060ff8260081c161591828093612986575b801561296f575b156129135760ff1981166001175f5582612902575b506002606060405161287c81612ec2565b61070881526001602082015261012c604082015201526099805468ffffffffffffffffff191666012c01000007081790556002609a55609680546001600160a01b0319169190911790556128cc57005b61ff00195f54165f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a1005b61ffff1916610101175f558261286b565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b1580156128565750600160ff821614612856565b50600160ff82161061284f565b34610208576060366003190112610203576129ac612e53565b6024356001600160401b0381116117715761062c916129d26129e0923690600401613035565b6129da612e1c565b9161353f565b6040519182916020835260208301906130ce565b3461020857604036600319011261020357612a0d612e53565b602435906001600160401b03821161177157366023830112156116e857816004013591612a3983612f63565b92612a476040519485612f42565b8084526024602085019160051b830101913683116116ed57602401905b828210612b30578385612a77815161348c565b6001600160a01b03909216915f5b8251811015612b1a576001600160a01b03612aa082856134df565b511690843b1561032157604051916309aa152760e11b83526004830152602082602481885afa8015611af5575f90612ae8575b60019250612ae182856134df565b5201612a85565b506020823d8211612b12575b81612b0160209383612f42565b810103126102035760019151612ad3565b3d9150612af4565b6040516020808252819061062c90820185612fe7565b60208091612b3d84612fd3565b815201910190612a64565b346102085760203660031901126102035763ffffffff612b66612e09565b165f52609b602052602060405f2054604051908152f35b34610208575f366003190112610203575f6060604051612b9c81612ec2565b82815282602082015282604082015201526080604051612bbb81612ec2565b6099549063ffffffff8083169283835260ff60208401818360201c16815283604086019360281c1683526060609a5495019485526040519586525116602085015251166040830152516060820152f35b34610208575f366003190112610203576020612c25613411565b6040516001600160a01b039091168152f35b34612d19576020366003190112610203576004357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103215760206024916040519283809263237dfb4760e11b82523360048301525afa908115611af5575f91612cfa575b50156120495760015481811603612ceb57806001556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2005b63c61dca5d60e01b5f5260045ffd5b612d13915060203d602011611362576113558183612f42565b82612ca8565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b6004359063ffffffff8216820361176d57565b6044359063ffffffff8216820361176d57565b6024359063ffffffff8216820361176d57565b359063ffffffff8216820361176d57565b600435906001600160a01b038216820361176d57565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b608081019081106001600160401b03821117612edd57604052565b634e487b7160e01b5f52604160045260245ffd5b60c081019081106001600160401b03821117612edd57604052565b604081019081106001600160401b03821117612edd57604052565b606081019081106001600160401b03821117612edd57604052565b90601f801991011681019081106001600160401b03821117612edd57604052565b6001600160401b038111612edd5760051b60200190565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b35906001600160a01b038216820361176d57565b90602080835192838152019201905f5b8181106130045750505090565b8251845260209384019390920191600101612ff7565b6001600160401b038111612edd57601f01601f191660200190565b81601f820112156116e85760208135910161304f8261301a565b9261305d6040519485612f42565b8284528282011161307957815f92602092838601378301015290565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b9080602083519182815201916020808360051b8301019401925f915b8383106130f957505050505090565b9091929394601f19828203018352855190602080835192838152019201905f905b80821061313957505050602080600192970193019301919392906130ea565b909192602060606001926001600160601b0360408851868060a01b0381511684528581015186850152015116604082015201940192019061311a565b9080601f830112156116e857813561318c81612f63565b9261319a6040519485612f42565b81845260208085019260051b8201019283116116ed57602001905b8282106131c25750505090565b81358152602091820191016131b5565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b90602080835192838152019201905f5b8181106132485750505090565b825163ffffffff1684526020938401939092019160010161323b565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b91909160c081840312611768576040519061332082612ef1565b81938135916001600160401b0383116116f25761334360a0939284938301613035565b8452602081013560208501526040810135604085015261336560608201612e42565b606085015261337660808201612fd3565b60808501520135910152565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b908160209103126102035751801515810361176d5790565b6096546001600160a01b0316803b1561032157602060049160405192838092632495a59960e01b82525afa908115611af5575f9161344d575090565b90506020813d602011613484575b8161346860209383612f42565b8101031261020357516001600160a01b038116810361176d5790565b3d915061345b565b9061349682612f63565b6134a36040519182612f42565b82815280926134b4601f1991612f63565b0190602036910137565b8051156134cb5760200190565b634e487b7160e01b5f52603260045260245ffd5b80518210156134cb5760209160051b010190565b9081602091031261020357516001600160a01b038116810361176d5790565b5f5b82811061352057505050565b606082820152602001613514565b9081518110156134cb570160200190565b6001600160a01b03169190823b1561032157604051636830483560e01b8152602081600481875afa908115611af5575f9161396e575b50833b1561032157604051634f4c91e160e11b815290602082600481885afa918215611af5575f9261392a575b50843b1561032157602060049560405196878092632efa2ca360e11b82525afa948515611af5575f95613909575b5082519295916136096135e285612f63565b946135f06040519687612f42565b8086526135ff601f1991612f63565b0160208601613512565b5f965b80518810156138fe5761361f888261352e565b5160f81c936001600160a01b03831692833b15610321575f60449460405195868092638902624560e01b82528a600483015263ffffffff8d1660248301525afa938415611af5575f9461386c575b50835161367981612f63565b906136876040519283612f42565b808252613696601f1991612f63565b015f5b8181106138435750506136ac8b896134df565b526136b78a886134df565b505f5b8451811015613832576001600160a01b038a16906136d881876134df565b51823b15610321576020906024604051809581936308f6629d60e31b835260048301525afa918215611af5575f92613812575b5061371681876134df565b516001600160a01b0388169061372c83896134df565b5191803b156103215760405163fa28c62760e01b8152600481019390935260ff8b16602484015263ffffffff8d166044840152602090839060649082905afa908115611af5578e925f926137cb575b50936137b86137c4936001600160601b0386946001986040519561379e87612f27565b8a8060a01b0316865260208601521660408401528d6134df565b519061228583836134df565b50016136ba565b915091506020813d821161380a575b816137e760209383612f42565b8101031261020357516001600160601b038116810361176d578d916137b861377b565b3d91506137da565b61382b91925060203d811161030f576103018183612f42565b905f61370b565b50600190990198909450915061360c565b60209060405161385281612f27565b5f81525f838201525f604082015282828601015201613699565b9093503d805f833e61387e8183612f42565b810190602081830312610203578051906001600160401b03821161177157019080601f830112156116e85781516138b481612f63565b926138c26040519485612f42565b81845260208085019260051b8201019283116116ed57602001905b8282106138ee57505050925f61366d565b81518152602091820191016138dd565b505050935091505090565b61392391955060203d60201161030f576103018183612f42565b935f6135d0565b9091506020813d602011613966575b8161394660209383612f42565b8101031261020357516001600160a01b038116810361176d57905f6135a2565b3d9150613939565b613987915060203d60201161030f576103018183612f42565b5f613575565b6040519061399a82612ec2565b606080838181528160208201528160408201520152565b519063ffffffff8216820361176d57565b602081830312610203578051906001600160401b03821161177157019080601f830112156116e85781516139f581612f63565b92613a036040519485612f42565b81845260208085019260051b8201019283116116ed57602001905b828210613a2b5750505090565b60208091613a38846139b1565b815201910190613a1e565b908060209392818452848401375f828201840152601f01601f1916010190565b91908110156134cb5760051b0190565b9081602091031261020357516001600160c01b038116810361176d5790565b908210156134cb570190565b5f198114610b3f5760010190565b60409063ffffffff613ac994931681528160208201520190612fe7565b90565b9060a080613ae3845160c0855260c0850190613382565b93602081015160208501526040810151604085015263ffffffff6060820151166060850152600180831b036080820151166080850152015191015290565b9063ffffffff8091169116019063ffffffff8211610b3f57565b90613b4f825160c0835260c0830190613acc565b9163ffffffff602082015116602083015263ffffffff604082015116604083015260ff60608201511660608301526080810151928281036080840152835180825260208201916020808360051b8301019601925f915b838310613bbd57505050505060a08091015191015290565b9091929396602080613bf3600193601f198682030187526040838d51878060a01b03815116845201519181858201520190613382565b99019301930191939290613ba5565b6064546001600160a01b03163303613c1657565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b613ac991613cd8916020613cd0613c718351613d2c565b92603a60405193849281808501977f19457468657265756d205369676e6564204d6573736167653a0a00000000000089528051918291018587015e8401908382015f8152815193849201905e01015f815203601f198101835282612f42565b519020613de1565b919091613e16565b9063ffffffff8091169116039063ffffffff8211610b3f57565b8115610b53570490565b90613d0e8261301a565b613d1b6040519182612f42565b82815280926134b4601f199161301a565b8015613dc15780815f925b613dad575080613d4683613d04565b92915b613d5257505090565b5f198201918211610b3f5781600a820491600a8302838104600a1484151715610b3f578103908111610b3f5760ff1660300160ff8111610b3f5760f81b6001600160f81b0319165f1a90613da6908561352e565b5380613d49565b91613db9600a91613a9e565b920480613d37565b50604051613dd0604082612f42565b60018152600360fc1b602082015290565b9060418151145f14613e0d57613e0991602082015190606060408401519301515f1a90613f2e565b9091565b50505f90600290565b6005811015613f1a5780613e275750565b60018103613e745760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b60028103613ec15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b600314613eca57565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b634e487b7160e01b5f52602160045260245ffd5b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613f9e576020935f9360ff60809460405194855216868401526040830152606082015282805260015afa15611af5575f516001600160a01b03811615613f9657905f90565b505f90600190565b505050505f90600390565b60f81c600a811015613fd05760300160ff8111610b3f5760f81b6001600160f81b03191690565b60570160ff8111610b3f5760f81b6001600160f81b0319169056fea2646970667358221220767446be26988bd16086a8a99963c9c659a9a9b12d8f181e7f6fbdcd4370bc6d64736f6c634300081c0033"; + +type ReclaimTaskManagerConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: ReclaimTaskManagerConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class ReclaimTaskManager__factory extends ContractFactory { + constructor(...args: ReclaimTaskManagerConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + _stakeRegistry: string, + _rewardsCoordinator: string, + _pauserRegistry: string, + overrides?: Overrides & { from?: string } + ): Promise { + return super.deploy( + _stakeRegistry, + _rewardsCoordinator, + _pauserRegistry, + overrides || {} + ) as Promise; + } + override getDeployTransaction( + _stakeRegistry: string, + _rewardsCoordinator: string, + _pauserRegistry: string, + overrides?: Overrides & { from?: string } + ): TransactionRequest { + return super.getDeployTransaction( + _stakeRegistry, + _rewardsCoordinator, + _pauserRegistry, + overrides || {} + ); + } + override attach(address: string): ReclaimTaskManager { + return super.attach(address) as ReclaimTaskManager; + } + override connect(signer: Signer): ReclaimTaskManager__factory { + return super.connect(signer) as ReclaimTaskManager__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): ReclaimTaskManagerInterface { + return new utils.Interface(_abi) as ReclaimTaskManagerInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): ReclaimTaskManager { + return new Contract(address, _abi, signerOrProvider) as ReclaimTaskManager; + } +} diff --git a/src/avs/contracts/factories/RewardsCoordinator__factory.ts b/src/avs/contracts/factories/RewardsCoordinator__factory.ts index af965b4b..43cc6d37 100644 --- a/src/avs/contracts/factories/RewardsCoordinator__factory.ts +++ b/src/avs/contracts/factories/RewardsCoordinator__factory.ts @@ -1,18 +1,12 @@ /* Autogenerated file. Do not edit manually. */ /* tslint:disable */ /* eslint-disable */ -import { - Signer, - utils, - Contract, - ContractFactory, - BigNumberish, - Overrides, -} from "ethers"; +import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; import type { Provider, TransactionRequest } from "@ethersproject/providers"; import type { RewardsCoordinator, RewardsCoordinatorInterface, + IRewardsCoordinatorTypes, } from "../RewardsCoordinator"; const _abi = [ @@ -20,39 +14,67 @@ const _abi = [ type: "constructor", inputs: [ { - name: "_delegationManager", - type: "address", - internalType: "contract IDelegationManager", - }, - { - name: "_strategyManager", - type: "address", - internalType: "contract IStrategyManager", - }, - { - name: "_CALCULATION_INTERVAL_SECONDS", - type: "uint32", - internalType: "uint32", - }, - { - name: "_MAX_REWARDS_DURATION", - type: "uint32", - internalType: "uint32", - }, - { - name: "_MAX_RETROACTIVE_LENGTH", - type: "uint32", - internalType: "uint32", - }, - { - name: "_MAX_FUTURE_LENGTH", - type: "uint32", - internalType: "uint32", - }, - { - name: "__GENESIS_REWARDS_TIMESTAMP", - type: "uint32", - internalType: "uint32", + name: "params", + type: "tuple", + internalType: + "struct IRewardsCoordinatorTypes.RewardsCoordinatorConstructorParams", + components: [ + { + name: "delegationManager", + type: "address", + internalType: "contract IDelegationManager", + }, + { + name: "strategyManager", + type: "address", + internalType: "contract IStrategyManager", + }, + { + name: "allocationManager", + type: "address", + internalType: "contract IAllocationManager", + }, + { + name: "pauserRegistry", + type: "address", + internalType: "contract IPauserRegistry", + }, + { + name: "permissionController", + type: "address", + internalType: "contract IPermissionController", + }, + { + name: "CALCULATION_INTERVAL_SECONDS", + type: "uint32", + internalType: "uint32", + }, + { + name: "MAX_REWARDS_DURATION", + type: "uint32", + internalType: "uint32", + }, + { + name: "MAX_RETROACTIVE_LENGTH", + type: "uint32", + internalType: "uint32", + }, + { + name: "MAX_FUTURE_LENGTH", + type: "uint32", + internalType: "uint32", + }, + { + name: "GENESIS_REWARDS_TIMESTAMP", + type: "uint32", + internalType: "uint32", + }, + { + name: "version", + type: "string", + internalType: "string", + }, + ], }, ], stateMutability: "nonpayable", @@ -135,6 +157,19 @@ const _abi = [ ], stateMutability: "view", }, + { + type: "function", + name: "allocationManager", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IAllocationManager", + }, + ], + stateMutability: "view", + }, { type: "function", name: "beaconChainETHStrategy", @@ -155,7 +190,7 @@ const _abi = [ { name: "leaf", type: "tuple", - internalType: "struct IRewardsCoordinator.EarnerTreeMerkleLeaf", + internalType: "struct IRewardsCoordinatorTypes.EarnerTreeMerkleLeaf", components: [ { name: "earner", @@ -186,7 +221,7 @@ const _abi = [ { name: "leaf", type: "tuple", - internalType: "struct IRewardsCoordinator.TokenTreeMerkleLeaf", + internalType: "struct IRewardsCoordinatorTypes.TokenTreeMerkleLeaf", components: [ { name: "token", @@ -217,7 +252,7 @@ const _abi = [ { name: "claim", type: "tuple", - internalType: "struct IRewardsCoordinator.RewardsMerkleClaim", + internalType: "struct IRewardsCoordinatorTypes.RewardsMerkleClaim", components: [ { name: "rootIndex", @@ -237,7 +272,8 @@ const _abi = [ { name: "earnerLeaf", type: "tuple", - internalType: "struct IRewardsCoordinator.EarnerTreeMerkleLeaf", + internalType: + "struct IRewardsCoordinatorTypes.EarnerTreeMerkleLeaf", components: [ { name: "earner", @@ -264,7 +300,8 @@ const _abi = [ { name: "tokenLeaves", type: "tuple[]", - internalType: "struct IRewardsCoordinator.TokenTreeMerkleLeaf[]", + internalType: + "struct IRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]", components: [ { name: "token", @@ -295,14 +332,14 @@ const _abi = [ name: "claimerFor", inputs: [ { - name: "", + name: "earner", type: "address", internalType: "address", }, ], outputs: [ { - name: "", + name: "claimer", type: "address", internalType: "address", }, @@ -316,12 +353,13 @@ const _abi = [ { name: "rewardsSubmissions", type: "tuple[]", - internalType: "struct IRewardsCoordinator.RewardsSubmission[]", + internalType: "struct IRewardsCoordinatorTypes.RewardsSubmission[]", components: [ { name: "strategiesAndMultipliers", type: "tuple[]", - internalType: "struct IRewardsCoordinator.StrategyAndMultiplier[]", + internalType: + "struct IRewardsCoordinatorTypes.StrategyAndMultiplier[]", components: [ { name: "strategy", @@ -374,12 +412,101 @@ const _abi = [ name: "operatorDirectedRewardsSubmissions", type: "tuple[]", internalType: - "struct IRewardsCoordinator.OperatorDirectedRewardsSubmission[]", + "struct IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]", + components: [ + { + name: "strategiesAndMultipliers", + type: "tuple[]", + internalType: + "struct IRewardsCoordinatorTypes.StrategyAndMultiplier[]", + components: [ + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + { + name: "multiplier", + type: "uint96", + internalType: "uint96", + }, + ], + }, + { + name: "token", + type: "address", + internalType: "contract IERC20", + }, + { + name: "operatorRewards", + type: "tuple[]", + internalType: "struct IRewardsCoordinatorTypes.OperatorReward[]", + components: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "startTimestamp", + type: "uint32", + internalType: "uint32", + }, + { + name: "duration", + type: "uint32", + internalType: "uint32", + }, + { + name: "description", + type: "string", + internalType: "string", + }, + ], + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "createOperatorDirectedOperatorSetRewardsSubmission", + inputs: [ + { + name: "operatorSet", + type: "tuple", + internalType: "struct OperatorSet", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + { + name: "operatorDirectedRewardsSubmissions", + type: "tuple[]", + internalType: + "struct IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]", components: [ { name: "strategiesAndMultipliers", type: "tuple[]", - internalType: "struct IRewardsCoordinator.StrategyAndMultiplier[]", + internalType: + "struct IRewardsCoordinatorTypes.StrategyAndMultiplier[]", components: [ { name: "strategy", @@ -401,7 +528,7 @@ const _abi = [ { name: "operatorRewards", type: "tuple[]", - internalType: "struct IRewardsCoordinator.OperatorReward[]", + internalType: "struct IRewardsCoordinatorTypes.OperatorReward[]", components: [ { name: "operator", @@ -443,12 +570,13 @@ const _abi = [ { name: "rewardsSubmissions", type: "tuple[]", - internalType: "struct IRewardsCoordinator.RewardsSubmission[]", + internalType: "struct IRewardsCoordinatorTypes.RewardsSubmission[]", components: [ { name: "strategiesAndMultipliers", type: "tuple[]", - internalType: "struct IRewardsCoordinator.StrategyAndMultiplier[]", + internalType: + "struct IRewardsCoordinatorTypes.StrategyAndMultiplier[]", components: [ { name: "strategy", @@ -495,12 +623,13 @@ const _abi = [ { name: "rewardsSubmissions", type: "tuple[]", - internalType: "struct IRewardsCoordinator.RewardsSubmission[]", + internalType: "struct IRewardsCoordinatorTypes.RewardsSubmission[]", components: [ { name: "strategiesAndMultipliers", type: "tuple[]", - internalType: "struct IRewardsCoordinator.StrategyAndMultiplier[]", + internalType: + "struct IRewardsCoordinatorTypes.StrategyAndMultiplier[]", components: [ { name: "strategy", @@ -545,19 +674,19 @@ const _abi = [ name: "cumulativeClaimed", inputs: [ { - name: "", + name: "earner", type: "address", internalType: "address", }, { - name: "", + name: "token", type: "address", internalType: "contract IERC20", }, ], outputs: [ { - name: "", + name: "totalClaimed", type: "uint256", internalType: "uint256", }, @@ -616,19 +745,6 @@ const _abi = [ outputs: [], stateMutability: "nonpayable", }, - { - type: "function", - name: "domainSeparator", - inputs: [], - outputs: [ - { - name: "", - type: "bytes32", - internalType: "bytes32", - }, - ], - stateMutability: "view", - }, { type: "function", name: "getCurrentClaimableDistributionRoot", @@ -637,7 +753,7 @@ const _abi = [ { name: "", type: "tuple", - internalType: "struct IRewardsCoordinator.DistributionRoot", + internalType: "struct IRewardsCoordinatorTypes.DistributionRoot", components: [ { name: "root", @@ -672,7 +788,7 @@ const _abi = [ { name: "", type: "tuple", - internalType: "struct IRewardsCoordinator.DistributionRoot", + internalType: "struct IRewardsCoordinatorTypes.DistributionRoot", components: [ { name: "root", @@ -713,7 +829,7 @@ const _abi = [ { name: "", type: "tuple", - internalType: "struct IRewardsCoordinator.DistributionRoot", + internalType: "struct IRewardsCoordinatorTypes.DistributionRoot", components: [ { name: "root", @@ -796,6 +912,42 @@ const _abi = [ ], stateMutability: "view", }, + { + type: "function", + name: "getOperatorSetSplit", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "operatorSet", + type: "tuple", + internalType: "struct OperatorSet", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + ], + outputs: [ + { + name: "", + type: "uint16", + internalType: "uint16", + }, + ], + stateMutability: "view", + }, { type: "function", name: "getRootIndexFromHash", @@ -824,11 +976,6 @@ const _abi = [ type: "address", internalType: "address", }, - { - name: "_pauserRegistry", - type: "address", - internalType: "contract IPauserRegistry", - }, { name: "initialPausedStatus", type: "uint256", @@ -858,19 +1005,19 @@ const _abi = [ name: "isAVSRewardsSubmissionHash", inputs: [ { - name: "", + name: "avs", type: "address", internalType: "address", }, { - name: "", + name: "hash", type: "bytes32", internalType: "bytes32", }, ], outputs: [ { - name: "", + name: "valid", type: "bool", internalType: "bool", }, @@ -882,19 +1029,43 @@ const _abi = [ name: "isOperatorDirectedAVSRewardsSubmissionHash", inputs: [ { - name: "", + name: "avs", type: "address", internalType: "address", }, { - name: "", + name: "hash", type: "bytes32", internalType: "bytes32", }, ], outputs: [ { - name: "", + name: "valid", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "isOperatorDirectedOperatorSetRewardsSubmissionHash", + inputs: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "hash", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "valid", type: "bool", internalType: "bool", }, @@ -906,14 +1077,14 @@ const _abi = [ name: "isRewardsForAllSubmitter", inputs: [ { - name: "", + name: "submitter", type: "address", internalType: "address", }, ], outputs: [ { - name: "", + name: "valid", type: "bool", internalType: "bool", }, @@ -925,19 +1096,19 @@ const _abi = [ name: "isRewardsSubmissionForAllEarnersHash", inputs: [ { - name: "", + name: "avs", type: "address", internalType: "address", }, { - name: "", + name: "hash", type: "bytes32", internalType: "bytes32", }, ], outputs: [ { - name: "", + name: "valid", type: "bool", internalType: "bool", }, @@ -949,19 +1120,19 @@ const _abi = [ name: "isRewardsSubmissionForAllHash", inputs: [ { - name: "", + name: "avs", type: "address", internalType: "address", }, { - name: "", + name: "hash", type: "bytes32", internalType: "bytes32", }, ], outputs: [ { - name: "", + name: "valid", type: "bool", internalType: "bool", }, @@ -1048,12 +1219,25 @@ const _abi = [ }, { type: "function", - name: "processClaim", + name: "permissionController", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IPermissionController", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "processClaim", inputs: [ { name: "claim", type: "tuple", - internalType: "struct IRewardsCoordinator.RewardsMerkleClaim", + internalType: "struct IRewardsCoordinatorTypes.RewardsMerkleClaim", components: [ { name: "rootIndex", @@ -1073,7 +1257,8 @@ const _abi = [ { name: "earnerLeaf", type: "tuple", - internalType: "struct IRewardsCoordinator.EarnerTreeMerkleLeaf", + internalType: + "struct IRewardsCoordinatorTypes.EarnerTreeMerkleLeaf", components: [ { name: "earner", @@ -1100,7 +1285,8 @@ const _abi = [ { name: "tokenLeaves", type: "tuple[]", - internalType: "struct IRewardsCoordinator.TokenTreeMerkleLeaf[]", + internalType: + "struct IRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]", components: [ { name: "token", @@ -1132,7 +1318,7 @@ const _abi = [ { name: "claims", type: "tuple[]", - internalType: "struct IRewardsCoordinator.RewardsMerkleClaim[]", + internalType: "struct IRewardsCoordinatorTypes.RewardsMerkleClaim[]", components: [ { name: "rootIndex", @@ -1152,7 +1338,8 @@ const _abi = [ { name: "earnerLeaf", type: "tuple", - internalType: "struct IRewardsCoordinator.EarnerTreeMerkleLeaf", + internalType: + "struct IRewardsCoordinatorTypes.EarnerTreeMerkleLeaf", components: [ { name: "earner", @@ -1179,7 +1366,8 @@ const _abi = [ { name: "tokenLeaves", type: "tuple[]", - internalType: "struct IRewardsCoordinator.TokenTreeMerkleLeaf[]", + internalType: + "struct IRewardsCoordinatorTypes.TokenTreeMerkleLeaf[]", components: [ { name: "token", @@ -1250,6 +1438,24 @@ const _abi = [ outputs: [], stateMutability: "nonpayable", }, + { + type: "function", + name: "setClaimerFor", + inputs: [ + { + name: "earner", + type: "address", + internalType: "address", + }, + { + name: "claimer", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, { type: "function", name: "setDefaultOperatorSplit", @@ -1306,12 +1512,34 @@ const _abi = [ }, { type: "function", - name: "setPauserRegistry", + name: "setOperatorSetSplit", inputs: [ { - name: "newPauserRegistry", + name: "operator", type: "address", - internalType: "contract IPauserRegistry", + internalType: "address", + }, + { + name: "operatorSet", + type: "tuple", + internalType: "struct OperatorSet", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + { + name: "split", + type: "uint16", + internalType: "uint16", }, ], outputs: [], @@ -1366,14 +1594,14 @@ const _abi = [ name: "submissionNonce", inputs: [ { - name: "", + name: "avs", type: "address", internalType: "address", }, ], outputs: [ { - name: "", + name: "nonce", type: "uint256", internalType: "uint256", }, @@ -1424,6 +1652,19 @@ const _abi = [ outputs: [], stateMutability: "nonpayable", }, + { + type: "function", + name: "version", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, { type: "event", name: "AVSRewardsSubmissionCreated", @@ -1450,12 +1691,13 @@ const _abi = [ name: "rewardsSubmission", type: "tuple", indexed: false, - internalType: "struct IRewardsCoordinator.RewardsSubmission", + internalType: "struct IRewardsCoordinatorTypes.RewardsSubmission", components: [ { name: "strategiesAndMultipliers", type: "tuple[]", - internalType: "struct IRewardsCoordinator.StrategyAndMultiplier[]", + internalType: + "struct IRewardsCoordinatorTypes.StrategyAndMultiplier[]", components: [ { name: "strategy", @@ -1690,12 +1932,13 @@ const _abi = [ type: "tuple", indexed: false, internalType: - "struct IRewardsCoordinator.OperatorDirectedRewardsSubmission", + "struct IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission", components: [ { name: "strategiesAndMultipliers", type: "tuple[]", - internalType: "struct IRewardsCoordinator.StrategyAndMultiplier[]", + internalType: + "struct IRewardsCoordinatorTypes.StrategyAndMultiplier[]", components: [ { name: "strategy", @@ -1717,7 +1960,114 @@ const _abi = [ { name: "operatorRewards", type: "tuple[]", - internalType: "struct IRewardsCoordinator.OperatorReward[]", + internalType: "struct IRewardsCoordinatorTypes.OperatorReward[]", + components: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "startTimestamp", + type: "uint32", + internalType: "uint32", + }, + { + name: "duration", + type: "uint32", + internalType: "uint32", + }, + { + name: "description", + type: "string", + internalType: "string", + }, + ], + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OperatorDirectedOperatorSetRewardsSubmissionCreated", + inputs: [ + { + name: "caller", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "operatorDirectedRewardsSubmissionHash", + type: "bytes32", + indexed: true, + internalType: "bytes32", + }, + { + name: "operatorSet", + type: "tuple", + indexed: false, + internalType: "struct OperatorSet", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + { + name: "submissionNonce", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "operatorDirectedRewardsSubmission", + type: "tuple", + indexed: false, + internalType: + "struct IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission", + components: [ + { + name: "strategiesAndMultipliers", + type: "tuple[]", + internalType: + "struct IRewardsCoordinatorTypes.StrategyAndMultiplier[]", + components: [ + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + { + name: "multiplier", + type: "uint96", + internalType: "uint96", + }, + ], + }, + { + name: "token", + type: "address", + internalType: "contract IERC20", + }, + { + name: "operatorRewards", + type: "tuple[]", + internalType: "struct IRewardsCoordinatorTypes.OperatorReward[]", components: [ { name: "operator", @@ -1790,57 +2140,93 @@ const _abi = [ }, { type: "event", - name: "OwnershipTransferred", + name: "OperatorSetSplitBipsSet", inputs: [ { - name: "previousOwner", + name: "caller", type: "address", indexed: true, internalType: "address", }, { - name: "newOwner", + name: "operator", type: "address", indexed: true, internalType: "address", }, + { + name: "operatorSet", + type: "tuple", + indexed: false, + internalType: "struct OperatorSet", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + { + name: "activatedAt", + type: "uint32", + indexed: false, + internalType: "uint32", + }, + { + name: "oldOperatorSetSplitBips", + type: "uint16", + indexed: false, + internalType: "uint16", + }, + { + name: "newOperatorSetSplitBips", + type: "uint16", + indexed: false, + internalType: "uint16", + }, ], anonymous: false, }, { type: "event", - name: "Paused", + name: "OwnershipTransferred", inputs: [ { - name: "account", + name: "previousOwner", type: "address", indexed: true, internalType: "address", }, { - name: "newPausedStatus", - type: "uint256", - indexed: false, - internalType: "uint256", + name: "newOwner", + type: "address", + indexed: true, + internalType: "address", }, ], anonymous: false, }, { type: "event", - name: "PauserRegistrySet", + name: "Paused", inputs: [ { - name: "pauserRegistry", + name: "account", type: "address", - indexed: false, - internalType: "contract IPauserRegistry", + indexed: true, + internalType: "address", }, { - name: "newPauserRegistry", - type: "address", + name: "newPausedStatus", + type: "uint256", indexed: false, - internalType: "contract IPauserRegistry", + internalType: "uint256", }, ], anonymous: false, @@ -1939,12 +2325,13 @@ const _abi = [ name: "rewardsSubmission", type: "tuple", indexed: false, - internalType: "struct IRewardsCoordinator.RewardsSubmission", + internalType: "struct IRewardsCoordinatorTypes.RewardsSubmission", components: [ { name: "strategiesAndMultipliers", type: "tuple[]", - internalType: "struct IRewardsCoordinator.StrategyAndMultiplier[]", + internalType: + "struct IRewardsCoordinatorTypes.StrategyAndMultiplier[]", components: [ { name: "strategy", @@ -2009,12 +2396,13 @@ const _abi = [ name: "rewardsSubmission", type: "tuple", indexed: false, - internalType: "struct IRewardsCoordinator.RewardsSubmission", + internalType: "struct IRewardsCoordinatorTypes.RewardsSubmission", components: [ { name: "strategiesAndMultipliers", type: "tuple[]", - internalType: "struct IRewardsCoordinator.StrategyAndMultiplier[]", + internalType: + "struct IRewardsCoordinatorTypes.StrategyAndMultiplier[]", components: [ { name: "strategy", @@ -2091,10 +2479,226 @@ const _abi = [ ], anonymous: false, }, + { + type: "error", + name: "AmountExceedsMax", + inputs: [], + }, + { + type: "error", + name: "AmountIsZero", + inputs: [], + }, + { + type: "error", + name: "CurrentlyPaused", + inputs: [], + }, + { + type: "error", + name: "DurationExceedsMax", + inputs: [], + }, + { + type: "error", + name: "DurationIsZero", + inputs: [], + }, + { + type: "error", + name: "EarningsNotGreaterThanClaimed", + inputs: [], + }, + { + type: "error", + name: "InputAddressZero", + inputs: [], + }, + { + type: "error", + name: "InputArrayLengthMismatch", + inputs: [], + }, + { + type: "error", + name: "InputArrayLengthZero", + inputs: [], + }, + { + type: "error", + name: "InvalidAddressZero", + inputs: [], + }, + { + type: "error", + name: "InvalidCalculationIntervalSecondsRemainder", + inputs: [], + }, + { + type: "error", + name: "InvalidClaimProof", + inputs: [], + }, + { + type: "error", + name: "InvalidDurationRemainder", + inputs: [], + }, + { + type: "error", + name: "InvalidEarner", + inputs: [], + }, + { + type: "error", + name: "InvalidEarnerLeafIndex", + inputs: [], + }, + { + type: "error", + name: "InvalidGenesisRewardsTimestampRemainder", + inputs: [], + }, + { + type: "error", + name: "InvalidNewPausedStatus", + inputs: [], + }, + { + type: "error", + name: "InvalidOperatorSet", + inputs: [], + }, + { + type: "error", + name: "InvalidPermissions", + inputs: [], + }, + { + type: "error", + name: "InvalidProofLength", + inputs: [], + }, + { + type: "error", + name: "InvalidRoot", + inputs: [], + }, + { + type: "error", + name: "InvalidRootIndex", + inputs: [], + }, + { + type: "error", + name: "InvalidShortString", + inputs: [], + }, + { + type: "error", + name: "InvalidStartTimestampRemainder", + inputs: [], + }, + { + type: "error", + name: "InvalidTokenLeafIndex", + inputs: [], + }, + { + type: "error", + name: "NewRootMustBeForNewCalculatedPeriod", + inputs: [], + }, + { + type: "error", + name: "OnlyPauser", + inputs: [], + }, + { + type: "error", + name: "OnlyUnpauser", + inputs: [], + }, + { + type: "error", + name: "OperatorsNotInAscendingOrder", + inputs: [], + }, + { + type: "error", + name: "PreviousSplitPending", + inputs: [], + }, + { + type: "error", + name: "RewardsEndTimestampNotElapsed", + inputs: [], + }, + { + type: "error", + name: "RootAlreadyActivated", + inputs: [], + }, + { + type: "error", + name: "RootDisabled", + inputs: [], + }, + { + type: "error", + name: "RootNotActivated", + inputs: [], + }, + { + type: "error", + name: "SplitExceedsMax", + inputs: [], + }, + { + type: "error", + name: "StartTimestampTooFarInFuture", + inputs: [], + }, + { + type: "error", + name: "StartTimestampTooFarInPast", + inputs: [], + }, + { + type: "error", + name: "StrategiesNotInAscendingOrder", + inputs: [], + }, + { + type: "error", + name: "StrategyNotWhitelisted", + inputs: [], + }, + { + type: "error", + name: "StringTooLong", + inputs: [ + { + name: "str", + type: "string", + internalType: "string", + }, + ], + }, + { + type: "error", + name: "SubmissionNotRetroactive", + inputs: [], + }, + { + type: "error", + name: "UnauthorizedCaller", + inputs: [], + }, ] as const; const _bytecode = - "0x61018080604052346103c057604051601f61544838819003918201601f19168301916001600160401b038311848410176103ac5780849260e09460405283398101031261035c578051906001600160a01b03821682036103585760208101516001600160a01b03811681036103585761007a6040830161040d565b6100866060840161040d565b906100936080850161040d565b926100ac60c06100a560a0880161040d565b960161040d565b9563ffffffff831680156103445763ffffffff81818a1606166102b3576201518063ffffffff91061661022257610120526101405260805260a05260c05260e052610100525f5460ff8160081c166101cd5760ff80821610610193575b4661016052604051615029908161041f8239608051818181611480015261481e015260a0518181816117aa01526147e3015260c051818181610b6f0152614862015260e05181818161050a01526136780152610100518181816106f501526149ac01526101205181611bcb015261014051818181610ba801526148a0015261016051816131860152f35b60ff90811916175f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a180610109565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b60405162461bcd60e51b815260206004820152605760248201527f52657761726473436f6f7264696e61746f723a2043414c43554c4154494f4e5f60448201527f494e54455256414c5f5345434f4e4453206d7573742062652061206d756c746960648201527f706c65206f6620534e415053484f545f434144454e4345000000000000000000608482015260a490fd5b60405162461bcd60e51b815260206004820152606060248201527f52657761726473436f6f7264696e61746f723a2047454e455349535f5245574160448201527f5244535f54494d455354414d50206d7573742062652061206d756c7469706c6560648201527f206f662043414c43554c4154494f4e5f494e54455256414c5f5345434f4e4453608482015260a490fd5b634e487b7160e01b5f52601260045260245ffd5b5f80fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b519063ffffffff821682036103585756fe6080604052600436106120ef575f3560e01c806218572c1461039a57806304a0c502146103955780630e9a53cf146103905780630eb383451461038b57806310d67a2f14610386578063131433b414610381578063136439dd1461037c578063149bc872146103775780632b9f64a41461037257806336af41fa1461036d57806337838ed01461036857806339b70e38146103635780633a8c07861461035e5780633ccc861d146103595780633efe1db6146103545780634596021c1461034f5780634b9439601461034a5780634d18cc351461034557806358baaa3e14610340578063595c6a671461033b5780635ac86ab7146103365780635c975abb146103315780635e9d83481461032c57806363f6a798146103275780636d21117e14610322578063715018a61461031d5780637b8f8b0514610318578063863cb9a914610313578063865c69531461030e578063886f1195146103095780638da5cb5b146103045780639104c319146102ff5780639be3d4e4146102fa5780639cb9a5fa146102f55780639d45c281146102f0578063a0169ddd146102eb578063a50a1d9c146102e6578063aebd8bae146102e1578063b3dbb0e0146102dc578063bb7e451f146102d7578063bf21a8aa146102d2578063c46db606146102cd578063d4540a55146102c8578063dcbb03b3146102c3578063de02e503146102be578063e063f81f146102b9578063e810ce21146102b4578063ea4d3c9b146102af578063ed71e6a2146102aa578063f2fde38b146102a5578063f698da25146102a0578063f8cd84481461029b578063f96abf2e14610296578063fabc1cbc14610291578063fbf1e2c11461028c578063fce36c7d146102875763ff9f6cce036120ef57611fdf565b611ee7565b611ebf565b611e55565b611d17565b611cf3565b611cd9565b611c48565b611bfa565b611bb6565b611b8a565b611b1d565b611af2565b611940565b61181c565b6117ce565b61178e565b611753565b6115c8565b61157a565b61154a565b6114a4565b611464565b6112f8565b6112bd565b61128f565b611267565b61123f565b6111e0565b6111b3565b611196565b61113b565b6110ed565b6110c9565b611069565b61104c565b611019565b610fba565b610f8d565b610f67565b610ee7565b610e49565b610c98565b610c0c565b610bd7565b610b93565b610b53565b6109fb565b610845565b610819565b610719565b6106d9565b610629565b610596565b61052e565b6104ee565b6104a4565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b6001600160a01b038116036104a057565b5f80fd5b346104e95760203660031901126104e4576004356104c18161048f565b60018060a01b03165f5260d1602052602060ff60405f2054166040519015158152f35b6103ef565b61039f565b346104e9575f3660031901126104e457602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346104e9575f3660031901126104e4576105886105496122bf565b6040519182918291909160608060808301948051845263ffffffff602082015116602085015263ffffffff604082015116604085015201511515910152565b0390f35b801515036104a057565b346104e95760403660031901126104e4576004356105b38161048f565b602435906105c08261058c565b6105c8613381565b60018060a01b0316805f5260d160205260ff60405f205416151582151590827f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c5f80a45f5260d160205260405f209060ff8019835416911515161790555f80f35b346104e95760203660031901126104e4576004356106468161048f565b6065546001600160a01b031690813b156106d45760206004926040519384809263755b36bd60e11b82525afa9182156106cf5761069e92610699915f916106a0575b506001600160a01b031633146123c3565b6133d9565b005b6106c2915060203d6020116106c8575b6106ba81836121a1565b8101906123a0565b5f610688565b503d6106b0565b6123b8565b61234d565b346104e9575f3660031901126104e457602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346104e95760203660031901126104e4576065546001600160a01b0316600435813b156106d45760206024926040519384809263237dfb4760e11b82523360048301525afa9182156106cf5761069e9261077a915f9161077f575b50612437565b612494565b6107a1915060203d6020116107a7575b61079981836121a1565b810190612422565b5f610774565b503d61078f565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a207374727563742063616c6c6461746120746f6044820152661bc81cda1bdc9d60ca1b6064820152608490fd5b604090600319011261081457600490565b6107ae565b346104e95760403660031901126104e457602061083d61083836610803565b612549565b604051908152f35b346104e95760203660031901126104e4576004356108628161048f565b60018060a01b03165f5260cc602052602060018060a01b0360405f205416604051908152f35b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b9181601f8401121561096f578235916001600160401b038311610916576020808501948460051b01011161091157565b610888565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b60206003198201126104e457600435906001600160401b0382116109f6576109f2916004016108e1565b9091565b61043f565b346104e957610a09366109c8565b90610a21610a1b600280606654161490565b15612592565b335f5260d1602052610a3960ff60405f2054166125de565b610a486002609754141561266a565b60026097555f5b828110610a605761069e6001609755565b80610b4d610a716001938686612785565b335f90815260ce60205260409020546040516020810190610aa681610a988686338761298d565b03601f1981018352826121a1565b51902090610ab383613606565b335f90815260d060205260409020610ae690610ad99084905b905f5260205260405f2090565b805460ff19166001179055565b610aef816129b1565b335f90815260ce60205260409020556040517f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf270482339180610b2f87826129da565b0390a46040610b406020830161253f565b910135903090339061371c565b01610a4f565b346104e9575f3660031901126104e457602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346104e9575f3660031901126104e4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346104e9575f3660031901126104e457602063ffffffff60cb5460a01c16604051908152f35b90816101009103126108145790565b346104e95760403660031901126104e4576004356001600160401b0381116109f657610c3f610c76913690600401610bfd565b60243590610c4c8261048f565b610c5d610a1b600480606654161490565b610c6c6002609754141561266a565b60026097556138ac565b6001609755005b63ffffffff8116036104a057565b3590610c9682610c7d565b565b346104e95760403660031901126104e457602435600435610cb882610c7d565b610cc9610a1b600880606654161490565b60cb5491610ce1336001600160a01b038516146129eb565b63ffffffff81169263ffffffff8160c01c16841115610dca5763ffffffff7fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd0891610d2c428710612a54565b610db0610d59610d51610d4460ca5463ffffffff1690565b9360a01c63ffffffff1690565b844216612ae4565b94610d8b610d656121c2565b88815263ffffffff8316602082015263ffffffff881660408201525f6060820152612afe565b60cb805463ffffffff60c01b191660c09290921b63ffffffff60c01b16919091179055565b60405163ffffffff9094168452169180602081015b0390a4005b60405162461bcd60e51b815260206004820152604b60248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a206e60448201527f657720726f6f74206d75737420626520666f72206e657765722063616c63756c60648201526a185d1959081c195c9a5bd960aa1b608482015260a490fd5b346104e95760403660031901126104e4576004356001600160401b0381116109f657610e799036906004016108e1565b60243591610e868361048f565b610e97610a1b600480606654161490565b610ea66002609754141561266a565b60026097553681900360fe1901925f5b83811015610c76578060051b8301359085821215610ee257610edc8360019386016138ac565b01610eb6565b6126b6565b346104e95760203660031901126104e457600435610f048161048f565b60018060a01b03165f5260d5602052610588610f5260405f2063ffffffff60405191610f2f83612166565b5461ffff8116835261ffff8160101c16602084015260201c166040820152613a67565b60405161ffff90911681529081906020820190565b346104e9575f3660031901126104e457602063ffffffff60cb5460c01c16604051908152f35b346104e95760203660031901126104e45761069e600435610fad81610c7d565b610fb5613381565b613a9e565b346104e9575f3660031901126104e4576065546001600160a01b0316803b156106d45760206024916040519283809263237dfb4760e11b82523360048301525afa80156106cf57611011915f9161077f5750612437565b61069e612be4565b346104e95760203660031901126104e45760043560ff81168091036104a05760016020911b806066541614604051908152f35b346104e9575f3660031901126104e4576020606654604051908152f35b346104e95760203660031901126104e4576004356001600160401b0381116109f65761109c6110be913690600401610bfd565b6110b86110b282356110ad81610c7d565b612244565b5061227e565b90613cea565b602060405160018152f35b346104e9575f3660031901126104e457602061ffff60cb5460e01c16604051908152f35b346104e95760403660031901126104e45760043561110a8161048f565b6024359060018060a01b03165f5260cf60205260405f20905f52602052602060ff60405f2054166040519015158152f35b346104e9575f3660031901126104e457611153613381565b603380546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346104e9575f3660031901126104e457602060ca54604051908152f35b346104e95760203660031901126104e45761069e6004356111d38161048f565b6111db613381565b613e60565b346104e95760403660031901126104e45760206112366004356112028161048f565b6024359061120f8261048f565b60018060a01b03165f5260cd835260405f209060018060a01b03165f5260205260405f2090565b54604051908152f35b346104e9575f3660031901126104e4576065546040516001600160a01b039091168152602090f35b346104e9575f3660031901126104e4576033546040516001600160a01b039091168152602090f35b346104e9575f3660031901126104e457602060405173beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08152f35b346104e9575f3660031901126104e4576112d56121d1565b5060ca545f1981019081116112f3576105496110b261058892612244565b6121f5565b346104e95760403660031901126104e4576004356113158161048f565b6024356001600160401b0381116109f6576113349036906004016108e1565b9190611347610a1b602080606654161490565b6113566002609754141561266a565b60026097556001600160a01b03821691611371338414612c22565b5f5b8481106113845761069e6001609755565b8061145e6113956001938887612cb1565b6001600160a01b0385165f90815260ce60205260409020549060405160208101906113c681610a9885878c87612e17565b519020886113d38361413a565b936113f5610ad984610acc8c60018060a01b03165f5260d360205260405f2090565b6113fe816129b1565b6001600160a01b038a165f90815260ce60205260409020557ffc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e06040518061144787339583612e3b565b0390a43090611459602033920161253f565b61371c565b01611373565b346104e9575f3660031901126104e457602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346104e95760203660031901126104e4576004356114c18161048f565b335f81815260cc6020526040812080546001600160a01b039485166001600160a01b03198216811790925590931691907fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca3129080a4005b6024359061ffff821682036104a057565b60a4359061ffff821682036104a057565b6044359061ffff821682036104a057565b346104e95760203660031901126104e45760043561ffff811681036104a05761069e90611575613381565b614250565b346104e95760403660031901126104e4576004356115978161048f565b6024359060018060a01b03165f5260d260205260405f20905f52602052602060ff60405f2054166040519015158152f35b346104e95760403660031901126104e4576004356115e58161048f565b6115ed611517565b906115ff610a1b608080606654161490565b6001600160a01b03811691338390036116de578061164661271061ffff7fd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f7494161115612e52565b60cb546116639060a01c63ffffffff165b63ffffffff4216612ae4565b926116b684836116b161169661169161168c8760018060a01b03165f5260d560205260405f2090565b612bb0565b613a67565b6001600160a01b039095165f90815260d56020526040902090565b6142ab565b6040805163ffffffff95909516855261ffff91821660208601529116908301523391606090a3005b60405162461bcd60e51b815260206004820152604160248201527f52657761726473436f6f7264696e61746f722e7365744f70657261746f72504960448201527f53706c69743a2063616c6c6572206973206e6f7420746865206f70657261746f6064820152603960f91b608482015260a490fd5b346104e95760203660031901126104e4576004356117708161048f565b60018060a01b03165f5260ce602052602060405f2054604051908152f35b346104e9575f3660031901126104e457602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346104e95760403660031901126104e4576004356117eb8161048f565b6024359060018060a01b03165f5260d060205260405f20905f52602052602060ff60405f2054166040519015158152f35b346104e95760c03660031901126104e4576004356118398161048f565b6118b86024356118488161048f565b6044356064356118578161048f565b6084359161186483610c7d565b61186c611528565b935f549661189e6118886118848a60ff9060081c1690565b1590565b8099819a611932575b8115611912575b50612ecf565b876118af600160ff195f5416175f55565b6118fb57612f32565b6118be57005b6118cc61ff00195f54165f55565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1005b61190d61010061ff00195f5416175f55565b612f32565b303b15915081611924575b505f611898565b60ff1660011490505f61191d565b600160ff8216109150611891565b346104e95760603660031901126104e45760043561195d8161048f565b6024356119698161048f565b611971611539565b611982610a1b604080606654161490565b6001600160a01b0383169133839003611a7c57817f48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934916119cd61271061ffff611a129616111561303b565b611a4286836116b184611a12611a2761169161168c846119f961165760cb5463ffffffff9060a01c1690565b9d8e9960018060a01b03165f5260d460205260405f2090565b9060018060a01b03165f5260205260405f2090565b6001600160a01b03909c165f90815260d46020526040902090565b6040805163ffffffff95909516855261ffff968716602086015291909516908301526001600160a01b039093169233918060608101610dc5565b60405162461bcd60e51b815260206004820152604260248201527f52657761726473436f6f7264696e61746f722e7365744f70657261746f72415660448201527f5353706c69743a2063616c6c6572206973206e6f7420746865206f706572617460648201526137b960f11b608482015260a490fd5b346104e95760203660031901126104e4576105886105496110b2600435611b176121d1565b50612244565b346104e95760403660031901126104e457610588610f52611b78600435611b438161048f565b60243590611b508261048f565b60018060a01b03165f5260d460205260405f209060018060a01b03165f5260205260405f2090565b63ffffffff60405191610f2f83612166565b346104e95760203660031901126104e4576020611ba86004356130d1565b63ffffffff60405191168152f35b346104e9575f3660031901126104e4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346104e95760403660031901126104e457600435611c178161048f565b6024359060018060a01b03165f5260d360205260405f20905f52602052602060ff60405f2054166040519015158152f35b346104e95760203660031901126104e457600435611c658161048f565b611c6d613381565b6001600160a01b03811615611c855761069e90613e18565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346104e9575f3660031901126104e457602061083d613183565b346104e95760403660031901126104e457602061083d611d1236610803565b6131b8565b346104e95760203660031901126104e457600435611d3481610c7d565b611d45610a1b600880606654161490565b611d5a60018060a01b0360cb541633146129eb565b60ca549063ffffffff811691821015611df6576001611d7b611dd092612244565b5001611dbd611db6611dad8354611da1611d9c6118848360ff9060401c1690565b6131ff565b60201c63ffffffff1690565b63ffffffff1690565b4210613269565b805460ff60401b1916600160401b179055565b7fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e5f80a2005b60405162461bcd60e51b815260206004820152603160248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152700d2dcecc2d8d2c840e4dedee892dcc8caf607b1b6064820152608490fd5b346104e95760203660031901126104e4576065546001600160a01b0316600435813b156106d45760206004926040519384809263755b36bd60e11b82525afa9182156106cf5761069e92611eba915f916106a057506001600160a01b031633146123c3565b6132d4565b346104e9575f3660031901126104e45760cb546040516001600160a01b039091168152602090f35b346104e957611ef5366109c8565b90611f07610a1b600180606654161490565b611f166002609754141561266a565b60026097555f5b828110611f2e5761069e6001609755565b80611fd9611f3f6001938686612785565b335f90815260ce60205260409020546040516020810190611f6681610a988686338761298d565b51902090611f7383613606565b335f90815260cf60205260409020611f9090610ad9908490610acc565b611f99816129b1565b335f90815260ce60205260409020556040517f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e6281339180610b2f87826129da565b01611f1d565b346104e957611fed366109c8565b90611fff610a1b601080606654161490565b335f5260d160205261201760ff60405f2054166125de565b6120266002609754141561266a565b60026097555f5b82811061203e5761069e6001609755565b806120e961204f6001938686612785565b335f90815260ce6020526040902054604051602081019061207681610a988686338761298d565b5190209061208383613606565b335f90815260d2602052604090206120a090610ad9908490610acc565b6120a9816129b1565b335f90815260ce60205260409020556040517f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b339180610b2f87826129da565b0161202d565b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b0382111761218157604052565b612152565b608081019081106001600160401b0382111761218157604052565b90601f801991011681019081106001600160401b0382111761218157604052565b60405190610c966080836121a1565b604051906121de82612186565b5f6060838281528260208201528260408201520152565b634e487b7160e01b5f52601160045260245ffd5b80156112f3575f190190565b5f198101919082116112f357565b919082039182116112f357565b634e487b7160e01b5f52603260045260245ffd5b60ca548110156122605760ca5f5260205f209060011b01905f90565b612230565b8054821015612260575f5260205f209060011b01905f90565b9060405161228b81612186565b606060ff6001839580548552015463ffffffff8116602085015263ffffffff8160201c16604085015260401c161515910152565b6122c76121d1565b5060ca54805b6122f257506122da6121c2565b5f81525f60208201525f60408201525f606082015290565b6123016110b26110ad83612215565b906123126118846060840151151590565b80612330575b61232c576123269150612209565b806122cd565b5090565b50612345611dad604084015163ffffffff1690565b421015612318565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b908160209103126104e457516123b58161048f565b90565b6040513d5f823e3d90fd5b156123ca57565b60405162461bcd60e51b815260206004820152602a60248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526939903ab73830bab9b2b960b11b6064820152608490fd5b908160209103126104e457516123b58161058c565b1561243e57565b60405162461bcd60e51b815260206004820152602860248201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160448201526739903830bab9b2b960c11b6064820152608490fd5b606654818116036124d457606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d90602090a2565b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b356123b58161048f565b60208135916125578361048f565b01356040519060208201925f84526001600160601b03199060601b16602183015260358201526035815261258c6055826121a1565b51902090565b1561259957565b60405162461bcd60e51b815260206004820152601960248201527f5061757361626c653a20696e64657820697320706175736564000000000000006044820152606490fd5b156125e557565b60405162461bcd60e51b815260206004820152605160248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f60448201527f7420612076616c69642063726561746552657761726473466f72416c6c53756260648201527036b4b9b9b4b7b71039bab136b4ba3a32b960791b608482015260a490fd5b1561267157565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206f6666736574000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206c656e677468000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527f43616c6c64617461207461696c20746f6f2073686f72740000000000000000006044820152606490fd5b91908110156122605760051b81013590609e1981360301821215610ee2570190565b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206c656e67746800006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c64617461206163636573732073747269646500006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206f666673657400006044820152606490fd5b9035601e19823603018112156128b45701602081359101916001600160401b0382116128af578160061b360383136128aa57565b6127ec565b6127a7565b612831565b916020908281520191905f905b8082106128d35750505090565b90919283356128e18161048f565b6001600160a01b0316815260208401356001600160601b03811691908290036104a0576040816001936020839401520194019201906128c6565b90608063ffffffff8161293f6129318680612876565b60a0875260a08701916128b9565b94602081013561294e8161048f565b6001600160a01b031660208601526040818101359086015282606082013561297581610c7d565b166060860152013561298681610c7d565b1691015290565b6123b5939260609260018060a01b031682526020820152816040820152019061291b565b90600182018092116112f357565b90602082018092116112f357565b919082018092116112f357565b9060206123b592818152019061291b565b156129f257565b60405162461bcd60e51b815260206004820152603460248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f6044820152733a103a3432903932bbb0b93239aab83230ba32b960611b6064820152608490fd5b15612a5b57565b60405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a207260448201527f65776172647343616c63756c6174696f6e456e6454696d657374616d702063616064820152746e6e6f7420626520696e207468652066757475726560581b608482015260a490fd5b9063ffffffff8091169116019063ffffffff82116112f357565b60ca54600160401b81101561218157806001612b1f920160ca5560ca612265565b919091612b9d5760606001610c969383518155019163ffffffff60208201511663ffffffff19845416178355612b7c63ffffffff604083015116849067ffffffff0000000082549160201b169067ffffffff000000001916179055565b0151815460ff60401b191690151560401b68ff000000000000000016179055565b634e487b7160e01b5f525f60045260245ffd5b90604051612bbd81612166565b604063ffffffff82945461ffff8116845261ffff8160101c16602085015260201c16910152565b5f196066556040515f1981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2565b356123b581610c7d565b15612c2957565b60405162461bcd60e51b815260206004820152605460248201527f52657761726473436f6f7264696e61746f722e6372656174654f70657261746f60448201527f724469726563746564415653526577617264735375626d697373696f6e3a2063606482015273616c6c6572206973206e6f74207468652041565360601b608482015260a490fd5b91908110156122605760051b8101359060be1981360301821215610ee2570190565b9035601e19823603018112156128b45701602081359101916001600160401b0382116128af5781360383136128aa57565b908060209392818452848401375f828201840152601f01601f1916010190565b9190612d41612d338480612876565b60c0845260c08401916128b9565b906020840135612d508161048f565b6001600160a01b0316602082810191909152612d6f6040860186612876565b838503604085015280855293909101925f5b818110612de357505050612dd584612daf612da260606123b5979801610c8b565b63ffffffff166060850152565b612dcb612dbe60808301610c8b565b63ffffffff166080850152565b60a0810190612cd3565b9160a0818503910152612d04565b9091936040806001928735612df78161048f565b848060a01b03168152602088013560208201520195019101919091612d81565b6123b5939260609260018060a01b0316825260208201528160408201520190612d24565b6040906123b5939281528160208201520190612d24565b15612e5957565b60405162461bcd60e51b815260206004820152604260248201527f52657761726473436f6f7264696e61746f722e7365744f70657261746f72504960448201527f53706c69743a2073706c6974206d757374206265203c3d203130303030206269606482015261707360f01b608482015260a490fd5b15612ed657565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b929493919094612f40614351565b60c9556065546001600160a01b03161580613029575b15612fae576111db61157594612fa9610c969885612f76610fb597606655565b60405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d90602090a26133d9565b613e18565b60405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a490fd5b506001600160a01b0386161515612f56565b1561304257565b60405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e7365744f70657261746f72415660448201527f5353706c69743a2073706c6974206d757374206265203c3d203130303030206260648201526269707360e81b608482015260a490fd5b63ffffffff5f199116019063ffffffff82116112f357565b63ffffffff60ca54165b63ffffffff81166131515760405162461bcd60e51b815260206004820152603760248201527f52657761726473436f6f7264696e61746f722e676574526f6f74496e6465784660448201527f726f6d486173683a20726f6f74206e6f7420666f756e640000000000000000006064820152608490fd5b8161315e6110ad836130b9565b5054146131795763ffffffff1680156112f3575f19016130db565b6123b591506130b9565b467f0000000000000000000000000000000000000000000000000000000000000000036131b05760c95490565b6123b5614351565b60208135916131c68361048f565b0135604051906020820192600160f81b84526001600160601b03199060601b16602183015260358201526035815261258c6055826121a1565b1561320657565b60405162461bcd60e51b815260206004820152603560248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152741c9bdbdd08185b1c9958591e48191a5cd8589b1959605a1b6064820152608490fd5b1561327057565b60405162461bcd60e51b815260206004820152603660248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152751c9bdbdd08185b1c9958591e481858dd1a5d985d195960521b6064820152608490fd5b60665419811981160361331657606681905560405190815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602090a2565b60405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608490fd5b6033546001600160a01b0316330361339557565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b6001600160a01b0381161561344a57606554604080516001600160a01b0392831681529183166020830152610c9692917f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb69190a160018060a01b03166001600160601b0360a01b6065541617606555565b60405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a490fd5b903590601e1981360301821215610ee257018035906001600160401b03821161350157602001918160061b360383136134fc57565b612740565b6126fb565b1561350d57565b60405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f76616c69646174655265776160448201527f7264735375626d697373696f6e3a20616d6f756e7420746f6f206c61726765006064820152608490fd5b1561357f57565b60405162461bcd60e51b815260206004820152605360248201527f52657761726473436f6f7264696e61746f722e5f76616c69646174655265776160448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152726f2066617220696e207468652066757475726560681b608482015260a490fd5b604061363d9161361681806134c7565b9390606083019485359061362982610c7d565b60808501359261363884610c7d565b6147be565b013580156136a757610c96916136686f4b3b4ca85a86c47a098a223fffffffff61366d931115613506565b612c18565b63ffffffff61369e817f000000000000000000000000000000000000000000000000000000000000000016426129cd565b91161115613578565b60405162461bcd60e51b815260206004820152604160248201527f52657761726473436f6f7264696e61746f722e5f76616c69646174655265776160448201527f7264735375626d697373696f6e3a20616d6f756e742063616e6e6f74206265206064820152600360fc1b608482015260a490fd5b6040516323b872dd60e01b60208201526001600160a01b039283166024820152929091166044830152606480830193909352918152610c96916137606084836121a1565b614a33565b1561376c57565b60405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063616c6c6572206973206e6f742076616c696420636c61696d6572000000006064820152608490fd5b903590601e1981360301821215610ee257018035906001600160401b03821161350157602001918160051b360383136134fc57565b91908110156122605760061b0190565b1561382357565b60405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063756d756c61746976654561726e696e6773206d75737420626520677420746064820152741a185b8818dd5b5d5b185d1a5d9950db185a5b5959605a1b608482015260a490fd5b906138bc6110b26110ad84612c18565b906138c78284613cea565b6138d36060840161253f565b936138fe6138f18660018060a01b03165f5260cc60205260405f2090565b546001600160a01b031690565b6001600160a01b03811615613a60575b90936001600160a01b0390911691613927338414613765565b6001600160a01b038616915f5b61394160a08301836137d7565b9050811015613a56578061396460019261395e60e08601866134c7565b9061380c565b86867f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce318c6139c26139a58260018060a01b03165f5260cd60205260405f2090565b6139ae8761253f565b60018060a01b03165f5260205260405f2090565b54613a076139fe6139e36020890135936139dd81861161381c565b84612223565b6001600160a01b039094165f90815260cd6020526040902090565b6139ae8861253f565b55613a1b818a613a168861253f565b614b05565b613a268c519561253f565b604080519687526001600160a01b0391909116602087015285015260a086901b869003881693606090a401613934565b5050505050509050565b508461390e565b604081015163ffffffff169081613a8757505061ffff60cb5460e01c1690565b61ffff914210613a9957602001511690565b511690565b60cb54907faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b36040805163ffffffff8560a01c16815263ffffffff84166020820152a163ffffffff60a01b1990911660a09190911b63ffffffff60a01b161760cb55565b15613b0857565b60405162461bcd60e51b815260206004820152603060248201525f80516020614f7483398151915260448201526f1c9bdbdd081a5cc8191a5cd8589b195960821b6064820152608490fd5b15613b5a57565b60405162461bcd60e51b815260206004820152603660248201525f80516020614f748339815191526044820152751c9bdbdd081b9bdd081858dd1a5d985d1959081e595d60521b6064820152608490fd5b15613bb257565b60405162461bcd60e51b815260206004820152604c60248201525f80516020614f7483398151915260448201527f746f6b656e496e646963657320616e6420746f6b656e50726f6f6673206c656e60648201526b0cee8d040dad2e6dac2e8c6d60a31b608482015260a490fd5b15613c2657565b60405162461bcd60e51b815260206004820152604a60248201525f80516020614f7483398151915260448201527f746f6b656e5472656550726f6f667320616e64206c6561766573206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a490fd5b903590601e1981360301821215610ee257018035906001600160401b038211613501576020019181360383136134fc57565b91908110156122605760051b0190565b90821015612260576109f29160051b810190613c91565b919091613d05613d006118846060860151151590565b613b01565b613d24613d1c611dad604086015163ffffffff1690565b421015613b53565b60a0810190613d3382826137d7565b9050613d5060c0830191613d4783856137d7565b91905014613bab565b613da0613d5d82846137d7565b969050613d7b60e0850197613d7289876134c7565b91905014613c1f565b51613d8860208501612c18565b613d956040860186613c91565b916060870193614bcb565b6080820135925f5b613db282856137d7565b9050811015613e0f5780613e098561395e8a613e0285613df981613df38c8f61366860019d8f613de790613ded94508d6137d7565b90613cc3565b986137d7565b90613cd3565b9490938c6134c7565b928a614cfb565b01613da8565b50505050509050565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b60cb546001600160a01b0391821691829082167f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb5f80a36001600160a01b0319161760cb55565b15613eae57565b60405162461bcd60e51b815260206004820152605460248201525f80516020614fb483398151915260448201527f61746f724469726563746564526577617264735375626d697373696f6e3a206e6064820152731bc81bdc195c985d1bdc9cc81c995dd85c99195960621b608482015260a490fd5b15613f2a57565b60405162461bcd60e51b815260206004820152605b60248201525f80516020614fb483398151915260448201525f80516020614f9483398151915260648201527f70657261746f722063616e6e6f74206265203020616464726573730000000000608482015260a490fd5b15613f9c57565b60405162461bcd60e51b815260206004820152607860248201525f80516020614fb483398151915260448201525f80516020614f9483398151915260648201527f70657261746f7273206d75737420626520696e20617363656e64696e67206f7260848201527f64657220746f2068616e646c65206475706c696361746573000000000000000060a482015260c490fd5b1561403457565b60405162461bcd60e51b815260206004820152606160248201525f80516020614fb483398151915260448201525f80516020614f9483398151915260648201527f70657261746f722072657761726420616d6f756e742063616e6e6f74206265206084820152600360fc1b60a482015260c490fd5b156140b057565b60405162461bcd60e51b815260206004820152607660248201525f80516020614fb483398151915260448201525f80516020614f9483398151915260648201527f70657261746f722d64697265637465642072657761726473207375626d697373608482015275696f6e206973206e6f7420726574726f61637469766560501b60a482015260c490fd5b9061414582806134c7565b909261416c606082019461415886612c18565b608084019461416686612c18565b926147be565b604081019061418761417e83836134c7565b90501515613ea7565b5f938493845b61419785856134c7565b905087101561421b576142136001916141f46141b78a61395e8a8a6134c7565b986141da6141d36141c78c61253f565b6001600160a01b031690565b1515613f23565b6141e66141c78b61253f565b90858060a01b031610613f95565b60206141ff8961253f565b9801359061420e82151561402d565b6129cd565b96019561418d565b95509150946123b59350614242925061423661423c91612c18565b91612c18565b90612ae4565b63ffffffff429116106140a9565b60cb54907fe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e6040805161ffff8560e01c16815261ffff84166020820152a161ffff60e01b1990911660e09190911b61ffff60e01b161760cb55565b610c969291815463ffffffff8160201c16804210156142f9575b5050815467ffffffffffff0000191660109190911b63ffff0000161760209290921b67ffffffff0000000016919091179055565b61431d575060cb54825461ffff191660e09190911c61ffff161782555b5f806142c5565b825461ffff191660109190911c61ffff16178255614316565b6001600160401b03811161218157601f01601f191660200190565b600a60206040516143636040826121a1565b828152016922b4b3b2b72630bcb2b960b11b81522060405160208101917f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866835260408201524660608201523060808201526080815261258c60a0826121a1565b156143ca57565b60405162461bcd60e51b815260206004820152604660248201525f80516020614fd483398151915260448201527f6f6e526577617264735375626d697373696f6e3a206e6f207374726174656769606482015265195cc81cd95d60d21b608482015260a490fd5b1561443857565b60405162461bcd60e51b815260206004820152605a60248201525f80516020614fd483398151915260448201527f6f6e526577617264735375626d697373696f6e3a206475726174696f6e20657860648201527f6365656473204d41585f524557415244535f4455524154494f4e000000000000608482015260a490fd5b9063ffffffff169081156144ce5763ffffffff160690565b634e487b7160e01b5f52601260045260245ffd5b156144e957565b60405162461bcd60e51b815260206004820152607060248201525f80516020614fd483398151915260448201527f6f6e526577617264735375626d697373696f6e3a206475726174696f6e206d7560648201527f73742062652061206d756c7469706c65206f662043414c43554c4154494f4e5f60848201526f494e54455256414c5f5345434f4e445360801b60a482015260c490fd5b1561458757565b60405162461bcd60e51b815260206004820152607660248201525f80516020614fd483398151915260448201527f6f6e526577617264735375626d697373696f6e3a20737461727454696d65737460648201527f616d70206d7573742062652061206d756c7469706c65206f662043414c43554c6084820152754154494f4e5f494e54455256414c5f5345434f4e445360501b60a482015260c490fd5b1561462b57565b60405162461bcd60e51b815260206004820152605760248201525f80516020614fd483398151915260448201527f6f6e526577617264735375626d697373696f6e3a20737461727454696d65737460648201527f616d7020746f6f2066617220696e207468652070617374000000000000000000608482015260a490fd5b156146b057565b60405162461bcd60e51b815260206004820152605060248201525f80516020614fd483398151915260448201527f6f6e526577617264735375626d697373696f6e3a20696e76616c69642073747260648201526f185d1959de4818dbdb9cda59195c995960821b608482015260a490fd5b1561472857565b60405162461bcd60e51b815260206004820152606f60248201525f80516020614fd483398151915260448201527f6f6e526577617264735375626d697373696f6e3a20737472617465676965732060648201527f6d75737420626520696e20617363656e64696e67206f7264657220746f20686160848201526e6e646c65206475706c69636174657360881b60a482015260c490fd5b9291614857614851611dad61489e94956147d98715156143c3565b61481163ffffffff7f00000000000000000000000000000000000000000000000000000000000000001663ffffffff83161115614431565b61484b63ffffffff6148447f000000000000000000000000000000000000000000000000000000000000000080946144b6565b16156144e2565b846144b6565b15614580565b63ffffffff614888817f00000000000000000000000000000000000000000000000000000000000000001642612223565b91168091111590816149a3575b50929192614624565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316915f90815b8183106148db575050505050565b6148ee6148e984848761380c565b61253f565b90853b156106d45760405163198f077960e21b81526001600160a01b03831660048201526020816024818a5afa9283156106cf57600193614957925f91614985575b50801561495f575b614941906146a9565b838060a01b03168092848060a01b031610614721565b9201916148cd565b5060a084901b849003811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014614938565b61499d915060203d81116107a75761079981836121a1565b5f614930565b905063ffffffff7f00000000000000000000000000000000000000000000000000000000000000001611155f614895565b156149db57565b60405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b60018060a01b03169060405190614a4b6040836121a1565b602082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020830152823b15614ac0575f81614a9b948260208195519301915af1614a95614ee9565b90614f18565b805180614aa6575050565b81602080614abb93610c969501019101612422565b6149d4565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b60405163a9059cbb60e01b60208201526001600160a01b039092166024830152604480830193909352918152610c96916137606064836121a1565b929192614b4c82614336565b91614b5a60405193846121a1565b829481845281830111614b76578281602093845f960137010152565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b9063ffffffff9094939294169260018360051c1b841015614c8457614c0394614bf6614bfe92612549565b933691614b40565b614e03565b15614c0a57565b60405162461bcd60e51b815260206004820152604660248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e657220636c61696d60648201526510383937b7b360d11b608482015260a490fd5b60405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e65724c656166496e6064820152620c8caf60eb1b608482015260a490fd5b9063ffffffff9094939294169260018360051c1b841015614d9857614d2694614bf6614bfe926131b8565b15614d2d57565b60405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e20636c61696d2070726f6f66006064820152608490fd5b60405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e4c656166496e646578000000006064820152608490fd5b93909291601f855116614e6a5791906020925b85518411614e615760018316614e47575f5282850151602052614e4060405f209260011c936129bf565b9291614e16565b838601515f52602052614e4060405f209260011c936129bf565b92509350501490565b60405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a490fd5b3d15614f13573d90614efa82614336565b91614f0860405193846121a1565b82523d5f602084013e565b606090565b90919015614f24575090565b815115614f345750805190602001fd5b604460209160405192839162461bcd60e51b83528160048401528051918291826024860152018484015e5f828201840152601f01601f19168101030190fdfe52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2061746f724469726563746564526577617264735375626d697373696f6e3a206f52657761726473436f6f7264696e61746f722e5f76616c69646174654f70657252657761726473436f6f7264696e61746f722e5f76616c6964617465436f6d6da26469706673582212202687d895e89c31be7e74a79f21e76d31f3d052cbc01c4950d791497f5adeb8ac64736f6c634300081a0033"; + "0x6101e0806040523461069257614bf78038038061001b816106df565b928339810190602081830312610642578051906001600160401b0382116105f25701610160818303126105a15760405161016081016001600160401b038111828210176104df5760405281516001600160a01b038116810361059d57815260208201516001600160a01b038116810361059d57602082019081526040830151926001600160a01b038416840361059d57604083019384526060810151916001600160a01b038316830361059d57606084019283526080820151946001600160a01b038616860361059d57608085019586526100f860a08401610704565b60a0860190815261010b60c08501610704565b9060c0870191825261011f60e08601610704565b9260e088019384526101346101008701610704565b94610100890195865261014a6101208801610704565b6101208a0190815261014088015190976001600160401b03821161054c57018b601f820112156104f35780516001600160401b0381116104df57610197601f8201601f19166020016106df565b9b818d5260208d019d6020838501011161048a5763ffffffff808f928f8f610140905f602089879b9a889b9a838a9c01905e85010152015260018060a01b039051169d60018060a01b039051169560018060a01b039051169660018060a01b039051169751169751169751169751169751169760018060a01b03905116801561047b5760805283156104675763ffffffff848906166104585763ffffffff620151808506166104495760a05260c05260e05261010052610120526101405261016052610180526101a052601f81511161040d57519051602082106103fd575b176101c0525f5460ff8160081c166103a85760ff8082160361036e575b6040516144e190816107168239608051818181610af501528181611225015281816114cb015261232b015260a051818181611cae0152611d47015260c051818181610da00152613ff9015260e0518181816107c201528181611a5901528181611dca01526120d80152610100518181816117030152613f700152610120518181816119d20152613f3b015261014051818181610d670152613fbb01526101605181818161056a015261370c015261018051818181610ab6015261410001526101a05181818161106c015261329601526101c0518161117d0152f35b60ff90811916175f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a180610293565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b5f198260200360031b1b16610276565b60449060405192839163305a27a960e01b8352602060048401525180918160248501528484015e5f828201840152601f01601f19168101030190fd5b63223c7b3960e11b5f5260045ffd5b630e06bd3160e01b5f5260045ffd5b634e487b7160e01b5f52601260045260245ffd5b6339b190bb60e11b5f5260045ffd5b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b5f80fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b6040519190601f01601f191682016001600160401b038111838210176104df57604052565b519063ffffffff8216820361059d5756fe6080604052600436106125f4575f3560e01c806218572c146103fa57806304a0c502146103f55780630ca29899146103f05780630e9a53cf146103eb5780630eb38345146103e6578063131433b4146103e1578063136439dd146103dc578063149bc872146103d75780632b9f64a4146103d257806336af41fa146103cd57806337838ed0146103c857806339b70e38146103c35780633a8c0786146103be5780633ccc861d146103b95780633efe1db6146103b45780634596021c146103af5780634657e26a146103aa5780634b943960146103a55780634d18cc35146103a057806354fd4d501461039b57806358baaa3e14610396578063595c6a67146103915780635ac86ab71461038c5780635c975abb146103875780635e9d83481461038257806363f6a7981461037d5780636d21117e14610378578063715018a6146103735780637b8f8b051461036e578063863cb9a914610369578063865c695314610364578063886f11951461035f5780638da5cb5b1461035a5780639104c319146103555780639be3d4e4146103505780639cb9a5fa1461034b5780639d45c281146103465780639de4b35f14610341578063a0169ddd1461033c578063a50a1d9c14610337578063aebd8bae14610332578063b3dbb0e01461032d578063bb7e451f14610328578063bf21a8aa14610323578063c46db6061461031e578063ca8aa7c714610319578063dcbb03b314610314578063de02e5031461030f578063e063f81f1461030a578063e810ce2114610305578063ea4d3c9b14610300578063ed71e6a2146102fb578063f22cef85146102f6578063f2f07ab4146102f1578063f2fde38b146102ec578063f6efbb59146102e7578063f74e8eac146102e2578063f8cd8448146102dd578063f96abf2e146102d8578063fabc1cbc146102d3578063fbf1e2c1146102ce578063fce36c7d146102c95763ff9f6cce036125f4576124f0565b612404565b6123dc565b612310565b612236565b612212565b61208a565b611f72565b611ee1565b611e93565b611d2b565b611cdd565b611c99565b611c6d565b611c20565b611bcd565b611a88565b611a44565b6119f6565b6119b6565b61197b565b61187d565b61182f565b6117ff565b611795565b611727565b6116e7565b61158b565b611550565b611522565b6114fa565b6114b6565b611457565b61142a565b61140d565b6113b2565b611364565b611340565b6112e0565b6112c3565b611290565b611213565b6111e6565b61116b565b61111b565b61109b565b611057565b610fc5565b610e84565b610e04565b610dcf565b610d8b565b610d4b565b610c29565b610bb8565b610b8c565b610ada565b610a9a565b610a07565b61099f565b61074a565b61054e565b610504565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b6001600160a01b0381160361050057565b5f80fd5b3461054957602036600319011261054457600435610521816104ef565b60018060a01b03165f5260d1602052602060ff60405f2054166040519015158152f35b61044f565b6103ff565b34610549575f36600319011261054457602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a207374727563742063616c6c6461746120746f6044820152661bc81cda1bdc9d60ca1b6064820152608490fd5b60409060031901126105f457600490565b61058e565b60409060231901126105f457602490565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b9181601f840112156106f1578235916001600160401b038311610698576020808501948460051b01011161069357565b61060a565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b3461054957606036600319011261054457610764366105e3565b6044356001600160401b03811161099a57610783903690600401610663565b919061079d61079761020080606654161490565b15612657565b6107b86107b383356107ae816104ef565b613294565b612677565b6107c0613339565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561099557602060405180926304c1b8eb60e31b825281806108118860048301612795565b03915afa80156109905761082c915f91610961575b506127b0565b5f5b8381106108415761083f6001609755565b005b8061095b61085260019387866128a9565b61087761085e8761266d565b6001600160a01b03165f90815260ce6020526040902090565b54906108828761266d565b6040516108a7816108998587602084019687612b88565b03601f19810183528261272f565b519020877ffff0759ccb371dfb5691798724e70b4fa61cb3bfe730a33ac19fb86a48efc756836108d681613462565b9561091d610910866109036108ea8861266d565b6001600160a01b03165f90815260d76020526040902090565b905f5260205260405f2090565b805460ff19166001179055565b61092681612bc0565b61093261085e8661266d565b55610944604051928392339684612be9565b0390a33090610956602033920161266d565b613597565b0161082e565b610983915060203d602011610989575b61097b818361272f565b810190612750565b5f610826565b503d610971565b6127a5565b61268d565b61049f565b34610549575f366003190112610544576109f96109ba612cdc565b6040519182918291909160608060808301948051845263ffffffff602082015116602085015263ffffffff604082015116604085015201511515910152565b0390f35b8015150361050057565b3461054957604036600319011261054457600435610a24816104ef565b60243590610a31826109fd565b610a396135e0565b60018060a01b0316805f5260d160205260ff60405f205416151582151590827f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c5f80a45f5260d160205260405f209060ff8019835416911515161790555f80f35b34610549575f36600319011261054457602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610549576020366003190112610544576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600435813b156109955760206024926040519384809263237dfb4760e11b82523360048301525afa9182156109905761083f92610b59915f91610b6d575b50612d73565b610b6860665482811614612d89565b61366c565b610b86915060203d6020116109895761097b818361272f565b5f610b53565b34610549576040366003190112610544576020610bb0610bab366105e3565b612d9f565b604051908152f35b3461054957602036600319011261054457600435610bd5816104ef565b60018060a01b03165f5260cc602052602060018060a01b0360405f205416604051908152f35b602060031982011261054457600435906001600160401b03821161099a57610c2591600401610663565b9091565b3461054957610c3736610bfb565b90610c49610797600280606654161490565b335f5260d1602052610c6160ff60405f205416612de8565b610c69613339565b5f5b828110610c7c5761083f6001609755565b80610d45610c8d6001938686612dfe565b335f90815260ce60205260409020546040516020810190610cb48161089986863387612e92565b51902090610cc18361369e565b335f90815260d060205260409020610cde90610910908490610903565b610ce781612bc0565b335f90815260ce60205260409020556040517f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf270482339180610d278782612eb6565b0390a46040610d386020830161266d565b9101359030903390613597565b01610c6b565b34610549575f36600319011261054457602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610549575f366003190112610544576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610549575f36600319011261054457602063ffffffff60cb5460a01c16604051908152f35b90816101009103126105f45790565b34610549576040366003190112610544576004356001600160401b03811161099a57610e37610e62913690600401610df5565b60243590610e44826104ef565b610e55610797600480606654161490565b610e5d613339565b61379d565b6001609755005b63ffffffff81160361050057565b3590610e8282610e69565b565b3461054957604036600319011261054457602435600435610ea482610e69565b610eb5610797600880606654161490565b60cb5491610ecd336001600160a01b03851614612de8565b63ffffffff81169263ffffffff8160c01c16841115610fb65763ffffffff7fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd0891610f18428710612ec7565b610f9c610f45610f3d610f3060ca5463ffffffff1690565b9360a01c63ffffffff1690565b844216612edd565b94610f77610f51612c0c565b88815263ffffffff8316602082015263ffffffff881660408201525f6060820152612ef7565b60cb805463ffffffff60c01b191660c09290921b63ffffffff60c01b16919091179055565b60405163ffffffff9094168452169180602081015b0390a4005b631ca7e50b60e21b5f5260045ffd5b34610549576040366003190112610544576004356001600160401b03811161099a57610ff5903690600401610663565b60243591611002836104ef565b611013610797600480606654161490565b61101b613339565b3681900360fe1901925f5b83811015610e62578060051b83013590858212156110525761104c83600193860161379d565b01611026565b6127da565b34610549575f366003190112610544576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610549576020366003190112610544576004356110b8816104ef565b60018060a01b03165f5260d56020526109f961110660405f2063ffffffff604051916110e3836126f4565b5461ffff8116835261ffff8160101c16602084015260201c166040820152613952565b60405161ffff90911681529081906020820190565b34610549575f36600319011261054457602063ffffffff60cb5460c01c16604051908152f35b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b34610549575f366003190112610544577f000000000000000000000000000000000000000000000000000000000000000060ff8116601f81116111d7576109f991604051916111bb60408461272f565b6020808452838101919036833783525260405191829182611141565b632cd44ac360e21b5f5260045ffd5b346105495760203660031901126105445761083f60043561120681610e69565b61120e6135e0565b6139dc565b34610549575f366003190112610544577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156109955760206024916040519283809263237dfb4760e11b82523360048301525afa801561099057611288915f91610b6d5750612d73565b61083f613638565b346105495760203660031901126105445760043560ff81168091036105005760016020911b806066541614604051908152f35b34610549575f366003190112610544576020606654604051908152f35b34610549576020366003190112610544576004356001600160401b03811161099a57611313611335913690600401610df5565b61132f611329823561132481610e69565b612c66565b50612c9b565b90613ac4565b602060405160018152f35b34610549575f36600319011261054457602061ffff60cb5460e01c16604051908152f35b3461054957604036600319011261054457600435611381816104ef565b6024359060018060a01b03165f5260cf60205260405f20905f52602052602060ff60405f2054166040519015158152f35b34610549575f366003190112610544576113ca6135e0565b603380546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b34610549575f36600319011261054457602060ca54604051908152f35b346105495760203660031901126105445761083f60043561144a816104ef565b6114526135e0565b613c31565b346105495760403660031901126105445760206114ad600435611479816104ef565b60243590611486826104ef565b60018060a01b03165f5260cd835260405f209060018060a01b03165f5260205260405f2090565b54604051908152f35b34610549575f366003190112610544576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610549575f366003190112610544576033546040516001600160a01b039091168152602090f35b34610549575f36600319011261054457602060405173beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08152f35b34610549575f36600319011261054457611568612c1b565b5060ca545f198101908111611586576109ba6113296109f992612c66565b612bac565b34610549576040366003190112610544576004356115a8816104ef565b6024356001600160401b03811161099a576115c7903690600401610663565b91906115da610797602080606654161490565b6115e66107b383613294565b6115ee613339565b6001600160a01b038216915f5b84811061160c5761083f6001609755565b806116e161161d60019388876128a9565b6001600160a01b0385165f90815260ce602052604090205490604051602081019061164e8161089985878c87612b88565b5190208861165b83613462565b9361167d610910846109038c60018060a01b03165f5260d360205260405f2090565b61168681612bc0565b6001600160a01b038a165f90815260ce60205260409020557ffc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0604051806116cf87339583612fe7565b0390a43090610956602033920161266d565b016115fb565b34610549575f36600319011261054457602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461054957606036600319011261054457600435611744816104ef565b61174d366105f9565b9060018060a01b03165f5260d660205261177461176f60405f20923690612ffe565b613c78565b5f526020526109f961110660405f2063ffffffff604051916110e3836126f4565b346105495760203660031901126105445761083f6004356117b5816104ef565b33613cd7565b6024359061ffff8216820361050057565b6044359061ffff8216820361050057565b6084359061ffff8216820361050057565b6064359061ffff8216820361050057565b346105495760203660031901126105445760043561ffff811681036105005761083f9061182a6135e0565b613d2f565b346105495760403660031901126105445760043561184c816104ef565b6024359060018060a01b03165f5260d260205260405f20905f52602052602060ff60405f2054166040519015158152f35b346105495760403660031901126105445760043561189a816104ef565b6118a26117bb565b6118b3610797608080606654161490565b6118bf6107b383613294565b7fd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f746118fb63ffffffff60cb5460a01c1663ffffffff4216612edd565b9160018060a01b03841693845f5260d560205261194f848361194a61192f60405f2063ffffffff604051916110e3836126f4565b6001600160a01b039095165f90815260d56020526040902090565b613d8a565b6040805163ffffffff909516855261ffff9182166020860152911690830152339180606081015b0390a3005b3461054957602036600319011261054457600435611998816104ef565b60018060a01b03165f5260ce602052602060405f2054604051908152f35b34610549575f36600319011261054457602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461054957604036600319011261054457600435611a13816104ef565b6024359060018060a01b03165f5260d060205260405f20905f52602052602060ff60405f2054166040519015158152f35b34610549575f366003190112610544576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461054957606036600319011261054457600435611aa5816104ef565b602435611ab1816104ef565b611ab96117cc565b611aca610797604080606654161490565b611ad66107b384613294565b7f48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934611b1263ffffffff60cb5460a01c1663ffffffff4216612edd565b9160018060a01b03851693845f5260d4602052611b93848361194a84611b7e611b63611b518360405f209060018060a01b03165f5260205260405f2090565b63ffffffff604051916110e3836126f4565b6001600160a01b03909c165f90815260d46020526040902090565b9060018060a01b03165f5260205260405f2090565b6040805163ffffffff95909516855261ffff968716602086015291909516908301526001600160a01b039093169233918060608101610fb1565b34610549576020366003190112610544576109f96109ba611329600435611bf2612c1b565b50612c66565b604090600319011261054457600435611c10816104ef565b90602435611c1d816104ef565b90565b3461054957611c5d611b51611c3436611bf8565b9060018060a01b03165f5260d460205260405f209060018060a01b03165f5260205260405f2090565b60405161ffff9091168152602090f35b34610549576020366003190112610544576020611c8b6004356130b1565b63ffffffff60405191168152f35b34610549575f366003190112610544576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461054957604036600319011261054457600435611cfa816104ef565b6024359060018060a01b03165f5260d360205260405f20905f52602052602060ff60405f2054166040519015158152f35b3461054957611d3936611bf8565b611d456107b383613294565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610995576040516336b87bd760e11b81526001600160a01b038416600482015290602090829060249082905afa908115610990575f91611e74575b508015611dc7575b91611dc261083f93613116565b613cd7565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691823b156109955760405163ba1a84e560e01b81526001600160a01b038216600482015292602090849060249082905afa9283156109905761083f93611dc2915f91611e45575b50151591935050611db5565b611e67915060203d602011611e6d575b611e5f818361272f565b810190613107565b5f611e39565b503d611e55565b611e8d915060203d6020116109895761097b818361272f565b5f611dad565b3461054957604036600319011261054457600435611eb0816104ef565b6024359060018060a01b03165f5260d760205260405f20905f52602052602060ff60405f2054166040519015158152f35b3461054957602036600319011261054457600435611efe816104ef565b611f066135e0565b6001600160a01b03811615611f1e5761083f90613be9565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346105495760a036600319011261054457600435611f8f816104ef565b612002602435604435611fa1816104ef565b60643590611fae82610e69565b611fb66117dd565b925f5495611fe8611fd2611fce8960ff9060081c1690565b1590565b8098819961207c575b811561205c575b5061312c565b86611ff9600160ff195f5416175f55565b6120455761318f565b61200857005b61201661ff00195f54165f55565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1005b61205761010061ff00195f5416175f55565b61318f565b303b1591508161206e575b505f611fe2565b60ff1660011490505f612067565b600160ff8216109150611fdb565b34610549576080366003190112610544576004356120a7816104ef565b6120b0366105f9565b6120b86117ee565b6120ca61079761010080606654161490565b6120d66107b384613294565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561099557602060405180936304c1b8eb60e31b825281806121288860048301612795565b03915afa918215610990577f14918b3834ab6752eb2e1b489b6663a67810efb5f56f3944a97ede8ecf1fd9f192612165915f9161096157506127b0565b60cb546121819060a01c63ffffffff1663ffffffff4216612edd565b936119766121cb6121c66121c16121a88560018060a01b03165f5260d660205260405f2090565b6121b561176f368b612ffe565b5f5260205260405f2090565b612fa9565b613952565b926121fb878261194a6121ee8760018060a01b03165f5260d660205260405f2090565b6121b561176f368d612ffe565b60405193849360018060a01b0316973397856131ad565b34610549576040366003190112610544576020610bb0612231366105e3565b6131de565b346105495760203660031901126105445760043561225381610e69565b612264610797600880606654161490565b61227960018060a01b0360cb54163314612de8565b60ca549063ffffffff81169182101561230157612297600191612c66565b500163ffffffff81546122b060ff8260401c1615613225565b60201c164210156122f257805460ff60401b1916600160401b1790557fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e5f80a2005b630c36f66560e21b5f5260045ffd5b6394a8d38960e01b5f5260045ffd5b34610549576020366003190112610544576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600435813b156109955760206004926040519384809263755b36bd60e11b82525afa918215610990575f92612399575b5061083f91612394906001600160a01b0316331461323b565b613251565b91506020823d6020116123d4575b816123b46020938361272f565b810103126105445761239461083f92516123cd816104ef565b925061237b565b3d91506123a7565b34610549575f3660031901126105445760cb546040516001600160a01b039091168152602090f35b346105495761241236610bfb565b90612424610797600180606654161490565b61242c613339565b5f5b82811061243f5761083f6001609755565b806124ea6124506001938686612dfe565b335f90815260ce602052604090205460405160208101906124778161089986863387612e92565b519020906124848361369e565b335f90815260cf602052604090206124a190610910908490610903565b6124aa81612bc0565b335f90815260ce60205260409020556040517f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e6281339180610d278782612eb6565b0161242e565b34610549576124fe36610bfb565b90612510610797601080606654161490565b335f5260d160205261252860ff60405f205416612de8565b612530613339565b5f5b8281106125435761083f6001609755565b806125ee6125546001938686612dfe565b335f90815260ce6020526040902054604051602081019061257b8161089986863387612e92565b519020906125888361369e565b335f90815260d2602052604090206125a590610910908490610903565b6125ae81612bc0565b335f90815260ce60205260409020556040517f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b339180610d278782612eb6565b01612532565b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b1561265e57565b63840a48d560e01b5f5260045ffd5b35611c1d816104ef565b1561267e57565b63932d94f760e01b5f5260045ffd5b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b0382111761270f57604052565b6126e0565b608081019081106001600160401b0382111761270f57604052565b90601f801991011681019081106001600160401b0382111761270f57604052565b908160209103126105445751611c1d816109fd565b63ffffffff602080928035612779816104ef565b6001600160a01b03168552013561278f81610e69565b16910152565b604081019291610e829190612765565b6040513d5f823e3d90fd5b156127b757565b631fb1705560e21b5f5260045ffd5b634e487b7160e01b5f52603260045260245ffd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206f6666736574000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206c656e677468000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527f43616c6c64617461207461696c20746f6f2073686f72740000000000000000006044820152606490fd5b91908110156128cb5760051b8101359060be1981360301821215611052570190565b6127c6565b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206c656e67746800006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c64617461206163636573732073747269646500006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206f666673657400006044820152606490fd5b9035601e19823603018112156129dd5701602081359101916001600160401b0382116129d8578160061b360383136129d357565b612915565b6128d0565b61295a565b916020908281520191905f905b8082106129fc5750505090565b9091928335612a0a816104ef565b6001600160a01b0316815260208401356001600160601b0381169190829003610500576040816001936020839401520194019201906129ef565b9035601e19823603018112156129dd5701602081359101916001600160401b0382116129d85781360383136129d357565b908060209392818452848401375f828201840152601f01601f1916010190565b9190612ab2612aa4848061299f565b60c0845260c08401916129e2565b906020840135612ac1816104ef565b6001600160a01b0316602082810191909152612ae0604086018661299f565b838503604085015280855293909101925f5b818110612b5457505050612b4684612b20612b136060611c1d979801610e77565b63ffffffff166060850152565b612b3c612b2f60808301610e77565b63ffffffff166080850152565b60a0810190612a44565b9160a0818503910152612a75565b9091936040806001928735612b68816104ef565b848060a01b03168152602088013560208201520195019101919091612af2565b611c1d939260609260018060a01b0316825260208201528160408201520190612a95565b634e487b7160e01b5f52601160045260245ffd5b906001820180921161158657565b906020820180921161158657565b9190820180921161158657565b611c1d9392612bfa82608094612765565b60408201528160608201520190612a95565b60405190610e8260808361272f565b60405190612c2882612714565b5f6060838281528260208201528260408201520152565b8015611586575f190190565b5f1981019190821161158657565b9190820391821161158657565b60ca548110156128cb5760ca5f5260205f209060011b01905f90565b80548210156128cb575f5260205f209060011b01905f90565b90604051612ca881612714565b606060ff6001839580548552015463ffffffff8116602085015263ffffffff8160201c16604085015260401c161515910152565b612ce4612c1b565b5060ca54805b612d0f5750612cf7612c0c565b5f81525f60208201525f60408201525f606082015290565b612d1e61132961132483612c4b565b90612d2f611fce6060840151151590565b80612d4d575b612d4957612d439150612c3f565b80612cea565b5090565b50612d6b612d62604084015163ffffffff1690565b63ffffffff1690565b421015612d35565b15612d7a57565b631d77d47760e21b5f5260045ffd5b15612d9057565b63c61dca5d60e01b5f5260045ffd5b6020813591612dad836104ef565b01356040519060208201925f84526001600160601b03199060601b166021830152603582015260358152612de260558261272f565b51902090565b15612def57565b635c427cd960e01b5f5260045ffd5b91908110156128cb5760051b81013590609e1981360301821215611052570190565b90608063ffffffff81612e44612e36868061299f565b60a0875260a08701916129e2565b946020810135612e53816104ef565b6001600160a01b0316602086015260408181013590860152826060820135612e7a81610e69565b1660608601520135612e8b81610e69565b1691015290565b611c1d939260609260018060a01b0316825260208201528160408201520190612e20565b906020611c1d928181520190612e20565b15612ece57565b6306957c9160e11b5f5260045ffd5b9063ffffffff8091169116019063ffffffff821161158657565b60ca54600160401b81101561270f57806001612f18920160ca5560ca612c82565b919091612f965760606001610e829383518155019163ffffffff60208201511663ffffffff19845416178355612f7563ffffffff604083015116849067ffffffff0000000082549160201b169067ffffffff000000001916179055565b0151815460ff60401b191690151560401b68ff000000000000000016179055565b634e487b7160e01b5f525f60045260245ffd5b90604051612fb6816126f4565b604063ffffffff82945461ffff8116845261ffff8160101c16602085015260201c16910152565b35611c1d81610e69565b604090611c1d939281528160208201520190612a95565b919082604091031261304857604051604081018181106001600160401b0382111761270f5760405260208082948035613036816104ef565b845201359161304483610e69565b0152565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b63ffffffff5f199116019063ffffffff821161158657565b63ffffffff60ca54165b63ffffffff81166130d55763504570e360e01b5f5260045ffd5b816130e261132483613099565b5054146130fd5763ffffffff168015611586575f19016130bb565b611c1d9150613099565b90816020910312610544575190565b1561311d57565b63fb494ea160e01b5f5260045ffd5b1561313357565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b61182a9261145261120e926131a8610e8298979561366c565b613be9565b929361ffff8092969563ffffffff6080956131cc8860a081019b612765565b16604087015216606085015216910152565b60208135916131ec836104ef565b0135604051906020820192600160f81b84526001600160601b03199060601b166021830152603582015260358152612de260558261272f565b1561322c57565b631b14174b60e01b5f5260045ffd5b1561324257565b63794821ff60e01b5f5260045ffd5b613262606654198219811614612d89565b806066556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561099557604051631beb2b9760e31b81526001600160a01b0390911660048201523360248201523060448201525f80356001600160e01b03191660648301529091602091839160849183915af1908115610990575f91613320575090565b611c1d915060203d6020116109895761097b818361272f565b60026097541461334a576002609755565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b903590601e198136030182121561105257018035906001600160401b0382116133c957602001918160061b360383136133c457565b612864565b61281f565b156133d557565b63796cc52560e01b5f5260045ffd5b156133eb57565b63150358a160e21b5f5260045ffd5b91908110156128cb5760061b0190565b1561341157565b630863a45360e11b5f5260045ffd5b1561342757565b6310fb47f160e31b5f5260045ffd5b1561343d57565b6310eb483f60e21b5f5260045ffd5b1561345357565b63070b5a6f60e21b5f5260045ffd5b906134cd916134db613474828061338f565b60608401959161349b9061348788612fdd565b608087019361349585612fdd565b92613f0c565b6134c76134c160408601976134bc6134b38a8961338f565b905015156133ce565b612fdd565b91612fdd565b90612edd565b63ffffffff429116106133e4565b5f928391825b6134eb838361338f565b90508410156135765761356d60019161354e6135118761350b888861338f565b906133fa565b9161353461352d6135218561266d565b6001600160a01b031690565b151561340a565b6135406135218461266d565b90858060a01b031610613420565b613567602082013591613562831515613436565b61266d565b97612bdc565b930192946134e1565b5050505090611c1d6f4b3b4ca85a86c47a098a223fffffffff82111561344c565b6040516323b872dd60e01b60208201526001600160a01b039283166024820152929091166044830152606480830193909352918152610e82916135db60848361272f565b614187565b6033546001600160a01b031633036135f457565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b5f196066556040515f1981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2565b806066556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2565b6136fc6f4b3b4ca85a86c47a098a223fffffffff60406136e8936136c2818061338f565b9590606083013580976136d482610e69565b6080850135926136e384610e69565b613f0c565b01356136f5811515613436565b111561344c565b61370581610e69565b63ffffffff7f0000000000000000000000000000000000000000000000000000000000000000164201908142116115865763ffffffff161161374357565b637ee2b44360e01b5f5260045ffd5b903590601e198136030182121561105257018035906001600160401b0382116133c957602001918160051b360383136133c457565b1561378e57565b63aa385e8160e01b5f5260045ffd5b906137ad61132961132484612fdd565b906137b88284613ac4565b6137c46060840161266d565b936137ef6137e28660018060a01b03165f5260cc60205260405f2090565b546001600160a01b031690565b6001600160a01b0381161561394b575b90936001600160a01b0390911691613818338414612de8565b6001600160a01b038616915f5b61383260a0830183613752565b9050811015613941578061384f60019261350b60e086018661338f565b86867f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce318c6138ad6138908260018060a01b03165f5260cd60205260405f2090565b6138998761266d565b60018060a01b03165f5260205260405f2090565b546138f26138e96138ce6020890135936138c8818611613787565b84612c59565b6001600160a01b039094165f90815260cd6020526040902090565b6138998861266d565b55613906818a6139018861266d565b61423f565b6139118c519561266d565b604080519687526001600160a01b0391909116602087015285015260a086901b869003881693606090a401613825565b5050505050509050565b50846137ff565b604081015163ffffffff1680158015613999575b1561397a57505060cb5460e01c61ffff1690565b63ffffffff164210613991576020015161ffff1690565b5161ffff1690565b5061ffff806139aa845161ffff1690565b16148015613966575063ffffffff81164210613966565b6001600160401b03811161270f57601f01601f191660200190565b60cb54907faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b36040805163ffffffff8560a01c16815263ffffffff84166020820152a163ffffffff60a01b1990911660a09190911b63ffffffff60a01b161760cb55565b15613a4657565b631437a2bb60e31b5f5260045ffd5b15613a5c57565b6343714afd60e01b5f5260045ffd5b903590601e198136030182121561105257018035906001600160401b0382116133c9576020019181360383136133c457565b91908110156128cb5760051b0190565b908210156128cb57610c259160051b810190613a6b565b919091613adf613ada611fce6060860151151590565b613225565b613afe613af6612d62604086015163ffffffff1690565b421015613a3f565b60a0810190613b0d8282613752565b9050613b2a60c0830191613b218385613752565b91905014613a55565b613b71613b378284613752565b969050613b4c60e0850197613b21898761338f565b51613b5960208501612fdd565b613b666040860186613a6b565b91606087019361431b565b6080820135925f5b613b838285613752565b9050811015613be05780613bda8561350b8a613bd385613bca81613bc48c8f6134bc60019d8f613bb890613bbe94508d613752565b90613a9d565b98613752565b90613aad565b9490938c61338f565b928a614366565b01613b79565b50505050509050565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b60cb546001600160a01b0391821691829082167f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb5f80a36001600160a01b0319161760cb55565b602081519101516040519060208201926001600160601b03199060601b16835263ffffffff60a01b9060a01b16603482015260208152613cb960408261272f565b5190519060208110613cc9575090565b5f199060200360031b1b1690565b6001600160a01b039081165f81815260cc6020526040812080546001600160a01b03198116958516958617909155909216917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca3129080a4565b60cb54907fe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e6040805161ffff8560e01c16815261ffff84166020820152a161ffff60e01b1990911660e09190911b61ffff60e01b161760cb55565b91909161271061ffff841611613e3757805463ffffffff8160201c16421115613e2857610e8293613ded91602081901c63ffffffff16613e0f5750825461ffff191661ffff1783555b825463ffff0000191660109190911b63ffff000016178255565b9067ffffffff0000000082549160201b169067ffffffff000000001916179055565b835461ffff191660109190911c61ffff16178355613dd3565b637b1e25c560e01b5f5260045ffd5b63891c63df60e01b5f5260045ffd5b15613e4d57565b630dd0b9f560e21b5f5260045ffd5b9063ffffffff16908115613e745763ffffffff160690565b634e487b7160e01b5f52601260045260245ffd5b15613e8f57565b63ee66470560e01b5f5260045ffd5b15613ea557565b63cb3f434d60e01b5f5260045ffd5b15613ebb57565b633c1a94f160e21b5f5260045ffd5b15613ed157565b63041aa75760e11b5f5260045ffd5b15613ee757565b632efd965160e11b5f5260045ffd5b15613efd57565b63dfad9ca160e01b5f5260045ffd5b9291613fb0613faa612d62613ff79495613f278715156133ce565b613fa463ffffffff8216613f6363ffffffff7f000000000000000000000000000000000000000000000000000000000000000016821115613e46565b613f9d63ffffffff613f967f00000000000000000000000000000000000000000000000000000000000000008096613e5c565b1615613e88565b1515613e9e565b84613e5c565b15613eb4565b63ffffffff613fe1817f00000000000000000000000000000000000000000000000000000000000000001642612c59565b91168091111590816140f7575b50929192613eca565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316915f90815b818310614034575050505050565b6140426135628484876133fa565b90853b156109955760405163198f077960e21b81526001600160a01b03831660048201526020816024818a5afa928315610990576001936140ab925f916140d9575b5080156140b3575b61409590613ee0565b838060a01b03168092848060a01b031610613ef6565b920191614026565b5060a084901b849003811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01461408c565b6140f1915060203d81116109895761097b818361272f565b5f614084565b905063ffffffff7f00000000000000000000000000000000000000000000000000000000000000001611155f613fee565b1561412f57565b60405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b610e82916142099160018060a01b03165f80604051936141a860408661272f565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564602086015260208151910182855af13d15614237573d916141ed836139c1565b926141fb604051948561272f565b83523d5f602085013e614416565b805190811591821561421d575b5050614128565b6142309250602080918301019101612750565b5f80614216565b606091614416565b60405163a9059cbb60e01b60208201526001600160a01b039092166024830152604480830193909352918152610e82916135db60648361272f565b929192614286826139c1565b91614294604051938461272f565b8294818452818301116142b0578281602093845f960137010152565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b1561430c57565b6369ca16c960e01b5f5260045ffd5b91929063ffffffff169160018260051c1b8310156143585761434e61435394614346610e8297612d9f565b93369161427a565b6143a0565b614305565b62c6c39d60e71b5f5260045ffd5b91929063ffffffff169160018260051c1b8310156143915761434e61435394614346610e82976131de565b63054ff4df60e51b5f5260045ffd5b93909291601f8551166144075791906020925b855184116143fe57600183166143e4575f52828501516020526143dd60405f209260011c93612bce565b92916143b3565b838601515f526020526143dd60405f209260011c93612bce565b92509350501490565b6313717da960e21b5f5260045ffd5b91929015614478575081511561442a575090565b3b156144335790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b82519091501561448b5750805190602001fd5b60405162461bcd60e51b81529081906144a79060048301611141565b0390fdfea264697066735822122015d9847d6b18277ac3f2990e6431e5c53b08c56884c971148a4a2b902caf978a64736f6c634300081c0033"; type RewardsCoordinatorConstructorParams = | [signer?: Signer] @@ -2114,46 +2718,16 @@ export class RewardsCoordinator__factory extends ContractFactory { } override deploy( - _delegationManager: string, - _strategyManager: string, - _CALCULATION_INTERVAL_SECONDS: BigNumberish, - _MAX_REWARDS_DURATION: BigNumberish, - _MAX_RETROACTIVE_LENGTH: BigNumberish, - _MAX_FUTURE_LENGTH: BigNumberish, - __GENESIS_REWARDS_TIMESTAMP: BigNumberish, + params: IRewardsCoordinatorTypes.RewardsCoordinatorConstructorParamsStruct, overrides?: Overrides & { from?: string } ): Promise { - return super.deploy( - _delegationManager, - _strategyManager, - _CALCULATION_INTERVAL_SECONDS, - _MAX_REWARDS_DURATION, - _MAX_RETROACTIVE_LENGTH, - _MAX_FUTURE_LENGTH, - __GENESIS_REWARDS_TIMESTAMP, - overrides || {} - ) as Promise; + return super.deploy(params, overrides || {}) as Promise; } override getDeployTransaction( - _delegationManager: string, - _strategyManager: string, - _CALCULATION_INTERVAL_SECONDS: BigNumberish, - _MAX_REWARDS_DURATION: BigNumberish, - _MAX_RETROACTIVE_LENGTH: BigNumberish, - _MAX_FUTURE_LENGTH: BigNumberish, - __GENESIS_REWARDS_TIMESTAMP: BigNumberish, + params: IRewardsCoordinatorTypes.RewardsCoordinatorConstructorParamsStruct, overrides?: Overrides & { from?: string } ): TransactionRequest { - return super.getDeployTransaction( - _delegationManager, - _strategyManager, - _CALCULATION_INTERVAL_SECONDS, - _MAX_REWARDS_DURATION, - _MAX_RETROACTIVE_LENGTH, - _MAX_FUTURE_LENGTH, - __GENESIS_REWARDS_TIMESTAMP, - overrides || {} - ); + return super.getDeployTransaction(params, overrides || {}); } override attach(address: string): RewardsCoordinator { return super.attach(address) as RewardsCoordinator; diff --git a/src/avs/contracts/factories/SocketRegistry__factory.ts b/src/avs/contracts/factories/SocketRegistry__factory.ts new file mode 100644 index 00000000..3df716fa --- /dev/null +++ b/src/avs/contracts/factories/SocketRegistry__factory.ts @@ -0,0 +1,155 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { + SocketRegistry, + SocketRegistryInterface, +} from "../SocketRegistry"; + +const _abi = [ + { + type: "constructor", + inputs: [ + { + name: "_slashingRegistryCoordinator", + type: "address", + internalType: "contract ISlashingRegistryCoordinator", + }, + ], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "getOperatorSocket", + inputs: [ + { + name: "_operatorId", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "operatorIdToSocket", + inputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "setOperatorSocket", + inputs: [ + { + name: "_operatorId", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "_socket", + type: "string", + internalType: "string", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "slashingRegistryCoordinator", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "error", + name: "OnlySlashingRegistryCoordinator", + inputs: [], + }, +] as const; + +const _bytecode = + "0x60a080604052346100e257604051601f61075438819003918201601f19168301916001600160401b038311848410176100ce5780849260209460405283398101031261007e57516001600160a01b0381169081900361007a576080526040516106249081610130823960805181818161011d01526103990152f35b5f80fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fdfe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b5f3560e01c806310bea0d714610401578063af65fdfc146103c8578063cf1d6b42146103845763f043367e0361000e573461037f57604036600319011261037a5760243567ffffffffffffffff811161032a57366023820112156102d157806004013567ffffffffffffffff811161025957604051916100fb601f8301601f19166020018461052c565b818352366024838301011161027c57815f9260246020930183860137830101527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361026d576004355f525f60205260405f20815167ffffffffffffffff81116102595761017382546104f4565b601f8111610214575b50602092601f82116001146101b857928192935f926101ad575b50505f19600383901b1c191660019190911b179055005b015190505f80610196565b601f19821693835f52805f20915f5b8681106101fc57508360019596106101e4575b505050811b019055005b01515f1960f88460031b161c191690555f80806101da565b919260206001819286850151815501940192016101c7565b825f5260205f20601f830160051c8101916020841061024f575b601f0160051c01905b818110610244575061017c565b5f8155600101610237565b909150819061022e565b634e487b7160e01b5f52604160045260245ffd5b632c01b20560e21b5f5260045ffd5b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b61047a565b61042a565b3461037f575f36600319011261037a576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461037f57602036600319011261037a576004355f525f6020526103fd6103f160405f2061054e565b604051918291826104ca565b0390f35b3461042a57602036600319011261037a576004355f525f6020526103fd6103f160405f2061054e565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b90600182811c92168015610522575b602083101461050e57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610503565b90601f8019910116810190811067ffffffffffffffff82111761025957604052565b9060405191825f825492610561846104f4565b80845293600181169081156105cc5750600114610588575b506105869250038361052c565b565b90505f9291925260205f20905f915b8183106105b0575050906020610586928201015f610579565b6020919350806001915483858901015201910190918492610597565b90506020925061058694915060ff191682840152151560051b8201015f61057956fea2646970667358221220b7f5f8c45eeae6edd909acecdb7212c60690a2497628b3be0b838be43404e9f864736f6c634300081c0033"; + +type SocketRegistryConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: SocketRegistryConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class SocketRegistry__factory extends ContractFactory { + constructor(...args: SocketRegistryConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + _slashingRegistryCoordinator: string, + overrides?: Overrides & { from?: string } + ): Promise { + return super.deploy( + _slashingRegistryCoordinator, + overrides || {} + ) as Promise; + } + override getDeployTransaction( + _slashingRegistryCoordinator: string, + overrides?: Overrides & { from?: string } + ): TransactionRequest { + return super.getDeployTransaction( + _slashingRegistryCoordinator, + overrides || {} + ); + } + override attach(address: string): SocketRegistry { + return super.attach(address) as SocketRegistry; + } + override connect(signer: Signer): SocketRegistry__factory { + return super.connect(signer) as SocketRegistry__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): SocketRegistryInterface { + return new utils.Interface(_abi) as SocketRegistryInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): SocketRegistry { + return new Contract(address, _abi, signerOrProvider) as SocketRegistry; + } +} diff --git a/src/avs/contracts/factories/index.ts b/src/avs/contracts/factories/index.ts index 3539dbc2..8a642137 100644 --- a/src/avs/contracts/factories/index.ts +++ b/src/avs/contracts/factories/index.ts @@ -6,4 +6,7 @@ export { DelegationManager__factory } from "./DelegationManager__factory"; export { ECDSAStakeRegistry__factory } from "./ECDSAStakeRegistry__factory"; export { ERC20Mock__factory } from "./ERC20Mock__factory"; export { ReclaimServiceManager__factory } from "./ReclaimServiceManager__factory"; +export { ReclaimSlashingRegistryCoordinator__factory } from "./ReclaimSlashingRegistryCoordinator__factory"; +export { ReclaimTaskManager__factory } from "./ReclaimTaskManager__factory"; export { RewardsCoordinator__factory } from "./RewardsCoordinator__factory"; +export { SocketRegistry__factory } from "./SocketRegistry__factory"; diff --git a/src/avs/contracts/index.ts b/src/avs/contracts/index.ts index bb83243b..9f37ec72 100644 --- a/src/avs/contracts/index.ts +++ b/src/avs/contracts/index.ts @@ -6,11 +6,17 @@ export type { DelegationManager } from "./DelegationManager"; export type { ECDSAStakeRegistry } from "./ECDSAStakeRegistry"; export type { ERC20Mock } from "./ERC20Mock"; export type { ReclaimServiceManager } from "./ReclaimServiceManager"; +export type { ReclaimSlashingRegistryCoordinator } from "./ReclaimSlashingRegistryCoordinator"; +export type { ReclaimTaskManager } from "./ReclaimTaskManager"; export type { RewardsCoordinator } from "./RewardsCoordinator"; +export type { SocketRegistry } from "./SocketRegistry"; export * as factories from "./factories"; export { ReclaimServiceManager__factory } from "./factories/ReclaimServiceManager__factory"; +export { ReclaimTaskManager__factory } from "./factories/ReclaimTaskManager__factory"; +export { ReclaimSlashingRegistryCoordinator__factory } from "./factories/ReclaimSlashingRegistryCoordinator__factory"; export { AVSDirectory__factory } from "./factories/AVSDirectory__factory"; export { DelegationManager__factory } from "./factories/DelegationManager__factory"; export { ECDSAStakeRegistry__factory } from "./factories/ECDSAStakeRegistry__factory"; export { ERC20Mock__factory } from "./factories/ERC20Mock__factory"; export { RewardsCoordinator__factory } from "./factories/RewardsCoordinator__factory"; +export { SocketRegistry__factory } from "./factories/SocketRegistry__factory"; diff --git a/src/avs/tests/test.operator.ts b/src/avs/tests/test.operator.ts index f62d94be..013b3706 100644 --- a/src/avs/tests/test.operator.ts +++ b/src/avs/tests/test.operator.ts @@ -16,7 +16,7 @@ import { Wallet } from 'ethers' import { arrayify } from 'ethers/lib/utils' import assert from 'node:assert' import { createClaimOnAvs } from 'src/avs/client/create-claim-on-avs' -import { NewTaskCreatedEventObject, TaskCompletedEventObject } from 'src/avs/contracts/ReclaimServiceManager' +import { NewTaskCreatedEventObject, TaskCompletedEventObject } from 'src/avs/contracts/ReclaimTaskManager' import { runFreshChain, sendGasToAddress, submitPaymentRoot } from 'src/avs/tests/utils' import { getContracts } from 'src/avs/utils/contracts' import { registerOperator } from 'src/avs/utils/register' diff --git a/src/avs/types/index.ts b/src/avs/types/index.ts index aafb7b9d..47b669c6 100644 --- a/src/avs/types/index.ts +++ b/src/avs/types/index.ts @@ -1,6 +1,6 @@ import type { ethers } from 'ethers' -import type { NewTaskCreatedEventObject } from 'src/avs/contracts/ReclaimServiceManager' +import type { NewTaskCreatedEventObject } from 'src/avs/contracts/ReclaimTaskManager' import type { createClaimOnAttestor } from 'src/client' import type { ClaimTunnelResponse } from 'src/proto/api' import type { CreateClaimOnAttestorOpts, ProofGenerationStep, ProviderName } from 'src/types' @@ -13,6 +13,7 @@ export type ChainConfig = { contractAddress: string delegationManagerAddress: string rewardsCoordinatorAddress: string + slashingCoordinatorAddress: string stakeRegistryAddress: string avsDirectoryAddress: string } diff --git a/src/avs/utils/contracts.ts b/src/avs/utils/contracts.ts index f2ab4397..7253360b 100644 --- a/src/avs/utils/contracts.ts +++ b/src/avs/utils/contracts.ts @@ -1,8 +1,7 @@ import { ethers } from 'ethers' import { CHAIN_CONFIGS, PRIVATE_KEY, SELECTED_CHAIN_ID } from 'src/avs/config' -import { AVSDirectory__factory, DelegationManager__factory, ECDSAStakeRegistry__factory, ERC20Mock__factory, ProxyAdmin__factory, ReclaimServiceManager__factory, RewardsCoordinator__factory } from 'src/avs/contracts' +import { AVSDirectory__factory, DelegationManager__factory, ECDSAStakeRegistry__factory, ERC20Mock__factory, ReclaimServiceManager__factory, ReclaimSlashingRegistryCoordinator__factory, RewardsCoordinator__factory } from 'src/avs/contracts' import { ChainConfig } from 'src/avs/types' -import { ReclaimServiceManagerInterface } from '../contracts/ReclaimServiceManager' export type Contracts = ReturnType @@ -29,7 +28,7 @@ export function initialiseContracts( contractAddress, delegationManagerAddress, rewardsCoordinatorAddress, - proxyAdminAddress, + slashingCoordinatorAddress, }: ChainConfig, privateKey: string | undefined = PRIVATE_KEY ) { @@ -70,8 +69,8 @@ export function initialiseContracts( wallet || provider ), // eslint-disable-next-line camelcase - proxyAdmin: ProxyAdmin__factory.connect( - proxyAdminAddress, + slashingCoordinator: ReclaimSlashingRegistryCoordinator__factory.connect( + slashingCoordinatorAddress, wallet || provider ), // tokens diff --git a/src/avs/utils/register.ts b/src/avs/utils/register.ts index 612e8f28..de450982 100644 --- a/src/avs/utils/register.ts +++ b/src/avs/utils/register.ts @@ -1,5 +1,6 @@ import { ethers } from 'ethers' import { RECLAIM_PUBLIC_URL, SELECTED_CHAIN_ID } from 'src/avs/config' +import { SocketRegistry__factory } from 'src/avs/contracts' import { getContracts } from 'src/avs/utils/contracts' import { logger as LOGGER } from 'src/utils' @@ -42,16 +43,16 @@ export async function registerOperator({ .connect(wallet) const registryContract = contracts.registryContract .connect(wallet) + const slashingCoordinator = contracts.slashingCoordinator + .connect(wallet) const addr = await wallet.address try { - const tx1 = await delegationManager - .registerAsOperator({ - '__deprecated_earningsReceiver': addr, - delegationApprover: - '0x0000000000000000000000000000000000000000', - stakerOptOutWindowBlocks: 0 - }, '') + const tx1 = await delegationManager.registerAsOperator( + '0x0000000000000000000000000000000000000000', + 0, + '' + ) await tx1.wait() logger.info('operator registered on DM successfully') } catch(err) { @@ -101,24 +102,19 @@ export async function registerOperator({ logger.info('operator already registered on AVS') } - const existingMetadata = await contract.getMetadataForOperator(addr) - .catch(err => { - if(err.message.includes('Operator not found')) { - return undefined - } - - throw err - }) - const metadata = { addr, url: reclaimRpcUrl } - if( - existingMetadata?.addr === metadata.addr - && existingMetadata?.url === metadata.url - ) { + // eslint-disable-next-line camelcase + const socketRegistry = SocketRegistry__factory.connect( + await slashingCoordinator.socketRegistry(), + wallet + ) + const existingMetadata = await socketRegistry.getOperatorSocket(addr) + const metadata = JSON.stringify({ url: reclaimRpcUrl }) + if(metadata === existingMetadata) { logger.info('operator metadata already up to date') return } - await contract.updateOperatorMetadata(metadata) + await slashingCoordinator.updateSocket(metadata) logger.info({ metadata }, 'operator metadata updated successfully') } \ No newline at end of file From f057a72cd7fd9abb91146e76bf42a39d91a7c36b Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Thu, 15 May 2025 10:09:58 +0530 Subject: [PATCH 19/26] wip: registration of operator --- .../script/deployments/core/31337.json | 2 +- .../script/deployments/reclaim/31337.json | 2 +- avs/utils/contract-data-gen.sh | 1 + src/avs/contracts/AllocationManager.ts | 2262 +++++++++++++++++ src/avs/contracts/ReclaimServiceManager.ts | 22 + .../factories/AllocationManager__factory.ts | 1979 ++++++++++++++ .../ReclaimServiceManager__factory.ts | 15 +- ...aimSlashingRegistryCoordinator__factory.ts | 2 +- src/avs/contracts/factories/index.ts | 1 + src/avs/contracts/index.ts | 2 + src/avs/utils/contracts.ts | 7 +- src/avs/utils/register.ts | 82 +- 12 files changed, 4338 insertions(+), 39 deletions(-) create mode 100644 src/avs/contracts/AllocationManager.ts create mode 100644 src/avs/contracts/factories/AllocationManager__factory.ts diff --git a/avs/contracts/script/deployments/core/31337.json b/avs/contracts/script/deployments/core/31337.json index 9a4429c7..9c5c1f0f 100644 --- a/avs/contracts/script/deployments/core/31337.json +++ b/avs/contracts/script/deployments/core/31337.json @@ -1 +1 @@ -{"lastUpdate":{"timestamp":"1747145944","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x4ed7c70f96b99c776995fb64377f0d4ab3b0e1c1","avsDirectory":"0x610178da211fef7d417bc0e6fed39f05609ad788","avsDirectoryImpl":"0xa85233c63b9ee964add6f2cffe00fd84eb32338f","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x4a679253410272dd5232b3ff7cf5dbb88f295319","eigenPodManager":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManagerImpl":"0xc5a5c42992decbae36851359345fe25997f5c42d","strategyFactory":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","rewardsCoordinator":"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0","pauserRegistry":"0x0b306bf915c4d645ff596e518faf3f9669b97016","strategyBeacon":"0x84ea74d481ee0a5332c457a4d796187f6ba67feb","allocationManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","permissionController":"0x59b670e9fa9d0a427751af201d676719a970857b"}} \ No newline at end of file +{"lastUpdate":{"timestamp":"1747194163","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x4ed7c70f96b99c776995fb64377f0d4ab3b0e1c1","avsDirectory":"0x610178da211fef7d417bc0e6fed39f05609ad788","avsDirectoryImpl":"0xa85233c63b9ee964add6f2cffe00fd84eb32338f","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x4a679253410272dd5232b3ff7cf5dbb88f295319","eigenPodManager":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManagerImpl":"0xc5a5c42992decbae36851359345fe25997f5c42d","strategyFactory":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","rewardsCoordinator":"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0","pauserRegistry":"0x0b306bf915c4d645ff596e518faf3f9669b97016","strategyBeacon":"0x84ea74d481ee0a5332c457a4d796187f6ba67feb","allocationManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","permissionController":"0x59b670e9fa9d0a427751af201d676719a970857b"}} \ No newline at end of file diff --git a/avs/contracts/script/deployments/reclaim/31337.json b/avs/contracts/script/deployments/reclaim/31337.json index 5ec4e77e..70157f9e 100644 --- a/avs/contracts/script/deployments/reclaim/31337.json +++ b/avs/contracts/script/deployments/reclaim/31337.json @@ -1 +1 @@ -{"lastUpdate":{"timestamp":"1747145951","block_number":"26"},"addresses":{"proxyAdmin":"0x809d550fca64d94bd9f66e60752a544199cfac3d","serviceManager":"0x1291be112d480055dafd8a610b7d1e203891c274","serviceManagerImpl":"0x8198f5d8f8cffe8f9c413d98a0a55aeb8ab9fbb7","taskManager":"0x82e01223d51eb87e16a03e24687edf0f294da6f1","registryCoordinator":"0x7969c5ed335650692bc04293b07f5bf2e7a673c0","blsapkRegistry":"0xc351628eb244ec633d5f21fbd6621e1a683b1181","indexRegistry":"0xcbeaf3bde82155f56486fb5a1072cb8baaf547cc","stakeRegistry":"0xb7278a61aa25c888815afc32ad3cc52ff24fe575","operatorStateRetriever":"0x5081a39b8a5f0e35a8d959395a630b68b74dd30f","strategy":"0x2b961e3959b79326a8e7f64ef0d2d825707669b5","pauserRegistry":"0x0000000000000000000000000000000000000000","token":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","instantSlasher":"0x922d6956c99e12dfeb3224dea977d0939758a1fe","socketRegistry":"0xb0d4afd8879ed9f52b28595d31b441d079b2ca07"}} \ No newline at end of file +{"lastUpdate":{"timestamp":"1747194165","block_number":"32"},"addresses":{"proxyAdmin":"0x809d550fca64d94bd9f66e60752a544199cfac3d","serviceManager":"0x1291be112d480055dafd8a610b7d1e203891c274","serviceManagerImpl":"0x8198f5d8f8cffe8f9c413d98a0a55aeb8ab9fbb7","taskManager":"0x82e01223d51eb87e16a03e24687edf0f294da6f1","registryCoordinator":"0x7969c5ed335650692bc04293b07f5bf2e7a673c0","blsapkRegistry":"0xc351628eb244ec633d5f21fbd6621e1a683b1181","indexRegistry":"0xcbeaf3bde82155f56486fb5a1072cb8baaf547cc","stakeRegistry":"0xb7278a61aa25c888815afc32ad3cc52ff24fe575","operatorStateRetriever":"0x5081a39b8a5f0e35a8d959395a630b68b74dd30f","strategy":"0x2b961e3959b79326a8e7f64ef0d2d825707669b5","pauserRegistry":"0x0000000000000000000000000000000000000000","token":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","instantSlasher":"0x922d6956c99e12dfeb3224dea977d0939758a1fe","socketRegistry":"0xb0d4afd8879ed9f52b28595d31b441d079b2ca07"}} \ No newline at end of file diff --git a/avs/utils/contract-data-gen.sh b/avs/utils/contract-data-gen.sh index 0b3c0555..27f8bd94 100644 --- a/avs/utils/contract-data-gen.sh +++ b/avs/utils/contract-data-gen.sh @@ -4,6 +4,7 @@ typechain -- --target ethers-v5 --out-dir src/avs/contracts \ avs/contracts/out/ReclaimServiceManager.sol/*.json \ avs/contracts/out/ReclaimTaskManager.sol/*.json \ avs/contracts/out/ReclaimSlashingRegistryCoordinator.sol/*.json \ + avs/contracts/out/AllocationManager.sol/*.json \ avs/contracts/out/AVSDirectory.sol/*.json \ avs/contracts/out/DelegationManager.sol/*.json \ avs/contracts/out/ECDSAStakeRegistry.sol/*.json \ diff --git a/src/avs/contracts/AllocationManager.ts b/src/avs/contracts/AllocationManager.ts new file mode 100644 index 00000000..14d907f1 --- /dev/null +++ b/src/avs/contracts/AllocationManager.ts @@ -0,0 +1,2262 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { + BaseContract, + BigNumber, + BigNumberish, + BytesLike, + CallOverrides, + ContractTransaction, + Overrides, + PopulatedTransaction, + Signer, + utils, +} from "ethers"; +import type { + FunctionFragment, + Result, + EventFragment, +} from "@ethersproject/abi"; +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, +} from "./common"; + +export type OperatorSetStruct = { avs: string; id: BigNumberish }; + +export type OperatorSetStructOutput = [string, number] & { + avs: string; + id: number; +}; + +export declare namespace IAllocationManagerTypes { + export type CreateSetParamsStruct = { + operatorSetId: BigNumberish; + strategies: string[]; + }; + + export type CreateSetParamsStructOutput = [number, string[]] & { + operatorSetId: number; + strategies: string[]; + }; + + export type DeregisterParamsStruct = { + operator: string; + avs: string; + operatorSetIds: BigNumberish[]; + }; + + export type DeregisterParamsStructOutput = [string, string, number[]] & { + operator: string; + avs: string; + operatorSetIds: number[]; + }; + + export type AllocationStruct = { + currentMagnitude: BigNumberish; + pendingDiff: BigNumberish; + effectBlock: BigNumberish; + }; + + export type AllocationStructOutput = [BigNumber, BigNumber, number] & { + currentMagnitude: BigNumber; + pendingDiff: BigNumber; + effectBlock: number; + }; + + export type AllocateParamsStruct = { + operatorSet: OperatorSetStruct; + strategies: string[]; + newMagnitudes: BigNumberish[]; + }; + + export type AllocateParamsStructOutput = [ + OperatorSetStructOutput, + string[], + BigNumber[] + ] & { + operatorSet: OperatorSetStructOutput; + strategies: string[]; + newMagnitudes: BigNumber[]; + }; + + export type RegisterParamsStruct = { + avs: string; + operatorSetIds: BigNumberish[]; + data: BytesLike; + }; + + export type RegisterParamsStructOutput = [string, number[], string] & { + avs: string; + operatorSetIds: number[]; + data: string; + }; + + export type SlashingParamsStruct = { + operator: string; + operatorSetId: BigNumberish; + strategies: string[]; + wadsToSlash: BigNumberish[]; + description: string; + }; + + export type SlashingParamsStructOutput = [ + string, + number, + string[], + BigNumber[], + string + ] & { + operator: string; + operatorSetId: number; + strategies: string[]; + wadsToSlash: BigNumber[]; + description: string; + }; +} + +export interface AllocationManagerInterface extends utils.Interface { + functions: { + "ALLOCATION_CONFIGURATION_DELAY()": FunctionFragment; + "DEALLOCATION_DELAY()": FunctionFragment; + "addStrategiesToOperatorSet(address,uint32,address[])": FunctionFragment; + "clearDeallocationQueue(address,address[],uint16[])": FunctionFragment; + "createOperatorSets(address,(uint32,address[])[])": FunctionFragment; + "delegation()": FunctionFragment; + "deregisterFromOperatorSets((address,address,uint32[]))": FunctionFragment; + "getAVSRegistrar(address)": FunctionFragment; + "getAllocatableMagnitude(address,address)": FunctionFragment; + "getAllocatedSets(address)": FunctionFragment; + "getAllocatedStake((address,uint32),address[],address[])": FunctionFragment; + "getAllocatedStrategies(address,(address,uint32))": FunctionFragment; + "getAllocation(address,(address,uint32),address)": FunctionFragment; + "getAllocationDelay(address)": FunctionFragment; + "getAllocations(address[],(address,uint32),address)": FunctionFragment; + "getEncumberedMagnitude(address,address)": FunctionFragment; + "getMaxMagnitude(address,address)": FunctionFragment; + "getMaxMagnitudes(address[],address)": FunctionFragment; + "getMaxMagnitudes(address,address[])": FunctionFragment; + "getMaxMagnitudesAtBlock(address,address[],uint32)": FunctionFragment; + "getMemberCount((address,uint32))": FunctionFragment; + "getMembers((address,uint32))": FunctionFragment; + "getMinimumSlashableStake((address,uint32),address[],address[],uint32)": FunctionFragment; + "getOperatorSetCount(address)": FunctionFragment; + "getRegisteredSets(address)": FunctionFragment; + "getStrategiesInOperatorSet((address,uint32))": FunctionFragment; + "getStrategyAllocations(address,address)": FunctionFragment; + "initialize(address,uint256)": FunctionFragment; + "isMemberOfOperatorSet(address,(address,uint32))": FunctionFragment; + "isOperatorSet((address,uint32))": FunctionFragment; + "isOperatorSlashable(address,(address,uint32))": FunctionFragment; + "modifyAllocations(address,((address,uint32),address[],uint64[])[])": FunctionFragment; + "owner()": FunctionFragment; + "pause(uint256)": FunctionFragment; + "pauseAll()": FunctionFragment; + "paused(uint8)": FunctionFragment; + "paused()": FunctionFragment; + "pauserRegistry()": FunctionFragment; + "permissionController()": FunctionFragment; + "registerForOperatorSets(address,(address,uint32[],bytes))": FunctionFragment; + "removeStrategiesFromOperatorSet(address,uint32,address[])": FunctionFragment; + "renounceOwnership()": FunctionFragment; + "setAVSRegistrar(address,address)": FunctionFragment; + "setAllocationDelay(address,uint32)": FunctionFragment; + "slashOperator(address,(address,uint32,address[],uint256[],string))": FunctionFragment; + "transferOwnership(address)": FunctionFragment; + "unpause(uint256)": FunctionFragment; + "updateAVSMetadataURI(address,string)": FunctionFragment; + "version()": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "ALLOCATION_CONFIGURATION_DELAY" + | "DEALLOCATION_DELAY" + | "addStrategiesToOperatorSet" + | "clearDeallocationQueue" + | "createOperatorSets" + | "delegation" + | "deregisterFromOperatorSets" + | "getAVSRegistrar" + | "getAllocatableMagnitude" + | "getAllocatedSets" + | "getAllocatedStake" + | "getAllocatedStrategies" + | "getAllocation" + | "getAllocationDelay" + | "getAllocations" + | "getEncumberedMagnitude" + | "getMaxMagnitude" + | "getMaxMagnitudes(address[],address)" + | "getMaxMagnitudes(address,address[])" + | "getMaxMagnitudesAtBlock" + | "getMemberCount" + | "getMembers" + | "getMinimumSlashableStake" + | "getOperatorSetCount" + | "getRegisteredSets" + | "getStrategiesInOperatorSet" + | "getStrategyAllocations" + | "initialize" + | "isMemberOfOperatorSet" + | "isOperatorSet" + | "isOperatorSlashable" + | "modifyAllocations" + | "owner" + | "pause" + | "pauseAll" + | "paused(uint8)" + | "paused()" + | "pauserRegistry" + | "permissionController" + | "registerForOperatorSets" + | "removeStrategiesFromOperatorSet" + | "renounceOwnership" + | "setAVSRegistrar" + | "setAllocationDelay" + | "slashOperator" + | "transferOwnership" + | "unpause" + | "updateAVSMetadataURI" + | "version" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "ALLOCATION_CONFIGURATION_DELAY", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "DEALLOCATION_DELAY", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "addStrategiesToOperatorSet", + values: [string, BigNumberish, string[]] + ): string; + encodeFunctionData( + functionFragment: "clearDeallocationQueue", + values: [string, string[], BigNumberish[]] + ): string; + encodeFunctionData( + functionFragment: "createOperatorSets", + values: [string, IAllocationManagerTypes.CreateSetParamsStruct[]] + ): string; + encodeFunctionData( + functionFragment: "delegation", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "deregisterFromOperatorSets", + values: [IAllocationManagerTypes.DeregisterParamsStruct] + ): string; + encodeFunctionData( + functionFragment: "getAVSRegistrar", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "getAllocatableMagnitude", + values: [string, string] + ): string; + encodeFunctionData( + functionFragment: "getAllocatedSets", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "getAllocatedStake", + values: [OperatorSetStruct, string[], string[]] + ): string; + encodeFunctionData( + functionFragment: "getAllocatedStrategies", + values: [string, OperatorSetStruct] + ): string; + encodeFunctionData( + functionFragment: "getAllocation", + values: [string, OperatorSetStruct, string] + ): string; + encodeFunctionData( + functionFragment: "getAllocationDelay", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "getAllocations", + values: [string[], OperatorSetStruct, string] + ): string; + encodeFunctionData( + functionFragment: "getEncumberedMagnitude", + values: [string, string] + ): string; + encodeFunctionData( + functionFragment: "getMaxMagnitude", + values: [string, string] + ): string; + encodeFunctionData( + functionFragment: "getMaxMagnitudes(address[],address)", + values: [string[], string] + ): string; + encodeFunctionData( + functionFragment: "getMaxMagnitudes(address,address[])", + values: [string, string[]] + ): string; + encodeFunctionData( + functionFragment: "getMaxMagnitudesAtBlock", + values: [string, string[], BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getMemberCount", + values: [OperatorSetStruct] + ): string; + encodeFunctionData( + functionFragment: "getMembers", + values: [OperatorSetStruct] + ): string; + encodeFunctionData( + functionFragment: "getMinimumSlashableStake", + values: [OperatorSetStruct, string[], string[], BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "getOperatorSetCount", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "getRegisteredSets", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "getStrategiesInOperatorSet", + values: [OperatorSetStruct] + ): string; + encodeFunctionData( + functionFragment: "getStrategyAllocations", + values: [string, string] + ): string; + encodeFunctionData( + functionFragment: "initialize", + values: [string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "isMemberOfOperatorSet", + values: [string, OperatorSetStruct] + ): string; + encodeFunctionData( + functionFragment: "isOperatorSet", + values: [OperatorSetStruct] + ): string; + encodeFunctionData( + functionFragment: "isOperatorSlashable", + values: [string, OperatorSetStruct] + ): string; + encodeFunctionData( + functionFragment: "modifyAllocations", + values: [string, IAllocationManagerTypes.AllocateParamsStruct[]] + ): string; + encodeFunctionData(functionFragment: "owner", values?: undefined): string; + encodeFunctionData(functionFragment: "pause", values: [BigNumberish]): string; + encodeFunctionData(functionFragment: "pauseAll", values?: undefined): string; + encodeFunctionData( + functionFragment: "paused(uint8)", + values: [BigNumberish] + ): string; + encodeFunctionData(functionFragment: "paused()", values?: undefined): string; + encodeFunctionData( + functionFragment: "pauserRegistry", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "permissionController", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "registerForOperatorSets", + values: [string, IAllocationManagerTypes.RegisterParamsStruct] + ): string; + encodeFunctionData( + functionFragment: "removeStrategiesFromOperatorSet", + values: [string, BigNumberish, string[]] + ): string; + encodeFunctionData( + functionFragment: "renounceOwnership", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "setAVSRegistrar", + values: [string, string] + ): string; + encodeFunctionData( + functionFragment: "setAllocationDelay", + values: [string, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "slashOperator", + values: [string, IAllocationManagerTypes.SlashingParamsStruct] + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "unpause", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "updateAVSMetadataURI", + values: [string, string] + ): string; + encodeFunctionData(functionFragment: "version", values?: undefined): string; + + decodeFunctionResult( + functionFragment: "ALLOCATION_CONFIGURATION_DELAY", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "DEALLOCATION_DELAY", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "addStrategiesToOperatorSet", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "clearDeallocationQueue", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "createOperatorSets", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "delegation", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "deregisterFromOperatorSets", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getAVSRegistrar", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getAllocatableMagnitude", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getAllocatedSets", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getAllocatedStake", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getAllocatedStrategies", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getAllocation", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getAllocationDelay", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getAllocations", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getEncumberedMagnitude", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getMaxMagnitude", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getMaxMagnitudes(address[],address)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getMaxMagnitudes(address,address[])", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getMaxMagnitudesAtBlock", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getMemberCount", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "getMembers", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "getMinimumSlashableStake", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getOperatorSetCount", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getRegisteredSets", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getStrategiesInOperatorSet", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getStrategyAllocations", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "isMemberOfOperatorSet", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isOperatorSet", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "isOperatorSlashable", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "modifyAllocations", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "owner", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "pause", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "pauseAll", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "paused(uint8)", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "paused()", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "pauserRegistry", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "permissionController", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "registerForOperatorSets", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "removeStrategiesFromOperatorSet", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "renounceOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setAVSRegistrar", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setAllocationDelay", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "slashOperator", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "transferOwnership", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "unpause", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "updateAVSMetadataURI", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "version", data: BytesLike): Result; + + events: { + "AVSMetadataURIUpdated(address,string)": EventFragment; + "AVSRegistrarSet(address,address)": EventFragment; + "AllocationDelaySet(address,uint32,uint32)": EventFragment; + "AllocationUpdated(address,(address,uint32),address,uint64,uint32)": EventFragment; + "EncumberedMagnitudeUpdated(address,address,uint64)": EventFragment; + "Initialized(uint8)": EventFragment; + "MaxMagnitudeUpdated(address,address,uint64)": EventFragment; + "OperatorAddedToOperatorSet(address,(address,uint32))": EventFragment; + "OperatorRemovedFromOperatorSet(address,(address,uint32))": EventFragment; + "OperatorSetCreated((address,uint32))": EventFragment; + "OperatorSlashed(address,(address,uint32),address[],uint256[],string)": EventFragment; + "OwnershipTransferred(address,address)": EventFragment; + "Paused(address,uint256)": EventFragment; + "StrategyAddedToOperatorSet((address,uint32),address)": EventFragment; + "StrategyRemovedFromOperatorSet((address,uint32),address)": EventFragment; + "Unpaused(address,uint256)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "AVSMetadataURIUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "AVSRegistrarSet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "AllocationDelaySet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "AllocationUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "EncumberedMagnitudeUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; + getEvent(nameOrSignatureOrTopic: "MaxMagnitudeUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OperatorAddedToOperatorSet"): EventFragment; + getEvent( + nameOrSignatureOrTopic: "OperatorRemovedFromOperatorSet" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "OperatorSetCreated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OperatorSlashed"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Paused"): EventFragment; + getEvent(nameOrSignatureOrTopic: "StrategyAddedToOperatorSet"): EventFragment; + getEvent( + nameOrSignatureOrTopic: "StrategyRemovedFromOperatorSet" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "Unpaused"): EventFragment; +} + +export interface AVSMetadataURIUpdatedEventObject { + avs: string; + metadataURI: string; +} +export type AVSMetadataURIUpdatedEvent = TypedEvent< + [string, string], + AVSMetadataURIUpdatedEventObject +>; + +export type AVSMetadataURIUpdatedEventFilter = + TypedEventFilter; + +export interface AVSRegistrarSetEventObject { + avs: string; + registrar: string; +} +export type AVSRegistrarSetEvent = TypedEvent< + [string, string], + AVSRegistrarSetEventObject +>; + +export type AVSRegistrarSetEventFilter = TypedEventFilter; + +export interface AllocationDelaySetEventObject { + operator: string; + delay: number; + effectBlock: number; +} +export type AllocationDelaySetEvent = TypedEvent< + [string, number, number], + AllocationDelaySetEventObject +>; + +export type AllocationDelaySetEventFilter = + TypedEventFilter; + +export interface AllocationUpdatedEventObject { + operator: string; + operatorSet: OperatorSetStructOutput; + strategy: string; + magnitude: BigNumber; + effectBlock: number; +} +export type AllocationUpdatedEvent = TypedEvent< + [string, OperatorSetStructOutput, string, BigNumber, number], + AllocationUpdatedEventObject +>; + +export type AllocationUpdatedEventFilter = + TypedEventFilter; + +export interface EncumberedMagnitudeUpdatedEventObject { + operator: string; + strategy: string; + encumberedMagnitude: BigNumber; +} +export type EncumberedMagnitudeUpdatedEvent = TypedEvent< + [string, string, BigNumber], + EncumberedMagnitudeUpdatedEventObject +>; + +export type EncumberedMagnitudeUpdatedEventFilter = + TypedEventFilter; + +export interface InitializedEventObject { + version: number; +} +export type InitializedEvent = TypedEvent<[number], InitializedEventObject>; + +export type InitializedEventFilter = TypedEventFilter; + +export interface MaxMagnitudeUpdatedEventObject { + operator: string; + strategy: string; + maxMagnitude: BigNumber; +} +export type MaxMagnitudeUpdatedEvent = TypedEvent< + [string, string, BigNumber], + MaxMagnitudeUpdatedEventObject +>; + +export type MaxMagnitudeUpdatedEventFilter = + TypedEventFilter; + +export interface OperatorAddedToOperatorSetEventObject { + operator: string; + operatorSet: OperatorSetStructOutput; +} +export type OperatorAddedToOperatorSetEvent = TypedEvent< + [string, OperatorSetStructOutput], + OperatorAddedToOperatorSetEventObject +>; + +export type OperatorAddedToOperatorSetEventFilter = + TypedEventFilter; + +export interface OperatorRemovedFromOperatorSetEventObject { + operator: string; + operatorSet: OperatorSetStructOutput; +} +export type OperatorRemovedFromOperatorSetEvent = TypedEvent< + [string, OperatorSetStructOutput], + OperatorRemovedFromOperatorSetEventObject +>; + +export type OperatorRemovedFromOperatorSetEventFilter = + TypedEventFilter; + +export interface OperatorSetCreatedEventObject { + operatorSet: OperatorSetStructOutput; +} +export type OperatorSetCreatedEvent = TypedEvent< + [OperatorSetStructOutput], + OperatorSetCreatedEventObject +>; + +export type OperatorSetCreatedEventFilter = + TypedEventFilter; + +export interface OperatorSlashedEventObject { + operator: string; + operatorSet: OperatorSetStructOutput; + strategies: string[]; + wadSlashed: BigNumber[]; + description: string; +} +export type OperatorSlashedEvent = TypedEvent< + [string, OperatorSetStructOutput, string[], BigNumber[], string], + OperatorSlashedEventObject +>; + +export type OperatorSlashedEventFilter = TypedEventFilter; + +export interface OwnershipTransferredEventObject { + previousOwner: string; + newOwner: string; +} +export type OwnershipTransferredEvent = TypedEvent< + [string, string], + OwnershipTransferredEventObject +>; + +export type OwnershipTransferredEventFilter = + TypedEventFilter; + +export interface PausedEventObject { + account: string; + newPausedStatus: BigNumber; +} +export type PausedEvent = TypedEvent<[string, BigNumber], PausedEventObject>; + +export type PausedEventFilter = TypedEventFilter; + +export interface StrategyAddedToOperatorSetEventObject { + operatorSet: OperatorSetStructOutput; + strategy: string; +} +export type StrategyAddedToOperatorSetEvent = TypedEvent< + [OperatorSetStructOutput, string], + StrategyAddedToOperatorSetEventObject +>; + +export type StrategyAddedToOperatorSetEventFilter = + TypedEventFilter; + +export interface StrategyRemovedFromOperatorSetEventObject { + operatorSet: OperatorSetStructOutput; + strategy: string; +} +export type StrategyRemovedFromOperatorSetEvent = TypedEvent< + [OperatorSetStructOutput, string], + StrategyRemovedFromOperatorSetEventObject +>; + +export type StrategyRemovedFromOperatorSetEventFilter = + TypedEventFilter; + +export interface UnpausedEventObject { + account: string; + newPausedStatus: BigNumber; +} +export type UnpausedEvent = TypedEvent< + [string, BigNumber], + UnpausedEventObject +>; + +export type UnpausedEventFilter = TypedEventFilter; + +export interface AllocationManager extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: AllocationManagerInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: { + ALLOCATION_CONFIGURATION_DELAY( + overrides?: CallOverrides + ): Promise<[number]>; + + DEALLOCATION_DELAY(overrides?: CallOverrides): Promise<[number]>; + + addStrategiesToOperatorSet( + avs: string, + operatorSetId: BigNumberish, + strategies: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + clearDeallocationQueue( + operator: string, + strategies: string[], + numToClear: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + createOperatorSets( + avs: string, + params: IAllocationManagerTypes.CreateSetParamsStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + delegation(overrides?: CallOverrides): Promise<[string]>; + + deregisterFromOperatorSets( + params: IAllocationManagerTypes.DeregisterParamsStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + getAVSRegistrar(avs: string, overrides?: CallOverrides): Promise<[string]>; + + getAllocatableMagnitude( + operator: string, + strategy: string, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getAllocatedSets( + operator: string, + overrides?: CallOverrides + ): Promise<[OperatorSetStructOutput[]]>; + + getAllocatedStake( + operatorSet: OperatorSetStruct, + operators: string[], + strategies: string[], + overrides?: CallOverrides + ): Promise<[BigNumber[][]]>; + + getAllocatedStrategies( + operator: string, + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise<[string[]]>; + + getAllocation( + operator: string, + operatorSet: OperatorSetStruct, + strategy: string, + overrides?: CallOverrides + ): Promise<[IAllocationManagerTypes.AllocationStructOutput]>; + + getAllocationDelay( + operator: string, + overrides?: CallOverrides + ): Promise<[boolean, number]>; + + getAllocations( + operators: string[], + operatorSet: OperatorSetStruct, + strategy: string, + overrides?: CallOverrides + ): Promise<[IAllocationManagerTypes.AllocationStructOutput[]]>; + + getEncumberedMagnitude( + operator: string, + strategy: string, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getMaxMagnitude( + operator: string, + strategy: string, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + "getMaxMagnitudes(address[],address)"( + operators: string[], + strategy: string, + overrides?: CallOverrides + ): Promise<[BigNumber[]]>; + + "getMaxMagnitudes(address,address[])"( + operator: string, + strategies: string[], + overrides?: CallOverrides + ): Promise<[BigNumber[]]>; + + getMaxMagnitudesAtBlock( + operator: string, + strategies: string[], + blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber[]]>; + + getMemberCount( + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getMembers( + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise<[string[]]>; + + getMinimumSlashableStake( + operatorSet: OperatorSetStruct, + operators: string[], + strategies: string[], + futureBlock: BigNumberish, + overrides?: CallOverrides + ): Promise<[BigNumber[][]] & { slashableStake: BigNumber[][] }>; + + getOperatorSetCount( + avs: string, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + getRegisteredSets( + operator: string, + overrides?: CallOverrides + ): Promise<[OperatorSetStructOutput[]]>; + + getStrategiesInOperatorSet( + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise<[string[]]>; + + getStrategyAllocations( + operator: string, + strategy: string, + overrides?: CallOverrides + ): Promise< + [ + OperatorSetStructOutput[], + IAllocationManagerTypes.AllocationStructOutput[] + ] + >; + + initialize( + initialOwner: string, + initialPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + isMemberOfOperatorSet( + operator: string, + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise<[boolean]>; + + isOperatorSet( + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise<[boolean]>; + + isOperatorSlashable( + operator: string, + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise<[boolean]>; + + modifyAllocations( + operator: string, + params: IAllocationManagerTypes.AllocateParamsStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + owner(overrides?: CallOverrides): Promise<[string]>; + + pause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + pauseAll( + overrides?: Overrides & { from?: string } + ): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise<[boolean]>; + + "paused()"(overrides?: CallOverrides): Promise<[BigNumber]>; + + pauserRegistry(overrides?: CallOverrides): Promise<[string]>; + + permissionController(overrides?: CallOverrides): Promise<[string]>; + + registerForOperatorSets( + operator: string, + params: IAllocationManagerTypes.RegisterParamsStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + removeStrategiesFromOperatorSet( + avs: string, + operatorSetId: BigNumberish, + strategies: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + setAVSRegistrar( + avs: string, + registrar: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setAllocationDelay( + operator: string, + delay: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + slashOperator( + avs: string, + params: IAllocationManagerTypes.SlashingParamsStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + updateAVSMetadataURI( + avs: string, + metadataURI: string, + overrides?: Overrides & { from?: string } + ): Promise; + + version(overrides?: CallOverrides): Promise<[string]>; + }; + + ALLOCATION_CONFIGURATION_DELAY(overrides?: CallOverrides): Promise; + + DEALLOCATION_DELAY(overrides?: CallOverrides): Promise; + + addStrategiesToOperatorSet( + avs: string, + operatorSetId: BigNumberish, + strategies: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + clearDeallocationQueue( + operator: string, + strategies: string[], + numToClear: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + createOperatorSets( + avs: string, + params: IAllocationManagerTypes.CreateSetParamsStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + delegation(overrides?: CallOverrides): Promise; + + deregisterFromOperatorSets( + params: IAllocationManagerTypes.DeregisterParamsStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + getAVSRegistrar(avs: string, overrides?: CallOverrides): Promise; + + getAllocatableMagnitude( + operator: string, + strategy: string, + overrides?: CallOverrides + ): Promise; + + getAllocatedSets( + operator: string, + overrides?: CallOverrides + ): Promise; + + getAllocatedStake( + operatorSet: OperatorSetStruct, + operators: string[], + strategies: string[], + overrides?: CallOverrides + ): Promise; + + getAllocatedStrategies( + operator: string, + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + getAllocation( + operator: string, + operatorSet: OperatorSetStruct, + strategy: string, + overrides?: CallOverrides + ): Promise; + + getAllocationDelay( + operator: string, + overrides?: CallOverrides + ): Promise<[boolean, number]>; + + getAllocations( + operators: string[], + operatorSet: OperatorSetStruct, + strategy: string, + overrides?: CallOverrides + ): Promise; + + getEncumberedMagnitude( + operator: string, + strategy: string, + overrides?: CallOverrides + ): Promise; + + getMaxMagnitude( + operator: string, + strategy: string, + overrides?: CallOverrides + ): Promise; + + "getMaxMagnitudes(address[],address)"( + operators: string[], + strategy: string, + overrides?: CallOverrides + ): Promise; + + "getMaxMagnitudes(address,address[])"( + operator: string, + strategies: string[], + overrides?: CallOverrides + ): Promise; + + getMaxMagnitudesAtBlock( + operator: string, + strategies: string[], + blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getMemberCount( + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + getMembers( + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + getMinimumSlashableStake( + operatorSet: OperatorSetStruct, + operators: string[], + strategies: string[], + futureBlock: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getOperatorSetCount( + avs: string, + overrides?: CallOverrides + ): Promise; + + getRegisteredSets( + operator: string, + overrides?: CallOverrides + ): Promise; + + getStrategiesInOperatorSet( + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + getStrategyAllocations( + operator: string, + strategy: string, + overrides?: CallOverrides + ): Promise< + [ + OperatorSetStructOutput[], + IAllocationManagerTypes.AllocationStructOutput[] + ] + >; + + initialize( + initialOwner: string, + initialPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + isMemberOfOperatorSet( + operator: string, + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + isOperatorSet( + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + isOperatorSlashable( + operator: string, + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + modifyAllocations( + operator: string, + params: IAllocationManagerTypes.AllocateParamsStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + pauseAll( + overrides?: Overrides & { from?: string } + ): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + pauserRegistry(overrides?: CallOverrides): Promise; + + permissionController(overrides?: CallOverrides): Promise; + + registerForOperatorSets( + operator: string, + params: IAllocationManagerTypes.RegisterParamsStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + removeStrategiesFromOperatorSet( + avs: string, + operatorSetId: BigNumberish, + strategies: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + setAVSRegistrar( + avs: string, + registrar: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setAllocationDelay( + operator: string, + delay: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + slashOperator( + avs: string, + params: IAllocationManagerTypes.SlashingParamsStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + updateAVSMetadataURI( + avs: string, + metadataURI: string, + overrides?: Overrides & { from?: string } + ): Promise; + + version(overrides?: CallOverrides): Promise; + + callStatic: { + ALLOCATION_CONFIGURATION_DELAY(overrides?: CallOverrides): Promise; + + DEALLOCATION_DELAY(overrides?: CallOverrides): Promise; + + addStrategiesToOperatorSet( + avs: string, + operatorSetId: BigNumberish, + strategies: string[], + overrides?: CallOverrides + ): Promise; + + clearDeallocationQueue( + operator: string, + strategies: string[], + numToClear: BigNumberish[], + overrides?: CallOverrides + ): Promise; + + createOperatorSets( + avs: string, + params: IAllocationManagerTypes.CreateSetParamsStruct[], + overrides?: CallOverrides + ): Promise; + + delegation(overrides?: CallOverrides): Promise; + + deregisterFromOperatorSets( + params: IAllocationManagerTypes.DeregisterParamsStruct, + overrides?: CallOverrides + ): Promise; + + getAVSRegistrar(avs: string, overrides?: CallOverrides): Promise; + + getAllocatableMagnitude( + operator: string, + strategy: string, + overrides?: CallOverrides + ): Promise; + + getAllocatedSets( + operator: string, + overrides?: CallOverrides + ): Promise; + + getAllocatedStake( + operatorSet: OperatorSetStruct, + operators: string[], + strategies: string[], + overrides?: CallOverrides + ): Promise; + + getAllocatedStrategies( + operator: string, + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + getAllocation( + operator: string, + operatorSet: OperatorSetStruct, + strategy: string, + overrides?: CallOverrides + ): Promise; + + getAllocationDelay( + operator: string, + overrides?: CallOverrides + ): Promise<[boolean, number]>; + + getAllocations( + operators: string[], + operatorSet: OperatorSetStruct, + strategy: string, + overrides?: CallOverrides + ): Promise; + + getEncumberedMagnitude( + operator: string, + strategy: string, + overrides?: CallOverrides + ): Promise; + + getMaxMagnitude( + operator: string, + strategy: string, + overrides?: CallOverrides + ): Promise; + + "getMaxMagnitudes(address[],address)"( + operators: string[], + strategy: string, + overrides?: CallOverrides + ): Promise; + + "getMaxMagnitudes(address,address[])"( + operator: string, + strategies: string[], + overrides?: CallOverrides + ): Promise; + + getMaxMagnitudesAtBlock( + operator: string, + strategies: string[], + blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getMemberCount( + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + getMembers( + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + getMinimumSlashableStake( + operatorSet: OperatorSetStruct, + operators: string[], + strategies: string[], + futureBlock: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getOperatorSetCount( + avs: string, + overrides?: CallOverrides + ): Promise; + + getRegisteredSets( + operator: string, + overrides?: CallOverrides + ): Promise; + + getStrategiesInOperatorSet( + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + getStrategyAllocations( + operator: string, + strategy: string, + overrides?: CallOverrides + ): Promise< + [ + OperatorSetStructOutput[], + IAllocationManagerTypes.AllocationStructOutput[] + ] + >; + + initialize( + initialOwner: string, + initialPausedStatus: BigNumberish, + overrides?: CallOverrides + ): Promise; + + isMemberOfOperatorSet( + operator: string, + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + isOperatorSet( + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + isOperatorSlashable( + operator: string, + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + modifyAllocations( + operator: string, + params: IAllocationManagerTypes.AllocateParamsStruct[], + overrides?: CallOverrides + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pause( + newPausedStatus: BigNumberish, + overrides?: CallOverrides + ): Promise; + + pauseAll(overrides?: CallOverrides): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + pauserRegistry(overrides?: CallOverrides): Promise; + + permissionController(overrides?: CallOverrides): Promise; + + registerForOperatorSets( + operator: string, + params: IAllocationManagerTypes.RegisterParamsStruct, + overrides?: CallOverrides + ): Promise; + + removeStrategiesFromOperatorSet( + avs: string, + operatorSetId: BigNumberish, + strategies: string[], + overrides?: CallOverrides + ): Promise; + + renounceOwnership(overrides?: CallOverrides): Promise; + + setAVSRegistrar( + avs: string, + registrar: string, + overrides?: CallOverrides + ): Promise; + + setAllocationDelay( + operator: string, + delay: BigNumberish, + overrides?: CallOverrides + ): Promise; + + slashOperator( + avs: string, + params: IAllocationManagerTypes.SlashingParamsStruct, + overrides?: CallOverrides + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: CallOverrides + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: CallOverrides + ): Promise; + + updateAVSMetadataURI( + avs: string, + metadataURI: string, + overrides?: CallOverrides + ): Promise; + + version(overrides?: CallOverrides): Promise; + }; + + filters: { + "AVSMetadataURIUpdated(address,string)"( + avs?: string | null, + metadataURI?: null + ): AVSMetadataURIUpdatedEventFilter; + AVSMetadataURIUpdated( + avs?: string | null, + metadataURI?: null + ): AVSMetadataURIUpdatedEventFilter; + + "AVSRegistrarSet(address,address)"( + avs?: null, + registrar?: null + ): AVSRegistrarSetEventFilter; + AVSRegistrarSet(avs?: null, registrar?: null): AVSRegistrarSetEventFilter; + + "AllocationDelaySet(address,uint32,uint32)"( + operator?: null, + delay?: null, + effectBlock?: null + ): AllocationDelaySetEventFilter; + AllocationDelaySet( + operator?: null, + delay?: null, + effectBlock?: null + ): AllocationDelaySetEventFilter; + + "AllocationUpdated(address,(address,uint32),address,uint64,uint32)"( + operator?: null, + operatorSet?: null, + strategy?: null, + magnitude?: null, + effectBlock?: null + ): AllocationUpdatedEventFilter; + AllocationUpdated( + operator?: null, + operatorSet?: null, + strategy?: null, + magnitude?: null, + effectBlock?: null + ): AllocationUpdatedEventFilter; + + "EncumberedMagnitudeUpdated(address,address,uint64)"( + operator?: null, + strategy?: null, + encumberedMagnitude?: null + ): EncumberedMagnitudeUpdatedEventFilter; + EncumberedMagnitudeUpdated( + operator?: null, + strategy?: null, + encumberedMagnitude?: null + ): EncumberedMagnitudeUpdatedEventFilter; + + "Initialized(uint8)"(version?: null): InitializedEventFilter; + Initialized(version?: null): InitializedEventFilter; + + "MaxMagnitudeUpdated(address,address,uint64)"( + operator?: null, + strategy?: null, + maxMagnitude?: null + ): MaxMagnitudeUpdatedEventFilter; + MaxMagnitudeUpdated( + operator?: null, + strategy?: null, + maxMagnitude?: null + ): MaxMagnitudeUpdatedEventFilter; + + "OperatorAddedToOperatorSet(address,(address,uint32))"( + operator?: string | null, + operatorSet?: null + ): OperatorAddedToOperatorSetEventFilter; + OperatorAddedToOperatorSet( + operator?: string | null, + operatorSet?: null + ): OperatorAddedToOperatorSetEventFilter; + + "OperatorRemovedFromOperatorSet(address,(address,uint32))"( + operator?: string | null, + operatorSet?: null + ): OperatorRemovedFromOperatorSetEventFilter; + OperatorRemovedFromOperatorSet( + operator?: string | null, + operatorSet?: null + ): OperatorRemovedFromOperatorSetEventFilter; + + "OperatorSetCreated((address,uint32))"( + operatorSet?: null + ): OperatorSetCreatedEventFilter; + OperatorSetCreated(operatorSet?: null): OperatorSetCreatedEventFilter; + + "OperatorSlashed(address,(address,uint32),address[],uint256[],string)"( + operator?: null, + operatorSet?: null, + strategies?: null, + wadSlashed?: null, + description?: null + ): OperatorSlashedEventFilter; + OperatorSlashed( + operator?: null, + operatorSet?: null, + strategies?: null, + wadSlashed?: null, + description?: null + ): OperatorSlashedEventFilter; + + "OwnershipTransferred(address,address)"( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + OwnershipTransferred( + previousOwner?: string | null, + newOwner?: string | null + ): OwnershipTransferredEventFilter; + + "Paused(address,uint256)"( + account?: string | null, + newPausedStatus?: null + ): PausedEventFilter; + Paused(account?: string | null, newPausedStatus?: null): PausedEventFilter; + + "StrategyAddedToOperatorSet((address,uint32),address)"( + operatorSet?: null, + strategy?: null + ): StrategyAddedToOperatorSetEventFilter; + StrategyAddedToOperatorSet( + operatorSet?: null, + strategy?: null + ): StrategyAddedToOperatorSetEventFilter; + + "StrategyRemovedFromOperatorSet((address,uint32),address)"( + operatorSet?: null, + strategy?: null + ): StrategyRemovedFromOperatorSetEventFilter; + StrategyRemovedFromOperatorSet( + operatorSet?: null, + strategy?: null + ): StrategyRemovedFromOperatorSetEventFilter; + + "Unpaused(address,uint256)"( + account?: string | null, + newPausedStatus?: null + ): UnpausedEventFilter; + Unpaused( + account?: string | null, + newPausedStatus?: null + ): UnpausedEventFilter; + }; + + estimateGas: { + ALLOCATION_CONFIGURATION_DELAY( + overrides?: CallOverrides + ): Promise; + + DEALLOCATION_DELAY(overrides?: CallOverrides): Promise; + + addStrategiesToOperatorSet( + avs: string, + operatorSetId: BigNumberish, + strategies: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + clearDeallocationQueue( + operator: string, + strategies: string[], + numToClear: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + createOperatorSets( + avs: string, + params: IAllocationManagerTypes.CreateSetParamsStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + delegation(overrides?: CallOverrides): Promise; + + deregisterFromOperatorSets( + params: IAllocationManagerTypes.DeregisterParamsStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + getAVSRegistrar(avs: string, overrides?: CallOverrides): Promise; + + getAllocatableMagnitude( + operator: string, + strategy: string, + overrides?: CallOverrides + ): Promise; + + getAllocatedSets( + operator: string, + overrides?: CallOverrides + ): Promise; + + getAllocatedStake( + operatorSet: OperatorSetStruct, + operators: string[], + strategies: string[], + overrides?: CallOverrides + ): Promise; + + getAllocatedStrategies( + operator: string, + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + getAllocation( + operator: string, + operatorSet: OperatorSetStruct, + strategy: string, + overrides?: CallOverrides + ): Promise; + + getAllocationDelay( + operator: string, + overrides?: CallOverrides + ): Promise; + + getAllocations( + operators: string[], + operatorSet: OperatorSetStruct, + strategy: string, + overrides?: CallOverrides + ): Promise; + + getEncumberedMagnitude( + operator: string, + strategy: string, + overrides?: CallOverrides + ): Promise; + + getMaxMagnitude( + operator: string, + strategy: string, + overrides?: CallOverrides + ): Promise; + + "getMaxMagnitudes(address[],address)"( + operators: string[], + strategy: string, + overrides?: CallOverrides + ): Promise; + + "getMaxMagnitudes(address,address[])"( + operator: string, + strategies: string[], + overrides?: CallOverrides + ): Promise; + + getMaxMagnitudesAtBlock( + operator: string, + strategies: string[], + blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getMemberCount( + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + getMembers( + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + getMinimumSlashableStake( + operatorSet: OperatorSetStruct, + operators: string[], + strategies: string[], + futureBlock: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getOperatorSetCount( + avs: string, + overrides?: CallOverrides + ): Promise; + + getRegisteredSets( + operator: string, + overrides?: CallOverrides + ): Promise; + + getStrategiesInOperatorSet( + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + getStrategyAllocations( + operator: string, + strategy: string, + overrides?: CallOverrides + ): Promise; + + initialize( + initialOwner: string, + initialPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + isMemberOfOperatorSet( + operator: string, + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + isOperatorSet( + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + isOperatorSlashable( + operator: string, + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + modifyAllocations( + operator: string, + params: IAllocationManagerTypes.AllocateParamsStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + pauseAll(overrides?: Overrides & { from?: string }): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + pauserRegistry(overrides?: CallOverrides): Promise; + + permissionController(overrides?: CallOverrides): Promise; + + registerForOperatorSets( + operator: string, + params: IAllocationManagerTypes.RegisterParamsStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + removeStrategiesFromOperatorSet( + avs: string, + operatorSetId: BigNumberish, + strategies: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + setAVSRegistrar( + avs: string, + registrar: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setAllocationDelay( + operator: string, + delay: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + slashOperator( + avs: string, + params: IAllocationManagerTypes.SlashingParamsStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + updateAVSMetadataURI( + avs: string, + metadataURI: string, + overrides?: Overrides & { from?: string } + ): Promise; + + version(overrides?: CallOverrides): Promise; + }; + + populateTransaction: { + ALLOCATION_CONFIGURATION_DELAY( + overrides?: CallOverrides + ): Promise; + + DEALLOCATION_DELAY( + overrides?: CallOverrides + ): Promise; + + addStrategiesToOperatorSet( + avs: string, + operatorSetId: BigNumberish, + strategies: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + clearDeallocationQueue( + operator: string, + strategies: string[], + numToClear: BigNumberish[], + overrides?: Overrides & { from?: string } + ): Promise; + + createOperatorSets( + avs: string, + params: IAllocationManagerTypes.CreateSetParamsStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + delegation(overrides?: CallOverrides): Promise; + + deregisterFromOperatorSets( + params: IAllocationManagerTypes.DeregisterParamsStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + getAVSRegistrar( + avs: string, + overrides?: CallOverrides + ): Promise; + + getAllocatableMagnitude( + operator: string, + strategy: string, + overrides?: CallOverrides + ): Promise; + + getAllocatedSets( + operator: string, + overrides?: CallOverrides + ): Promise; + + getAllocatedStake( + operatorSet: OperatorSetStruct, + operators: string[], + strategies: string[], + overrides?: CallOverrides + ): Promise; + + getAllocatedStrategies( + operator: string, + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + getAllocation( + operator: string, + operatorSet: OperatorSetStruct, + strategy: string, + overrides?: CallOverrides + ): Promise; + + getAllocationDelay( + operator: string, + overrides?: CallOverrides + ): Promise; + + getAllocations( + operators: string[], + operatorSet: OperatorSetStruct, + strategy: string, + overrides?: CallOverrides + ): Promise; + + getEncumberedMagnitude( + operator: string, + strategy: string, + overrides?: CallOverrides + ): Promise; + + getMaxMagnitude( + operator: string, + strategy: string, + overrides?: CallOverrides + ): Promise; + + "getMaxMagnitudes(address[],address)"( + operators: string[], + strategy: string, + overrides?: CallOverrides + ): Promise; + + "getMaxMagnitudes(address,address[])"( + operator: string, + strategies: string[], + overrides?: CallOverrides + ): Promise; + + getMaxMagnitudesAtBlock( + operator: string, + strategies: string[], + blockNumber: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getMemberCount( + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + getMembers( + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + getMinimumSlashableStake( + operatorSet: OperatorSetStruct, + operators: string[], + strategies: string[], + futureBlock: BigNumberish, + overrides?: CallOverrides + ): Promise; + + getOperatorSetCount( + avs: string, + overrides?: CallOverrides + ): Promise; + + getRegisteredSets( + operator: string, + overrides?: CallOverrides + ): Promise; + + getStrategiesInOperatorSet( + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + getStrategyAllocations( + operator: string, + strategy: string, + overrides?: CallOverrides + ): Promise; + + initialize( + initialOwner: string, + initialPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + isMemberOfOperatorSet( + operator: string, + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + isOperatorSet( + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + isOperatorSlashable( + operator: string, + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + modifyAllocations( + operator: string, + params: IAllocationManagerTypes.AllocateParamsStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + owner(overrides?: CallOverrides): Promise; + + pause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + pauseAll( + overrides?: Overrides & { from?: string } + ): Promise; + + "paused(uint8)"( + index: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "paused()"(overrides?: CallOverrides): Promise; + + pauserRegistry(overrides?: CallOverrides): Promise; + + permissionController( + overrides?: CallOverrides + ): Promise; + + registerForOperatorSets( + operator: string, + params: IAllocationManagerTypes.RegisterParamsStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + removeStrategiesFromOperatorSet( + avs: string, + operatorSetId: BigNumberish, + strategies: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + setAVSRegistrar( + avs: string, + registrar: string, + overrides?: Overrides & { from?: string } + ): Promise; + + setAllocationDelay( + operator: string, + delay: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + slashOperator( + avs: string, + params: IAllocationManagerTypes.SlashingParamsStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: Overrides & { from?: string } + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + updateAVSMetadataURI( + avs: string, + metadataURI: string, + overrides?: Overrides & { from?: string } + ): Promise; + + version(overrides?: CallOverrides): Promise; + }; +} diff --git a/src/avs/contracts/ReclaimServiceManager.ts b/src/avs/contracts/ReclaimServiceManager.ts index 0d2d120a..65611568 100644 --- a/src/avs/contracts/ReclaimServiceManager.ts +++ b/src/avs/contracts/ReclaimServiceManager.ts @@ -130,6 +130,7 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { "setAppointee(address,address,bytes4)": FunctionFragment; "setClaimerFor(address)": FunctionFragment; "setRewardsInitiator(address)": FunctionFragment; + "slashingRegistryCoordinator()": FunctionFragment; "taskManager()": FunctionFragment; "transferOwnership(address)": FunctionFragment; "updateAVSMetadataURI(string)": FunctionFragment; @@ -160,6 +161,7 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { | "setAppointee" | "setClaimerFor" | "setRewardsInitiator" + | "slashingRegistryCoordinator" | "taskManager" | "transferOwnership" | "updateAVSMetadataURI" @@ -248,6 +250,10 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { functionFragment: "setRewardsInitiator", values: [string] ): string; + encodeFunctionData( + functionFragment: "slashingRegistryCoordinator", + values?: undefined + ): string; encodeFunctionData( functionFragment: "taskManager", values?: undefined @@ -347,6 +353,10 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { functionFragment: "setRewardsInitiator", data: BytesLike ): Result; + decodeFunctionResult( + functionFragment: "slashingRegistryCoordinator", + data: BytesLike + ): Result; decodeFunctionResult( functionFragment: "taskManager", data: BytesLike @@ -537,6 +547,8 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; + slashingRegistryCoordinator(overrides?: CallOverrides): Promise<[string]>; + taskManager(overrides?: CallOverrides): Promise<[string]>; transferOwnership( @@ -659,6 +671,8 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; + slashingRegistryCoordinator(overrides?: CallOverrides): Promise; + taskManager(overrides?: CallOverrides): Promise; transferOwnership( @@ -770,6 +784,8 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: CallOverrides ): Promise; + slashingRegistryCoordinator(overrides?: CallOverrides): Promise; + taskManager(overrides?: CallOverrides): Promise; transferOwnership( @@ -916,6 +932,8 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; + slashingRegistryCoordinator(overrides?: CallOverrides): Promise; + taskManager(overrides?: CallOverrides): Promise; transferOwnership( @@ -1041,6 +1059,10 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: Overrides & { from?: string } ): Promise; + slashingRegistryCoordinator( + overrides?: CallOverrides + ): Promise; + taskManager(overrides?: CallOverrides): Promise; transferOwnership( diff --git a/src/avs/contracts/factories/AllocationManager__factory.ts b/src/avs/contracts/factories/AllocationManager__factory.ts new file mode 100644 index 00000000..fd9a7e46 --- /dev/null +++ b/src/avs/contracts/factories/AllocationManager__factory.ts @@ -0,0 +1,1979 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { + Signer, + utils, + Contract, + ContractFactory, + BigNumberish, + Overrides, +} from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { + AllocationManager, + AllocationManagerInterface, +} from "../AllocationManager"; + +const _abi = [ + { + type: "constructor", + inputs: [ + { + name: "_delegation", + type: "address", + internalType: "contract IDelegationManager", + }, + { + name: "_pauserRegistry", + type: "address", + internalType: "contract IPauserRegistry", + }, + { + name: "_permissionController", + type: "address", + internalType: "contract IPermissionController", + }, + { + name: "_DEALLOCATION_DELAY", + type: "uint32", + internalType: "uint32", + }, + { + name: "_ALLOCATION_CONFIGURATION_DELAY", + type: "uint32", + internalType: "uint32", + }, + { + name: "_version", + type: "string", + internalType: "string", + }, + ], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "ALLOCATION_CONFIGURATION_DELAY", + inputs: [], + outputs: [ + { + name: "", + type: "uint32", + internalType: "uint32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "DEALLOCATION_DELAY", + inputs: [], + outputs: [ + { + name: "", + type: "uint32", + internalType: "uint32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "addStrategiesToOperatorSet", + inputs: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "operatorSetId", + type: "uint32", + internalType: "uint32", + }, + { + name: "strategies", + type: "address[]", + internalType: "contract IStrategy[]", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "clearDeallocationQueue", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "strategies", + type: "address[]", + internalType: "contract IStrategy[]", + }, + { + name: "numToClear", + type: "uint16[]", + internalType: "uint16[]", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "createOperatorSets", + inputs: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "params", + type: "tuple[]", + internalType: "struct IAllocationManagerTypes.CreateSetParams[]", + components: [ + { + name: "operatorSetId", + type: "uint32", + internalType: "uint32", + }, + { + name: "strategies", + type: "address[]", + internalType: "contract IStrategy[]", + }, + ], + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "delegation", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IDelegationManager", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "deregisterFromOperatorSets", + inputs: [ + { + name: "params", + type: "tuple", + internalType: "struct IAllocationManagerTypes.DeregisterParams", + components: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "operatorSetIds", + type: "uint32[]", + internalType: "uint32[]", + }, + ], + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "getAVSRegistrar", + inputs: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IAVSRegistrar", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getAllocatableMagnitude", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + ], + outputs: [ + { + name: "", + type: "uint64", + internalType: "uint64", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getAllocatedSets", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "tuple[]", + internalType: "struct OperatorSet[]", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getAllocatedStake", + inputs: [ + { + name: "operatorSet", + type: "tuple", + internalType: "struct OperatorSet", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + { + name: "operators", + type: "address[]", + internalType: "address[]", + }, + { + name: "strategies", + type: "address[]", + internalType: "contract IStrategy[]", + }, + ], + outputs: [ + { + name: "", + type: "uint256[][]", + internalType: "uint256[][]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getAllocatedStrategies", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "operatorSet", + type: "tuple", + internalType: "struct OperatorSet", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + ], + outputs: [ + { + name: "", + type: "address[]", + internalType: "contract IStrategy[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getAllocation", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "operatorSet", + type: "tuple", + internalType: "struct OperatorSet", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + ], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct IAllocationManagerTypes.Allocation", + components: [ + { + name: "currentMagnitude", + type: "uint64", + internalType: "uint64", + }, + { + name: "pendingDiff", + type: "int128", + internalType: "int128", + }, + { + name: "effectBlock", + type: "uint32", + internalType: "uint32", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getAllocationDelay", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + { + name: "", + type: "uint32", + internalType: "uint32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getAllocations", + inputs: [ + { + name: "operators", + type: "address[]", + internalType: "address[]", + }, + { + name: "operatorSet", + type: "tuple", + internalType: "struct OperatorSet", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + ], + outputs: [ + { + name: "", + type: "tuple[]", + internalType: "struct IAllocationManagerTypes.Allocation[]", + components: [ + { + name: "currentMagnitude", + type: "uint64", + internalType: "uint64", + }, + { + name: "pendingDiff", + type: "int128", + internalType: "int128", + }, + { + name: "effectBlock", + type: "uint32", + internalType: "uint32", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getEncumberedMagnitude", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + ], + outputs: [ + { + name: "", + type: "uint64", + internalType: "uint64", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getMaxMagnitude", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + ], + outputs: [ + { + name: "", + type: "uint64", + internalType: "uint64", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getMaxMagnitudes", + inputs: [ + { + name: "operators", + type: "address[]", + internalType: "address[]", + }, + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + ], + outputs: [ + { + name: "", + type: "uint64[]", + internalType: "uint64[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getMaxMagnitudes", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "strategies", + type: "address[]", + internalType: "contract IStrategy[]", + }, + ], + outputs: [ + { + name: "", + type: "uint64[]", + internalType: "uint64[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getMaxMagnitudesAtBlock", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "strategies", + type: "address[]", + internalType: "contract IStrategy[]", + }, + { + name: "blockNumber", + type: "uint32", + internalType: "uint32", + }, + ], + outputs: [ + { + name: "", + type: "uint64[]", + internalType: "uint64[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getMemberCount", + inputs: [ + { + name: "operatorSet", + type: "tuple", + internalType: "struct OperatorSet", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getMembers", + inputs: [ + { + name: "operatorSet", + type: "tuple", + internalType: "struct OperatorSet", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + ], + outputs: [ + { + name: "", + type: "address[]", + internalType: "address[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getMinimumSlashableStake", + inputs: [ + { + name: "operatorSet", + type: "tuple", + internalType: "struct OperatorSet", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + { + name: "operators", + type: "address[]", + internalType: "address[]", + }, + { + name: "strategies", + type: "address[]", + internalType: "contract IStrategy[]", + }, + { + name: "futureBlock", + type: "uint32", + internalType: "uint32", + }, + ], + outputs: [ + { + name: "slashableStake", + type: "uint256[][]", + internalType: "uint256[][]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getOperatorSetCount", + inputs: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getRegisteredSets", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "tuple[]", + internalType: "struct OperatorSet[]", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getStrategiesInOperatorSet", + inputs: [ + { + name: "operatorSet", + type: "tuple", + internalType: "struct OperatorSet", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + ], + outputs: [ + { + name: "", + type: "address[]", + internalType: "contract IStrategy[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getStrategyAllocations", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + ], + outputs: [ + { + name: "", + type: "tuple[]", + internalType: "struct OperatorSet[]", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + { + name: "", + type: "tuple[]", + internalType: "struct IAllocationManagerTypes.Allocation[]", + components: [ + { + name: "currentMagnitude", + type: "uint64", + internalType: "uint64", + }, + { + name: "pendingDiff", + type: "int128", + internalType: "int128", + }, + { + name: "effectBlock", + type: "uint32", + internalType: "uint32", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "initialize", + inputs: [ + { + name: "initialOwner", + type: "address", + internalType: "address", + }, + { + name: "initialPausedStatus", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "isMemberOfOperatorSet", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "operatorSet", + type: "tuple", + internalType: "struct OperatorSet", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "isOperatorSet", + inputs: [ + { + name: "operatorSet", + type: "tuple", + internalType: "struct OperatorSet", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "isOperatorSlashable", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "operatorSet", + type: "tuple", + internalType: "struct OperatorSet", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "modifyAllocations", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "params", + type: "tuple[]", + internalType: "struct IAllocationManagerTypes.AllocateParams[]", + components: [ + { + name: "operatorSet", + type: "tuple", + internalType: "struct OperatorSet", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + { + name: "strategies", + type: "address[]", + internalType: "contract IStrategy[]", + }, + { + name: "newMagnitudes", + type: "uint64[]", + internalType: "uint64[]", + }, + ], + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "owner", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "pause", + inputs: [ + { + name: "newPausedStatus", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "pauseAll", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "paused", + inputs: [ + { + name: "index", + type: "uint8", + internalType: "uint8", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "paused", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "pauserRegistry", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IPauserRegistry", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "permissionController", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IPermissionController", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "registerForOperatorSets", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "params", + type: "tuple", + internalType: "struct IAllocationManagerTypes.RegisterParams", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "operatorSetIds", + type: "uint32[]", + internalType: "uint32[]", + }, + { + name: "data", + type: "bytes", + internalType: "bytes", + }, + ], + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "removeStrategiesFromOperatorSet", + inputs: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "operatorSetId", + type: "uint32", + internalType: "uint32", + }, + { + name: "strategies", + type: "address[]", + internalType: "contract IStrategy[]", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "renounceOwnership", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setAVSRegistrar", + inputs: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "registrar", + type: "address", + internalType: "contract IAVSRegistrar", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setAllocationDelay", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "delay", + type: "uint32", + internalType: "uint32", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "slashOperator", + inputs: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "params", + type: "tuple", + internalType: "struct IAllocationManagerTypes.SlashingParams", + components: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "operatorSetId", + type: "uint32", + internalType: "uint32", + }, + { + name: "strategies", + type: "address[]", + internalType: "contract IStrategy[]", + }, + { + name: "wadsToSlash", + type: "uint256[]", + internalType: "uint256[]", + }, + { + name: "description", + type: "string", + internalType: "string", + }, + ], + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "transferOwnership", + inputs: [ + { + name: "newOwner", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "unpause", + inputs: [ + { + name: "newPausedStatus", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "updateAVSMetadataURI", + inputs: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "metadataURI", + type: "string", + internalType: "string", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "version", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "event", + name: "AVSMetadataURIUpdated", + inputs: [ + { + name: "avs", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "metadataURI", + type: "string", + indexed: false, + internalType: "string", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "AVSRegistrarSet", + inputs: [ + { + name: "avs", + type: "address", + indexed: false, + internalType: "address", + }, + { + name: "registrar", + type: "address", + indexed: false, + internalType: "contract IAVSRegistrar", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "AllocationDelaySet", + inputs: [ + { + name: "operator", + type: "address", + indexed: false, + internalType: "address", + }, + { + name: "delay", + type: "uint32", + indexed: false, + internalType: "uint32", + }, + { + name: "effectBlock", + type: "uint32", + indexed: false, + internalType: "uint32", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "AllocationUpdated", + inputs: [ + { + name: "operator", + type: "address", + indexed: false, + internalType: "address", + }, + { + name: "operatorSet", + type: "tuple", + indexed: false, + internalType: "struct OperatorSet", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + { + name: "strategy", + type: "address", + indexed: false, + internalType: "contract IStrategy", + }, + { + name: "magnitude", + type: "uint64", + indexed: false, + internalType: "uint64", + }, + { + name: "effectBlock", + type: "uint32", + indexed: false, + internalType: "uint32", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "EncumberedMagnitudeUpdated", + inputs: [ + { + name: "operator", + type: "address", + indexed: false, + internalType: "address", + }, + { + name: "strategy", + type: "address", + indexed: false, + internalType: "contract IStrategy", + }, + { + name: "encumberedMagnitude", + type: "uint64", + indexed: false, + internalType: "uint64", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Initialized", + inputs: [ + { + name: "version", + type: "uint8", + indexed: false, + internalType: "uint8", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "MaxMagnitudeUpdated", + inputs: [ + { + name: "operator", + type: "address", + indexed: false, + internalType: "address", + }, + { + name: "strategy", + type: "address", + indexed: false, + internalType: "contract IStrategy", + }, + { + name: "maxMagnitude", + type: "uint64", + indexed: false, + internalType: "uint64", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OperatorAddedToOperatorSet", + inputs: [ + { + name: "operator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "operatorSet", + type: "tuple", + indexed: false, + internalType: "struct OperatorSet", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OperatorRemovedFromOperatorSet", + inputs: [ + { + name: "operator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "operatorSet", + type: "tuple", + indexed: false, + internalType: "struct OperatorSet", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OperatorSetCreated", + inputs: [ + { + name: "operatorSet", + type: "tuple", + indexed: false, + internalType: "struct OperatorSet", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OperatorSlashed", + inputs: [ + { + name: "operator", + type: "address", + indexed: false, + internalType: "address", + }, + { + name: "operatorSet", + type: "tuple", + indexed: false, + internalType: "struct OperatorSet", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + { + name: "strategies", + type: "address[]", + indexed: false, + internalType: "contract IStrategy[]", + }, + { + name: "wadSlashed", + type: "uint256[]", + indexed: false, + internalType: "uint256[]", + }, + { + name: "description", + type: "string", + indexed: false, + internalType: "string", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OwnershipTransferred", + inputs: [ + { + name: "previousOwner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newOwner", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Paused", + inputs: [ + { + name: "account", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newPausedStatus", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "StrategyAddedToOperatorSet", + inputs: [ + { + name: "operatorSet", + type: "tuple", + indexed: false, + internalType: "struct OperatorSet", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + { + name: "strategy", + type: "address", + indexed: false, + internalType: "contract IStrategy", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "StrategyRemovedFromOperatorSet", + inputs: [ + { + name: "operatorSet", + type: "tuple", + indexed: false, + internalType: "struct OperatorSet", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + { + name: "strategy", + type: "address", + indexed: false, + internalType: "contract IStrategy", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Unpaused", + inputs: [ + { + name: "account", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newPausedStatus", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "AlreadyMemberOfSet", + inputs: [], + }, + { + type: "error", + name: "CurrentlyPaused", + inputs: [], + }, + { + type: "error", + name: "Empty", + inputs: [], + }, + { + type: "error", + name: "InputAddressZero", + inputs: [], + }, + { + type: "error", + name: "InputArrayLengthMismatch", + inputs: [], + }, + { + type: "error", + name: "InsufficientMagnitude", + inputs: [], + }, + { + type: "error", + name: "InvalidAVSRegistrar", + inputs: [], + }, + { + type: "error", + name: "InvalidCaller", + inputs: [], + }, + { + type: "error", + name: "InvalidNewPausedStatus", + inputs: [], + }, + { + type: "error", + name: "InvalidOperator", + inputs: [], + }, + { + type: "error", + name: "InvalidOperatorSet", + inputs: [], + }, + { + type: "error", + name: "InvalidPermissions", + inputs: [], + }, + { + type: "error", + name: "InvalidShortString", + inputs: [], + }, + { + type: "error", + name: "InvalidSnapshotOrdering", + inputs: [], + }, + { + type: "error", + name: "InvalidWadToSlash", + inputs: [], + }, + { + type: "error", + name: "ModificationAlreadyPending", + inputs: [], + }, + { + type: "error", + name: "NonexistentAVSMetadata", + inputs: [], + }, + { + type: "error", + name: "NotMemberOfSet", + inputs: [], + }, + { + type: "error", + name: "OnlyPauser", + inputs: [], + }, + { + type: "error", + name: "OnlyUnpauser", + inputs: [], + }, + { + type: "error", + name: "OperatorNotSlashable", + inputs: [], + }, + { + type: "error", + name: "OutOfBounds", + inputs: [], + }, + { + type: "error", + name: "SameMagnitude", + inputs: [], + }, + { + type: "error", + name: "StrategiesMustBeInAscendingOrder", + inputs: [], + }, + { + type: "error", + name: "StrategyAlreadyInOperatorSet", + inputs: [], + }, + { + type: "error", + name: "StrategyNotInOperatorSet", + inputs: [], + }, + { + type: "error", + name: "StringTooLong", + inputs: [ + { + name: "str", + type: "string", + internalType: "string", + }, + ], + }, + { + type: "error", + name: "UninitializedAllocationDelay", + inputs: [], + }, +] as const; + +const _bytecode = + "0x610140806040523461041657615d628038038061001b81610463565b92833981019060c0818303126103c65780516001600160a01b03811681036103c25760208201516001600160a01b03811692908381036103c2576040820151926001600160a01b03841684036103c25761007760608401610488565b9161008460808501610488565b60a085015190946001600160401b03821161037257019587601f880112156103195786516001600160401b038111610305576100c9601f8201601f1916602001610463565b978189526020890199602083830101116102b057815f9260208093018c5e89010152156102a15760805260a05260c05260e05261010052601f8151116102655751905160208210610255575b17610120525f5460ff8160081c166102005760ff808216036101c6575b6040516158c8908161049a823960805181818161071101528181611e97015281816124e60152613177015260a05181818161116201528181611dc801528181612a120152818161307701526145f8015260c051818181610cf7015281816120570152613c69015260e0518181816124ad0152614e4901526101005181818161193501526143d501526101205181611d140152f35b60ff90811916175f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a180610132565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b5f198260200360031b1b16610115565b60449060405192839163305a27a960e01b8352602060048401525180918160248501528484015e5f828201840152601f01601f19168101030190fd5b6339b190bb60e11b5f5260045ffd5b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b5f80fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b6040519190601f01601f191682016001600160401b0381118382101761030557604052565b519063ffffffff821682036103c25756fe608060405260043610613228575f3560e01c806310e1b9b81461031b5780631352c3e614610316578063136439dd1461031157806315fe50281461030c578063260dc75814610307578063261f84e0146103025780632981eb77146102fd5780632b453a9a146102f85780632bab2c4a146102f3578063304c10cd146102ee57806336352057146102e957806340120dab146102e45780634177a87c146102df5780634657e26a146102da5780634a10ffe5146102d55780634b5046ef146102d057806350feea20146102cb578063547afb87146102c657806354fd4d50146102c157806356c483e6146102bc578063595c6a67146102b75780635ac86ab7146102b25780635c975abb146102ad578063670d3ba2146102a85780636cfb4481146102a35780636e3492b51461029e5780636e875dba14610299578063715018a61461029457806379ae50cd1461028f5780637bc1ef611461028a578063886f1195146102855780638ce64854146102805780638da5cb5b1461027b57806394d7d00c14610276578063952899ee14610271578063a9333ec81461026c578063a982182114610267578063adc2e3d914610262578063b2447af71461025d578063b66bd98914610258578063b9fbaed114610253578063ba1a84e51461024e578063c221d8ae14610249578063cd6dc68714610244578063d3d96ff41461023f578063df5cf7231461023a578063f2fde38b14610235578063f605ce08146102305763fabc1cbc036132285761315c565b613137565b6130a6565b613062565b612f33565b612e45565b612db4565b612d79565b612d3c565b612c64565b612c31565b6129b7565b612950565b6128fc565b612779565b612603565b6125db565b612526565b6124d1565b612491565b612405565b6123aa565b612331565b611fe3565b611fa9565b611f52565b611f35565b611f02565b611e85565b611d9d565b611d02565b611c74565b611b53565b611a43565b6119a6565b611920565b6118a2565b6117a8565b611013565b610f85565b610e9e565b610e23565b610cdb565b610a65565b6108c9565b61082d565b6106f6565b6106bb565b61062a565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b6001600160a01b0381160361042157565b5f80fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b604081019081106001600160401b038211176104a557604052565b610476565b606081019081106001600160401b038211176104a557604052565b608081019081106001600160401b038211176104a557604052565b90601f801991011681019081106001600160401b038211176104a557604052565b604051906105106040836104e0565b565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b63ffffffff81160361042157565b60409060231901126105ac576040519061058a8261048a565b8160243561059781610410565b81526020604435916105a883610563565b0152565b610425565b60409060031901126105ac57604051906105ca8261048a565b816004356105d781610410565b81526020602435916105a883610563565b91908260409103126105ac576040516106008161048a565b6020808294803561061081610410565b84520135916105a883610563565b6001600160401b031690565b346106b65760803660031901126106b157606061067a60043561064c81610410565b61065536610571565b906106746064359261066684610410565b61066e61328b565b5061414a565b906141e5565b90506106af604051809263ffffffff604080926001600160401b0381511685526020810151600f0b6020860152015116910152565bf35b610370565b610320565b346106b65760603660031901126106b15760206106ec6004356106dd81610410565b6106e636610571565b906132be565b6040519015158152f35b346106b65760203660031901126106b1576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600435813b156107bf5760206024926040519384809263237dfb4760e11b82523360048301525afa9182156107ba5761078992610775915f9161078b575b506133a1565b610784606654828116146133b7565b614377565b005b6107ad915060203d6020116107b3575b6107a581836104e0565b81019061337e565b5f61076f565b503d61079b565b613396565b61332b565b90602080835192838152019201905f5b8181106107e15750505090565b909192602060408261080e600194885163ffffffff6020809260018060a01b038151168552015116910152565b0194019291016107d4565b90602061082a9281815201906107c4565b90565b346106b65760203660031901126106b15760043561084a81610410565b6001600160a01b03165f818152609d602052604090205461086a816133e5565b915f5b82811061088657604051806108828682610819565b0390f35b600190825f52609d6020526108ad6108a18260405f2061524c565b90549060031b1c6143a9565b6108b78287613448565b526108c28186613448565b500161086d565b346106b65760403660031901126106b15760206106ec6108e8366105b1565b80516001600160a01b03165f9081526098845260408082209285015163ffffffff16825260019092016020522054151590565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b9181601f84011215610a60578235916001600160401b038311610a5b576020808501948460051b010111610a5657565b6109cd565b610974565b61091b565b346106b65760403660031901126106b157600435610a8281610410565b6024356001600160401b038111610ccc57610aa1903690600401610a26565b90610ab3610aae846143d3565b613461565b6001600160a01b0383165f90815260a460205260409020610adf90610ada905b5460ff1690565b613477565b5f915b808310610aeb57005b610afe610af984838561355c565b613583565b907f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c610bc7610b96610b2e610501565b6001600160a01b03891681529463ffffffff16602086019081526001600160a01b0389165f908152609860205260409020610b8c90610b8790610b81610b78855163ffffffff1690565b63ffffffff1690565b9061527e565b61358d565b5163ffffffff1690565b610bbb610ba1610501565b6001600160a01b038a1681529163ffffffff166020830152565b604051918291826135a3565b0390a1610bd38261414a565b925f5b610bee610be487858561355c565b60208101906135c9565b9050811015610cbc5780610c4587610c3f610c33610c2e600196610c28610be4610c208e5f52609960205260405f2090565b968c8c61355c565b90613608565b613618565b6001600160a01b031690565b90614478565b507f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b610cb3610c7f610c2e84610c28610be48d8b8b61355c565b6040805189516001600160a01b0390811682526020808c015163ffffffff1690830152909216908201529081906060820190565b0390a101610bd6565b5060019094019392509050610ae2565b6103c0565b5f9103126106b157565b346106b6575f3660031901126106b157602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b6001600160401b0381116104a55760051b60200190565b9080601f83011215610a60578135610d4981610d1b565b92610d5760405194856104e0565b81845260208085019260051b820101928311610a5657602001905b828210610d7f5750505090565b602080918335610d8e81610410565b815201910190610d72565b602081016020825282518091526040820191602060408360051b8301019401925f915b838310610dcb57505050505090565b9091929394603f19828203018352855190602080835192838152019201905f905b808210610e0b5750505060208060019297019301930191939290610dbc565b90919260208060019286518152019401920190610dec565b346106b65760803660031901126106b157610e3d366105b1565b6044356001600160401b038111610ccc57610e5c903690600401610d32565b90606435906001600160401b038211610ccc5761088292610e84610e92933690600401610d32565b9063ffffffff4316926145e7565b60405191829182610d99565b346106b65760a03660031901126106b157610eb8366105b1565b6044356001600160401b038111610ccc57610ed7903690600401610d32565b6064356001600160401b038111610ccc57610ef6903690600401610d32565b90610f0e608435610f0681610563565b8383866145e7565b925f5b8251811015610f7757610f37826001600160a01b03610f308487613448565b51166132be565b15610f45575b600101610f11565b915f5b8451811015610f7057805f610f69600193610f63888b613448565b51613448565b5201610f48565b5091610f3d565b604051806108828782610d99565b346106b65760203660031901126106b1576020610fac600435610fa781610410565b613622565b6040516001600160a01b039091168152f35b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a207374727563742063616c6c6461746120746f6044820152661bc81cda1bdc9d60ca1b6064820152608490fd5b346106b65760403660031901126106b15760043561103081610410565b6024356001600160401b038111610ccc5760a060031982360301126116f657611066611060600280606654161490565b15613647565b611072610aae836143d3565b611129610b8761108460248401613583565b61109e61108f610501565b6001600160a01b039096168652565b63ffffffff16602085019081526110d96110be60448601866004016135c9565b90506110d060648701876004016135c9565b9190501461365d565b845161111590610b789061110a906001600160a01b03165b6001600160a01b03165f90815260986020526040902090565b925163ffffffff1690565b906001915f520160205260405f2054151590565b6111466111418361113c84600401613618565b6132be565b613673565b61116061115960448301836004016135c9565b9050613689565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691905f5b61119e60448401846004016135c9565b905081101561168b5780158015611629575b6111b9906136dd565b6111cd81610c2860648601866004016135c9565b351515806115fe575b6111df906136f3565b61123d6112386111ff6111f18861414a565b5f52609960205260405f2090565b611219610c33610c2e86610c2860448b018b6004016135c9565b6001600160a01b03165f90815260019091016020526040902054151590565b613709565b61127261124c84600401613618565b6112558761414a565b61126c610c2e85610c2860448a018a6004016135c9565b916141e5565b919061128861061e84516001600160401b031690565b80156115f3576112d161061e7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd926112ca86610c2860648c018c6004016135c9565b35906147f9565b936113836112e684516001600160401b031690565b956113036001600160401b0388166001600160401b0383166153be565b61130d878a613448565b5261133861132b8261132686516001600160401b031690565b61371f565b6001600160401b03168452565b61135d6113508261132688516001600160401b031690565b6001600160401b03168652565b611376602086019161132683516001600160401b031690565b6001600160401b03169052565b866113926020830151600f0b90565b855f61139e83600f0b90565b1261151a575b8391508b836113da610c2e8994610c286113cc6113c66113e09a600401613618565b9661414a565b9460448101906004016135c9565b916148ac565b6113ec87600401613618565b9061142e61141861140a610c2e88610c2860448e0160048f016135c9565b92516001600160401b031690565b926040519384938d63ffffffff43169386613785565b0390a161146861144086600401613618565b611457610c2e85610c2860448b018b6004016135c9565b83516001600160401b031691614b15565b61147485600401613618565b9061149d61148f610c2e85610c2860448b018b6004016135c9565b91516001600160401b031690565b91873b156107bf5760405163601bb36f60e01b81526001600160a01b039182166004820152911660248201526001600160401b039384166044820152921660648301525f8260848183895af19182156107ba57600192611500575b505b0161118e565b8061150e5f611514936104e0565b80610cd1565b5f6114f8565b61155d61061e61061e611583956112ca61156c95610c2861154f6115436115436115799b61373f565b6001600160801b031690565b9360648101906004016135c9565b6001600160801b0316600f0b90565b6020840151600f0b61375f565b600f0b6020830152565b8189886115e86115ad610c2e89610c2861159f86600401613618565b9560448101906004016135c9565b6115d06115c187516001600160401b031690565b6020880151600f0b5b90614825565b604087015163ffffffff169160405195869586613785565b0390a1865f856113a4565b5050600191506114fa565b506111df670de0b6b3a764000061161f83610c2860648801886004016135c9565b35111590506111d6565b506111b961164a610c33610c33610c2e85610c2860448a018a6004016135c9565b611678610c33610c33610c33610c2e61166960448b018b6004016135c9565b6116728a6136cf565b91613608565b6001600160a01b039091161190506111b0565b7f80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe585836116f16116e2876116c181600401613618565b936116d260448301836004016135c9565b93909260848101906004016137d6565b93909260405197889788613828565b0390a1005b610fbe565b60409060031901126106b15760043561171381610410565b9060243561082a81610410565b90602080835192838152019201905f5b81811061173d5750505090565b9091926020606082611778600194885163ffffffff604080926001600160401b0381511685526020810151600f0b6020860152015116910152565b019401929101611730565b909161179a61082a936040845260408401906107c4565b916020818403910152611720565b346106b6576117b6366116fb565b6001600160a01b0382165f818152609d60205260409020549092916117da826133e5565b926117e4836138f3565b945f5b8481106117fd5760405180610882898983611783565b600190825f52609d6020526118398561181c6108a18460405f2061524c565b80611827858c613448565b52611832848b613448565b50866132a9565b611843828a613448565b5261184e8189613448565b50016117e7565b90602080835192838152019201905f5b8181106118725750505090565b82516001600160a01b0316845260209384019390920191600101611865565b90602061082a928181520190611855565b346106b65760403660031901126106b1576118c46118bf366105b1565b61414a565b5f52609960205260405f206040519081602082549182815201915f5260205f20905f5b81811061190a57610882856118fe818703826104e0565b60405191829182611891565b82548452602090930192600192830192016118e7565b346106b6575f3660031901126106b1576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b60206040818301928281528451809452019201905f5b8181106119875750505090565b82516001600160401b031684526020938401939092019160010161197a565b346106b65760403660031901126106b1576004356001600160401b038111610ccc576119d6903690600401610d32565b602435906119e382610410565b6119ed8151613689565b915f5b8251811015611a3557600190611a19836001600160a01b03611a128488613448565b5116613e62565b6001600160401b03611a2b8388613448565b91169052016119f0565b604051806108828682611964565b346106b65760603660031901126106b157600435611a6081610410565b6024356001600160401b038111610ccc57611a7f903690600401610a26565b90916044356001600160401b038111610ccc57611aa0903690600401610a26565b929093611ab4611060600180606654161490565b611abf84831461365d565b5f5b828110611aca57005b611ad5818484613608565b3590611ae082610410565b611aeb818789613608565b359161ffff8316830361042157600192611b059187614cd1565b01611ac1565b60606003198201126106b157600435611b2381610410565b91602435611b3081610563565b91604435906001600160401b038211610ccc57611b4f91600401610a26565b9091565b346106b657611b6136611b0b565b91611b70610aae8593956143d3565b611bc9610b8760405192611b838461048a565b6001600160a01b038516845263ffffffff1660208401908152611115610b7861110a611bae8761414a565b6001600160a01b039098165f90815260986020526040902090565b5f5b838110611bd457005b600190611c05611c00611bef865f52609960205260405f2090565b610c3f610c33610c2e868b8d613608565b613942565b7f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b611c6b611c37610c2e84898b613608565b6040805187516001600160a01b0390811682526020808a015163ffffffff1690830152909216908201529081906060820190565b0390a101611bcb565b346106b65760403660031901126106b157600435611c9181610410565b6024356001600160401b038111610ccc57611cb0903690600401610d32565b611cba8151613689565b915f5b8251811015611a3557600190611ce66001600160a01b03611cde8387613448565b511684613e62565b6001600160401b03611cf88388613448565b9116905201611cbd565b346106b6575f3660031901126106b1577f000000000000000000000000000000000000000000000000000000000000000060ff811690601f8211611d8e576040805191611d4f82846104e0565b6020808452830193601f198301368637835283528051928392602084525180918160208601528385015e5f838201830152601f01601f19168201010390f35b632cd44ac360e21b5f5260045ffd5b346106b65760403660031901126106b157600435611dba81610410565b602435611dc681610563565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169133839003611e04575b6107899250614dbb565b611e15611e10826143d3565b613958565b823b156107bf576040516336b87bd760e11b81526001600160a01b038216600482015292602090849060249082905afa9283156107ba5761078993611e61915f91611e66575b5061396e565b611dfa565b611e7f915060203d6020116107b3576107a581836104e0565b5f611e5b565b346106b6575f3660031901126106b1577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156107bf5760206024916040519283809263237dfb4760e11b82523360048301525afa80156107ba57611efa915f9161078b57506133a1565b610789614343565b346106b65760203660031901126106b15760043560ff81168091036104215760016020911b806066541614604051908152f35b346106b6575f3660031901126106b1576020606654604051908152f35b346106b65760603660031901126106b15760206106ec600435611f7481610410565b611f806118bf36610571565b5f908152609a845260408082206001600160a01b03909316825260019092016020522054151590565b346106b6576020611fc2611fbc366116fb565b90614f74565b90506001600160401b0360405191168152f35b908160609103126116f65790565b346106b65760203660031901126106b1576004356001600160401b038111610ccc57612013903690600401611fd5565b612024611060600480606654161490565b61203561203082613618565b6143d3565b80156122ca575b61204590613958565b6020810190604081014363ffffffff167f00000000000000000000000000000000000000000000000000000000000000005f5b61208284866135c9565b9050811015612251578061224b866120ef610b878a611115610b7861110a6110f16120c0610af98f9c610c2860019e6120ba8a613618565b9c6135c9565b946120db6120cc610501565b6001600160a01b03909a168a52565b610c2e60208a0196879063ffffffff169052565b612137612132610ad361211d6121048c613618565b6001600160a01b03165f908152609e6020526040902090565b6121268561414a565b5f5260205260405f2090565b613984565b61216e61215f6121468a613618565b6001600160a01b03165f908152609c6020526040902090565b6121688361414a565b9061565a565b5061219b61218c61217e8361414a565b5f52609a60205260405f2090565b6121958a613618565b90615082565b506121a8610c3389613618565b7fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe604051806121d785826135a3565b0390a261221a6121e786886139b2565b916122056121f3610501565b5f815263ffffffff9094166020850152565b6121266122146121048c613618565b9161414a565b906020908051151560ff80198554169116178355015164ffffffff0082549160081b169064ffffffff001916179055565b01612078565b83868661227f612266610c33610fa785613618565b9361227961227384613618565b94613618565b926135c9565b939091813b156107bf575f80946122ac6040519788968795869463181e54ab60e11b865260048601613a0c565b03925af180156107ba576122bc57005b8061150e5f610789936104e0565b506120456122dd61203060208401613618565b905061203c565b90602080835192838152019201905f5b8181106123015750505090565b82516001600160a01b03168452602093840193909201916001016122f4565b90602061082a9281815201906122e4565b346106b65760403660031901126106b15761234e6118bf366105b1565b5f52609a60205260405f206040519081602082549182815201915f5260205f20905f5b8181106123945761088285612388818703826104e0565b60405191829182612320565b8254845260209093019260019283019201612371565b346106b6575f3660031901126106b1576123c2615095565b603380546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346106b65760203660031901126106b15760043561242281610410565b6001600160a01b03165f818152609c6020526040902054612442816133e5565b915f5b82811061245a57604051806108828682610819565b600190825f52609c6020526124756108a18260405f2061524c565b61247f8287613448565b5261248a8186613448565b5001612445565b346106b6575f3660031901126106b157602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346106b6575f3660031901126106b1576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b90602061082a928181520190611720565b346106b65760803660031901126106b1576004356001600160401b038111610ccc57612556903690600401610d32565b61255f36610571565b9060643561256c81610410565b61257682516138f3565b925f5b83518110156125cd576001906125af846001600160a01b0361259b8489613448565b51166125a561328b565b506106748661414a565b90506125bb8288613448565b526125c68187613448565b5001612579565b604051806108828782612515565b346106b6575f3660031901126106b1576033546040516001600160a01b039091168152602090f35b346106b65760603660031901126106b15760043561262081610410565b6024356001600160401b038111610ccc5761263f903690600401610d32565b9060443561264c81610563565b6126568351613689565b925f926001600160a01b03169163ffffffff16905b805184101561276b575f83815260a1602052604090206126ad906001600160a01b036126978785613448565b511660018060a01b03165f5260205260405f2090565b938454945f955b808710612723576001939495965080155f146126fb57506126f29050670de0b6b3a76400005b6126e48389613448565b906001600160401b03169052565b0192919061266b565b61061e61271c6126f2936127116126da946136cf565b905f5260205f200190565b5460201c90565b8087169080881860011c820180921161276657825f528563ffffffff8360205f20015416115f146127575750955b956126b4565b96506001810180911115612751575b6136bb565b604051806108828782611964565b346106b65760403660031901126106b15760043561279681610410565b6024356001600160401b038111610ccc5736602382011215610a60578060040135916127c183610d1b565b916127cf60405193846104e0565b8383526024602084019460051b82010190368211610a565760248101945b8286106127fe576107898585613a35565b85356001600160401b038111610a60578201608060231982360301126105ac576040519061282b826104aa565b61283836602483016105e8565b825260648101356001600160401b0381116128f75761285d9060243691840101610d32565b602083015260848101356001600160401b0381116128f757602491010136601f82011215610a6057803561289081610d1b565b9161289e60405193846104e0565b81835260208084019260051b82010190368211610a5657602001915b8183106128d75750505060408201528152602095860195016127ed565b82356001600160401b0381168103610421578152602092830192016128ba565b610512565b346106b657602061293f61293a612912366116fb565b6001600160a01b039182165f90815260a1865260408082209290931681526020919091522090565b615210565b6001600160401b0360405191168152f35b346106b65760403660031901126106b15760043561296d81610410565b602435906001600160401b038211610ccc5736602383011215610a60578160040135906001600160401b038211610a5b573660248385010111610a56576024610789930190613e91565b346106b65760403660031901126106b1576004356129d481610410565b6024356001600160401b038111610ccc576129f3903690600401611fd5565b612a04611060600480606654161490565b612a10610aae836143d3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156107bf576040516336b87bd760e11b81526001600160a01b038416600482015290602090829060249082905afa80156107ba57612a80915f91611e66575061396e565b60208101916001600160a01b03811691905f5b612a9d85846135c9565b9050811015612bcd5780612bc7612bba87612b13610b87612ad0610af9600198610c28612ac98d613618565b968d6135c9565b612aea612adb610501565b6001600160a01b039095168552565b63ffffffff1660208401908152835161111590610b789061110a906001600160a01b03166110f1565b612b2c612b27612b2383896132be565b1590565b613f1b565b6001600160a01b0386165f908152609c60205260409020612b5090610b818361414a565b50612b6686612b6161217e8461414a565b614478565b50877f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e60405180612b9785826135a3565b0390a26001600160a01b0386165f908152609e6020526040902061212690612214565b805460ff19166001179055565b01612a93565b50612c039184612be2610c33610fa784613618565b90612bf6612bef84613618565b91846135c9565b95909360408101906137d6565b9094833b156107bf576122ac5f96928793604051998a988997889663631fea8160e11b885260048801613f31565b346106b65760403660031901126106b157612c4e6118bf366105b1565b5f52609a602052602060405f2054604051908152f35b346106b657610b87612cc0612c7836611b0b565b9391612c89610aae859793976143d3565b611115610b7861110a60405196612c9f8861048a565b6001600160a01b038116885263ffffffff90941660208801908152936110f1565b612cc98161414a565b905f5b838110612cd557005b600190612d01611238612cf0865f52609960205260405f2090565b612195610c33610c2e868b8d613608565b7f7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee612d33611c37610c2e84898b613608565b0390a101612ccc565b346106b65760203660031901126106b157604063ffffffff612d68600435612d6381610410565b613fb2565b835191151582529091166020820152f35b346106b65760203660031901126106b157600435612d9681610410565b60018060a01b03165f526098602052602060405f2054604051908152f35b346106b65760603660031901126106b157600435612dd181610410565b612dda36610571565b9060018060a01b03165f52609f602052612df760405f209161414a565b5f5260205260405f206040519081602082549182815201915f5260205f20905f5b818110612e2f57610882856118fe818703826104e0565b8254845260209093019260019283019201612e18565b346106b65760403660031901126106b157600435612e6281610410565b612ea76024355f5492612e8d60ff600886901c161580958196612f25575b8115612f05575b50614067565b83612e9e600160ff195f5416175f55565b612eee576140ca565b612ead57005b612ebb61ff00195f54165f55565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989080602081016116f1565b612f0061010061ff00195f5416175f55565b6140ca565b303b15915081612f17575b505f612e87565b60ff1660011490505f612f10565b600160ff8216109150612e80565b346106b65760403660031901126106b157600435612f5081610410565b60243590612f5d82610410565b612f69610aae826143d3565b6001600160a01b03821691823b156107bf5760405163b526578760e01b81526001600160a01b038316600482015292602090849060249082905afa9081156107ba57612fe1613017927f2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf85955f91613043575b506140db565b6001600160a01b0383165f90815260976020526040902080546001600160a01b0319166001600160a01b03909216919091179055565b61302081613622565b604080516001600160a01b039384168152929091166020830152819081016116f1565b61305c915060203d6020116107b3576107a581836104e0565b5f612fdb565b346106b6575f3660031901126106b1576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346106b65760203660031901126106b1576004356130c381610410565b6130cb615095565b6001600160a01b038116156130e357610789906150ed565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346106b657602061314a611fbc366116fb565b506001600160401b0360405191168152f35b346106b65760203660031901126106b1576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600435813b156107bf5760206004926040519384809263755b36bd60e11b82525afa9182156107ba575f926131e5575b50610789916131e0906001600160a01b031633146140f1565b614107565b91506020823d602011613220575b81613200602093836104e0565b810103126106b1576131e0610789925161321981610410565b92506131c7565b3d91506131f3565b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b60405190613298826104aa565b5f6040838281528260208201520152565b6106746132b9939261066e61328b565b905090565b6001600160a01b03165f908152609e60205260409020906132de9061414a565b5f52602052602060405f20604051906132f68261048a565b549063ffffffff60ff831615159283835260081c169283910152151590811561331d575090565b63ffffffff16431115919050565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b908160209103126106b1575180151581036104215790565b6040513d5f823e3d90fd5b156133a857565b631d77d47760e21b5f5260045ffd5b156133be57565b63c61dca5d60e01b5f5260045ffd5b604051906133da8261048a565b5f6020838281520152565b906133ef82610d1b565b6133fc60405191826104e0565b828152809261340d601f1991610d1b565b01905f5b82811061341d57505050565b6020906134286133cd565b82828501015201613411565b634e487b7160e01b5f52603260045260245ffd5b805182101561345c5760209160051b010190565b613434565b1561346857565b63932d94f760e01b5f5260045ffd5b1561347e57565b6348f7dbb960e01b5f5260045ffd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206f6666736574000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206c656e677468000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527f43616c6c64617461207461696c20746f6f2073686f72740000000000000000006044820152606490fd5b919081101561345c5760051b81013590603e198136030182121561357e570190565b61348d565b3561082a81610563565b1561359457565b631fb1705560e21b5f5260045ffd5b81516001600160a01b0316815260209182015163ffffffff169181019190915260400190565b903590601e198136030182121561357e57018035906001600160401b03821161360357602001918160051b360383136135fe57565b613517565b6134d2565b919081101561345c5760051b0190565b3561082a81610410565b6001600160a01b039081165f81815260976020526040902054909116806132b9575090565b1561364e57565b63840a48d560e01b5f5260045ffd5b1561366457565b6343714afd60e01b5f5260045ffd5b1561367a57565b63ebbff49760e01b5f5260045ffd5b9061369382610d1b565b6136a060405191826104e0565b82815280926136b1601f1991610d1b565b0190602036910137565b634e487b7160e01b5f52601160045260245ffd5b5f1981019190821161276657565b156136e457565b639f1c805360e01b5f5260045ffd5b156136fa57565b631353603160e01b5f5260045ffd5b1561371057565b6331bc342760e11b5f5260045ffd5b906001600160401b03809116911603906001600160401b03821161276657565b600f0b6f7fffffffffffffffffffffffffffffff198114612766575f0390565b90600f0b90600f0b019060016001607f1b0319821260016001607f1b0383131761276657565b6001600160a01b039182168152825182166020808301919091529092015163ffffffff9081166040840152921660608201526001600160401b0390921660808301529190911660a082015260c00190565b903590601e198136030182121561357e57018035906001600160401b038211613603576020019181360383136135fe57565b908060209392818452848401375f828201840152601f01601f1916010190565b6001600160a01b03918216815282519091166020808301919091529091015163ffffffff1660408201529095949293918060c0830160c060608501525260e0820196905f5b8181106138c25750505080860360808201526020808551978881520194015f965b8088106138aa57505061082a94955060a0818503910152613808565b9094602080600192885181520196019701969061388e565b90919760206138e96001928b356138d881610410565b6001600160a01b0316815260200190565b990192910161386d565b906138fd82610d1b565b61390a60405191826104e0565b828152809261391b601f1991610d1b565b01905f5b82811061392b57505050565b60209061393661328b565b8282850101520161391f565b1561394957565b63585cfb2f60e01b5f5260045ffd5b1561395f57565b6348f5c3ed60e01b5f5260045ffd5b1561397557565b63ccea9e6f60e01b5f5260045ffd5b1561398b57565b6325131d4f60e01b5f5260045ffd5b63ffffffff60019116019063ffffffff821161276657565b9063ffffffff8091169116019063ffffffff821161276657565b916020908281520191905f5b8181106139e55750505090565b90919260208060019263ffffffff87356139fe81610563565b1681520194019291016139d8565b6001600160a01b0391821681529116602082015260606040820181905261082a939101916139cc565b90613a6790613a4b611060600180606654161490565b613a57611e10846143d3565b613a6083613fb2565b9290613e0a565b5f925b8151841015613e0457613a9c6020613a828685613448565b510151516040613a928786613448565b510151511461365d565b613aa68483613448565b515191613ad6610b87613ac26110f1865160018060a01b031690565b611115610b78602088015163ffffffff1690565b613ae083836132be565b935f5b6020613aef8885613448565b51015151811015613df557807f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd613b9c82613cb6878b8d8c8c613b52613b4560019c6020613b3d878a613448565b510151613448565b516001600160a01b031690565b968793613b5f8584614bcd565b613b7285613b6c8661414a565b856141e5565b9a8b989197613b94613b8e610b7860408d015163ffffffff1690565b15613e20565b898888615135565b613be3613bd9613bb38b516001600160401b031690565b613bd3613bc6886040613b3d8a8a613448565b516001600160401b031690565b90615194565b600f0b60208b0152565b613c04613bfd613bf760208c0151600f0b90565b600f0b90565b1515613e36565b6020890151600f0b805f811215613d6b57505015613d02575050506001600160a01b03165f90815260a360205260409020613c5e92613c589161221491905b9060018060a01b03165f5260205260405f2090565b906151c5565b613ca6613c99613c947f000000000000000000000000000000000000000000000000000000000000000063ffffffff43166139b2565b61399a565b63ffffffff166040840152565b83613cb08d61414a565b8c6148ac565b613cf9613ceb6040613cdf613cd286516001600160401b031690565b6020870151600f0b6115ca565b94015163ffffffff1690565b6040519384938c8c86613785565b0390a101613ae3565b613d549550613d479450613bc69350604091613b3d91613d4260208a016113768c6115ca6020613d3985516001600160401b031690565b920151600f0b90565b613448565b6001600160401b03168352565b5f60208301524363ffffffff166040830152613ca6565b95509650505050505f915013613d82575b50613ca6565b613db7613ddc91613bc6613daa6020860192613da584516001600160401b031690565b614825565b6001600160401b03168252565b6001600160401b03613dd361061e85516001600160401b031690565b91161115613e4c565b613def613c998a63ffffffff43166139b2565b5f613d7c565b50935091509260010192613a6a565b50505050565b15613e1157565b63fa55fc8160e01b5f5260045ffd5b15613e2757565b630d8fcbe360e41b5f5260045ffd5b15613e3d57565b634606179360e11b5f5260045ffd5b15613e5357565b636c9be0bf60e01b5f5260045ffd5b6001600160a01b039081165f90815260a160209081526040808320939094168252919091522061082a90615210565b907fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c94371391613ec0610aae826143d3565b6001600160a01b03165f81815260a4602052604090205490939060ff1615613eff575b613efa604051928392602084526020840191613808565b0390a2565b835f5260a460205260405f20600160ff19825416179055613ee3565b15613f2257565b636c6c6e2760e11b5f5260045ffd5b6001600160a01b0391821681529116602082015260806040820181905261082a95919491939192613f669291860191906139cc565b926060818503910152613808565b90604051613f81816104c5565b606063ffffffff829454818116845260ff8160201c1615156020850152818160281c16604085015260481c16910152565b60018060a01b03165f52609b60205260405f2090606060405192613fd5846104c5565b5461402d61402361401d63ffffffff841680885260ff8560201c1615159788602082015263ffffffff808760281c169687604084015260481c16968791015263ffffffff1690565b95151590565b9263ffffffff1690565b63ffffffff811615159081614056575b5061404757509190565b9192505063ffffffff16600191565b63ffffffff1690504310155f61403d565b1561406e57565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b6140d661051092614377565b6150ed565b156140e257565b631d0b13c160e31b5f5260045ffd5b156140f857565b63794821ff60e01b5f5260045ffd5b6141186066541982198116146133b7565b806066556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a2565b602081519101516040519060208201926bffffffffffffffffffffffff199060601b16835263ffffffff60a01b9060a01b166034820152602081526141906040826104e0565b51905190602081106141a0575090565b5f199060200360031b1b1690565b906040516141bb816104aa565b604063ffffffff8294546001600160401b038116845280831c600f0b602085015260c01c16910152565b92916142ae6142b3916141f66133cd565b506141ff61328b565b50613c4361422461293a83613c438a60018060a01b03165f5260a160205260405f2090565b946142a161425661424985613c438c60018060a01b03165f5260a260205260405f2090565b546001600160401b031690565b98614271614262610501565b6001600160401b039099168952565b614288602089019a8b906001600160401b03169052565b6001600160a01b03165f90815260a06020526040902090565b905f5260205260405f2090565b6141ae565b9260408401906142ca610b78835163ffffffff1690565b431061433d575f80926142e487516001600160401b031690565b926143086142fb60208a01956115ca8751600f0b90565b6001600160401b03168952565b8351600f0b9083821261431e575b505052529190565b61137661433692613da583516001600160401b031690565b5f80614316565b50509190565b5f196066556040515f1981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2565b806066556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2565b6143b16133cd565b5063ffffffff604051916143c48361048a565b8060601c835216602082015290565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156107bf57604051631beb2b9760e31b81526001600160a01b0390911660048201523360248201523060448201525f80356001600160e01b03191660648301529091602091839160849183915af19081156107ba575f9161445f575090565b61082a915060203d6020116107b3576107a581836104e0565b61082a916001600160a01b03169061527e565b9061449582610d1b565b6144a260405191826104e0565b82815280926144b3601f1991610d1b565b01905f5b8281106144c357505050565b8060606020809385010152016144b7565b6020818303126106b1578051906001600160401b038211610ccc57019080601f83011215610a605781519061450882610d1b565b9261451660405194856104e0565b82845260208085019360051b82010190828211610a565760208101935b82851061454257505050505090565b84516001600160401b038111610a6057820184603f82011215610a605760208101519061456e82610d1b565b9161457c60405193846104e0565b8083526020808085019260051b8401010191878311610a5657604001905b8282106145b257505050815260209485019401614533565b815181526020918201910161459a565b90916145d961082a936040845260408401906122e4565b916020818403910152611855565b909391926145f5855161448b565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156107bf575f6040518093637870733b60e11b825281806146488b8d600484016145c2565b03915afa9182156107ba575f926147d5575b50939590935f90670de0b6b3a7640000955b83518310156147ca57614682613b458486613448565b9361468d8951613689565b6146978589613448565b526146a28488613448565b505f5b89518110156147bc578087876146c0613b456001958f613448565b8c6001600160401b036146ea61293a84613c438760018060a01b03165f5260a160205260405f2090565b16918983156147b1576147599561470b6147409361061e93614745986132a9565b9063ffffffff80614723604085015163ffffffff1690565b92169116111580614798575b61476f57516001600160401b031690565b61545e565b61475383610f638a89613448565b51615349565b61476782610f63898d613448565b525b016146a5565b614793613daa61478683516001600160401b031690565b6020840151600f0b6115ca565b613bc6565b505f6147a86020830151600f0b90565b600f0b1261472f565b505050505050614769565b50935060019092019161466c565b505050505092915050565b6147f29192503d805f833e6147ea81836104e0565b8101906144d4565b905f61465a565b90670de0b6b3a76400009061480e8184615349565b92096148175790565b600181018091116127665790565b906001600160401b0361483b9216600f0b61375f565b6001600160401b0381600f0b11614858576001600160401b031690565b60405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b6064820152608490fd5b93909260206148d261424985613c438960018060a01b03165f5260a260205260405f2090565b910180516001600160401b039081169216829003614a75575b50506149738161491384613c43876142a18a60018060a01b03165f5260a060205260405f2090565b81518154602084015160409485015163ffffffff60c01b60c09190911b1677ffffffffffffffffffffffffffffffff00000000000000009190951b166001600160e01b03199091166001600160401b039092169190911717919091179055565b6020810151600f0b156149dd5750826149bb6149d5926149aa856142a16149da9860018060a01b03165f52609f60205260405f2090565b6001600160a01b039091169061527e565b506001600160a01b03165f908152609d6020526040902090565b61527e565b50565b516001600160401b0316156149f157505050565b614a2690612168610c33614a19856142a18860018060a01b03165f52609f60205260405f2090565b926001600160a01b031690565b506001600160a01b0382165f908152609f60205260409020614a499082906142a1565b5415614a53575050565b614a706149da9260018060a01b03165f52609d60205260405f2090565b61565a565b614ada614b0b91613bc67facf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc5594614abf88613c438c60018060a01b03165f5260a260205260405f2090565b906001600160401b03166001600160401b0319825416179055565b604080516001600160a01b03808a168252871660208201526001600160401b03909216908201529081906060820190565b0390a15f806148eb565b6001600160a01b038181165f90815260a1602090815260408083209386168352929052207f1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c93614bae91614b7b906001600160401b0383169063ffffffff431690615769565b604080516001600160a01b0394851681529490931660208501526001600160401b03169183019190915281906060820190565b0390a1565b5f1981146127665760010190565b8015612766575f190190565b6001600160a01b038082165f90815260a36020908152604080832093861683529290529081209093929190614c0d905b5480600f0b9060801d600f0b0390565b935b84151580614cc6575b15614cbf57614c43614c3e84613c438560018060a01b03165f5260a360205260405f2090565b615495565b614c4e8482856141e5565b91614c63610b78604085015163ffffffff1690565b4310614cb557614ca992614caf949287614c7d93886148ac565b614ca3614c9e86613c438760018060a01b03165f5260a360205260405f2090565b6154da565b50614bb3565b94614bc1565b93614c0f565b5050505050509050565b5050509050565b5061ffff8110614c18565b6001600160a01b038181165f90815260a3602090815260408083209386168352929052908120909490614d0390614bfd565b945b85151580614dae575b15614da657614d34614c3e85613c438660018060a01b03165f5260a360205260405f2090565b614d3f8582866141e5565b91614d54610b78604085015163ffffffff1690565b4310614d9b57614d8f92614d95949288614d6e93896148ac565b614ca3614c9e87613c438860018060a01b03165f5260a360205260405f2090565b95614bc1565b94614d05565b505050509350505050565b509350505050565b5061ffff85168110614d0e565b907f4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db91614bae614f08614e06614e018460018060a01b03165f52609b60205260405f2090565b613f74565b610b8c6060820191614e1c835163ffffffff1690565b63ffffffff811615159081614f63575b50614f39575b63ffffffff87166040820152614e7e614e74613c947f000000000000000000000000000000000000000000000000000000000000000063ffffffff43166139b2565b63ffffffff168452565b6001600160a01b0386165f908152609b602052604090208151815460208085015160408601516060909601516cffffffff00000000000000000060489190911b1668ffffffff000000000060289790971b9690961664ff0000000091151590921b166cffffffffffffffffffffffffff1990921663ffffffff909316929092171717919091179055565b604080516001600160a01b03909416845263ffffffff94851660208501529316928201929092529081906060820190565b614f57614f4d604083015163ffffffff1690565b63ffffffff168252565b60016020820152614e32565b63ffffffff1690504310155f614e2c565b90916001600160401b03614f9c84613c438560018060a01b03165f5260a260205260405f2090565b541683614fc1614bfd8396613c438760018060a01b03165f5260a360205260405f2090565b5f905b808210614ff3575b505061293a61132691613c4361082a959660018060a01b03165f5260a160205260405f2090565b9092506150436142ae83613c436150278761502284613c438d60018060a01b03165f5260a360205260405f2090565b615565565b6001600160a01b038a165f90815260a0602052604090206142a1565b615057610b78604083015163ffffffff1690565b431061507a576020015160019661507091600f0b6115ca565b9586930190614fc4565b869350614fcc565b61082a916001600160a01b03169061565a565b6033546001600160a01b031633036150a957565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b9061514261516a9261414a565b5f52609960205260405f209060018060a01b0316906001915f520160205260405f2054151590565b918261518c575b508161517b575090565b6001600160401b0391505116151590565b91505f615171565b6001600160401b03809116600f0b9116600f0b0360016001607f1b03811360016001607f1b03198212176127665790565b90815460801d906151e4826001850190600f0b5f5260205260405f2090565b5581546001600160801b0316600190910160801b6fffffffffffffffffffffffffffffffff1916179055565b8054806152265750670de0b6b3a7640000919050565b805f19810111612766576001600160401b03915f525f199060205f2001015460201c1690565b805482101561345c575f5260205f2001905f90565b9161527a9183549060031b91821b915f19901b19161790565b9055565b5f8281526001820160205260409020546152e157805490600160401b8210156104a557826152cc6152b684600180960185558461524c565b819391549060031b91821b915f19901b19161790565b90558054925f520160205260405f2055600190565b50505f90565b81156152f1570490565b634e487b7160e01b5f52601260045260245ffd5b1561530c57565b60405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b6044820152606490fd5b5f19828209828202918280831092039180830392146153ad577faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066993670de0b6b3a764000091615399848411615305565b0990828211900360ee1b910360121c170290565b50670de0b6b3a76400009250500490565b5f19670de0b6b3a7640000820991670de0b6b3a764000082029182808510940393808503941461545257670de0b6b3a764000082916153fe868411615305565b09600182190182168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b509061082a92506152e7565b90915f198383099280830292838086109503948086039514615488579082916153fe868411615305565b50509061082a92506152e7565b6154aa815480600f0b9060801d600f0b131590565b6154cb578054600f0b5f9081526001909101602052604090205490565b5490565b631ed9509560e11b5f5260045ffd5b906154f0825480600f0b9060801d600f0b131590565b6154cb578154600f0b9160018101925f61552b82615519818890600f0b5f5260205260405f2090565b549690600f0b5f5260205260405f2090565b5560016001600160801b031983541691016001600160801b0316179055565b9190915f838201938412911290801582169115161761276657565b805490916001600160ff1b0381116155c957613bf761559261558d6155999385600f0b61554a565b61582f565b9260801d90565b81600f0b12156155ba5760016154c7920190600f0b5f5260205260405f2090565b632d0483c560e21b5f5260045ffd5b60405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b6064820152608490fd5b80548015615646575f190190615635828261524c565b8154905f199060031b1b1916905555565b634e487b7160e01b5f52603160045260245ffd5b6001810191805f528260205260405f2054928315155f146156f5575f1984018481116127665783545f19810194908511612766575f9585836142a1946156a898036156ae575b50505061561f565b55600190565b6156de6156d8916156cf6156c56156ec958861524c565b90549060031b1c90565b9283918761524c565b90615261565b85905f5260205260405f2090565b555f80806156a0565b505050505f90565b1561570457565b63151b8e3f60e11b5f5260045ffd5b8054600160401b8110156104a5576157309160018201815561524c565b61575657815160209283015190921b63ffffffff191663ffffffff909216919091179055565b634e487b7160e01b5f525f60045260245ffd5b8054806157a5575b506157a061051093615790615784610501565b63ffffffff9095168552565b6001600160e01b03166020840152565b615713565b805f1981011161276657815f5263ffffffff615800610b785f198460205f200101610b8c6157f2604051926157d98461048a565b548681169081855260201c602085015263ffffffff1690565b8589169586911611156156fd565b036157715761051093925090612711615818926136cf565b9063ffffffff82549181199060201b169116179055565b9081600f0b91820361583d57565b60405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b6064820152608490fdfea26469706673582212201bd8db24bd408a798efb1737d110d078edc1ba7ea8484c23fbb9b2a823f3e42a64736f6c634300081c0033"; + +type AllocationManagerConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: AllocationManagerConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class AllocationManager__factory extends ContractFactory { + constructor(...args: AllocationManagerConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + _delegation: string, + _pauserRegistry: string, + _permissionController: string, + _DEALLOCATION_DELAY: BigNumberish, + _ALLOCATION_CONFIGURATION_DELAY: BigNumberish, + _version: string, + overrides?: Overrides & { from?: string } + ): Promise { + return super.deploy( + _delegation, + _pauserRegistry, + _permissionController, + _DEALLOCATION_DELAY, + _ALLOCATION_CONFIGURATION_DELAY, + _version, + overrides || {} + ) as Promise; + } + override getDeployTransaction( + _delegation: string, + _pauserRegistry: string, + _permissionController: string, + _DEALLOCATION_DELAY: BigNumberish, + _ALLOCATION_CONFIGURATION_DELAY: BigNumberish, + _version: string, + overrides?: Overrides & { from?: string } + ): TransactionRequest { + return super.getDeployTransaction( + _delegation, + _pauserRegistry, + _permissionController, + _DEALLOCATION_DELAY, + _ALLOCATION_CONFIGURATION_DELAY, + _version, + overrides || {} + ); + } + override attach(address: string): AllocationManager { + return super.attach(address) as AllocationManager; + } + override connect(signer: Signer): AllocationManager__factory { + return super.connect(signer) as AllocationManager__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): AllocationManagerInterface { + return new utils.Interface(_abi) as AllocationManagerInterface; + } + static connect( + address: string, + signerOrProvider: Signer | Provider + ): AllocationManager { + return new Contract(address, _abi, signerOrProvider) as AllocationManager; + } +} diff --git a/src/avs/contracts/factories/ReclaimServiceManager__factory.ts b/src/avs/contracts/factories/ReclaimServiceManager__factory.ts index fbac7e73..7def2627 100644 --- a/src/avs/contracts/factories/ReclaimServiceManager__factory.ts +++ b/src/avs/contracts/factories/ReclaimServiceManager__factory.ts @@ -493,6 +493,19 @@ const _abi = [ outputs: [], stateMutability: "nonpayable", }, + { + type: "function", + name: "slashingRegistryCoordinator", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract ISlashingRegistryCoordinator", + }, + ], + stateMutability: "view", + }, { type: "function", name: "taskManager", @@ -625,7 +638,7 @@ const _abi = [ ] as const; const _bytecode = - "0x61016080604052346102b857604051601f612d9438819003918201601f19168301916001600160401b038311848410176102a45780849260e094604052833981010312610254578051906001600160a01b0382168203610250576020810151906001600160a01b03821682036102505760408101516001600160a01b03811681036102505760608201516001600160a01b0381169390849003610250576080830151936001600160a01b03851685036102505760a0840151936001600160a01b03851685036102505760c00151956001600160a01b03871687036102505760805260c05260e052610100526101205260a0525f5460ff8160081c166101fb5760ff808216036101c1575b5061014052604051612a8e908161030682396080518181816107300152818161081c01528181610d3a015261109e015260a05181610554015260c0518181816101d6015281816108c30152610b84015260e0518181816104fb015281816107ec01528181610d1201528181611c9801526123d6015261010051818181611de5015261243501526101205181818161065a01528181610c1101528181611525015281816115a40152611645015261014051816107a10152f35b60ff90811916175f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a181610109565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b5f80fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fdfe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b5f5f3560e01c80631785f53c146116215780631fdb0cfd1461158a578063279432eb146115015780632e8da829146114d457806333cfb7b7146114b05780633bc28c8c1461148b578063485cc955146111dc57806352efdca014611114578063630868dc146110cd5780636b3aa72e14611089578063715018a61461102c5780638da5cb5b1461100457806396d356c514610e7b5780639926ee7d14610c765780639da16d8e14610bed578063a0169ddd14610b60578063a20b99bf14610885578063a364f4da146107d0578063a50a640e1461078c578063a98fb355146106e4578063ba55088014610640578063c1a8e2c51461047d578063e481af9d14610452578063f2fde38b146103c1578063fc299dee146103995763fce36c7d1461019a575061000e565b34610394576020366003190112610279576004356001600160401b03811161038f576101ca903690600401611a4b565b91906101d4612773565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690825b84811061032b5750813b15610326576040519363fce36c7d60e01b855280602486016020600488015252604485019060448160051b8701019280928690609e1983360301905b8483106102895788808b8181808c0381838f5af1801561027e576102685750f35b81610272916118d2565b6102795780f35b61171c565b6040513d84823e3d90fd5b9091929394956043198a8203018252863590838212156103215760208091876001940190608063ffffffff61030d826102d36102c5878061233c565b60a0885260a0880191612370565b95898060a01b036102e58983016117d6565b1688870152604081013560408701528361030160608301611aeb565b16606087015201611aeb565b169101529801920193019190949392610247565b6122f7565b611afc565b8061036061034760206103416001958a88612653565b01612259565b6040610354848a88612653565b01359030903390612796565b6103896103736020610341848a88612653565b856040610381858b89612653565b0135916127e1565b01610201565b61176c565b6116cc565b503461039457366003190112610279576065546040516001600160a01b039091168152602090f35b5034610394576020366003190112610279576103db6117bc565b6103e3612675565b6001600160a01b038116156103fe576103fb9061272b565b80f35b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b5034610394573660031901126102795761047961046d6123d4565b60405191829182611835565b0390f35b5034610394576040366003190112610279576104976117bc565b90602435916001600160401b03831161038f573660238401121561063b578260040135926104c484611ad4565b936104d260405195866118d2565b8085526024602086019160051b8301019136831161063657602401905b82821061061e575050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361060f5760405190610536826118a3565b6001600160a01b0390811682523060208301908152604083019485527f000000000000000000000000000000000000000000000000000000000000000090911693909190843b1561032657604051636e3492b560e01b815260206004820181905292516001600160a01b03908116602483015293519093166044840152516060606484015280516084840181905260a48401929190910190845b8181106105f357505050818394818581819503925af1801561027e576102685750f35b825163ffffffff168452602093840193909201916001016105d0565b634394dbdf60e11b8252600482fd5b6020809161062b84611aeb565b8152019101906104ef565b6119f2565b6118f3565b50346103945761064f366117ea565b91610658612675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692833b1561032657604051630664120160e01b81523060048201526001600160a01b0392831660248201529290911660448301526001600160e01b0319166064820152829182908290818381608481015b03925af1801561027e576102685750f35b5034610394576020366003190112610279576004356001600160401b03811161038f573660238201121561063b57610726903690602481600401359101611967565b61072e612675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561032657826106d38193829360405194858094819363a98fb35560e01b835260206004840152602483019061210a565b503461039457366003190112610279576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5034610394576020366003190112610279576107ea6117bc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361060f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610326576040516351b27a6d60e11b81526001600160a01b03909216600483015282919082908290602490829084905af1801561027e576102685750f35b5034610394576020366003190112610279576004356001600160401b03811161038f576108b6903690600401611a4b565b6108c1929192612773565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316825b828110610aab5750803b156103265760405191634e5cd2fd60e11b835280604484013060048601526040602486015252606483019460648260051b8501019181869060be19813603015b838310610958578880898181808b0381838e5af1801561027e576102685750f35b9091929394606319888203018a528535828112156103215783019061098e610980838061233c565b60c0845260c0840191612370565b916001600160a01b036109a3602083016117d6565b16602083015260206109b8604083018361233c565b848603604086015280865294909101938c905b808210610a7b5750505063ffffffff6109e660608301611aeb565b16606083015263ffffffff6109fd60808301611aeb565b16608083015260a0810135601e19823603018112156103215701906020823592016001600160401b038311610a76578236038113610a715783836020948594938460a0879660019a03910152818452848401378d838284010152601f8019910116010197019a019301919098939298610937565b6122b2565b61226d565b909194604080600192838060a01b03610a938a6117d6565b168152602089013560208201520196019201906109cb565b909291829483955b610acb610ac1858585612173565b604081019061219a565b9050871015610b1b57610ae2610ac1858585612173565b881015610b07576001916020610aff928a60061b01013590611bf4565b960195610ab3565b634e487b7160e01b86526032600452602486fd5b600192949593919650610b5a90610b4481308a610b3f6020610341898d3395612173565b612796565b84610b556020610341868a8d612173565b6127e1565b016108ed565b503461039457602036600319011261027957610b7a6117bc565b610b82612675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103265760405163a0169ddd60e01b81526001600160a01b03909216600483015282919082908290602490829084905af1801561027e576102685750f35b503461039457602036600319011261027957610c076117bc565b610c0f612675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561032657604051634f906cf960e01b81523060048201526001600160a01b039091166024820152829182908290818381604481016106d3565b503461039457604036600319011261027957610c906117bc565b6024356001600160401b03811161038f5760606003198236030112610e2a5760405191610cbc836118a3565b81600401356001600160401b038111610dd95782013660238201121561063b57610cf0903690602460048201359101611967565b8352602083019060248301358252604460408501930135835260018060a01b037f0000000000000000000000000000000000000000000000000000000000000000163303610dca577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561032657859485610dac93819560405197889687958694639926ee7d60e01b865260018060a01b0316600486015260406024860152516060604486015260a485019061210a565b9151606484015251608483015203925af1801561027e576102685750f35b634394dbdf60e11b8552600485fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b503461039457602036600319011261027957610e956117bc565b610e9d612675565b610ea681611b4f565b15610fa1576001600160a01b0316815b60975480821015610f9b5782610ecb83611877565b905460039190911b1c6001600160a01b031614610eeb5750600101610eb6565b9091505f198101908111610f875790610f21610f09610f4593611877565b905460039190911b1c6001600160a01b031691611877565b81546001600160a01b0393841660039290921b91821b9390911b1916919091179055565b6097548015610f73575f1901610f5a81611877565b81549060018060a01b039060031b1b1916905560975580f35b634e487b7160e01b82526031600452602482fd5b634e487b7160e01b83526011600452602483fd5b50505080f35b60405162461bcd60e51b815260206004820152603560248201527f72656d6f76654f70657261746f7246726f6d57686974656c6973743a206f70656044820152741c985d1bdc881b9bdd081dda1a5d195b1a5cdd1959605a1b6064820152608490fd5b503461039457366003190112610279576033546040516001600160a01b039091168152602090f35b5034610394578060031936011261027957611045612675565b603380546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461039457366003190112610279576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461039457602036600319011261027957600435906097548210156111115760206110f883611877565b905460405160039290921b1c6001600160a01b03168152f35b80fd5b50346103945760203660031901126102795761112e6117bc565b611136612675565b61113f81611b4f565b61117a57609754600160401b8110156111665790610f218260016103fb9401609755611877565b634e487b7160e01b83526041600452602483fd5b60405162461bcd60e51b815260206004820152603460248201527f6164644f70657261746f72546f57686974656c6973743a206f70657261746f7260448201527308185b1c9958591e481dda1a5d195b1a5cdd195960621b6064820152608490fd5b5034610394576040366003190112610279576111f66117bc565b602435906001600160a01b03821682036114875782549160ff8360081c16159283809461147a575b8015611463575b156114075760ff1981166001178555836113f6575b5060ff845460081c161561139d576112546112599261272b565b6126cd565b60209060405161126983826118d2565b8381525f3681378051906001600160401b03821161138957600160401b821161138957839060975483609755808410611328575b500160978552845b8281106112ed575050506112b7575080f35b7f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989061ff0019835416835560405160018152a180f35b81516001600160a01b03167f354a83ed9988f79f6038d4c7a7dadbad8af32f4ad6df893e0e5807a1b1944ff9820155908401906001016112a5565b7f354a83ed9988f79f6038d4c7a7dadbad8af32f4ad6df893e0e5807a1b1944ff901837f354a83ed9988f79f6038d4c7a7dadbad8af32f4ad6df893e0e5807a1b1944ff9015b81811061137b575061129d565b87815586935060010161136e565b634e487b7160e01b85526041600452602485fd5b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b61ffff19166101011784555f61123a565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b1580156112255750600160ff821614611225565b50600160ff82161061121e565b8280fd5b5034610394576020366003190112610279576103fb6114a86117bc565b611254612675565b346103945760203660031901126102795761047961046d6114cf6117bc565b611c96565b346103945760203660031901126102795760206114f76114f26117bc565b611b4f565b6040519015158152f35b50346103945760203660031901126102795761151b6117bc565b611523612675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103265760405163eb5a4e8760e01b81523060048201526001600160a01b039091166024820152829182908290818381604481016106d3565b503461039457611599366117ea565b916115a2612675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692833b1561032657604051634a86c03760e11b81523060048201526001600160a01b0392831660248201529290911660448301526001600160e01b0319166064820152829182908290818381608481016106d3565b50346116cc5760203660031901126102795761163b6117bc565b611643612675565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103265760405163268959e560e01b81523060048201526001600160a01b039290921660248301525f908290604490829084905af180156116c1576116b3575080f35b6116bf91505f906118d2565b005b6040513d5f823e3d90fd5b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b600435906001600160a01b03821682036117d257565b5f80fd5b35906001600160a01b03821682036117d257565b6060906003190112610279576004356001600160a01b03811681036117d257906024356001600160a01b03811681036117d257906044356001600160e01b0319811681036117d25790565b60206040818301928281528451809452019201905f5b8181106118585750505090565b82516001600160a01b031684526020938401939092019160010161184b565b60975481101561188f5760975f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b606081019081106001600160401b038211176118be57604052565b634e487b7160e01b5f52604160045260245ffd5b90601f801991011681019081106001600160401b038211176118be57604052565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b6001600160401b0381116118be57601f01601f191660200190565b9291926119738261194c565b9161198160405193846118d2565b82948184528183011161199d578281602093845f960137010152565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b9181601f8401121561063b578235916001600160401b038311611a7b576020808501948460051b01011161063657565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b6001600160401b0381116118be5760051b60200190565b359063ffffffff821682036117d257565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b609754905f5b828110611b63575050505f90565b611b6c81611877565b905460039190911b1c6001600160a01b0390811690831614611b9057600101611b55565b505050600190565b90816020910312610279575160ff811681036117d25790565b90611bbb82611ad4565b611bc860405191826118d2565b8281528092611bd9601f1991611ad4565b0190602036910137565b90815181101561188f570160200190565b91908201809211611c0157565b634e487b7160e01b5f52601160045260245ffd5b908160409103126102795760405190604082018281106001600160401b038211176118be576040528051906001600160a01b03821682036117d257602091835201516bffffffffffffffffffffffff811681036117d257602082015290565b805182101561188f5760209160051b010190565b5f198114611c015760010190565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610326576040516309aa152760e11b81526001600160a01b039092166004830152602082602481845afa9182156116c1575f926120d6575b50803b15610326576040519163871ef04960e01b83526004830152602082602481845afa9182156116c1575f92612092575b506001600160c01b038216908115908115612029575b5061200f57805f915b611fea575061ffff16611d5e8161194c565b90611d6c60405192836118d2565b808252611d7b601f199161194c565b013660208301375f5f5b8251821080611fdf575b15611ddd576001811b84166001600160c01b0316611db6575b611db190611c88565b611d85565b906001611db19160ff60f81b8460f81b165f1a611dd38287611be3565b5301919050611da8565b505f939250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690835b8151851015611e9f57611e238583611be3565b5160f81c833b156103265760405190633ca5a5f560e01b82526004820152602081602481875afa9081156116c1575f91611e6d575b50611e6590600192611bf4565b940193611e10565b90506020813d8211611e97575b81611e87602093836118d2565b8101031261027957516001611e58565b3d9150611e7a565b611eaa919450611bb1565b925f905f5b8151811015611fd957611ec28183611be3565b5160f81c843b1561032657604051633ca5a5f560e01b81526004810182905290602082602481895afa9182156116c1575f92611fa6575b50905f915b818310611f1057505050600101611eaf565b909194863b1561032657604080516356e4026d60e11b815260ff841660048201526024810188905290816044818b5afa9182156116c157600192611f6f925f91611f78575b50838060a01b03905116611f69828d611c74565b52611c88565b95019190611efe565b611f99915060403d8111611f9f575b611f9181836118d2565b810190611c15565b5f611f55565b503d611f87565b9091506020813d8211611fd1575b81611fc1602093836118d2565b810103126102795751905f611ef9565b3d9150611fb4565b50505050565b506101008110611d8f565b5f198101818111611c015761ffff9116911661ffff8114611c01576001019080611d4c565b505060405161201f6020826118d2565b5f81525f36813790565b8091503b1561032657602060049160405192838092639aa1653d60e01b82525afa80156116c15760ff915f91612063575b5016155f611d43565b612085915060203d60201161208b575b61207d81836118d2565b810190611b98565b5f61205a565b503d612073565b9091506020813d6020116120ce575b816120ae602093836118d2565b8101031261027957516001600160c01b03811681036117d257905f611d2d565b3d91506120a1565b9091506020813d602011612102575b816120f2602093836118d2565b810103126102795751905f611cfb565b3d91506120e5565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206f6666736574000000006044820152606490fd5b919081101561188f5760051b8101359060be1981360301821215612195570190565b61212e565b903590601e198136030182121561219557018035906001600160401b03821161221457602001918160061b360383136121cf57565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c64617461207461696c20746f6f2073686f72740000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206c656e677468000000006044820152606490fd5b356001600160a01b03811681036117d25790565b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206c656e67746800006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c64617461206163636573732073747269646500006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206f666673657400006044820152606490fd5b9035601e19823603018112156103215701602081359101916001600160401b038211610a76578160061b36038313610a7157565b916020908281520191905f905b80821061238a5750505090565b909192833560018060a01b0381168091036117d25781526020840135906bffffffffffffffffffffffff82168092036117d25760408160019360208394015201940192019061237d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561032657604051639aa1653d60e01b8152602081600481855afa80156116c15760ff915f91612634575b5016801561200f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316905f9081905b8083106125b757506124759150611bb1565b925f905f5b843b1561032657604051639aa1653d60e01b8152602081600481895afa80156116c15760ff915f91612599575b50168110156125925760ff8116843b1561032657604051633ca5a5f560e01b81526004810182905290602082602481895afa9182156116c1575f9261255f575b50905f915b8183106124fe5750505060010161247a565b909194863b1561032657604080516356e4026d60e11b815260ff841660048201526024810188905290816044818b5afa9182156116c157600192612556925f91611f785750838060a01b03905116611f69828d611c74565b950191906124ec565b9091506020813d821161258a575b8161257a602093836118d2565b810103126102795751905f6124e7565b3d915061256d565b5092505050565b6125b1915060203d811161208b5761207d81836118d2565b5f6124a7565b90833b1561032657604051633ca5a5f560e01b815260ff84166004820152602081602481885afa9081156116c1575f91612602575b506125f990600192611bf4565b92019190612463565b90506020813d821161262c575b8161261c602093836118d2565b81010312610279575160016125ec565b3d915061260f565b61264d915060203d60201161208b5761207d81836118d2565b5f61242b565b919081101561188f5760051b81013590609e1981360301821215612195570190565b6033546001600160a01b0316330361268957565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b606554604080516001600160a01b038084168252841660208201529192917fe11cddf1816a43318ca175bbc52cd0185436e9cbead7c83acc54a73e461717e39190a16001600160a01b03166001600160a01b03199190911617606555565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b6065546001600160a01b0316330361278757565b638e79fdb560e01b5f5260045ffd5b6040516323b872dd60e01b60208201526001600160a01b0392831660248201529290911660448301526064808301939093529181526127df916127da6084836118d2565b6128a7565b565b6001600160a01b038116803b1561032657604051636eb1769f60e11b81523060048201526001600160a01b038416602482015290602090829060449082905afa9081156116c1575f91612873575b506127df9361283d91611bf4565b60405163095ea7b360e01b60208201526001600160a01b03909316602484015260448084019190915282526127da6064836118d2565b90506020813d60201161289f575b8161288e602093836118d2565b8101031261027957516127df61282f565b3d9150612881565b906129269160018060a01b03165f80604051936128c56040866118d2565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564602086015260208151910182855af13d156129b7573d9161290a8361194c565b9261291860405194856118d2565b83523d5f602085013e6129bb565b8051908115918215612994575b50501561293c57565b60405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b8192509060209181010312610279576020015180151581036117d2575f80612933565b6060915b91929015612a1d57508151156129cf575090565b3b156129d85790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015612a305750805190602001fd5b60405162461bcd60e51b815260206004820152908190612a5490602483019061210a565b0390fdfea2646970667358221220780b7f5cce86a9ceeca17d131f92c3785d83874c73b2d3acf66d994f2222223964736f6c634300081c0033"; + "0x61018080604052346102dc57604051601f612f9838819003918201601f19168301916001600160401b038311848410176102c85780849260e0946040528339810103126102785780516001600160a01b0381168103610274576020820151916001600160a01b0383168303610274576040810151906001600160a01b03821682036102745760608101516001600160a01b0381169290839003610274576080820151926001600160a01b03841684036102745760a0830151926001600160a01b03841684036102745760c00151946001600160a01b03861686036102745760805260c0528460e052610100526101205260a0525f5460ff8160081c1661021f5760ff808216036101e5575b506101405261016052604051612c6e908161032a823960805181818161077f0152818161086b01528181610d8901526110ed015260a0518181816105a301526112ff015260c0518181816101e1015281816109120152610bd3015260e05181818161054a0152818161083b01528181610d6101528181611e7801526125b6015261010051818181611fc501526126150152610120518181816106a901528181610c60015281816113db01528181611705015281816117840152611825015261014051816107f001526101605181818161049d01526113450152f35b60ff90811916175f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a18261010a565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b5f80fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fdfe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b5f5f3560e01c80631785f53c146118015780631fdb0cfd1461176a578063279432eb146116e15780632e8da829146116b457806333cfb7b7146116905780633bc28c8c1461166b578063485cc9551461122b57806352efdca014611163578063630868dc1461111c5780636b3aa72e146110d8578063715018a61461107b5780638da5cb5b1461105357806396d356c514610eca5780639926ee7d14610cc55780639da16d8e14610c3c578063a0169ddd14610baf578063a20b99bf146108d4578063a364f4da1461081f578063a50a640e146107db578063a98fb35514610733578063ba5508801461068f578063c1a8e2c5146104cc578063cf1d6b4214610488578063e481af9d1461045d578063f2fde38b146103cc578063fc299dee146103a45763fce36c7d146101a5575061000e565b3461039f576020366003190112610284576004356001600160401b03811161039a576101d5903690600401611c2b565b91906101df612953565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690825b8481106103365750813b15610331576040519363fce36c7d60e01b855280602486016020600488015252604485019060448160051b8701019280928690609e1983360301905b8483106102945788808b8181808c0381838f5af18015610289576102735750f35b8161027d91611ab2565b6102845780f35b6118fc565b6040513d84823e3d90fd5b9091929394956043198a82030182528635908382121561032c5760208091876001940190608063ffffffff610318826102de6102d0878061251c565b60a0885260a0880191612550565b95898060a01b036102f08983016119b6565b1688870152604081013560408701528361030c60608301611ccb565b16606087015201611ccb565b169101529801920193019190949392610252565b6124d7565b611cdc565b8061036b610352602061034c6001958a88612833565b01612439565b604061035f848a88612833565b01359030903390612976565b61039461037e602061034c848a88612833565b85604061038c858b89612833565b0135916129c1565b0161020c565b61194c565b6118ac565b503461039f57366003190112610284576065546040516001600160a01b039091168152602090f35b503461039f576020366003190112610284576103e661199c565b6103ee612855565b6001600160a01b03811615610409576104069061290b565b80f35b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b503461039f57366003190112610284576104846104786125b4565b60405191829182611a15565b0390f35b503461039f57366003190112610284576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461039f576040366003190112610284576104e661199c565b90602435916001600160401b03831161039a573660238401121561068a5782600401359261051384611cb4565b936105216040519586611ab2565b8085526024602086019160051b8301019136831161068557602401905b82821061066d575050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361065e576040519061058582611a83565b6001600160a01b0390811682523060208301908152604083019485527f000000000000000000000000000000000000000000000000000000000000000090911693909190843b1561033157604051636e3492b560e01b815260206004820181905292516001600160a01b03908116602483015293519093166044840152516060606484015280516084840181905260a48401929190910190845b81811061064257505050818394818581819503925af18015610289576102735750f35b825163ffffffff1684526020938401939092019160010161061f565b634394dbdf60e11b8252600482fd5b6020809161067a84611ccb565b81520191019061053e565b611bd2565b611ad3565b503461039f5761069e366119ca565b916106a7612855565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692833b1561033157604051630664120160e01b81523060048201526001600160a01b0392831660248201529290911660448301526001600160e01b0319166064820152829182908290818381608481015b03925af18015610289576102735750f35b503461039f576020366003190112610284576004356001600160401b03811161039a573660238201121561068a57610775903690602481600401359101611b47565b61077d612855565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561033157826107228193829360405194858094819363a98fb35560e01b83526020600484015260248301906122ea565b503461039f57366003190112610284576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461039f5760203660031901126102845761083961199c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361065e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610331576040516351b27a6d60e11b81526001600160a01b03909216600483015282919082908290602490829084905af18015610289576102735750f35b503461039f576020366003190112610284576004356001600160401b03811161039a57610905903690600401611c2b565b610910929192612953565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316825b828110610afa5750803b156103315760405191634e5cd2fd60e11b835280604484013060048601526040602486015252606483019460648260051b8501019181869060be19813603015b8383106109a7578880898181808b0381838e5af18015610289576102735750f35b9091929394606319888203018a5285358281121561032c578301906109dd6109cf838061251c565b60c0845260c0840191612550565b916001600160a01b036109f2602083016119b6565b1660208301526020610a07604083018361251c565b848603604086015280865294909101938c905b808210610aca5750505063ffffffff610a3560608301611ccb565b16606083015263ffffffff610a4c60808301611ccb565b16608083015260a0810135601e198236030181121561032c5701906020823592016001600160401b038311610ac5578236038113610ac05783836020948594938460a0879660019a03910152818452848401378d838284010152601f8019910116010197019a019301919098939298610986565b612492565b61244d565b909194604080600192838060a01b03610ae28a6119b6565b16815260208901356020820152019601920190610a1a565b909291829483955b610b1a610b10858585612353565b604081019061237a565b9050871015610b6a57610b31610b10858585612353565b881015610b56576001916020610b4e928a60061b01013590611dd4565b960195610b02565b634e487b7160e01b86526032600452602486fd5b600192949593919650610ba990610b9381308a610b8e602061034c898d3395612353565b612976565b84610ba4602061034c868a8d612353565b6129c1565b0161093c565b503461039f57602036600319011261028457610bc961199c565b610bd1612855565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103315760405163a0169ddd60e01b81526001600160a01b03909216600483015282919082908290602490829084905af18015610289576102735750f35b503461039f57602036600319011261028457610c5661199c565b610c5e612855565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561033157604051634f906cf960e01b81523060048201526001600160a01b03909116602482015282918290829081838160448101610722565b503461039f57604036600319011261028457610cdf61199c565b6024356001600160401b03811161039a5760606003198236030112610e795760405191610d0b83611a83565b81600401356001600160401b038111610e285782013660238201121561068a57610d3f903690602460048201359101611b47565b8352602083019060248301358252604460408501930135835260018060a01b037f0000000000000000000000000000000000000000000000000000000000000000163303610e19577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561033157859485610dfb93819560405197889687958694639926ee7d60e01b865260018060a01b0316600486015260406024860152516060604486015260a48501906122ea565b9151606484015251608483015203925af18015610289576102735750f35b634394dbdf60e11b8552600485fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b503461039f57602036600319011261028457610ee461199c565b610eec612855565b610ef581611d2f565b15610ff0576001600160a01b0316815b60975480821015610fea5782610f1a83611a57565b905460039190911b1c6001600160a01b031614610f3a5750600101610f05565b9091505f198101908111610fd65790610f70610f58610f9493611a57565b905460039190911b1c6001600160a01b031691611a57565b81546001600160a01b0393841660039290921b91821b9390911b1916919091179055565b6097548015610fc2575f1901610fa981611a57565b81549060018060a01b039060031b1b1916905560975580f35b634e487b7160e01b82526031600452602482fd5b634e487b7160e01b83526011600452602483fd5b50505080f35b60405162461bcd60e51b815260206004820152603560248201527f72656d6f76654f70657261746f7246726f6d57686974656c6973743a206f70656044820152741c985d1bdc881b9bdd081dda1a5d195b1a5cdd1959605a1b6064820152608490fd5b503461039f57366003190112610284576033546040516001600160a01b039091168152602090f35b503461039f578060031936011261028457611094612855565b603380546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461039f57366003190112610284576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461039f576020366003190112610284576004359060975482101561116057602061114783611a57565b905460405160039290921b1c6001600160a01b03168152f35b80fd5b503461039f5760203660031901126102845761117d61199c565b611185612855565b61118e81611d2f565b6111c957609754600160401b8110156111b55790610f708260016104069401609755611a57565b634e487b7160e01b83526041600452602483fd5b60405162461bcd60e51b815260206004820152603460248201527f6164644f70657261746f72546f57686974656c6973743a206f70657261746f7260448201527308185b1c9958591e481dda1a5d195b1a5cdd195960621b6064820152608490fd5b503461039f5760403660031901126102845761124561199c565b602435906001600160a01b03821682036116675782549160ff8360081c16159283809461165a575b8015611643575b156115e75760ff1981166001178555836115d6575b5060ff845460081c161561157d576112a36112a89261290b565b6128ad565b6020906040516112b88382611ab2565b8381525f3681378051906001600160401b03821161156957600160401b821161156957839060975483609755808410611508575b500160978552845b8281106114cd5750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169050803b15610331576040516334f65bfd60e21b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660248201819052908590818160448183885af18015610289576114b8575b5050813b15610331578460405163a982182160e01b8152306004820152604060248201526004604482015263544f444f60e01b6064820152818160848183885af18015610289576114a3575b50507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561033157859260848492836040519586948593634a86c03760e11b855230600486015260248501526044840152630130fc2760e51b60648401525af180156102895761148e575b5050611458575080f35b7f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989061ff0019835416835560405160018152a180f35b8161149891611ab2565b61028457825f61144e565b816114ad91611ab2565b61028457845f6113d7565b816114c291611ab2565b61028457845f61138b565b81516001600160a01b03167f354a83ed9988f79f6038d4c7a7dadbad8af32f4ad6df893e0e5807a1b1944ff9820155908401906001016112f4565b7f354a83ed9988f79f6038d4c7a7dadbad8af32f4ad6df893e0e5807a1b1944ff901837f354a83ed9988f79f6038d4c7a7dadbad8af32f4ad6df893e0e5807a1b1944ff9015b81811061155b57506112ec565b87815586935060010161154e565b634e487b7160e01b85526041600452602485fd5b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b61ffff19166101011784555f611289565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b1580156112745750600160ff821614611274565b50600160ff82161061126d565b8280fd5b503461039f5760203660031901126102845761040661168861199c565b6112a3612855565b3461039f576020366003190112610284576104846104786116af61199c565b611e76565b3461039f5760203660031901126102845760206116d76116d261199c565b611d2f565b6040519015158152f35b503461039f576020366003190112610284576116fb61199c565b611703612855565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103315760405163eb5a4e8760e01b81523060048201526001600160a01b03909116602482015282918290829081838160448101610722565b503461039f57611779366119ca565b91611782612855565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692833b1561033157604051634a86c03760e11b81523060048201526001600160a01b0392831660248201529290911660448301526001600160e01b031916606482015282918290829081838160848101610722565b50346118ac5760203660031901126102845761181b61199c565b611823612855565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103315760405163268959e560e01b81523060048201526001600160a01b039290921660248301525f908290604490829084905af180156118a157611893575080f35b61189f91505f90611ab2565b005b6040513d5f823e3d90fd5b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b600435906001600160a01b03821682036119b257565b5f80fd5b35906001600160a01b03821682036119b257565b6060906003190112610284576004356001600160a01b03811681036119b257906024356001600160a01b03811681036119b257906044356001600160e01b0319811681036119b25790565b60206040818301928281528451809452019201905f5b818110611a385750505090565b82516001600160a01b0316845260209384019390920191600101611a2b565b609754811015611a6f5760975f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b606081019081106001600160401b03821117611a9e57604052565b634e487b7160e01b5f52604160045260245ffd5b90601f801991011681019081106001600160401b03821117611a9e57604052565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b6001600160401b038111611a9e57601f01601f191660200190565b929192611b5382611b2c565b91611b616040519384611ab2565b829481845281830111611b7d578281602093845f960137010152565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b9181601f8401121561068a578235916001600160401b038311611c5b576020808501948460051b01011161068557565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b6001600160401b038111611a9e5760051b60200190565b359063ffffffff821682036119b257565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b609754905f5b828110611d43575050505f90565b611d4c81611a57565b905460039190911b1c6001600160a01b0390811690831614611d7057600101611d35565b505050600190565b90816020910312610284575160ff811681036119b25790565b90611d9b82611cb4565b611da86040519182611ab2565b8281528092611db9601f1991611cb4565b0190602036910137565b908151811015611a6f570160200190565b91908201809211611de157565b634e487b7160e01b5f52601160045260245ffd5b908160409103126102845760405190604082018281106001600160401b03821117611a9e576040528051906001600160a01b03821682036119b257602091835201516bffffffffffffffffffffffff811681036119b257602082015290565b8051821015611a6f5760209160051b010190565b5f198114611de15760010190565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610331576040516309aa152760e11b81526001600160a01b039092166004830152602082602481845afa9182156118a1575f926122b6575b50803b15610331576040519163871ef04960e01b83526004830152602082602481845afa9182156118a1575f92612272575b506001600160c01b038216908115908115612209575b506121ef57805f915b6121ca575061ffff16611f3e81611b2c565b90611f4c6040519283611ab2565b808252611f5b601f1991611b2c565b013660208301375f5f5b82518210806121bf575b15611fbd576001811b84166001600160c01b0316611f96575b611f9190611e68565b611f65565b906001611f919160ff60f81b8460f81b165f1a611fb38287611dc3565b5301919050611f88565b505f939250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690835b815185101561207f576120038583611dc3565b5160f81c833b156103315760405190633ca5a5f560e01b82526004820152602081602481875afa9081156118a1575f9161204d575b5061204590600192611dd4565b940193611ff0565b90506020813d8211612077575b8161206760209383611ab2565b8101031261028457516001612038565b3d915061205a565b61208a919450611d91565b925f905f5b81518110156121b9576120a28183611dc3565b5160f81c843b1561033157604051633ca5a5f560e01b81526004810182905290602082602481895afa9182156118a1575f92612186575b50905f915b8183106120f05750505060010161208f565b909194863b1561033157604080516356e4026d60e11b815260ff841660048201526024810188905290816044818b5afa9182156118a15760019261214f925f91612158575b50838060a01b03905116612149828d611e54565b52611e68565b950191906120de565b612179915060403d811161217f575b6121718183611ab2565b810190611df5565b5f612135565b503d612167565b9091506020813d82116121b1575b816121a160209383611ab2565b810103126102845751905f6120d9565b3d9150612194565b50505050565b506101008110611f6f565b5f198101818111611de15761ffff9116911661ffff8114611de1576001019080611f2c565b50506040516121ff602082611ab2565b5f81525f36813790565b8091503b1561033157602060049160405192838092639aa1653d60e01b82525afa80156118a15760ff915f91612243575b5016155f611f23565b612265915060203d60201161226b575b61225d8183611ab2565b810190611d78565b5f61223a565b503d612253565b9091506020813d6020116122ae575b8161228e60209383611ab2565b8101031261028457516001600160c01b03811681036119b257905f611f0d565b3d9150612281565b9091506020813d6020116122e2575b816122d260209383611ab2565b810103126102845751905f611edb565b3d91506122c5565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206f6666736574000000006044820152606490fd5b9190811015611a6f5760051b8101359060be1981360301821215612375570190565b61230e565b903590601e198136030182121561237557018035906001600160401b0382116123f457602001918160061b360383136123af57565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c64617461207461696c20746f6f2073686f72740000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206c656e677468000000006044820152606490fd5b356001600160a01b03811681036119b25790565b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206c656e67746800006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c64617461206163636573732073747269646500006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206f666673657400006044820152606490fd5b9035601e198236030181121561032c5701602081359101916001600160401b038211610ac5578160061b36038313610ac057565b916020908281520191905f905b80821061256a5750505090565b909192833560018060a01b0381168091036119b25781526020840135906bffffffffffffffffffffffff82168092036119b25760408160019360208394015201940192019061255d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561033157604051639aa1653d60e01b8152602081600481855afa80156118a15760ff915f91612814575b501680156121ef577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316905f9081905b80831061279757506126559150611d91565b925f905f5b843b1561033157604051639aa1653d60e01b8152602081600481895afa80156118a15760ff915f91612779575b50168110156127725760ff8116843b1561033157604051633ca5a5f560e01b81526004810182905290602082602481895afa9182156118a1575f9261273f575b50905f915b8183106126de5750505060010161265a565b909194863b1561033157604080516356e4026d60e11b815260ff841660048201526024810188905290816044818b5afa9182156118a157600192612736925f916121585750838060a01b03905116612149828d611e54565b950191906126cc565b9091506020813d821161276a575b8161275a60209383611ab2565b810103126102845751905f6126c7565b3d915061274d565b5092505050565b612791915060203d811161226b5761225d8183611ab2565b5f612687565b90833b1561033157604051633ca5a5f560e01b815260ff84166004820152602081602481885afa9081156118a1575f916127e2575b506127d990600192611dd4565b92019190612643565b90506020813d821161280c575b816127fc60209383611ab2565b81010312610284575160016127cc565b3d91506127ef565b61282d915060203d60201161226b5761225d8183611ab2565b5f61260b565b9190811015611a6f5760051b81013590609e1981360301821215612375570190565b6033546001600160a01b0316330361286957565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b606554604080516001600160a01b038084168252841660208201529192917fe11cddf1816a43318ca175bbc52cd0185436e9cbead7c83acc54a73e461717e39190a16001600160a01b03166001600160a01b03199190911617606555565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b6065546001600160a01b0316330361296757565b638e79fdb560e01b5f5260045ffd5b6040516323b872dd60e01b60208201526001600160a01b0392831660248201529290911660448301526064808301939093529181526129bf916129ba608483611ab2565b612a87565b565b6001600160a01b038116803b1561033157604051636eb1769f60e11b81523060048201526001600160a01b038416602482015290602090829060449082905afa9081156118a1575f91612a53575b506129bf93612a1d91611dd4565b60405163095ea7b360e01b60208201526001600160a01b03909316602484015260448084019190915282526129ba606483611ab2565b90506020813d602011612a7f575b81612a6e60209383611ab2565b8101031261028457516129bf612a0f565b3d9150612a61565b90612b069160018060a01b03165f8060405193612aa5604086611ab2565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564602086015260208151910182855af13d15612b97573d91612aea83611b2c565b92612af86040519485611ab2565b83523d5f602085013e612b9b565b8051908115918215612b74575b505015612b1c57565b60405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b8192509060209181010312610284576020015180151581036119b2575f80612b13565b6060915b91929015612bfd5750815115612baf575090565b3b15612bb85790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015612c105750805190602001fd5b60405162461bcd60e51b815260206004820152908190612c349060248301906122ea565b0390fdfea2646970667358221220cf84c446bd15381c29ed2bc3c5bff5551d0a0874f415e278d29ab20bd351abde64736f6c634300081c0033"; type ReclaimServiceManagerConstructorParams = | [signer?: Signer] diff --git a/src/avs/contracts/factories/ReclaimSlashingRegistryCoordinator__factory.ts b/src/avs/contracts/factories/ReclaimSlashingRegistryCoordinator__factory.ts index 8d83ca4a..88a344f2 100644 --- a/src/avs/contracts/factories/ReclaimSlashingRegistryCoordinator__factory.ts +++ b/src/avs/contracts/factories/ReclaimSlashingRegistryCoordinator__factory.ts @@ -1705,7 +1705,7 @@ const _abi = [ ] as const; const _bytecode = - "0x61016080604052346104c457615e7e8038038061001b81610511565b92833981019060e081830312610474578051916001600160a01b0383168303610470576020820151926001600160a01b03841684036104705760408301516001600160a01b03811681036104705760608401516001600160a01b0381168103610470576080850151916001600160a01b03831683036104705760a0860151966001600160a01b038816968789036104705760c0810151906001600160401b03821161042057019486601f870112156103c75785516001600160401b0381116103b3576100f0601f8201601f1916602001610511565b9681885260208801986020838301011161035e57815f9260208093018b5e8801015260c05260a05260e05260805261010052601f8151116103225751905160208210610312575b176101205215610303576101405260325460ff8160081c166102ae5760ff80821603610273575b604051615947908161053782396080518181816127e801526137d8015260a051818181610cf701528181610f920152818161158b01528181611bd601528181611f7401528181614323015281816148290152614ab8015260c051818181610ff7015281816114c601528181611c1a01528181611eb0015281816136e60152818161488b01528181614b1a0152615391015260e0518181816110590152818161152a01528181611f130152818161232c01528181612c7c015281816149000152614b8f01526101005181818161141001528181611e46015281816126de01528181613a1101526150710152610120518161193d015261014051818181610b1a01528181611a76015281816122a101526128d80152f35b60ff90811916176032557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a18061015e565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b6339b190bb60e11b5f5260045ffd5b5f198260200360031b1b16610137565b60449060405192839163305a27a960e01b8352602060048401525180918160248501528484015e5f828201840152601f01601f19168101030190fd5b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b5f80fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b6040519190601f01601f191682016001600160401b038111838210176103b35760405256fe6080604052600436106129ba575f3560e01c8062cf2ab51461037a57806303fd34921461037557806304ec635114610370578063054310e61461036b5780630cf4b767146103665780630d3f213414610361578063125e05841461035c57806313542a4e14610357578063136439dd146103525780631478851f1461034d5780631eb812da14610348578063249a0c421461034357806328f61b311461033e578063296bb0641461033957806329d1e0c3146103345780632cdd1e861461032f578063303ca9561461032a5780633c2a7f4c146103255780633eef3a51146103205780635140a5481461031b578063530b97a41461031657806354fd4d50146103115780635865c60c1461030c578063595c6a67146103075780635ac86ab7146103025780635b0b829f146102fd5780635c975abb146102f85780635df45946146102f357806368304835146102ee5780636e3b17db146102e9578063715018a6146102e457806373447992146102df5780638281ab75146102da57806384b0196e146102d557806384ca5213146102d0578063871ef049146102cb578063886f1195146102c65780638da5cb5b146102c15780639aa1653d146102bc5780639e9923c2146102b75780639feab859146102b2578063a65497c6146102ad578063a96f783e146102a8578063b5265787146102a3578063c391425e1461029e578063c63fd50214610299578063ca0de88214610294578063ca8aa7c71461028f578063de1164bb1461028a578063e65797ad14610285578063ea32afae14610280578063f2fde38b1461027b578063f698da2514610276578063fabc1cbc146102715763fd39105a036129ba57612974565b6128c2565b6128a8565b612817565b6127d3565b612766565b61270d565b6126c9565b61268f565b6124fb565b612457565b6123df565b6123c2565b612395565b61235b565b612317565b6122f8565b6122d0565b61228c565b61225c565b612208565b6120d6565b611d53565b611d24565b611cc9565b611c49565b611c05565b611bc1565b611ba4565b611b10565b611ae1565b611a64565b6119f4565b61192b565b6117f0565b61172a565b6112f0565b611157565b610e5a565b610dc6565b610d99565b610cdc565b610cb4565b610c82565b610bfa565b610bcb565b610aff565b610ac4565b610a89565b610a35565b6109c2565b6108d6565b6107f6565b6107be565b61064e565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b038211176104f757604052565b6104c8565b604081019081106001600160401b038211176104f757604052565b90601f801991011681019081106001600160401b038211176104f757604052565b60405190610547604083610517565b565b60405190610547606083610517565b6001600160401b0381116104f75760051b60200190565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b6001600160a01b038116036105d957565b5f80fd5b9080601f830112156106495781356105f481610558565b926106026040519485610517565b81845260208085019260051b82010192831161064457602001905b82821061062a5750505090565b602080918335610639816105c8565b81520191019061061d565b61056f565b61046f565b346107b95760203660031901126107b4576004356001600160401b0381116107af5761067e9036906004016105dd565b61069561068f600480603354161490565b15612a1d565b6040905f60205b82518210156107ad578351906106b28583610517565b60018252803660208401376106f26106da6106cd8587612a59565b516001600160a01b031690565b6106e384612a47565b6001600160a01b039091169052565b6106fa612a6d565b9061072461070b6106cd8688612a59565b6001600160a01b03165f90815260036020526040902090565b5461072e83612a47565b5261075861075361074761074185612a47565b51614c90565b6001600160c01b031690565b61350f565b945f5b865181101561079b578061079561078e61078861077a6001958c612ac1565b516001600160f81b03191690565b60f81c90565b86886136bc565b0161075b565b509450600190930192915061069c9050565b005b61041f565b6103cf565b61037f565b346107b95760203660031901126107b4576004355f526002602052602060405f2054604051908152f35b63ffffffff8116036105d957565b346107b95760603660031901126107b45760243561083661083060043561081c846107e8565b604435905f52600260205260405f20612bb1565b50612bc6565b63ffffffff8082511692169182106108bd5760408161087261089a9460206108809501519063ffffffff82161591821561089e575b50506137bf565b01516001600160c01b031690565b6040516001600160c01b0390911681529081906020820190565b0390f35b9091506108b59063ffffffff165b63ffffffff1690565b115f8061086b565b636cb19aff60e01b5f5260045ffd5b5f9103126107b457565b346107b9575f3660031901126107b4576007546040516001600160a01b039091168152602090f35b6001600160401b0381116104f757601f01601f191660200190565b929192610925826108fe565b916109336040519384610517565b82948184528183011161094f578281602093845f960137010152565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b9080601f83011215610649578160206109bf93359101610919565b90565b346107b95760203660031901126107b4576004356001600160401b0381116107af576109f29036906004016109a4565b335f52600360205260ff600160405f20015416906003821015610a3057610a1e60016107ad9314612ad2565b335f52600360205260405f20546137d5565b6119ae565b346107b95760203660031901126107b4577fa77a91bea7b6d95a8eb5a54878a1d9e3c875e26c86a9b70e3420c5c5db193b626040600435610a74613895565b600a549080600a5582519182526020820152a1005b346107b95760203660031901126107b457600435610aa6816105c8565b60018060a01b03165f526009602052602060405f2054604051908152f35b346107b95760203660031901126107b457600435610ae1816105c8565b60018060a01b03165f526003602052602060405f2054604051908152f35b346107b95760203660031901126107b4576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600435813b15610bc65760206024926040519384809263237dfb4760e11b82523360048301525afa918215610bc1576107ad92610b7e915f91610b92575b50612b67565b610b8d60335482811614612b7d565b613921565b610bb4915060203d602011610bba575b610bac8183610517565b810190612b48565b5f610b78565b503d610ba2565b612b5c565b612ae8565b346107b95760203660031901126107b4576004355f526004602052602060ff60405f2054166040519015158152f35b346107b95760403660031901126107b4576060610c32610830602435600435610c21612b93565b505f52600260205260405f20612bb1565b6040519063ffffffff815116825263ffffffff6020820151166020830152604060018060c01b03910151166040820152f35b6004359060ff821682036105d957565b359060ff821682036105d957565b346107b95760203660031901126107b45760ff610c9d610c64565b165f526005602052602060405f2054604051908152f35b346107b9575f3660031901126107b4576008546040516001600160a01b039091168152602090f35b346107b95760203660031901126107b4576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600435813b15610bc6576020906024604051809481936308f6629d60e31b835260048301525afa8015610bc15761089a915f91610d6a575b506040516001600160a01b0390911681529081906020820190565b610d8c915060203d602011610d92575b610d848183610517565b810190612bf7565b5f610d4f565b503d610d7a565b346107b95760203660031901126107b4576107ad600435610db9816105c8565b610dc1613895565b613953565b346107b95760203660031901126107b4576107ad600435610de6816105c8565b610dee613895565b6139b1565b9080601f83011215610649578135610e0a81610558565b92610e186040519485610517565b81845260208085019260051b82010192831161064457602001905b828210610e405750505090565b602080918335610e4f816107e8565b815201910190610e33565b346107b95760603660031901126107b457600435610e77816105c8565b602435610e83816105c8565b604435906001600160401b0382116107af57610ed9610ea9610ede933690600401610df3565b91610eb2613a0f565b610ec361068f600280603354161490565b600b546001600160a01b03918216911614612c0c565b613a50565b6001600160a01b0382165f9081526003602052604090209091610f77825492610f276001610f1881610f0f88614c90565b94015460ff1690565b610f21816119c2565b14612ad2565b610f41610747610747610f3b5f5460ff1690565b88613e7c565b90610f4d821515613a99565b610f688282166001600160c01b03168314612ea0565b612ea0565b9019166001600160c01b031690565b610f818184614cd4565b6001600160c01b0316156110f8575b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc657835f91610fe5938360405180968195829463f4e24fe560e01b845260048401613aaf565b03925af18015610bc1576110e4575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc6575f604051809263bd29b8cd60e01b8252818381611047898960048401613ad1565b03925af18015610bc1576110d0575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691823b15610bc6576110ac925f928360405180968195829463bd29b8cd60e01b845260048401613ad1565b03925af18015610bc1576110bc57005b806110ca5f6107ad93610517565b806108cc565b806110ca5f6110de93610517565b5f611056565b806110ca5f6110f293610517565b5f610ff4565b6001600160a01b0381165f90815260036020526040902061112390600101805460ff19166002179055565b816001600160a01b0382167f396fdcb180cb0fea26928113fb0fd1c3549863f9cd563e6a184f1d578116c8e45f80a3610f90565b346107b95760203660031901126107b457604061118f61118a60043561117c816105c8565b611184612c22565b506130ce565b613afc565b6111a58251809260208091805184520151910152565bf35b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b60609060031901126112485760405190611211826104dc565b8160043561121e816107e8565b815260243561ffff811681036105d95760208201526044359061ffff821682036105d95760400152565b6111a7565b6001600160601b038116036105d957565b81601f820112156106495780359061127582610558565b926112836040519485610517565b82845260208085019360061b8301019181831161064457602001925b8284106112ad575050505090565b60408483031261124857602060409182516112c7816104fc565b86356112d2816105c8565b8152828701356112e18161124d565b8382015281520193019261129f565b346107b95760c03660031901126107b45761130a366111f8565b6064356113168161124d565b6084356001600160401b0381116107af5761133590369060040161125e565b60a43592611342846107e8565b61134a613895565b5f5460ff1692839161135e60c08410613c1a565b61137861136a86613c30565b60ff1660ff195f5416175f55565b6113828186613fad565b61138a613c42565b946113958551612a8f565b965f5b86518110156113d257806113cc6113c26113b46001948b612a59565b51516001600160a01b031690565b6106e3838d612a59565b01611398565b5086889695966113e0610538565b63ffffffff891681529060208201526113f882612a47565b5261140281612a47565b50600b546001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116929116823b15610bc657604051630130fc2760e51b8152915f918391829161145d919060048401613c8f565b038183865af18015610bc157611690575b506114796001613312565b6114836001613312565b803b15610bc657602060049160405192838092632981eb7760e01b82525afa8015610bc1576114c4915f91611661575b5063ffffffff808416911611613d4a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc6575f6040518092630662d3e160e51b82528183816115188c898d8c60048601613db1565b03925af18015610bc15761164d575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc65760405163136ca0f960e11b815260ff84166004820152905f908290602490829084905af18015610bc157611639575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc65760405163136ca0f960e11b815260ff9390931660048401525f908390602490829084905af18015610bc1577fa34835bc2b673ec37fcf1591a91295b163fc2e181e4ea4e733beb27de1ceac4c9561162093600192611625575b5060405195869586613e0e565b0390a2005b806110ca5f61163393610517565b88611613565b806110ca5f61164793610517565b86611588565b806110ca5f61165b93610517565b86611527565b611683915060203d602011611689575b61167b8183610517565b810190612e75565b886114b3565b503d611671565b806110ca5f61169e93610517565b8761146e565b9181601f84011215610649578235916001600160401b0383116116d1576020838186019501011161064457565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b346107b95760403660031901126107b4576004356001600160401b0381116107af573660238201121561064957806004013561176581610558565b916117736040519384610517565b8183526024602084019260051b820101903682116106445760248101925b8284106117c157602435856001600160401b0382116107af576117bb6107ad9236906004016116a4565b91612c3a565b83356001600160401b038111610649576020916117e58392602436918701016105dd565b815201930192611791565b346107b95760a03660031901126107b45760043561180d816105c8565b61187b60243561181c816105c8565b604435611828816105c8565b6064359060843592611839846105c8565b6032549561185f60ff600889901c1615809881996118f9575b81156118d9575b50612ecc565b86611872600160ff196032541617603255565b6118c057612f2f565b61188157005b61189161ff001960325416603255565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1005b6118d461010061ff00196032541617603255565b612f2f565b303b159150816118eb575b505f611859565b60ff1660011490505f6118e4565b600160ff8216109150611852565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b346107b9575f3660031901126107b4577f000000000000000000000000000000000000000000000000000000000000000060ff8116601f811161199f5761089a916040519161197b604084610517565b60208084528381019190368337835252604051918291602083526020830190611907565b632cd44ac360e21b5f5260045ffd5b634e487b7160e01b5f52602160045260245ffd5b60031115610a3057565b906003821015610a305752565b815181526020918201516040820193926105479201906119cc565b346107b95760203660031901126107b457600435611a11816105c8565b611a19612c22565b5060018060a01b03165f52600360205260405f2060ff600160405192611a3e846104fc565b80548452015416906003821015610a305761089a916020820152604051918291826119d9565b346107b9575f3660031901126107b4577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc65760206024916040519283809263237dfb4760e11b82523360048301525afa8015610bc157611ad9915f91610b925750612b67565b6107ad6138ed565b346107b95760203660031901126107b4576020600160ff611b00610c64565b161b806033541614604051908152f35b346107b95760803660031901126107b457611b29610c64565b606036602319011261124857604051611b41816104dc565b602435611b4d816107e8565b815260443561ffff811681036105d957602082015260643561ffff811681036105d9576040820152611b7d613895565b60ff5f541660ff83161015611b95576107ad91613fad565b637310cff560e11b5f5260045ffd5b346107b9575f3660031901126107b4576020603354604051908152f35b346107b9575f3660031901126107b4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346107b9575f3660031901126107b4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346107b95760403660031901126107b457600435611c66816105c8565b6024356001600160401b0381116107af57611c859036906004016109a4565b6008546001600160a01b03163303611cba576001600160a01b0382165f9081526009602052604090204290556107ad91614068565b6376d8ab1760e11b5f5260045ffd5b346107b9575f3660031901126107b457611ce1613895565b609680546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346107b95760203660031901126107b4576020611d4b600435611d46816105c8565b6130ce565b604051908152f35b346107b95760a03660031901126107b457611d6d366111f8565b606435611d798161124d565b6084356001600160401b0381116107af57611d9890369060040161125e565b611da0613895565b5f5460ff1680611db260c08210613c1a565b611dbe61136a82613c30565b611dc88582613fad565b611dd0613c42565b93611ddb8451612a8f565b955f5b8551811015611e0a5780611e04611dfa6113b46001948a612a59565b6106e3838c612a59565b01611dde565b50848688611e16610538565b63ffffffff88168152906020820152611e2e82612a47565b52611e3881612a47565b50600b546001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811692911690823b15610bc657611e95925f9283604051809681958294630130fc2760e51b845260048401613c8f565b03925af18015610bc15761203f575b50611eae5f613312565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc6575f6040518092633aea0b9d60e11b8252818381611f01888b8d60048501613de6565b03925af18015610bc15761202b575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc65760405163136ca0f960e11b815260ff86166004820152905f908290602490829084905af18015610bc157612017575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc65760405163136ca0f960e11b815260ff9590951660048601525f908590602490829084905af1938415610bc1575f6116209281927fa34835bc2b673ec37fcf1591a91295b163fc2e181e4ea4e733beb27de1ceac4c97612009575060405195869586613e0e565b806110ca8461163393610517565b806110ca5f61202593610517565b85611f71565b806110ca5f61203993610517565b85611f10565b806110ca5f61204d93610517565b85611ea4565b92939161207561208392600f60f81b865260e0602087015260e0860190611907565b908482036040860152611907565b92606083015260018060a01b031660808201525f60a082015260c0818303910152602080835192838152019201905f5b8181106120c05750505090565b82518452602093840193909201916001016120b3565b346107b9575f3660031901126107b45760c854158061216e575b15612131576120fd61414f565b612105614204565b9061089a604051612117602082610517565b5f8082523660208301376040519384933091469186612053565b60405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606490fd5b5060c954156120f0565b81601f820112156106495780359061218f82610558565b9261219d6040519485610517565b82845260208085019360061b8301019181831161064457602001925b8284106121c7575050505090565b60408483031261124857602060409182516121e1816104fc565b6121ea87610c74565b8152828701356121f9816105c8565b838201528152019301926121b9565b346107b95760a03660031901126107b457600435612225816105c8565b60243590604435906001600160401b0382116107af5760209261224f611d4b933690600401612178565b6064359160843593613121565b346107b95760203660031901126107b457602061227a600435614c90565b6040516001600160c01b039091168152f35b346107b9575f3660031901126107b4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346107b9575f3660031901126107b4576096546040516001600160a01b039091168152602090f35b346107b9575f3660031901126107b457602060ff5f5416604051908152f35b346107b9575f3660031901126107b4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346107b9575f3660031901126107b45760206040517f2bd82124057f0913bc3b772ce7b83e8057c1ad1f3510fc83778be20f10ec5de68152f35b346107b95760203660031901126107b4576107ad6004356123b5816105c8565b6123bd613895565b613f4f565b346107b9575f3660031901126107b4576020600a54604051908152f35b346107b95760203660031901126107b45760206004356123fe816105c8565b600b546040516001600160a01b0392831691909216148152f35b60206040818301928281528451809452019201905f5b81811061243b5750505090565b825163ffffffff1684526020938401939092019160010161242e565b346107b95760403660031901126107b457600435612474816107e8565b602435906001600160401b0382116107af5736602383011215610649578160040135916124a083610558565b926124ae6040519485610517565b8084526024602085019160051b8301019136831161064457602401905b8282106124eb5761089a6124df8686614299565b60405191829182612418565b81358152602091820191016124cb565b346107b95760803660031901126107b457600435612518816105c8565b602435612524816105c8565b6044356001600160401b0381116107af57612543903690600401610df3565b90606435916001600160401b0383116107af576125a76125bf9161256e610ed99536906004016116a4565b959094612579613a0f565b61258a61068f600180603354161490565b600b546001600160a01b03166001600160a01b0390911614612c0c565b9282016125b481846132cf565b879592949195614320565b926125c981613312565b8061265057505050916125dd928194614751565b51905f5b81518110156107ad578061264a61260061078861077a60019587612ac1565b63ffffffff6126416108ac61263761262561261b888c612a59565b5163ffffffff1690565b9460ff165f52600160205260405f2090565b5463ffffffff1690565b91161115613435565b016125e1565b80612662600192989695979498613312565b03612680576107ad956126749161331c565b97935095915050614431565b63354bb8ab60e01b5f5260045ffd5b346107b9575f3660031901126107b45760206040517f4d404e3276e7ac2163d8ee476afa6a41d1f68fb71f2d8b6546b24e55ce01b72a8152f35b346107b9575f3660031901126107b4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346107b9575f3660031901126107b457600b546040516001600160a01b039091168152602090f35b61054790929192606081019361ffff6040809263ffffffff8151168552826020820151166020860152015116910152565b346107b95760203660031901126107b45760ff612781610c64565b612789612b93565b50165f52600160205261089a60405f2061ffff604051916127a9836104dc565b5463ffffffff81168352818160201c16602084015260301c16604082015260405191829182612735565b346107b9575f3660031901126107b4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346107b95760203660031901126107b457600435612834816105c8565b61283c613895565b6001600160a01b03811615612854576107ad90613f07565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346107b9575f3660031901126107b4576020611d4b615568565b346107b95760203660031901126107b4576004357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc65760206004916040519283809263755b36bd60e11b82525afa908115610bc1575f91612955575b506001600160a01b03163303612946576107ad9061347d565b63794821ff60e01b5f5260045ffd5b61296e915060203d602011610d9257610d848183610517565b5f61292d565b346107b95760203660031901126107b457600435612991816105c8565b60018060a01b03165f526003602052602060ff600160405f200154166111a560405180926119cc565b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b15612a2457565b63840a48d560e01b5f5260045ffd5b634e487b7160e01b5f52603260045260245ffd5b805115612a545760200190565b612a33565b8051821015612a545760209160051b010190565b60408051909190612a7e8382610517565b6001815291601f1901366020840137565b90612a9982610558565b612aa66040519182610517565b8281528092612ab7601f1991610558565b0190602036910137565b908151811015612a54570160200190565b15612ad957565b63aba4733960e01b5f5260045ffd5b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b519081151582036105d957565b908160209103126107b4576109bf90612b3b565b6040513d5f823e3d90fd5b15612b6e57565b631d77d47760e21b5f5260045ffd5b15612b8457565b63c61dca5d60e01b5f5260045ffd5b60405190612ba0826104dc565b5f6040838281528260208201520152565b8054821015612a54575f5260205f2001905f90565b90604051612bd3816104dc565b604081935463ffffffff8116835263ffffffff8160201c166020840152811c910152565b908160209103126107b457516109bf816105c8565b15612c1357565b6366e565df60e01b5f5260045ffd5b60405190612c2f826104fc565b5f6020838281520152565b9190612c4d61068f600480603354161490565b612c6b612c5b5f5460ff1690565b612c66368585610919565b613e7c565b50612c7882845114612e53565b5f917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165b818410612cb3575050505050565b612cd7610788612cc986858798999a9697612e69565b356001600160f81b03191690565b91612ce28688612a59565b51918251813b15610bc6576040516379a0849160e11b815260ff8616600482015290602082602481865afa918215610bc157612d2d9263ffffffff915f91612e35575b501614612e8a565b612d378351612a8f565b955f985f995b85518b1015612dc35788612dbb600192612da6610f638f612d986107476107418f938f6106cd82612d6d92612a59565b6001600160a01b0381165f908152600360205260409020909a9054612d928383612a59565b52612a59565b60ff600192161c1660011490565b838060a01b0316838060a01b03831611612eb6565b9a0199612d3d565b509594809298939950612dd991976001956136bc565b43612def8260ff165f52600560205260405f2090565b557f46077d55330763f16269fd75e5761663f4192d2791747c0189b16ad31db07db460ff60405192169180612e2943829190602083019252565b0390a201929193612ca5565b612e4d915060203d81116116895761167b8183610517565b5f612d25565b15612e5a57565b63aaad13f760e01b5f5260045ffd5b90821015612a54570190565b908160209103126107b457516109bf816107e8565b15612e9157565b638e5aeee760e01b5f5260045ffd5b15612ea757565b63d053aa2160e01b5f5260045ffd5b15612ebd57565b63ba50f91160e01b5f5260045ffd5b15612ed357565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b92919260408051612f408282610517565b601681527520ab29a932b3b4b9ba393ca1b7b7b93234b730ba37b960511b6020820152612f6f82519283610517565b600682526576302e302e3160d01b6020830152612f9c60ff60325460081c16612f9781613ea7565b613ea7565b8051906001600160401b0382116104f757612fc182612fbc60ca54614117565b614e7c565b602090601f831160011461303357610dee946130116123bd989561300986610b8d976105479e9d9b97610dc1975f92613028575b50508160011b915f199060031b1c19161790565b60ca55614f1b565b61301a5f60c855565b6130235f60c955565b613f07565b015190505f80612ff5565b60ca5f52601f19831691907f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee1925f5b8181106130b657506123bd98956001866105479d9c9a96610dc196610dee9b96610b8d9a613011971061309e575b505050811b0160ca55614f1b565b01515f1960f88460031b161c191690555f8080613090565b92936020600181928786015181550195019301613062565b6109bf9060405160208101917f2bd82124057f0913bc3b772ce7b83e8057c1ad1f3510fc83778be20f10ec5de6835260018060a01b0316604082015260408152613119606082610517565b5190206140f1565b919493909260405192602084019460e08501917f4d404e3276e7ac2163d8ee476afa6a41d1f68fb71f2d8b6546b24e55ce01b72a875260018060a01b03166040860152606085015260c060808501528651809152602061010085019701905f5b8181106131ae575050506109bf949561311992849260a084015260c083015203601f198101835282610517565b8251805160ff168a526020908101516001600160a01b0316818b015260409099019890920191600101613181565b359060028210156105d957565b919082604091031261124857604051613201816104fc565b6020808294803584520135910152565b9080601f83011215610649576040519161322c604084610517565b82906040810192831161064457905b8282106132485750505090565b813581526020918201910161323b565b8082039291610100841261124857604051613272816104dc565b6080819561328084866131e9565b835261328f84604087016131e9565b6020840152607f190112611248576132c660409260c08451956132b1876104fc565b6132be8360808301613211565b875201613211565b60208401520152565b9091610140828403126107b4576132e5826131dc565b926020830135906001600160401b0382116107af57604061330b826109bf9487016109a4565b9401613258565b60021115610a3057565b9190610180838203126107b457613332836131dc565b9260208101356001600160401b0381116107af57826133529183016109a4565b926133608360408401613258565b926101408301356001600160401b0381116107af5781613381918501612178565b92610160810135906001600160401b0382116107af57019060608282031261124857604051916133b0836104dc565b80356001600160401b0381116133e4576040926133ce9183016109a4565b8352602081013560208401520135604082015290565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b1561343c57565b63c6b9e76760e01b5f5260045ffd5b90604051613458816104dc565b604061ffff82945463ffffffff81168452818160201c16602085015260301c16910152565b61348e603354198219811614612b7d565b806033556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a2565b906134ca826108fe565b6134d76040519182610517565b8281528092612ab7601f19916108fe565b634e487b7160e01b5f52601160045260245ffd5b5f19811461350a5760010190565b6134e8565b5f81805b61358957506135259061ffff166134c0565b5f5f5b825182108061357e575b15613577576001811b8416613550575b61354b906134fc565b613528565b90600161354b9160ff60f81b8460f81b165f1a61356d8287612ac1565b5301919050613542565b5050905090565b506101008110613532565b5f19810181811161350a5761ffff9116911661ffff811461350a576001019080613513565b6020818303126107b4578051906001600160401b0382116107af57019080601f830112156106495781516135e181610558565b926135ef6040519485610517565b81845260208085019260051b82010192831161064457602001905b8282106136175750505090565b6020809161362484612b3b565b81520191019061360a565b93929190606085016060865281518091526020608087019201905f5b81811061369d575050508481036020860152602080835192838152019201905f5b818110613687575050509060406105479294019060ff169052565b825184526020938401939092019160010161366c565b82516001600160a01b031684526020938401939092019160010161364b565b909291926136c8612a6d565b9060f885901b6001600160f81b0319165f1a6136e383612a47565b537f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031694853b15610bc65761373a955f9283604051809981958294636c3fb4bf60e01b84528a6004850161362f565b03925af1938415610bc1575f9461379b575b505f5b8251811015613794578061376e61376860019388612a59565b51151590565b613779575b0161374f565b61378f8361378a6106cd8488612a59565b614068565b613773565b5050509050565b6137b89194503d805f833e6137b08183610517565b8101906135ae565b925f61374c565b156137c657565b63bbba60cb60e01b5f5260045ffd5b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b15610bc6575f60405180936378219b3f60e11b8252856004830152604060248301528183816138356044820188611907565b03925af1908115610bc1577fec2963ab21c1e50e1e582aa542af2e4bf7bf38e6e1403c27b42e1c5d6e621eaa9261388092613885575b50604051918291602083526020830190611907565b0390a2565b5f61388f91610517565b5f61386b565b6096546001600160a01b031633036138a957565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b5f196033556040515f1981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2565b806033556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2565b600754604080516001600160a01b038084168252841660208201529192917f315457d8a8fe60f04af17c16e2f5a5e1db612b31648e58030360759ef8f3528c9190a16001600160a01b03166001600160a01b03199190911617600755565b600854604080516001600160a01b038084168252841660208201529192917f8f30ab09f43a6c157d7fce7e0a13c003042c1c95e8a72e7a146a21c0caa24dc99190a16001600160a01b03166001600160a01b03199190911617600855565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303613a4157565b6323d871a560e01b5f5260045ffd5b90613a5b82516134c0565b5f5b8351811015613a94576001906001600160f81b0319613a7c8287612a59565b5160f81b165f1a613a8d8285612ac1565b5301613a5d565b509150565b15613aa057565b6368b6a87560e11b5f5260045ffd5b6001600160a01b0390911681526040602082018190526109bf92910190611907565b6040906109bf939281528160208201520190611907565b634e487b7160e01b5f52601260045260245ffd5b5f5160206158f25f395f51905f5290613b13612c22565b505f919006602060c0835b613c13575f935f5160206158f25f395f51905f5260038186818180090908604051613b498582610517565b84368237848185604051613b5d8282610517565b813682378381528360208201528360408201528560608201527f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f5260808201525f5160206158f25f395f51905f5260a082015260056107cf195a01fa8015613c1857613bc790615642565b5191613c13575f5160206158f25f395f51905f5282800914613bfe57505f5160206158f25f395f51905f5260015f94089293613b1e565b92935050613c0a610538565b92835282015290565b613ae8565bfe5b15613c2157565b633cb89c9760e01b5f5260045ffd5b60ff60019116019060ff821161350a57565b60408051909190613c538382610517565b6001815291601f1901825f5b828110613c6b57505050565b602090604051613c7a816104fc565b5f815260608382015282828501015201613c5f565b90604082019060018060a01b031682526040602083015282518091526060820191602060608360051b8301019401925f915b838310613cd057505050505090565b9091929394605f1982820301835285516020606081604085019363ffffffff81511686520151936040838201528451809452019201905f905b808210613d285750505060208060019297019301930191939290613cc1565b82516001600160a01b0316845260209384019390920191600190910190613d09565b15613d5157565b630bd441b960e21b5f5260045ffd5b90602080835192838152019201905f5b818110613d7d5750505090565b825180516001600160a01b031685526020908101516001600160601b03168186015260409094019390920191600101613d70565b906109bf94936001600160601b0360809460ff63ffffffff941685521660208401521660408201528160608201520190613d60565b6001600160601b036109bf949360ff6060941683521660208201528160408201520190613d60565b9395949060c0936001600160601b0363ffffffff94613e5088613e679561ffff6040809263ffffffff8151168552826020820151166020860152015116910152565b16606087015260e0608087015260e0860190613d60565b95613e7181613312565b60a085015216910152565b906001613e8a60ff93614e04565b928392161b1115613e985790565b63ca95733360e01b5f5260045ffd5b15613eae57565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b609680546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b600b54604080516001600160a01b038084168252841660208201529192917f9770f3cadfdcbb6f93af935e86047111590c3768271d237e4a2bc0b874bed6939190a16001600160a01b03166001600160a01b03199190911617600b55565b60ff7f3ee6fe8d54610244c3e9d3c066ae4aee997884aa28f10616ae821925401318ac911691825f52600160205260405f2061400063ffffffff835116829063ffffffff1663ffffffff19825416179055565b6020820151815465ffff0000000067ffff000000000000604086015160301b169260201b169067ffffffff00000000191617179055604051809161388082606081019261ffff6040809263ffffffff8151168552826020820151166020860152015116910152565b9060018060a01b0382165f52600360205260405f2060ff6001820154166003811015610a30576001036140e2576140d190546140a860ff5f541684613e7c565b6001600160c01b03908116916140bd90614c90565b1681166001600160c01b0390811691161490565b6140d9575050565b6105479161505c565b6325ec6c1f60e01b5f5260045ffd5b6042906140fc615568565b906040519161190160f01b8352600283015260228201522090565b90600182811c92168015614145575b602083101461413157565b634e487b7160e01b5f52602260045260245ffd5b91607f1691614126565b604051905f8260ca549161416283614117565b80835292600181169081156141e55750600114614186575b61054792500383610517565b5060ca5f90815290917f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee15b8183106141c95750509060206105479282010161417a565b60209193508060019154838589010152019101909184926141b1565b6020925061054794915060ff191682840152151560051b82010161417a565b604051905f8260cb549161421783614117565b80835292600181169081156141e5575060011461423a5761054792500383610517565b5060cb5f90815290917fa7ce836d032b2bf62b7e2097a8e0a6d8aeb35405ad15271e96d3b0188a1d06fb5b81831061427d5750509060206105479282010161417a565b6020919350806001915483858901015201910190918492614265565b91906142a58151612a8f565b905f5b81518110156142e357806142ca6142c160019385612a59565b51876002615151565b63ffffffff6142d98387612a59565b91169052016142a8565b5090925050565b908160209103126107b4575190565b905f905b6002821061430a57505050565b60208060019285518152019301910190916142fd565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690614354612c22565b5061436161118a846130ce565b91803b15610bc6576040935f610164926143f56020966143e1888a519a8b998a986301e2d35b60e11b8a5260018060a01b031660048a01526143b160248a01825160208091805184520151910152565b80830151805160648b01526020015160848a015201516143d560a4890182516142f9565b015160e48701906142f9565b805161012486015260200151610144850152565b5af1908115610bc1575f91614408575090565b6109bf915060203d60201161442a575b6144228183610517565b8101906142ea565b503d614418565b94918093916144526144589461444a8851855114612e53565b87838a61525b565b86614a7c565b5f5b8251811015614563578061449261448d61447c61078861077a60019689612ac1565b60ff165f52600160205260405f2090565b61344b565b6144a061261b838651612a59565b63ffffffff6144b66108ac845163ffffffff1690565b9116116144c5575b500161445a565b61451b906144d961078861077a8589612ac1565b6144f76144ea856040890151612a59565b516001600160601b031690565b896145096144ea8760208b0151612a59565b91614514878c612a59565b519361533c565b61455d614526612a6d565b61453361077a8488612ac1565b5f1a61453e82612a47565b5361378a602061454e858a612a59565b5101516001600160a01b031690565b5f6144be565b5050505050565b60405190614577826104dc565b60606040838281528260208201520152565b1561459057565b6313ca465760e01b5f5260045ffd5b156145a657565b630c6816cd60e01b5f5260045ffd5b9190820180921161350a57565b156145c957565b631968677d60e11b5f5260045ffd5b600160209183518155019101516003811015610a305760ff80198354169116179055565b9080601f8301121561064957815161461381610558565b926146216040519485610517565b81845260208085019260051b82010192831161064457602001905b8282106146495750505090565b6020809183516146588161124d565b81520191019061463c565b9190916040818403126107b45780516001600160401b0381116107af578361468c9183016145fc565b9260208201516001600160401b0381116107af576109bf92016145fc565b6109bf939260609260018060a01b0316825260208201528160408201520190611907565b6020818303126107b4578051906001600160401b0382116107af57019080601f8301121561064957815161470181610558565b9261470f6040519485610517565b81845260208085019260051b82010192831161064457602001905b8282106147375750505090565b602080918351614746816107e8565b81520191019061472a565b6147f061475c61456a565b946147ea614771610747610f3b5f5460ff1690565b61477a86614c90565b906147848661548b565b6001600160c01b031690614799821515614589565b60018060c01b03166147b36147ae8284161590565b61459f565b6001600160a01b0386165f9081526009602052604090206147e3906147dc9054600a54906145b5565b42116145c2565b1785614cd4565b836137d5565b6001614818816148108460018060a01b03165f52600360205260405f2090565b015460ff1690565b614821816119c2565b03614a17575b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc6575f6040518092631fd93ca960e11b82528183816148798a8960048401613aaf565b03925af18015610bc157614a03575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc657835f9184836148e09560405196879586948593632550477760e01b8552600485016146aa565b03925af18015610bc1575f915f916149df575b50604085015260208401527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc657825f91614952938360405180968195829462bff04d60e01b845260048401613ad1565b03925af1908115610bc1575f916149bd575b5082525f5b81518110156149b857806149b261498e61448d61447c61078861077a60019789612ac1565b63ffffffff6126416108ac6149a761261b878b51612a59565b935163ffffffff1690565b01614969565b505090565b6149d991503d805f833e6149d18183610517565b8101906146ce565b5f614964565b90506149fd91503d805f833e6149f58183610517565b810190614663565b5f6148f3565b806110ca5f614a1193610517565b5f614888565b614a48614a22610538565b838152600160208201526001600160a01b0383165f9081526003602052604090206145d8565b816001600160a01b0382167fe8e68cef1c3a761ed7be7e8463a375f27f7bc335e51824223cacce636ec5c3fe5f80a3614827565b614a8761475c61456a565b6001614aa7816148108460018060a01b03165f52600360205260405f2090565b614ab0816119c2565b03614c43575b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc6575f6040518092631fd93ca960e11b8252818381614b088a8960048401613aaf565b03925af18015610bc157614c2f575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc657835f918483614b6f9560405196879586948593632550477760e01b8552600485016146aa565b03925af18015610bc1575f915f91614c13575b50604085015260208401527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691823b15610bc657614be1925f928360405180968195829462bff04d60e01b845260048401613ad1565b03925af1908115610bc1575f91614bf9575b50815290565b614c0d91503d805f833e6149d18183610517565b5f614bf3565b9050614c2991503d805f833e6149f58183610517565b5f614b82565b806110ca5f614c3d93610517565b5f614b17565b614c4e614a22610538565b816001600160a01b0382167fe8e68cef1c3a761ed7be7e8463a375f27f7bc335e51824223cacce636ec5c3fe5f80a3614ab6565b5f1981019190821161350a57565b805f52600260205260405f20549081155f14614cac5750505f90565b5f52600260205260405f20905f19810190811161350a57614ccc91612bb1565b505460401c90565b90614ce7825f52600260205260405f2090565b5480614d345750614d03610547925f52600260205260405f2090565b614d2f614d0e610549565b4363ffffffff168152925b5f60208501526001600160c01b03166040840152565b6155cf565b91614d5f63ffffffff93614d59614d53845f52600260205260405f2090565b91614c82565b90612bb1565b5090614d6f825463ffffffff1690565b43851694168403614d9a57506105479250906001600160401b0382549181199060401b169116179055565b815467ffffffff000000001916602085901b67ffffffff000000001617909155610547929190614d2f90614dd6905f52600260205260405f2090565b91614d19614de2610549565b63ffffffff9095168552565b15614df557565b631019106960e31b5f5260045ffd5b90610100825111614e6d57815115614e6857602082015160019060f81c81901b5b8351821015614e6357600190614e4e614e4461078861077a8689612ac1565b60ff600191161b90565b90614e5a818311614dee565b17910190614e25565b925050565b5f9150565b637da54e4760e11b5f5260045ffd5b601f8111614e88575050565b60ca5f5260205f20906020601f840160051c83019310614ec2575b601f0160051c01905b818110614eb7575050565b5f8155600101614eac565b9091508190614ea3565b601f8211614ed957505050565b5f5260205f20906020601f840160051c83019310614f11575b601f0160051c01905b818110614f06575050565b5f8155600101614efb565b9091508190614ef2565b9081516001600160401b0381116104f757614f4281614f3b60cb54614117565b60cb614ecc565b602092601f8211600114614f7657614f71929382915f926130285750508160011b915f199060031b1c19161790565b60cb55565b60cb5f52601f198216937fa7ce836d032b2bf62b7e2097a8e0a6d8aeb35405ad15271e96d3b0188a1d06fb915f5b868110614fda5750836001959610614fc2575b505050811b0160cb55565b01515f1960f88460031b161c191690555f8080614fb7565b91926020600181928685015181550194019201614fa4565b602080825282516001600160a01b039081168284015281840151166040808401919091529092015160608083015280516080830181905260a09092019201905f5b8181106150405750505090565b825163ffffffff16845260209384019390920191600101615033565b600b54825192936001600160a01b03918216937f000000000000000000000000000000000000000000000000000000000000000090921692909161509f90612a8f565b925f5b86518110156150cd57806150b860019289612ac1565b5160f81c6150c68288612a59565b52016150a2565b509291945092615101906150f16150e2610549565b6001600160a01b039096168652565b6001600160a01b03166020850152565b6040830152803b15610bc657604051636e3492b560e01b8152915f9183918290849082906151329060048301614ff2565b03925af18015610bc1576151435750565b806110ca5f61054793610517565b9190815f528260205260405f2054925f5b8481106151fa5760405162461bcd60e51b815260206004820152605c60248201527f5265676973747279436f6f7264696e61746f722e67657451756f72756d42697460448201527f6d6170496e6465784174426c6f636b4e756d6265723a206e6f206269746d617060648201527f2075706461746520666f756e6420666f72206f70657261746f72496400000000608482015260a490fd5b80850385811161350a576108ac61521091614c82565b61523961522e826152298887905f5260205260405f2090565b612bb1565b505463ffffffff1690565b63ffffffff808616911611156152525750600101615162565b94505050505090565b919290602082019283515f52600460205260ff60405f2054166152d65760408301805142116152c757610547956152bf9386515f5260046020526152a960405f20600160ff19825416179055565b6007546001600160a01b03169651925193613121565b905191615658565b630819bdcd60e01b5f5260045ffd5b636fbefec360e11b5f5260045ffd5b156152ec57565b6356168b4160e11b5f5260045ffd5b908160209103126107b457516109bf8161124d565b1561531757565b634c44995d60e01b5f5260045ffd5b1561532d57565b63b187e86960e01b5f5260045ffd5b6020858101516001600160a01b039081165f8181526003909352604090922054929795969394929361538f9361538293919261537b92911614156152e5565b5160ff1690565b60ff808816911614612e8a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031694853b15610bc657604051635401ed2760e01b8152600481019290925260ff16602482015293602090859060449082905afa928315610bc157610547945f94615441575b508261543992615434615420936001600160601b0361542c61542082998b61578f565b6001600160601b031690565b911611615310565b6157b2565b911610615326565b61542091945092615439926154346154786001600160601b039660203d602011615484575b6154708183610517565b8101906152fb565b969350509250926153fd565b503d615466565b600b546001600160a01b0316803b15610bc657604051632e8da82960e01b81526001600160a01b03929092166004830152602090829060249082905afa908115610bc1575f91615549575b50156154de57565b60405162461bcd60e51b815260206004820152603c60248201527f5265636c61696d536c617368696e675265676973747279436f6f7264696e617460448201527f6f723a206f70657261746f72206e6f742077686974656c6973746564000000006064820152608490fd5b615562915060203d602011610bba57610bac8183610517565b5f6154d6565b6155706157d0565b61557861581b565b6040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a081526155c960c082610517565b51902090565b8054680100000000000000008110156104f7576155f191600182018155612bb1565b61562f57815160208084015160409485015163ffffffff909316911b67ffffffff00000000161767ffffffffffffffff199190931b16919091179055565b634e487b7160e01b5f525f60045260245ffd5b1561564957565b63d51edae360e01b5f5260045ffd5b9190916156658284615841565b9390926005851015610a305761568e94159384615756575b5083156156a3575b50505015151590565b61569457565b638baa579f60e01b5f5260045ffd5b5f9350906156ce6156dc8594936040519283916020830195630b135d3f60e11b875260248401613ad1565b03601f198101835282610517565b51915afa3d1561574f573d6156f0816108fe565b906156fe6040519283610517565b81523d5f602083013e5b81615741575b8161571d575b505f8080615685565b905061573a630b135d3f60e11b91602080825183010191016142ea565b145f615714565b90506020815110159061570e565b6060615708565b6001600160a01b0384811691161493505f61567d565b906001600160601b03809116911602906001600160601b03821691820361350a57565b6157ad6001600160601b039161ffff6020612710950151169061576c565b160490565b6157ad6001600160601b039161ffff6040612710950151169061576c565b6157d861414f565b80519081156157e8576020012090565b505060c85480156157f65790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b615823614204565b8051908115615833576020012090565b505060c95480156157f65790565b9060418151145f1461586d5761586991602082015190606060408401519301515f1a90615876565b9091565b50505f90600290565b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116158e6576020935f9360ff60809460405194855216868401526040830152606082015282805260015afa15610bc1575f516001600160a01b038116156158de57905f90565b505f90600190565b505050505f9060039056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a264697066735822122004127eee325cb278ea09a4373f754f8c97e50a28c8c8096d4fe9865332ecc25a64736f6c634300081c0033"; + "0x61016080604052346104c457615e7e8038038061001b81610511565b92833981019060e081830312610474578051916001600160a01b0383168303610470576020820151926001600160a01b03841684036104705760408301516001600160a01b03811681036104705760608401516001600160a01b0381168103610470576080850151916001600160a01b03831683036104705760a0860151966001600160a01b038816968789036104705760c0810151906001600160401b03821161042057019486601f870112156103c75785516001600160401b0381116103b3576100f0601f8201601f1916602001610511565b9681885260208801986020838301011161035e57815f9260208093018b5e8801015260c05260a05260e05260805261010052601f8151116103225751905160208210610312575b176101205215610303576101405260325460ff8160081c166102ae5760ff80821603610273575b604051615947908161053782396080518181816127e801526137d8015260a051818181610cf701528181610f920152818161158b01528181611bd601528181611f7401528181614323015281816148290152614ab8015260c051818181610ff7015281816114c601528181611c1a01528181611eb0015281816136e60152818161488b01528181614b1a0152615391015260e0518181816110590152818161152a01528181611f130152818161232c01528181612c7c015281816149000152614b8f01526101005181818161141001528181611e46015281816126de01528181613a1101526150710152610120518161193d015261014051818181610b1a01528181611a76015281816122a101526128d80152f35b60ff90811916176032557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a18061015e565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b6339b190bb60e11b5f5260045ffd5b5f198260200360031b1b16610137565b60449060405192839163305a27a960e01b8352602060048401525180918160248501528484015e5f828201840152601f01601f19168101030190fd5b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b5f80fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b6040519190601f01601f191682016001600160401b038111838210176103b35760405256fe6080604052600436106129ba575f3560e01c8062cf2ab51461037a57806303fd34921461037557806304ec635114610370578063054310e61461036b5780630cf4b767146103665780630d3f213414610361578063125e05841461035c57806313542a4e14610357578063136439dd146103525780631478851f1461034d5780631eb812da14610348578063249a0c421461034357806328f61b311461033e578063296bb0641461033957806329d1e0c3146103345780632cdd1e861461032f578063303ca9561461032a5780633c2a7f4c146103255780633eef3a51146103205780635140a5481461031b578063530b97a41461031657806354fd4d50146103115780635865c60c1461030c578063595c6a67146103075780635ac86ab7146103025780635b0b829f146102fd5780635c975abb146102f85780635df45946146102f357806368304835146102ee5780636e3b17db146102e9578063715018a6146102e457806373447992146102df5780638281ab75146102da57806384b0196e146102d557806384ca5213146102d0578063871ef049146102cb578063886f1195146102c65780638da5cb5b146102c15780639aa1653d146102bc5780639e9923c2146102b75780639feab859146102b2578063a65497c6146102ad578063a96f783e146102a8578063b5265787146102a3578063c391425e1461029e578063c63fd50214610299578063ca0de88214610294578063ca8aa7c71461028f578063de1164bb1461028a578063e65797ad14610285578063ea32afae14610280578063f2fde38b1461027b578063f698da2514610276578063fabc1cbc146102715763fd39105a036129ba57612974565b6128c2565b6128a8565b612817565b6127d3565b612766565b61270d565b6126c9565b61268f565b6124fb565b612457565b6123df565b6123c2565b612395565b61235b565b612317565b6122f8565b6122d0565b61228c565b61225c565b612208565b6120d6565b611d53565b611d24565b611cc9565b611c49565b611c05565b611bc1565b611ba4565b611b10565b611ae1565b611a64565b6119f4565b61192b565b6117f0565b61172a565b6112f0565b611157565b610e5a565b610dc6565b610d99565b610cdc565b610cb4565b610c82565b610bfa565b610bcb565b610aff565b610ac4565b610a89565b610a35565b6109c2565b6108d6565b6107f6565b6107be565b61064e565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b038211176104f757604052565b6104c8565b604081019081106001600160401b038211176104f757604052565b90601f801991011681019081106001600160401b038211176104f757604052565b60405190610547604083610517565b565b60405190610547606083610517565b6001600160401b0381116104f75760051b60200190565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b6001600160a01b038116036105d957565b5f80fd5b9080601f830112156106495781356105f481610558565b926106026040519485610517565b81845260208085019260051b82010192831161064457602001905b82821061062a5750505090565b602080918335610639816105c8565b81520191019061061d565b61056f565b61046f565b346107b95760203660031901126107b4576004356001600160401b0381116107af5761067e9036906004016105dd565b61069561068f600480603354161490565b15612a1d565b6040905f60205b82518210156107ad578351906106b28583610517565b60018252803660208401376106f26106da6106cd8587612a59565b516001600160a01b031690565b6106e384612a47565b6001600160a01b039091169052565b6106fa612a6d565b9061072461070b6106cd8688612a59565b6001600160a01b03165f90815260036020526040902090565b5461072e83612a47565b5261075861075361074761074185612a47565b51614c90565b6001600160c01b031690565b61350f565b945f5b865181101561079b578061079561078e61078861077a6001958c612ac1565b516001600160f81b03191690565b60f81c90565b86886136bc565b0161075b565b509450600190930192915061069c9050565b005b61041f565b6103cf565b61037f565b346107b95760203660031901126107b4576004355f526002602052602060405f2054604051908152f35b63ffffffff8116036105d957565b346107b95760603660031901126107b45760243561083661083060043561081c846107e8565b604435905f52600260205260405f20612bb1565b50612bc6565b63ffffffff8082511692169182106108bd5760408161087261089a9460206108809501519063ffffffff82161591821561089e575b50506137bf565b01516001600160c01b031690565b6040516001600160c01b0390911681529081906020820190565b0390f35b9091506108b59063ffffffff165b63ffffffff1690565b115f8061086b565b636cb19aff60e01b5f5260045ffd5b5f9103126107b457565b346107b9575f3660031901126107b4576007546040516001600160a01b039091168152602090f35b6001600160401b0381116104f757601f01601f191660200190565b929192610925826108fe565b916109336040519384610517565b82948184528183011161094f578281602093845f960137010152565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b9080601f83011215610649578160206109bf93359101610919565b90565b346107b95760203660031901126107b4576004356001600160401b0381116107af576109f29036906004016109a4565b335f52600360205260ff600160405f20015416906003821015610a3057610a1e60016107ad9314612ad2565b335f52600360205260405f20546137d5565b6119ae565b346107b95760203660031901126107b4577fa77a91bea7b6d95a8eb5a54878a1d9e3c875e26c86a9b70e3420c5c5db193b626040600435610a74613895565b600a549080600a5582519182526020820152a1005b346107b95760203660031901126107b457600435610aa6816105c8565b60018060a01b03165f526009602052602060405f2054604051908152f35b346107b95760203660031901126107b457600435610ae1816105c8565b60018060a01b03165f526003602052602060405f2054604051908152f35b346107b95760203660031901126107b4576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600435813b15610bc65760206024926040519384809263237dfb4760e11b82523360048301525afa918215610bc1576107ad92610b7e915f91610b92575b50612b67565b610b8d60335482811614612b7d565b613921565b610bb4915060203d602011610bba575b610bac8183610517565b810190612b48565b5f610b78565b503d610ba2565b612b5c565b612ae8565b346107b95760203660031901126107b4576004355f526004602052602060ff60405f2054166040519015158152f35b346107b95760403660031901126107b4576060610c32610830602435600435610c21612b93565b505f52600260205260405f20612bb1565b6040519063ffffffff815116825263ffffffff6020820151166020830152604060018060c01b03910151166040820152f35b6004359060ff821682036105d957565b359060ff821682036105d957565b346107b95760203660031901126107b45760ff610c9d610c64565b165f526005602052602060405f2054604051908152f35b346107b9575f3660031901126107b4576008546040516001600160a01b039091168152602090f35b346107b95760203660031901126107b4576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600435813b15610bc6576020906024604051809481936308f6629d60e31b835260048301525afa8015610bc15761089a915f91610d6a575b506040516001600160a01b0390911681529081906020820190565b610d8c915060203d602011610d92575b610d848183610517565b810190612bf7565b5f610d4f565b503d610d7a565b346107b95760203660031901126107b4576107ad600435610db9816105c8565b610dc1613895565b613953565b346107b95760203660031901126107b4576107ad600435610de6816105c8565b610dee613895565b6139b1565b9080601f83011215610649578135610e0a81610558565b92610e186040519485610517565b81845260208085019260051b82010192831161064457602001905b828210610e405750505090565b602080918335610e4f816107e8565b815201910190610e33565b346107b95760603660031901126107b457600435610e77816105c8565b602435610e83816105c8565b604435906001600160401b0382116107af57610ed9610ea9610ede933690600401610df3565b91610eb2613a0f565b610ec361068f600280603354161490565b600b546001600160a01b03918216911614612c0c565b613a50565b6001600160a01b0382165f9081526003602052604090209091610f77825492610f276001610f1881610f0f88614c90565b94015460ff1690565b610f21816119c2565b14612ad2565b610f41610747610747610f3b5f5460ff1690565b88613e7c565b90610f4d821515613a99565b610f688282166001600160c01b03168314612ea0565b612ea0565b9019166001600160c01b031690565b610f818184614cd4565b6001600160c01b0316156110f8575b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc657835f91610fe5938360405180968195829463f4e24fe560e01b845260048401613aaf565b03925af18015610bc1576110e4575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc6575f604051809263bd29b8cd60e01b8252818381611047898960048401613ad1565b03925af18015610bc1576110d0575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691823b15610bc6576110ac925f928360405180968195829463bd29b8cd60e01b845260048401613ad1565b03925af18015610bc1576110bc57005b806110ca5f6107ad93610517565b806108cc565b806110ca5f6110de93610517565b5f611056565b806110ca5f6110f293610517565b5f610ff4565b6001600160a01b0381165f90815260036020526040902061112390600101805460ff19166002179055565b816001600160a01b0382167f396fdcb180cb0fea26928113fb0fd1c3549863f9cd563e6a184f1d578116c8e45f80a3610f90565b346107b95760203660031901126107b457604061118f61118a60043561117c816105c8565b611184612c22565b506130ce565b613afc565b6111a58251809260208091805184520151910152565bf35b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b60609060031901126112485760405190611211826104dc565b8160043561121e816107e8565b815260243561ffff811681036105d95760208201526044359061ffff821682036105d95760400152565b6111a7565b6001600160601b038116036105d957565b81601f820112156106495780359061127582610558565b926112836040519485610517565b82845260208085019360061b8301019181831161064457602001925b8284106112ad575050505090565b60408483031261124857602060409182516112c7816104fc565b86356112d2816105c8565b8152828701356112e18161124d565b8382015281520193019261129f565b346107b95760c03660031901126107b45761130a366111f8565b6064356113168161124d565b6084356001600160401b0381116107af5761133590369060040161125e565b60a43592611342846107e8565b61134a613895565b5f5460ff1692839161135e60c08410613c1a565b61137861136a86613c30565b60ff1660ff195f5416175f55565b6113828186613fad565b61138a613c42565b946113958551612a8f565b965f5b86518110156113d257806113cc6113c26113b46001948b612a59565b51516001600160a01b031690565b6106e3838d612a59565b01611398565b5086889695966113e0610538565b63ffffffff891681529060208201526113f882612a47565b5261140281612a47565b50600b546001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116929116823b15610bc657604051630130fc2760e51b8152915f918391829161145d919060048401613c8f565b038183865af18015610bc157611690575b506114796001613312565b6114836001613312565b803b15610bc657602060049160405192838092632981eb7760e01b82525afa8015610bc1576114c4915f91611661575b5063ffffffff808416911611613d4a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc6575f6040518092630662d3e160e51b82528183816115188c898d8c60048601613db1565b03925af18015610bc15761164d575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc65760405163136ca0f960e11b815260ff84166004820152905f908290602490829084905af18015610bc157611639575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc65760405163136ca0f960e11b815260ff9390931660048401525f908390602490829084905af18015610bc1577fa34835bc2b673ec37fcf1591a91295b163fc2e181e4ea4e733beb27de1ceac4c9561162093600192611625575b5060405195869586613e0e565b0390a2005b806110ca5f61163393610517565b88611613565b806110ca5f61164793610517565b86611588565b806110ca5f61165b93610517565b86611527565b611683915060203d602011611689575b61167b8183610517565b810190612e75565b886114b3565b503d611671565b806110ca5f61169e93610517565b8761146e565b9181601f84011215610649578235916001600160401b0383116116d1576020838186019501011161064457565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b346107b95760403660031901126107b4576004356001600160401b0381116107af573660238201121561064957806004013561176581610558565b916117736040519384610517565b8183526024602084019260051b820101903682116106445760248101925b8284106117c157602435856001600160401b0382116107af576117bb6107ad9236906004016116a4565b91612c3a565b83356001600160401b038111610649576020916117e58392602436918701016105dd565b815201930192611791565b346107b95760a03660031901126107b45760043561180d816105c8565b61187b60243561181c816105c8565b604435611828816105c8565b6064359060843592611839846105c8565b6032549561185f60ff600889901c1615809881996118f9575b81156118d9575b50612ecc565b86611872600160ff196032541617603255565b6118c057612f2f565b61188157005b61189161ff001960325416603255565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1005b6118d461010061ff00196032541617603255565b612f2f565b303b159150816118eb575b505f611859565b60ff1660011490505f6118e4565b600160ff8216109150611852565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b346107b9575f3660031901126107b4577f000000000000000000000000000000000000000000000000000000000000000060ff8116601f811161199f5761089a916040519161197b604084610517565b60208084528381019190368337835252604051918291602083526020830190611907565b632cd44ac360e21b5f5260045ffd5b634e487b7160e01b5f52602160045260245ffd5b60031115610a3057565b906003821015610a305752565b815181526020918201516040820193926105479201906119cc565b346107b95760203660031901126107b457600435611a11816105c8565b611a19612c22565b5060018060a01b03165f52600360205260405f2060ff600160405192611a3e846104fc565b80548452015416906003821015610a305761089a916020820152604051918291826119d9565b346107b9575f3660031901126107b4577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc65760206024916040519283809263237dfb4760e11b82523360048301525afa8015610bc157611ad9915f91610b925750612b67565b6107ad6138ed565b346107b95760203660031901126107b4576020600160ff611b00610c64565b161b806033541614604051908152f35b346107b95760803660031901126107b457611b29610c64565b606036602319011261124857604051611b41816104dc565b602435611b4d816107e8565b815260443561ffff811681036105d957602082015260643561ffff811681036105d9576040820152611b7d613895565b60ff5f541660ff83161015611b95576107ad91613fad565b637310cff560e11b5f5260045ffd5b346107b9575f3660031901126107b4576020603354604051908152f35b346107b9575f3660031901126107b4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346107b9575f3660031901126107b4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346107b95760403660031901126107b457600435611c66816105c8565b6024356001600160401b0381116107af57611c859036906004016109a4565b6008546001600160a01b03163303611cba576001600160a01b0382165f9081526009602052604090204290556107ad91614068565b6376d8ab1760e11b5f5260045ffd5b346107b9575f3660031901126107b457611ce1613895565b609680546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346107b95760203660031901126107b4576020611d4b600435611d46816105c8565b6130ce565b604051908152f35b346107b95760a03660031901126107b457611d6d366111f8565b606435611d798161124d565b6084356001600160401b0381116107af57611d9890369060040161125e565b611da0613895565b5f5460ff1680611db260c08210613c1a565b611dbe61136a82613c30565b611dc88582613fad565b611dd0613c42565b93611ddb8451612a8f565b955f5b8551811015611e0a5780611e04611dfa6113b46001948a612a59565b6106e3838c612a59565b01611dde565b50848688611e16610538565b63ffffffff88168152906020820152611e2e82612a47565b52611e3881612a47565b50600b546001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811692911690823b15610bc657611e95925f9283604051809681958294630130fc2760e51b845260048401613c8f565b03925af18015610bc15761203f575b50611eae5f613312565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc6575f6040518092633aea0b9d60e11b8252818381611f01888b8d60048501613de6565b03925af18015610bc15761202b575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc65760405163136ca0f960e11b815260ff86166004820152905f908290602490829084905af18015610bc157612017575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc65760405163136ca0f960e11b815260ff9590951660048601525f908590602490829084905af1938415610bc1575f6116209281927fa34835bc2b673ec37fcf1591a91295b163fc2e181e4ea4e733beb27de1ceac4c97612009575060405195869586613e0e565b806110ca8461163393610517565b806110ca5f61202593610517565b85611f71565b806110ca5f61203993610517565b85611f10565b806110ca5f61204d93610517565b85611ea4565b92939161207561208392600f60f81b865260e0602087015260e0860190611907565b908482036040860152611907565b92606083015260018060a01b031660808201525f60a082015260c0818303910152602080835192838152019201905f5b8181106120c05750505090565b82518452602093840193909201916001016120b3565b346107b9575f3660031901126107b45760c854158061216e575b15612131576120fd61414f565b612105614204565b9061089a604051612117602082610517565b5f8082523660208301376040519384933091469186612053565b60405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606490fd5b5060c954156120f0565b81601f820112156106495780359061218f82610558565b9261219d6040519485610517565b82845260208085019360061b8301019181831161064457602001925b8284106121c7575050505090565b60408483031261124857602060409182516121e1816104fc565b6121ea87610c74565b8152828701356121f9816105c8565b838201528152019301926121b9565b346107b95760a03660031901126107b457600435612225816105c8565b60243590604435906001600160401b0382116107af5760209261224f611d4b933690600401612178565b6064359160843593613121565b346107b95760203660031901126107b457602061227a600435614c90565b6040516001600160c01b039091168152f35b346107b9575f3660031901126107b4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346107b9575f3660031901126107b4576096546040516001600160a01b039091168152602090f35b346107b9575f3660031901126107b457602060ff5f5416604051908152f35b346107b9575f3660031901126107b4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346107b9575f3660031901126107b45760206040517f2bd82124057f0913bc3b772ce7b83e8057c1ad1f3510fc83778be20f10ec5de68152f35b346107b95760203660031901126107b4576107ad6004356123b5816105c8565b6123bd613895565b613f4f565b346107b9575f3660031901126107b4576020600a54604051908152f35b346107b95760203660031901126107b45760206004356123fe816105c8565b600b546040516001600160a01b0392831691909216148152f35b60206040818301928281528451809452019201905f5b81811061243b5750505090565b825163ffffffff1684526020938401939092019160010161242e565b346107b95760403660031901126107b457600435612474816107e8565b602435906001600160401b0382116107af5736602383011215610649578160040135916124a083610558565b926124ae6040519485610517565b8084526024602085019160051b8301019136831161064457602401905b8282106124eb5761089a6124df8686614299565b60405191829182612418565b81358152602091820191016124cb565b346107b95760803660031901126107b457600435612518816105c8565b602435612524816105c8565b6044356001600160401b0381116107af57612543903690600401610df3565b90606435916001600160401b0383116107af576125a76125bf9161256e610ed99536906004016116a4565b959094612579613a0f565b61258a61068f600180603354161490565b600b546001600160a01b03166001600160a01b0390911614612c0c565b9282016125b481846132cf565b879592949195614320565b926125c981613312565b8061265057505050916125dd928194614751565b51905f5b81518110156107ad578061264a61260061078861077a60019587612ac1565b63ffffffff6126416108ac61263761262561261b888c612a59565b5163ffffffff1690565b9460ff165f52600160205260405f2090565b5463ffffffff1690565b91161115613435565b016125e1565b80612662600192989695979498613312565b03612680576107ad956126749161331c565b97935095915050614431565b63354bb8ab60e01b5f5260045ffd5b346107b9575f3660031901126107b45760206040517f4d404e3276e7ac2163d8ee476afa6a41d1f68fb71f2d8b6546b24e55ce01b72a8152f35b346107b9575f3660031901126107b4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346107b9575f3660031901126107b457600b546040516001600160a01b039091168152602090f35b61054790929192606081019361ffff6040809263ffffffff8151168552826020820151166020860152015116910152565b346107b95760203660031901126107b45760ff612781610c64565b612789612b93565b50165f52600160205261089a60405f2061ffff604051916127a9836104dc565b5463ffffffff81168352818160201c16602084015260301c16604082015260405191829182612735565b346107b9575f3660031901126107b4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346107b95760203660031901126107b457600435612834816105c8565b61283c613895565b6001600160a01b03811615612854576107ad90613f07565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346107b9575f3660031901126107b4576020611d4b615568565b346107b95760203660031901126107b4576004357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc65760206004916040519283809263755b36bd60e11b82525afa908115610bc1575f91612955575b506001600160a01b03163303612946576107ad9061347d565b63794821ff60e01b5f5260045ffd5b61296e915060203d602011610d9257610d848183610517565b5f61292d565b346107b95760203660031901126107b457600435612991816105c8565b60018060a01b03165f526003602052602060ff600160405f200154166111a560405180926119cc565b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b15612a2457565b63840a48d560e01b5f5260045ffd5b634e487b7160e01b5f52603260045260245ffd5b805115612a545760200190565b612a33565b8051821015612a545760209160051b010190565b60408051909190612a7e8382610517565b6001815291601f1901366020840137565b90612a9982610558565b612aa66040519182610517565b8281528092612ab7601f1991610558565b0190602036910137565b908151811015612a54570160200190565b15612ad957565b63aba4733960e01b5f5260045ffd5b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b519081151582036105d957565b908160209103126107b4576109bf90612b3b565b6040513d5f823e3d90fd5b15612b6e57565b631d77d47760e21b5f5260045ffd5b15612b8457565b63c61dca5d60e01b5f5260045ffd5b60405190612ba0826104dc565b5f6040838281528260208201520152565b8054821015612a54575f5260205f2001905f90565b90604051612bd3816104dc565b604081935463ffffffff8116835263ffffffff8160201c166020840152811c910152565b908160209103126107b457516109bf816105c8565b15612c1357565b6366e565df60e01b5f5260045ffd5b60405190612c2f826104fc565b5f6020838281520152565b9190612c4d61068f600480603354161490565b612c6b612c5b5f5460ff1690565b612c66368585610919565b613e7c565b50612c7882845114612e53565b5f917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165b818410612cb3575050505050565b612cd7610788612cc986858798999a9697612e69565b356001600160f81b03191690565b91612ce28688612a59565b51918251813b15610bc6576040516379a0849160e11b815260ff8616600482015290602082602481865afa918215610bc157612d2d9263ffffffff915f91612e35575b501614612e8a565b612d378351612a8f565b955f985f995b85518b1015612dc35788612dbb600192612da6610f638f612d986107476107418f938f6106cd82612d6d92612a59565b6001600160a01b0381165f908152600360205260409020909a9054612d928383612a59565b52612a59565b60ff600192161c1660011490565b838060a01b0316838060a01b03831611612eb6565b9a0199612d3d565b509594809298939950612dd991976001956136bc565b43612def8260ff165f52600560205260405f2090565b557f46077d55330763f16269fd75e5761663f4192d2791747c0189b16ad31db07db460ff60405192169180612e2943829190602083019252565b0390a201929193612ca5565b612e4d915060203d81116116895761167b8183610517565b5f612d25565b15612e5a57565b63aaad13f760e01b5f5260045ffd5b90821015612a54570190565b908160209103126107b457516109bf816107e8565b15612e9157565b638e5aeee760e01b5f5260045ffd5b15612ea757565b63d053aa2160e01b5f5260045ffd5b15612ebd57565b63ba50f91160e01b5f5260045ffd5b15612ed357565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b92919260408051612f408282610517565b601681527520ab29a932b3b4b9ba393ca1b7b7b93234b730ba37b960511b6020820152612f6f82519283610517565b600682526576302e302e3160d01b6020830152612f9c60ff60325460081c16612f9781613ea7565b613ea7565b8051906001600160401b0382116104f757612fc182612fbc60ca54614117565b614e7c565b602090601f831160011461303357610dee946130116123bd989561300986610b8d976105479e9d9b97610dc1975f92613028575b50508160011b915f199060031b1c19161790565b60ca55614f1b565b61301a5f60c855565b6130235f60c955565b613f07565b015190505f80612ff5565b60ca5f52601f19831691907f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee1925f5b8181106130b657506123bd98956001866105479d9c9a96610dc196610dee9b96610b8d9a613011971061309e575b505050811b0160ca55614f1b565b01515f1960f88460031b161c191690555f8080613090565b92936020600181928786015181550195019301613062565b6109bf9060405160208101917f2bd82124057f0913bc3b772ce7b83e8057c1ad1f3510fc83778be20f10ec5de6835260018060a01b0316604082015260408152613119606082610517565b5190206140f1565b919493909260405192602084019460e08501917f4d404e3276e7ac2163d8ee476afa6a41d1f68fb71f2d8b6546b24e55ce01b72a875260018060a01b03166040860152606085015260c060808501528651809152602061010085019701905f5b8181106131ae575050506109bf949561311992849260a084015260c083015203601f198101835282610517565b8251805160ff168a526020908101516001600160a01b0316818b015260409099019890920191600101613181565b359060028210156105d957565b919082604091031261124857604051613201816104fc565b6020808294803584520135910152565b9080601f83011215610649576040519161322c604084610517565b82906040810192831161064457905b8282106132485750505090565b813581526020918201910161323b565b8082039291610100841261124857604051613272816104dc565b6080819561328084866131e9565b835261328f84604087016131e9565b6020840152607f190112611248576132c660409260c08451956132b1876104fc565b6132be8360808301613211565b875201613211565b60208401520152565b9091610140828403126107b4576132e5826131dc565b926020830135906001600160401b0382116107af57604061330b826109bf9487016109a4565b9401613258565b60021115610a3057565b9190610180838203126107b457613332836131dc565b9260208101356001600160401b0381116107af57826133529183016109a4565b926133608360408401613258565b926101408301356001600160401b0381116107af5781613381918501612178565b92610160810135906001600160401b0382116107af57019060608282031261124857604051916133b0836104dc565b80356001600160401b0381116133e4576040926133ce9183016109a4565b8352602081013560208401520135604082015290565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b1561343c57565b63c6b9e76760e01b5f5260045ffd5b90604051613458816104dc565b604061ffff82945463ffffffff81168452818160201c16602085015260301c16910152565b61348e603354198219811614612b7d565b806033556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a2565b906134ca826108fe565b6134d76040519182610517565b8281528092612ab7601f19916108fe565b634e487b7160e01b5f52601160045260245ffd5b5f19811461350a5760010190565b6134e8565b5f81805b61358957506135259061ffff166134c0565b5f5f5b825182108061357e575b15613577576001811b8416613550575b61354b906134fc565b613528565b90600161354b9160ff60f81b8460f81b165f1a61356d8287612ac1565b5301919050613542565b5050905090565b506101008110613532565b5f19810181811161350a5761ffff9116911661ffff811461350a576001019080613513565b6020818303126107b4578051906001600160401b0382116107af57019080601f830112156106495781516135e181610558565b926135ef6040519485610517565b81845260208085019260051b82010192831161064457602001905b8282106136175750505090565b6020809161362484612b3b565b81520191019061360a565b93929190606085016060865281518091526020608087019201905f5b81811061369d575050508481036020860152602080835192838152019201905f5b818110613687575050509060406105479294019060ff169052565b825184526020938401939092019160010161366c565b82516001600160a01b031684526020938401939092019160010161364b565b909291926136c8612a6d565b9060f885901b6001600160f81b0319165f1a6136e383612a47565b537f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031694853b15610bc65761373a955f9283604051809981958294636c3fb4bf60e01b84528a6004850161362f565b03925af1938415610bc1575f9461379b575b505f5b8251811015613794578061376e61376860019388612a59565b51151590565b613779575b0161374f565b61378f8361378a6106cd8488612a59565b614068565b613773565b5050509050565b6137b89194503d805f833e6137b08183610517565b8101906135ae565b925f61374c565b156137c657565b63bbba60cb60e01b5f5260045ffd5b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b15610bc6575f60405180936378219b3f60e11b8252856004830152604060248301528183816138356044820188611907565b03925af1908115610bc1577fec2963ab21c1e50e1e582aa542af2e4bf7bf38e6e1403c27b42e1c5d6e621eaa9261388092613885575b50604051918291602083526020830190611907565b0390a2565b5f61388f91610517565b5f61386b565b6096546001600160a01b031633036138a957565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b5f196033556040515f1981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2565b806033556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2565b600754604080516001600160a01b038084168252841660208201529192917f315457d8a8fe60f04af17c16e2f5a5e1db612b31648e58030360759ef8f3528c9190a16001600160a01b03166001600160a01b03199190911617600755565b600854604080516001600160a01b038084168252841660208201529192917f8f30ab09f43a6c157d7fce7e0a13c003042c1c95e8a72e7a146a21c0caa24dc99190a16001600160a01b03166001600160a01b03199190911617600855565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303613a4157565b6323d871a560e01b5f5260045ffd5b90613a5b82516134c0565b5f5b8351811015613a94576001906001600160f81b0319613a7c8287612a59565b5160f81b165f1a613a8d8285612ac1565b5301613a5d565b509150565b15613aa057565b6368b6a87560e11b5f5260045ffd5b6001600160a01b0390911681526040602082018190526109bf92910190611907565b6040906109bf939281528160208201520190611907565b634e487b7160e01b5f52601260045260245ffd5b5f5160206158f25f395f51905f5290613b13612c22565b505f919006602060c0835b613c13575f935f5160206158f25f395f51905f5260038186818180090908604051613b498582610517565b84368237848185604051613b5d8282610517565b813682378381528360208201528360408201528560608201527f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f5260808201525f5160206158f25f395f51905f5260a082015260056107cf195a01fa8015613c1857613bc790615642565b5191613c13575f5160206158f25f395f51905f5282800914613bfe57505f5160206158f25f395f51905f5260015f94089293613b1e565b92935050613c0a610538565b92835282015290565b613ae8565bfe5b15613c2157565b633cb89c9760e01b5f5260045ffd5b60ff60019116019060ff821161350a57565b60408051909190613c538382610517565b6001815291601f1901825f5b828110613c6b57505050565b602090604051613c7a816104fc565b5f815260608382015282828501015201613c5f565b90604082019060018060a01b031682526040602083015282518091526060820191602060608360051b8301019401925f915b838310613cd057505050505090565b9091929394605f1982820301835285516020606081604085019363ffffffff81511686520151936040838201528451809452019201905f905b808210613d285750505060208060019297019301930191939290613cc1565b82516001600160a01b0316845260209384019390920191600190910190613d09565b15613d5157565b630bd441b960e21b5f5260045ffd5b90602080835192838152019201905f5b818110613d7d5750505090565b825180516001600160a01b031685526020908101516001600160601b03168186015260409094019390920191600101613d70565b906109bf94936001600160601b0360809460ff63ffffffff941685521660208401521660408201528160608201520190613d60565b6001600160601b036109bf949360ff6060941683521660208201528160408201520190613d60565b9395949060c0936001600160601b0363ffffffff94613e5088613e679561ffff6040809263ffffffff8151168552826020820151166020860152015116910152565b16606087015260e0608087015260e0860190613d60565b95613e7181613312565b60a085015216910152565b906001613e8a60ff93614e04565b928392161b1115613e985790565b63ca95733360e01b5f5260045ffd5b15613eae57565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b609680546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b600b54604080516001600160a01b038084168252841660208201529192917f9770f3cadfdcbb6f93af935e86047111590c3768271d237e4a2bc0b874bed6939190a16001600160a01b03166001600160a01b03199190911617600b55565b60ff7f3ee6fe8d54610244c3e9d3c066ae4aee997884aa28f10616ae821925401318ac911691825f52600160205260405f2061400063ffffffff835116829063ffffffff1663ffffffff19825416179055565b6020820151815465ffff0000000067ffff000000000000604086015160301b169260201b169067ffffffff00000000191617179055604051809161388082606081019261ffff6040809263ffffffff8151168552826020820151166020860152015116910152565b9060018060a01b0382165f52600360205260405f2060ff6001820154166003811015610a30576001036140e2576140d190546140a860ff5f541684613e7c565b6001600160c01b03908116916140bd90614c90565b1681166001600160c01b0390811691161490565b6140d9575050565b6105479161505c565b6325ec6c1f60e01b5f5260045ffd5b6042906140fc615568565b906040519161190160f01b8352600283015260228201522090565b90600182811c92168015614145575b602083101461413157565b634e487b7160e01b5f52602260045260245ffd5b91607f1691614126565b604051905f8260ca549161416283614117565b80835292600181169081156141e55750600114614186575b61054792500383610517565b5060ca5f90815290917f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee15b8183106141c95750509060206105479282010161417a565b60209193508060019154838589010152019101909184926141b1565b6020925061054794915060ff191682840152151560051b82010161417a565b604051905f8260cb549161421783614117565b80835292600181169081156141e5575060011461423a5761054792500383610517565b5060cb5f90815290917fa7ce836d032b2bf62b7e2097a8e0a6d8aeb35405ad15271e96d3b0188a1d06fb5b81831061427d5750509060206105479282010161417a565b6020919350806001915483858901015201910190918492614265565b91906142a58151612a8f565b905f5b81518110156142e357806142ca6142c160019385612a59565b51876002615151565b63ffffffff6142d98387612a59565b91169052016142a8565b5090925050565b908160209103126107b4575190565b905f905b6002821061430a57505050565b60208060019285518152019301910190916142fd565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690614354612c22565b5061436161118a846130ce565b91803b15610bc6576040935f610164926143f56020966143e1888a519a8b998a986301e2d35b60e11b8a5260018060a01b031660048a01526143b160248a01825160208091805184520151910152565b80830151805160648b01526020015160848a015201516143d560a4890182516142f9565b015160e48701906142f9565b805161012486015260200151610144850152565b5af1908115610bc1575f91614408575090565b6109bf915060203d60201161442a575b6144228183610517565b8101906142ea565b503d614418565b94918093916144526144589461444a8851855114612e53565b87838a61525b565b86614a7c565b5f5b8251811015614563578061449261448d61447c61078861077a60019689612ac1565b60ff165f52600160205260405f2090565b61344b565b6144a061261b838651612a59565b63ffffffff6144b66108ac845163ffffffff1690565b9116116144c5575b500161445a565b61451b906144d961078861077a8589612ac1565b6144f76144ea856040890151612a59565b516001600160601b031690565b896145096144ea8760208b0151612a59565b91614514878c612a59565b519361533c565b61455d614526612a6d565b61453361077a8488612ac1565b5f1a61453e82612a47565b5361378a602061454e858a612a59565b5101516001600160a01b031690565b5f6144be565b5050505050565b60405190614577826104dc565b60606040838281528260208201520152565b1561459057565b6313ca465760e01b5f5260045ffd5b156145a657565b630c6816cd60e01b5f5260045ffd5b9190820180921161350a57565b156145c957565b631968677d60e11b5f5260045ffd5b600160209183518155019101516003811015610a305760ff80198354169116179055565b9080601f8301121561064957815161461381610558565b926146216040519485610517565b81845260208085019260051b82010192831161064457602001905b8282106146495750505090565b6020809183516146588161124d565b81520191019061463c565b9190916040818403126107b45780516001600160401b0381116107af578361468c9183016145fc565b9260208201516001600160401b0381116107af576109bf92016145fc565b6109bf939260609260018060a01b0316825260208201528160408201520190611907565b6020818303126107b4578051906001600160401b0382116107af57019080601f8301121561064957815161470181610558565b9261470f6040519485610517565b81845260208085019260051b82010192831161064457602001905b8282106147375750505090565b602080918351614746816107e8565b81520191019061472a565b6147f061475c61456a565b946147ea614771610747610f3b5f5460ff1690565b61477a86614c90565b906147848661548b565b6001600160c01b031690614799821515614589565b60018060c01b03166147b36147ae8284161590565b61459f565b6001600160a01b0386165f9081526009602052604090206147e3906147dc9054600a54906145b5565b42116145c2565b1785614cd4565b836137d5565b6001614818816148108460018060a01b03165f52600360205260405f2090565b015460ff1690565b614821816119c2565b03614a17575b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc6575f6040518092631fd93ca960e11b82528183816148798a8960048401613aaf565b03925af18015610bc157614a03575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc657835f9184836148e09560405196879586948593632550477760e01b8552600485016146aa565b03925af18015610bc1575f915f916149df575b50604085015260208401527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc657825f91614952938360405180968195829462bff04d60e01b845260048401613ad1565b03925af1908115610bc1575f916149bd575b5082525f5b81518110156149b857806149b261498e61448d61447c61078861077a60019789612ac1565b63ffffffff6126416108ac6149a761261b878b51612a59565b935163ffffffff1690565b01614969565b505090565b6149d991503d805f833e6149d18183610517565b8101906146ce565b5f614964565b90506149fd91503d805f833e6149f58183610517565b810190614663565b5f6148f3565b806110ca5f614a1193610517565b5f614888565b614a48614a22610538565b838152600160208201526001600160a01b0383165f9081526003602052604090206145d8565b816001600160a01b0382167fe8e68cef1c3a761ed7be7e8463a375f27f7bc335e51824223cacce636ec5c3fe5f80a3614827565b614a8761475c61456a565b6001614aa7816148108460018060a01b03165f52600360205260405f2090565b614ab0816119c2565b03614c43575b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc6575f6040518092631fd93ca960e11b8252818381614b088a8960048401613aaf565b03925af18015610bc157614c2f575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc657835f918483614b6f9560405196879586948593632550477760e01b8552600485016146aa565b03925af18015610bc1575f915f91614c13575b50604085015260208401527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691823b15610bc657614be1925f928360405180968195829462bff04d60e01b845260048401613ad1565b03925af1908115610bc1575f91614bf9575b50815290565b614c0d91503d805f833e6149d18183610517565b5f614bf3565b9050614c2991503d805f833e6149f58183610517565b5f614b82565b806110ca5f614c3d93610517565b5f614b17565b614c4e614a22610538565b816001600160a01b0382167fe8e68cef1c3a761ed7be7e8463a375f27f7bc335e51824223cacce636ec5c3fe5f80a3614ab6565b5f1981019190821161350a57565b805f52600260205260405f20549081155f14614cac5750505f90565b5f52600260205260405f20905f19810190811161350a57614ccc91612bb1565b505460401c90565b90614ce7825f52600260205260405f2090565b5480614d345750614d03610547925f52600260205260405f2090565b614d2f614d0e610549565b4363ffffffff168152925b5f60208501526001600160c01b03166040840152565b6155cf565b91614d5f63ffffffff93614d59614d53845f52600260205260405f2090565b91614c82565b90612bb1565b5090614d6f825463ffffffff1690565b43851694168403614d9a57506105479250906001600160401b0382549181199060401b169116179055565b815467ffffffff000000001916602085901b67ffffffff000000001617909155610547929190614d2f90614dd6905f52600260205260405f2090565b91614d19614de2610549565b63ffffffff9095168552565b15614df557565b631019106960e31b5f5260045ffd5b90610100825111614e6d57815115614e6857602082015160019060f81c81901b5b8351821015614e6357600190614e4e614e4461078861077a8689612ac1565b60ff600191161b90565b90614e5a818311614dee565b17910190614e25565b925050565b5f9150565b637da54e4760e11b5f5260045ffd5b601f8111614e88575050565b60ca5f5260205f20906020601f840160051c83019310614ec2575b601f0160051c01905b818110614eb7575050565b5f8155600101614eac565b9091508190614ea3565b601f8211614ed957505050565b5f5260205f20906020601f840160051c83019310614f11575b601f0160051c01905b818110614f06575050565b5f8155600101614efb565b9091508190614ef2565b9081516001600160401b0381116104f757614f4281614f3b60cb54614117565b60cb614ecc565b602092601f8211600114614f7657614f71929382915f926130285750508160011b915f199060031b1c19161790565b60cb55565b60cb5f52601f198216937fa7ce836d032b2bf62b7e2097a8e0a6d8aeb35405ad15271e96d3b0188a1d06fb915f5b868110614fda5750836001959610614fc2575b505050811b0160cb55565b01515f1960f88460031b161c191690555f8080614fb7565b91926020600181928685015181550194019201614fa4565b602080825282516001600160a01b039081168284015281840151166040808401919091529092015160608083015280516080830181905260a09092019201905f5b8181106150405750505090565b825163ffffffff16845260209384019390920191600101615033565b600b54825192936001600160a01b03918216937f000000000000000000000000000000000000000000000000000000000000000090921692909161509f90612a8f565b925f5b86518110156150cd57806150b860019289612ac1565b5160f81c6150c68288612a59565b52016150a2565b509291945092615101906150f16150e2610549565b6001600160a01b039096168652565b6001600160a01b03166020850152565b6040830152803b15610bc657604051636e3492b560e01b8152915f9183918290849082906151329060048301614ff2565b03925af18015610bc1576151435750565b806110ca5f61054793610517565b9190815f528260205260405f2054925f5b8481106151fa5760405162461bcd60e51b815260206004820152605c60248201527f5265676973747279436f6f7264696e61746f722e67657451756f72756d42697460448201527f6d6170496e6465784174426c6f636b4e756d6265723a206e6f206269746d617060648201527f2075706461746520666f756e6420666f72206f70657261746f72496400000000608482015260a490fd5b80850385811161350a576108ac61521091614c82565b61523961522e826152298887905f5260205260405f2090565b612bb1565b505463ffffffff1690565b63ffffffff808616911611156152525750600101615162565b94505050505090565b919290602082019283515f52600460205260ff60405f2054166152d65760408301805142116152c757610547956152bf9386515f5260046020526152a960405f20600160ff19825416179055565b6007546001600160a01b03169651925193613121565b905191615658565b630819bdcd60e01b5f5260045ffd5b636fbefec360e11b5f5260045ffd5b156152ec57565b6356168b4160e11b5f5260045ffd5b908160209103126107b457516109bf8161124d565b1561531757565b634c44995d60e01b5f5260045ffd5b1561532d57565b63b187e86960e01b5f5260045ffd5b6020858101516001600160a01b039081165f8181526003909352604090922054929795969394929361538f9361538293919261537b92911614156152e5565b5160ff1690565b60ff808816911614612e8a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031694853b15610bc657604051635401ed2760e01b8152600481019290925260ff16602482015293602090859060449082905afa928315610bc157610547945f94615441575b508261543992615434615420936001600160601b0361542c61542082998b61578f565b6001600160601b031690565b911611615310565b6157b2565b911610615326565b61542091945092615439926154346154786001600160601b039660203d602011615484575b6154708183610517565b8101906152fb565b969350509250926153fd565b503d615466565b600b546001600160a01b0316803b15610bc657604051632e8da82960e01b81526001600160a01b03929092166004830152602090829060249082905afa908115610bc1575f91615549575b50156154de57565b60405162461bcd60e51b815260206004820152603c60248201527f5265636c61696d536c617368696e675265676973747279436f6f7264696e617460448201527f6f723a206f70657261746f72206e6f742077686974656c6973746564000000006064820152608490fd5b615562915060203d602011610bba57610bac8183610517565b5f6154d6565b6155706157d0565b61557861581b565b6040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a081526155c960c082610517565b51902090565b8054680100000000000000008110156104f7576155f191600182018155612bb1565b61562f57815160208084015160409485015163ffffffff909316911b67ffffffff00000000161767ffffffffffffffff199190931b16919091179055565b634e487b7160e01b5f525f60045260245ffd5b1561564957565b63d51edae360e01b5f5260045ffd5b9190916156658284615841565b9390926005851015610a305761568e94159384615756575b5083156156a3575b50505015151590565b61569457565b638baa579f60e01b5f5260045ffd5b5f9350906156ce6156dc8594936040519283916020830195630b135d3f60e11b875260248401613ad1565b03601f198101835282610517565b51915afa3d1561574f573d6156f0816108fe565b906156fe6040519283610517565b81523d5f602083013e5b81615741575b8161571d575b505f8080615685565b905061573a630b135d3f60e11b91602080825183010191016142ea565b145f615714565b90506020815110159061570e565b6060615708565b6001600160a01b0384811691161493505f61567d565b906001600160601b03809116911602906001600160601b03821691820361350a57565b6157ad6001600160601b039161ffff6020612710950151169061576c565b160490565b6157ad6001600160601b039161ffff6040612710950151169061576c565b6157d861414f565b80519081156157e8576020012090565b505060c85480156157f65790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b615823614204565b8051908115615833576020012090565b505060c95480156157f65790565b9060418151145f1461586d5761586991602082015190606060408401519301515f1a90615876565b9091565b50505f90600290565b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116158e6576020935f9360ff60809460405194855216868401526040830152606082015282805260015afa15610bc1575f516001600160a01b038116156158de57905f90565b505f90600190565b505050505f9060039056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a26469706673582212205a6c3a08d12dc38c88bb1ff521ffbdbb07f4c645df64318227e1da7aca39944464736f6c634300081c0033"; type ReclaimSlashingRegistryCoordinatorConstructorParams = | [signer?: Signer] diff --git a/src/avs/contracts/factories/index.ts b/src/avs/contracts/factories/index.ts index 8a642137..640b8d19 100644 --- a/src/avs/contracts/factories/index.ts +++ b/src/avs/contracts/factories/index.ts @@ -2,6 +2,7 @@ /* tslint:disable */ /* eslint-disable */ export { AVSDirectory__factory } from "./AVSDirectory__factory"; +export { AllocationManager__factory } from "./AllocationManager__factory"; export { DelegationManager__factory } from "./DelegationManager__factory"; export { ECDSAStakeRegistry__factory } from "./ECDSAStakeRegistry__factory"; export { ERC20Mock__factory } from "./ERC20Mock__factory"; diff --git a/src/avs/contracts/index.ts b/src/avs/contracts/index.ts index 9f37ec72..4043c142 100644 --- a/src/avs/contracts/index.ts +++ b/src/avs/contracts/index.ts @@ -2,6 +2,7 @@ /* tslint:disable */ /* eslint-disable */ export type { AVSDirectory } from "./AVSDirectory"; +export type { AllocationManager } from "./AllocationManager"; export type { DelegationManager } from "./DelegationManager"; export type { ECDSAStakeRegistry } from "./ECDSAStakeRegistry"; export type { ERC20Mock } from "./ERC20Mock"; @@ -14,6 +15,7 @@ export * as factories from "./factories"; export { ReclaimServiceManager__factory } from "./factories/ReclaimServiceManager__factory"; export { ReclaimTaskManager__factory } from "./factories/ReclaimTaskManager__factory"; export { ReclaimSlashingRegistryCoordinator__factory } from "./factories/ReclaimSlashingRegistryCoordinator__factory"; +export { AllocationManager__factory } from "./factories/AllocationManager__factory"; export { AVSDirectory__factory } from "./factories/AVSDirectory__factory"; export { DelegationManager__factory } from "./factories/DelegationManager__factory"; export { ECDSAStakeRegistry__factory } from "./factories/ECDSAStakeRegistry__factory"; diff --git a/src/avs/utils/contracts.ts b/src/avs/utils/contracts.ts index 7253360b..d4050953 100644 --- a/src/avs/utils/contracts.ts +++ b/src/avs/utils/contracts.ts @@ -1,6 +1,6 @@ import { ethers } from 'ethers' import { CHAIN_CONFIGS, PRIVATE_KEY, SELECTED_CHAIN_ID } from 'src/avs/config' -import { AVSDirectory__factory, DelegationManager__factory, ECDSAStakeRegistry__factory, ERC20Mock__factory, ReclaimServiceManager__factory, ReclaimSlashingRegistryCoordinator__factory, RewardsCoordinator__factory } from 'src/avs/contracts' +import { AllocationManager__factory, AVSDirectory__factory, DelegationManager__factory, ECDSAStakeRegistry__factory, ERC20Mock__factory, ReclaimServiceManager__factory, ReclaimSlashingRegistryCoordinator__factory, RewardsCoordinator__factory } from 'src/avs/contracts' import { ChainConfig } from 'src/avs/types' export type Contracts = ReturnType @@ -73,6 +73,11 @@ export function initialiseContracts( slashingCoordinatorAddress, wallet || provider ), + // eslint-disable-next-line camelcase + allocationManager: AllocationManager__factory.connect( + slashingCoordinatorAddress, + wallet || provider + ), // tokens tokens: { async getDefault() { diff --git a/src/avs/utils/register.ts b/src/avs/utils/register.ts index de450982..321c0997 100644 --- a/src/avs/utils/register.ts +++ b/src/avs/utils/register.ts @@ -24,6 +24,8 @@ type RegisterOpts = { reclaimRpcUrl?: string } +const OP_SET_ID = 0 + /** * Registers the operator on the chain, if required. * If already registered -- will just pass through @@ -35,6 +37,8 @@ export async function registerOperator({ reclaimRpcUrl = RECLAIM_PUBLIC_URL }: RegisterOpts = {}) { const contracts = getContracts(chainId) + const allocationManager = contracts.allocationManager + .connect(wallet) const delegationManager = contracts.delegationManager .connect(wallet) const avsDirectory = contracts.avsDirectory @@ -47,6 +51,7 @@ export async function registerOperator({ .connect(wallet) const addr = await wallet.address + try { const tx1 = await delegationManager.registerAsOperator( '0x0000000000000000000000000000000000000000', @@ -66,41 +71,50 @@ export async function registerOperator({ logger.info('Operator already registered on EL') } - const salt = ethers.utils.hexlify(ethers.utils.randomBytes(32)) - // Example expiry, 1 hour from now - const expiry = Math.floor(Date.now() / 1000) + 3600 - // Define the output structure - const operatorSignature = { expiry, salt, signature: '' } - // Calculate the digest hash using the avsDirectory's method - const digestHash = await avsDirectory - .calculateOperatorAVSRegistrationDigestHash( - addr, - contract.address, - salt, - expiry - ) + const tx = await allocationManager.registerForOperatorSets(addr, { + operatorSetIds: [OP_SET_ID], + avs: contract.address, + data: new Uint8Array(0) + }) + await tx.wait() - // Sign the digest hash with the operator's private key - const signingKey = new ethers.utils.SigningKey( - wallet.privateKey - ) - const signature = signingKey.signDigest(digestHash) - - // Encode the signature in the required format - operatorSignature.signature = ethers.utils.joinSignature(signature) - - logger.info('operator signature generated successfully') - - const isRegistered = await registryContract.operatorRegistered(addr) - if(!isRegistered) { - logger.info('registering operator on AVS...') - const tx2 = await registryContract - .registerOperatorWithSignature(operatorSignature, addr) - await tx2.wait() - logger.info('operator registered on AVS successfully') - } else { - logger.info('operator already registered on AVS') - } + logger.info('operator registered on AM successfully') + + // const salt = ethers.utils.hexlify(ethers.utils.randomBytes(32)) + // // Example expiry, 1 hour from now + // const expiry = Math.floor(Date.now() / 1000) + 3600 + // // Define the output structure + // const operatorSignature = { expiry, salt, signature: '' } + // // Calculate the digest hash using the avsDirectory's method + // const digestHash = await avsDirectory + // .calculateOperatorAVSRegistrationDigestHash( + // addr, + // contract.address, + // salt, + // expiry + // ) + + // // Sign the digest hash with the operator's private key + // const signingKey = new ethers.utils.SigningKey( + // wallet.privateKey + // ) + // const signature = signingKey.signDigest(digestHash) + + // // Encode the signature in the required format + // operatorSignature.signature = ethers.utils.joinSignature(signature) + + // logger.info('operator signature generated successfully') + + // const isRegistered = await registryContract.operatorRegistered(addr) + // if(!isRegistered) { + // logger.info('registering operator on AVS...') + // const tx2 = await registryContract + // .registerOperatorWithSignature(operatorSignature, addr) + // await tx2.wait() + // logger.info('operator registered on AVS successfully') + // } else { + // logger.info('operator already registered on AVS') + // } // eslint-disable-next-line camelcase const socketRegistry = SocketRegistry__factory.connect( From e78657a6db407a8ee20087a2f6d366749a10ed37 Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Mon, 19 May 2025 13:08:05 +0530 Subject: [PATCH 20/26] chore: add test operator metadata --- avs/contracts/src/test/metadata.json | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 avs/contracts/src/test/metadata.json diff --git a/avs/contracts/src/test/metadata.json b/avs/contracts/src/test/metadata.json new file mode 100644 index 00000000..0ddfed3b --- /dev/null +++ b/avs/contracts/src/test/metadata.json @@ -0,0 +1,7 @@ +{ + "name": "reclaim_test_operator", + "website": "https://reclaimprotocol.org", + "description": "Reclaim Test Operator", + "logo": "https://framerusercontent.com/images/ooonvWe9Oq1wOn8xKPj940V0i1w.png", + "twitter": "https://x.com/reclaimprotocol" +} \ No newline at end of file From 7dee8308aeefd8c801b9070e383a6dc75a1525f4 Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Wed, 4 Jun 2025 09:34:21 +0400 Subject: [PATCH 21/26] wip: register operator --- .../script/deployments/core/31337.json | 2 +- .../script/deployments/reclaim/31337.json | 2 +- avs/contracts/src/ReclaimServiceManager.sol | 32 ++++++++++++++++++- avs/contracts/src/test/operator.yaml | 10 ++++++ .../test/reclaim_test_operator.ecdsa.key.json | 1 + src/avs/utils/register.ts | 9 ++++-- 6 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 avs/contracts/src/test/operator.yaml create mode 100644 avs/contracts/src/test/reclaim_test_operator.ecdsa.key.json diff --git a/avs/contracts/script/deployments/core/31337.json b/avs/contracts/script/deployments/core/31337.json index 9c5c1f0f..36e57266 100644 --- a/avs/contracts/script/deployments/core/31337.json +++ b/avs/contracts/script/deployments/core/31337.json @@ -1 +1 @@ -{"lastUpdate":{"timestamp":"1747194163","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x4ed7c70f96b99c776995fb64377f0d4ab3b0e1c1","avsDirectory":"0x610178da211fef7d417bc0e6fed39f05609ad788","avsDirectoryImpl":"0xa85233c63b9ee964add6f2cffe00fd84eb32338f","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x4a679253410272dd5232b3ff7cf5dbb88f295319","eigenPodManager":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManagerImpl":"0xc5a5c42992decbae36851359345fe25997f5c42d","strategyFactory":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","rewardsCoordinator":"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0","pauserRegistry":"0x0b306bf915c4d645ff596e518faf3f9669b97016","strategyBeacon":"0x84ea74d481ee0a5332c457a4d796187f6ba67feb","allocationManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","permissionController":"0x59b670e9fa9d0a427751af201d676719a970857b"}} \ No newline at end of file +{"lastUpdate":{"timestamp":"1748928882","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x4ed7c70f96b99c776995fb64377f0d4ab3b0e1c1","avsDirectory":"0x610178da211fef7d417bc0e6fed39f05609ad788","avsDirectoryImpl":"0xa85233c63b9ee964add6f2cffe00fd84eb32338f","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x4a679253410272dd5232b3ff7cf5dbb88f295319","eigenPodManager":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManagerImpl":"0xc5a5c42992decbae36851359345fe25997f5c42d","strategyFactory":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","rewardsCoordinator":"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0","pauserRegistry":"0x0b306bf915c4d645ff596e518faf3f9669b97016","strategyBeacon":"0x84ea74d481ee0a5332c457a4d796187f6ba67feb","allocationManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","permissionController":"0x59b670e9fa9d0a427751af201d676719a970857b"}} \ No newline at end of file diff --git a/avs/contracts/script/deployments/reclaim/31337.json b/avs/contracts/script/deployments/reclaim/31337.json index 70157f9e..96c4b3fb 100644 --- a/avs/contracts/script/deployments/reclaim/31337.json +++ b/avs/contracts/script/deployments/reclaim/31337.json @@ -1 +1 @@ -{"lastUpdate":{"timestamp":"1747194165","block_number":"32"},"addresses":{"proxyAdmin":"0x809d550fca64d94bd9f66e60752a544199cfac3d","serviceManager":"0x1291be112d480055dafd8a610b7d1e203891c274","serviceManagerImpl":"0x8198f5d8f8cffe8f9c413d98a0a55aeb8ab9fbb7","taskManager":"0x82e01223d51eb87e16a03e24687edf0f294da6f1","registryCoordinator":"0x7969c5ed335650692bc04293b07f5bf2e7a673c0","blsapkRegistry":"0xc351628eb244ec633d5f21fbd6621e1a683b1181","indexRegistry":"0xcbeaf3bde82155f56486fb5a1072cb8baaf547cc","stakeRegistry":"0xb7278a61aa25c888815afc32ad3cc52ff24fe575","operatorStateRetriever":"0x5081a39b8a5f0e35a8d959395a630b68b74dd30f","strategy":"0x2b961e3959b79326a8e7f64ef0d2d825707669b5","pauserRegistry":"0x0000000000000000000000000000000000000000","token":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","instantSlasher":"0x922d6956c99e12dfeb3224dea977d0939758a1fe","socketRegistry":"0xb0d4afd8879ed9f52b28595d31b441d079b2ca07"}} \ No newline at end of file +{"lastUpdate":{"timestamp":"1748928889","block_number":"21"},"addresses":{"proxyAdmin":"0x809d550fca64d94bd9f66e60752a544199cfac3d","serviceManager":"0x1291be112d480055dafd8a610b7d1e203891c274","serviceManagerImpl":"0x8198f5d8f8cffe8f9c413d98a0a55aeb8ab9fbb7","taskManager":"0x82e01223d51eb87e16a03e24687edf0f294da6f1","registryCoordinator":"0x7969c5ed335650692bc04293b07f5bf2e7a673c0","blsapkRegistry":"0xc351628eb244ec633d5f21fbd6621e1a683b1181","indexRegistry":"0xcbeaf3bde82155f56486fb5a1072cb8baaf547cc","stakeRegistry":"0xb7278a61aa25c888815afc32ad3cc52ff24fe575","operatorStateRetriever":"0x5081a39b8a5f0e35a8d959395a630b68b74dd30f","strategy":"0x2b961e3959b79326a8e7f64ef0d2d825707669b5","pauserRegistry":"0x0000000000000000000000000000000000000000","token":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","instantSlasher":"0x922d6956c99e12dfeb3224dea977d0939758a1fe","socketRegistry":"0xb0d4afd8879ed9f52b28595d31b441d079b2ca07"}} \ No newline at end of file diff --git a/avs/contracts/src/ReclaimServiceManager.sol b/avs/contracts/src/ReclaimServiceManager.sol index 999c83bf..57d55e7b 100644 --- a/avs/contracts/src/ReclaimServiceManager.sol +++ b/avs/contracts/src/ReclaimServiceManager.sol @@ -6,12 +6,13 @@ import "@eigenlayer-middleware/src/ServiceManagerBase.sol"; import {IAllocationManager, IAllocationManagerTypes} from "@eigenlayer/contracts/interfaces/IAllocationManager.sol"; import {IRewardsCoordinator} from "@eigenlayer/contracts/interfaces/IRewardsCoordinator.sol"; import {ISlashingRegistryCoordinator} from "@eigenlayer-middleware/src/interfaces/ISlashingRegistryCoordinator.sol"; +import {IAVSRegistrar} from "@eigenlayer/contracts/interfaces/IAVSRegistrar.sol"; /** * @title Primary entrypoint for procuring services from Reclaim. * @author Layr Labs, Inc. */ -contract ReclaimServiceManager is ServiceManagerBase { +contract ReclaimServiceManager is ServiceManagerBase, IAVSRegistrar { IReclaimTaskManager public immutable taskManager; ISlashingRegistryCoordinator public immutable slashingRegistryCoordinator; @@ -49,6 +50,35 @@ contract ReclaimServiceManager is ServiceManagerBase { slashingRegistryCoordinator = _slashingRegistryCoordinator; } + function registerOperator( + address operator, + address avs, + uint32[] calldata operatorSetIds, + bytes calldata data + ) external { + + } + + function deregisterOperator( + address operator, + address avs, uint32[] + calldata operatorSetIds + ) external { + + } + + function supportsAVS( + address avs + ) external view returns (bool) { + return true; + } + + function registerOperatorSets( + uint256[] calldata operatorSetIds + ) external { + // For example, forward to SlashingRegistryCoordinator: + } + function initialize( address initialOwner, address rewardsInitiator diff --git a/avs/contracts/src/test/operator.yaml b/avs/contracts/src/test/operator.yaml new file mode 100644 index 00000000..70745111 --- /dev/null +++ b/avs/contracts/src/test/operator.yaml @@ -0,0 +1,10 @@ +operator: + address: 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 + delegation_approver_address: "0x0000000000000000000000000000000000000000" + metadata_url: "https://raw.githubusercontent.com/reclaimprotocol/attestor-core/refs/heads/avs-rewards/avs/contracts/src/test/metadata.json" + allocation_delay: 1200 +el_delegation_manager_address: "0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0" +eth_rpc_url: http://localhost:8545 +chain_id: 31337 +private_key_store_path: avs/contracts/src/test/reclaim_test_operator.ecdsa.key.json +signer_type: local_keystore \ No newline at end of file diff --git a/avs/contracts/src/test/reclaim_test_operator.ecdsa.key.json b/avs/contracts/src/test/reclaim_test_operator.ecdsa.key.json new file mode 100644 index 00000000..b1be2174 --- /dev/null +++ b/avs/contracts/src/test/reclaim_test_operator.ecdsa.key.json @@ -0,0 +1 @@ +{"address":"f39fd6e51aad88f6f4ce6ab8827279cfffb92266","crypto":{"cipher":"aes-128-ctr","ciphertext":"bd1310e4e8f11565ed4b5338c52a41074320b0247f75b89e7e71e7538338dd3c","cipherparams":{"iv":"2a97cf4d43a1a3f14cf491c4e620479e"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"ed4272ae424e24c5bb2559b5fa34565b3842e4240444cbefefc5450af0a06e84"},"mac":"67c44aad9948acfa79285f41ed63705ea18455897df0a1e902bbe68085f7753a"},"id":"ced9d006-6df8-40bc-a963-021564794c89","version":3} \ No newline at end of file diff --git a/src/avs/utils/register.ts b/src/avs/utils/register.ts index 321c0997..fd482d57 100644 --- a/src/avs/utils/register.ts +++ b/src/avs/utils/register.ts @@ -1,6 +1,6 @@ import { ethers } from 'ethers' import { RECLAIM_PUBLIC_URL, SELECTED_CHAIN_ID } from 'src/avs/config' -import { SocketRegistry__factory } from 'src/avs/contracts' +import { AllocationManager__factory, SocketRegistry__factory } from 'src/avs/contracts' import { getContracts } from 'src/avs/utils/contracts' import { logger as LOGGER } from 'src/utils' @@ -37,8 +37,6 @@ export async function registerOperator({ reclaimRpcUrl = RECLAIM_PUBLIC_URL }: RegisterOpts = {}) { const contracts = getContracts(chainId) - const allocationManager = contracts.allocationManager - .connect(wallet) const delegationManager = contracts.delegationManager .connect(wallet) const avsDirectory = contracts.avsDirectory @@ -49,6 +47,11 @@ export async function registerOperator({ .connect(wallet) const slashingCoordinator = contracts.slashingCoordinator .connect(wallet) + // eslint-disable-next-line camelcase + const allocationManager = await AllocationManager__factory.connect( + await slashingCoordinator.allocationManager(), + wallet + ) const addr = await wallet.address From c7ddf6e9337fcc7e724ab33f146c41a0866a2678 Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Wed, 4 Jun 2025 09:43:00 +0400 Subject: [PATCH 22/26] wip: contracts update --- .gitmodules | 3 +++ avs/contracts/.gitmodules | 3 +++ avs/contracts/foundry.toml | 7 ++++--- avs/contracts/lib/openzeppelin-contracts | 1 + avs/contracts/script/deployments/core/31337.json | 2 +- avs/contracts/script/deployments/reclaim/31337.json | 2 +- avs/contracts/script/utils/UpgradeableProxyLib.sol | 9 +++------ 7 files changed, 16 insertions(+), 11 deletions(-) create mode 100644 avs/contracts/.gitmodules create mode 160000 avs/contracts/lib/openzeppelin-contracts diff --git a/.gitmodules b/.gitmodules index 5965d9a1..f4d3f85c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -5,3 +5,6 @@ path = avs/contracts/lib/eigenlayer-middleware url = https://github.com/layr-labs/eigenlayer-middleware branch = 4d63f27247587607beb67f96fdabec4b2c1321ef +[submodule "avs/contracts/lib/openzeppelin-contracts"] + path = avs/contracts/lib/openzeppelin-contracts + url = https://github.com/OpenZeppelin/openzeppelin-contracts diff --git a/avs/contracts/.gitmodules b/avs/contracts/.gitmodules new file mode 100644 index 00000000..1199c897 --- /dev/null +++ b/avs/contracts/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/openzeppelin-contracts-upgradeable"] + path = lib/openzeppelin-contracts-upgradeable + url = https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable diff --git a/avs/contracts/foundry.toml b/avs/contracts/foundry.toml index 28806250..1b92903a 100644 --- a/avs/contracts/foundry.toml +++ b/avs/contracts/foundry.toml @@ -5,12 +5,13 @@ libs = ["lib"] fs_permissions = [{ access = "read-write", path = "./"}] remappings = [ - "@eigenlayer/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/", + "@eigenlayer/contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/", + "@eigenlayer/test/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/test/", "@eigenlayer-scripts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/script/", "@eigenlayer-middleware/=lib/eigenlayer-middleware/", - "@openzeppelin/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/", + "@openzeppelin/=lib/openzeppelin-contracts/", "@openzeppelin-upgrades/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/", - "forge-std/=lib/forge-std/src/", + "forge-std/=lib/forge-std/src/" ] gas_reports = ["*"] diff --git a/avs/contracts/lib/openzeppelin-contracts b/avs/contracts/lib/openzeppelin-contracts new file mode 160000 index 00000000..ecd2ca2c --- /dev/null +++ b/avs/contracts/lib/openzeppelin-contracts @@ -0,0 +1 @@ +Subproject commit ecd2ca2cd7cac116f7a37d0e474bbb3d7d5e1c4d diff --git a/avs/contracts/script/deployments/core/31337.json b/avs/contracts/script/deployments/core/31337.json index 36e57266..5e5a9502 100644 --- a/avs/contracts/script/deployments/core/31337.json +++ b/avs/contracts/script/deployments/core/31337.json @@ -1 +1 @@ -{"lastUpdate":{"timestamp":"1748928882","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x4ed7c70f96b99c776995fb64377f0d4ab3b0e1c1","avsDirectory":"0x610178da211fef7d417bc0e6fed39f05609ad788","avsDirectoryImpl":"0xa85233c63b9ee964add6f2cffe00fd84eb32338f","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x4a679253410272dd5232b3ff7cf5dbb88f295319","eigenPodManager":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManagerImpl":"0xc5a5c42992decbae36851359345fe25997f5c42d","strategyFactory":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","rewardsCoordinator":"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0","pauserRegistry":"0x0b306bf915c4d645ff596e518faf3f9669b97016","strategyBeacon":"0x84ea74d481ee0a5332c457a4d796187f6ba67feb","allocationManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","permissionController":"0x59b670e9fa9d0a427751af201d676719a970857b"}} \ No newline at end of file +{"lastUpdate":{"timestamp":"1749015671","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x4ed7c70f96b99c776995fb64377f0d4ab3b0e1c1","avsDirectory":"0x610178da211fef7d417bc0e6fed39f05609ad788","avsDirectoryImpl":"0xa85233c63b9ee964add6f2cffe00fd84eb32338f","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x4a679253410272dd5232b3ff7cf5dbb88f295319","eigenPodManager":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManagerImpl":"0xc5a5c42992decbae36851359345fe25997f5c42d","strategyFactory":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","rewardsCoordinator":"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0","pauserRegistry":"0x0b306bf915c4d645ff596e518faf3f9669b97016","strategyBeacon":"0x84ea74d481ee0a5332c457a4d796187f6ba67feb","allocationManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","permissionController":"0x59b670e9fa9d0a427751af201d676719a970857b"}} \ No newline at end of file diff --git a/avs/contracts/script/deployments/reclaim/31337.json b/avs/contracts/script/deployments/reclaim/31337.json index 96c4b3fb..462d2072 100644 --- a/avs/contracts/script/deployments/reclaim/31337.json +++ b/avs/contracts/script/deployments/reclaim/31337.json @@ -1 +1 @@ -{"lastUpdate":{"timestamp":"1748928889","block_number":"21"},"addresses":{"proxyAdmin":"0x809d550fca64d94bd9f66e60752a544199cfac3d","serviceManager":"0x1291be112d480055dafd8a610b7d1e203891c274","serviceManagerImpl":"0x8198f5d8f8cffe8f9c413d98a0a55aeb8ab9fbb7","taskManager":"0x82e01223d51eb87e16a03e24687edf0f294da6f1","registryCoordinator":"0x7969c5ed335650692bc04293b07f5bf2e7a673c0","blsapkRegistry":"0xc351628eb244ec633d5f21fbd6621e1a683b1181","indexRegistry":"0xcbeaf3bde82155f56486fb5a1072cb8baaf547cc","stakeRegistry":"0xb7278a61aa25c888815afc32ad3cc52ff24fe575","operatorStateRetriever":"0x5081a39b8a5f0e35a8d959395a630b68b74dd30f","strategy":"0x2b961e3959b79326a8e7f64ef0d2d825707669b5","pauserRegistry":"0x0000000000000000000000000000000000000000","token":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","instantSlasher":"0x922d6956c99e12dfeb3224dea977d0939758a1fe","socketRegistry":"0xb0d4afd8879ed9f52b28595d31b441d079b2ca07"}} \ No newline at end of file +{"lastUpdate":{"timestamp":"1749015704","block_number":"24"},"addresses":{"proxyAdmin":"0x809d550fca64d94bd9f66e60752a544199cfac3d","serviceManager":"0x1291be112d480055dafd8a610b7d1e203891c274","serviceManagerImpl":"0x8198f5d8f8cffe8f9c413d98a0a55aeb8ab9fbb7","taskManager":"0x82e01223d51eb87e16a03e24687edf0f294da6f1","registryCoordinator":"0x7969c5ed335650692bc04293b07f5bf2e7a673c0","blsapkRegistry":"0xc351628eb244ec633d5f21fbd6621e1a683b1181","indexRegistry":"0xcbeaf3bde82155f56486fb5a1072cb8baaf547cc","stakeRegistry":"0xb7278a61aa25c888815afc32ad3cc52ff24fe575","operatorStateRetriever":"0x5081a39b8a5f0e35a8d959395a630b68b74dd30f","strategy":"0x2b961e3959b79326a8e7f64ef0d2d825707669b5","pauserRegistry":"0x0000000000000000000000000000000000000000","token":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","instantSlasher":"0x922d6956c99e12dfeb3224dea977d0939758a1fe","socketRegistry":"0xb0d4afd8879ed9f52b28595d31b441d079b2ca07"}} \ No newline at end of file diff --git a/avs/contracts/script/utils/UpgradeableProxyLib.sol b/avs/contracts/script/utils/UpgradeableProxyLib.sol index 809d8d8d..d501ea9b 100644 --- a/avs/contracts/script/utils/UpgradeableProxyLib.sol +++ b/avs/contracts/script/utils/UpgradeableProxyLib.sol @@ -3,10 +3,7 @@ pragma solidity ^0.8.12; import {Vm} from "forge-std/Vm.sol"; import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; -import { - TransparentUpgradeableProxy, - ITransparentUpgradeableProxy -} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; import {EmptyContract} from "@eigenlayer/test/mocks/EmptyContract.sol"; library UpgradeableProxyLib { @@ -26,12 +23,12 @@ library UpgradeableProxyLib { function upgrade(address proxy, address impl) internal { ProxyAdmin admin = getProxyAdmin(proxy); - admin.upgrade(ITransparentUpgradeableProxy(payable(proxy)), impl); + admin.upgrade(TransparentUpgradeableProxy(payable(proxy)), impl); } function upgradeAndCall(address proxy, address impl, bytes memory initData) internal { ProxyAdmin admin = getProxyAdmin(proxy); - admin.upgradeAndCall(ITransparentUpgradeableProxy(payable(proxy)), impl, initData); + admin.upgradeAndCall(TransparentUpgradeableProxy(payable(proxy)), impl, initData); } function getImplementation(address proxy) internal view returns (address) { From afeeaac32c193484d6ba9f41c1132d193072decc Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Wed, 4 Jun 2025 09:58:04 +0400 Subject: [PATCH 23/26] chore: remove redundant files --- avs/contracts/deployments/core/31337.json | 1 - avs/contracts/deployments/reclaim/31337.json | 1 - 2 files changed, 2 deletions(-) delete mode 100644 avs/contracts/deployments/core/31337.json delete mode 100644 avs/contracts/deployments/reclaim/31337.json diff --git a/avs/contracts/deployments/core/31337.json b/avs/contracts/deployments/core/31337.json deleted file mode 100644 index 5408b00f..00000000 --- a/avs/contracts/deployments/core/31337.json +++ /dev/null @@ -1 +0,0 @@ -{"lastUpdate":{"timestamp":"1742193734","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","avsDirectory":"0xdc64a140aa3e981100a9beca4e685f962f0cf6c9","avsDirectoryImpl":"0x68b1d87f95878fe05b998f19b66f4baba5de1aed","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","eigenPodManagerImpl":"0x59b670e9fa9d0a427751af201d676719a970857b","strategyFactory":"0x959922be3caee4b8cd9a407cc3ac1c251c2007b1","strategyFactoryImpl":"0xc6e7df5e7b4f2a278906862b61205850344d4e7d","strategyBeacon":"0x09635f643e140090a9a8dcd712ed6285858cebef","rewardsCoordinator":"0x610178da211fef7d417bc0e6fed39f05609ad788"}} \ No newline at end of file diff --git a/avs/contracts/deployments/reclaim/31337.json b/avs/contracts/deployments/reclaim/31337.json deleted file mode 100644 index 110765f6..00000000 --- a/avs/contracts/deployments/reclaim/31337.json +++ /dev/null @@ -1 +0,0 @@ -{"lastUpdate":{"timestamp":"1742193737","block_number":"18"},"addresses":{"proxyAdmin":"0xf5059a5d33d5853360d16c683c16e67980206f36","reclaimServiceManager":"0x998abeb3e57409262ae5b751f60747921b33613e","reclaimServiceManagerImpl":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","stakeRegistry":"0x4826533b4897376654bb4d4ad88b7fafd0c98528","stakeRegistryImpl":"0x99bba657f2bbc93c02d617f8ba121cb8fc104acf","strategy":"0x24b3c7704709ed1491473f30393ffc93cfb0fc34","token":"0x1613beb3b2c4f22ee086b2b38c1476a3ce7f78e8"}} \ No newline at end of file From 9487d87ba78abbbd1da49c1595079aaf56ae2b61 Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Wed, 4 Jun 2025 10:03:00 +0400 Subject: [PATCH 24/26] tmp: rm middleware --- .gitmodules | 4 ---- avs/contracts/lib/eigenlayer-middleware | 1 - 2 files changed, 5 deletions(-) delete mode 160000 avs/contracts/lib/eigenlayer-middleware diff --git a/.gitmodules b/.gitmodules index f4d3f85c..88a9978e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,10 +1,6 @@ [submodule "avs/contracts/lib/forge-std"] path = avs/contracts/lib/forge-std url = https://github.com/foundry-rs/forge-std -[submodule "avs/contracts/lib/eigenlayer-middleware"] - path = avs/contracts/lib/eigenlayer-middleware - url = https://github.com/layr-labs/eigenlayer-middleware - branch = 4d63f27247587607beb67f96fdabec4b2c1321ef [submodule "avs/contracts/lib/openzeppelin-contracts"] path = avs/contracts/lib/openzeppelin-contracts url = https://github.com/OpenZeppelin/openzeppelin-contracts diff --git a/avs/contracts/lib/eigenlayer-middleware b/avs/contracts/lib/eigenlayer-middleware deleted file mode 160000 index 4d63f272..00000000 --- a/avs/contracts/lib/eigenlayer-middleware +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 4d63f27247587607beb67f96fdabec4b2c1321ef From 8f658eb33284f92e6b1c6bba71668da187c34e64 Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Thu, 12 Jun 2025 10:16:47 +0530 Subject: [PATCH 25/26] wip: update eigen --- .gitmodules | 3 +++ avs/contracts/foundry.toml | 4 +--- avs/contracts/lib/eigenlayer-middleware | 1 + avs/contracts/script/SetupPayments.s.sol | 2 +- avs/contracts/script/deployments/core/31337.json | 1 - avs/contracts/script/deployments/reclaim/31337.json | 2 +- avs/contracts/src/ReclaimTaskManager.sol | 1 + .../start-anvil-chain-with-el-and-avs-deployed.sh | 10 ++++++++-- package.json | 1 - 9 files changed, 16 insertions(+), 9 deletions(-) create mode 160000 avs/contracts/lib/eigenlayer-middleware delete mode 100644 avs/contracts/script/deployments/core/31337.json diff --git a/.gitmodules b/.gitmodules index 88a9978e..fba9e008 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "avs/contracts/lib/openzeppelin-contracts"] path = avs/contracts/lib/openzeppelin-contracts url = https://github.com/OpenZeppelin/openzeppelin-contracts +[submodule "avs/contracts/lib/eigenlayer-middleware"] + path = avs/contracts/lib/eigenlayer-middleware + url = https://github.com/layr-Labs/eigenlayer-middleware diff --git a/avs/contracts/foundry.toml b/avs/contracts/foundry.toml index 1b92903a..8b90c09a 100644 --- a/avs/contracts/foundry.toml +++ b/avs/contracts/foundry.toml @@ -25,6 +25,4 @@ optimizer_runs = 200 # Whether or not to use the Yul intermediate representation compilation pipeline via_ir = false # Override the Solidity version (this overrides `auto_detect_solc`) -auto_detect_solc = true - -# See more config options https://github.com/foundry-rs/foundry/tree/master/config \ No newline at end of file +auto_detect_solc = true \ No newline at end of file diff --git a/avs/contracts/lib/eigenlayer-middleware b/avs/contracts/lib/eigenlayer-middleware new file mode 160000 index 00000000..3fb5b610 --- /dev/null +++ b/avs/contracts/lib/eigenlayer-middleware @@ -0,0 +1 @@ +Subproject commit 3fb5b61076475108bd87d4e6c7352fd60b46af1c diff --git a/avs/contracts/script/SetupPayments.s.sol b/avs/contracts/script/SetupPayments.s.sol index b939a89e..84a764a4 100644 --- a/avs/contracts/script/SetupPayments.s.sol +++ b/avs/contracts/script/SetupPayments.s.sol @@ -18,7 +18,7 @@ contract SetupPayments is Script, Test { CoreDeploymentLib.DeploymentConfigData coreConfig; ReclaimDeploymentLib.DeploymentData reclaimDeployment; - ReclaimDeploymentLib.DeploymentConfigData reclaimConfig; + ReclaimDeploymentLib.SetupConfig reclaimConfig; RewardsCoordinator rewardsCoordinator; string internal constant paymentInfofilePath = "mockData/payment_info.json"; diff --git a/avs/contracts/script/deployments/core/31337.json b/avs/contracts/script/deployments/core/31337.json deleted file mode 100644 index 5e5a9502..00000000 --- a/avs/contracts/script/deployments/core/31337.json +++ /dev/null @@ -1 +0,0 @@ -{"lastUpdate":{"timestamp":"1749015671","block_number":"0"},"addresses":{"proxyAdmin":"0x5fbdb2315678afecb367f032d93f642f64180aa3","delegation":"0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0","delegationManagerImpl":"0x4ed7c70f96b99c776995fb64377f0d4ab3b0e1c1","avsDirectory":"0x610178da211fef7d417bc0e6fed39f05609ad788","avsDirectoryImpl":"0xa85233c63b9ee964add6f2cffe00fd84eb32338f","strategyManager":"0x0165878a594ca255338adfa4d48449f69242eb8f","strategyManagerImpl":"0x4a679253410272dd5232b3ff7cf5dbb88f295319","eigenPodManager":"0x3aa5ebb10dc797cac828524e59a333d0a371443c","eigenPodManagerImpl":"0xc5a5c42992decbae36851359345fe25997f5c42d","strategyFactory":"0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae","rewardsCoordinator":"0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0","pauserRegistry":"0x0b306bf915c4d645ff596e518faf3f9669b97016","strategyBeacon":"0x84ea74d481ee0a5332c457a4d796187f6ba67feb","allocationManager":"0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6","permissionController":"0x59b670e9fa9d0a427751af201d676719a970857b"}} \ No newline at end of file diff --git a/avs/contracts/script/deployments/reclaim/31337.json b/avs/contracts/script/deployments/reclaim/31337.json index 462d2072..ea439b91 100644 --- a/avs/contracts/script/deployments/reclaim/31337.json +++ b/avs/contracts/script/deployments/reclaim/31337.json @@ -1 +1 @@ -{"lastUpdate":{"timestamp":"1749015704","block_number":"24"},"addresses":{"proxyAdmin":"0x809d550fca64d94bd9f66e60752a544199cfac3d","serviceManager":"0x1291be112d480055dafd8a610b7d1e203891c274","serviceManagerImpl":"0x8198f5d8f8cffe8f9c413d98a0a55aeb8ab9fbb7","taskManager":"0x82e01223d51eb87e16a03e24687edf0f294da6f1","registryCoordinator":"0x7969c5ed335650692bc04293b07f5bf2e7a673c0","blsapkRegistry":"0xc351628eb244ec633d5f21fbd6621e1a683b1181","indexRegistry":"0xcbeaf3bde82155f56486fb5a1072cb8baaf547cc","stakeRegistry":"0xb7278a61aa25c888815afc32ad3cc52ff24fe575","operatorStateRetriever":"0x5081a39b8a5f0e35a8d959395a630b68b74dd30f","strategy":"0x2b961e3959b79326a8e7f64ef0d2d825707669b5","pauserRegistry":"0x0000000000000000000000000000000000000000","token":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","instantSlasher":"0x922d6956c99e12dfeb3224dea977d0939758a1fe","socketRegistry":"0xb0d4afd8879ed9f52b28595d31b441d079b2ca07"}} \ No newline at end of file +{"lastUpdate":{"timestamp":"1749016107","block_number":"33"},"addresses":{"proxyAdmin":"0x809d550fca64d94bd9f66e60752a544199cfac3d","serviceManager":"0x1291be112d480055dafd8a610b7d1e203891c274","serviceManagerImpl":"0x8198f5d8f8cffe8f9c413d98a0a55aeb8ab9fbb7","taskManager":"0x82e01223d51eb87e16a03e24687edf0f294da6f1","registryCoordinator":"0x7969c5ed335650692bc04293b07f5bf2e7a673c0","blsapkRegistry":"0xc351628eb244ec633d5f21fbd6621e1a683b1181","indexRegistry":"0xcbeaf3bde82155f56486fb5a1072cb8baaf547cc","stakeRegistry":"0xb7278a61aa25c888815afc32ad3cc52ff24fe575","operatorStateRetriever":"0x5081a39b8a5f0e35a8d959395a630b68b74dd30f","strategy":"0x2b961e3959b79326a8e7f64ef0d2d825707669b5","pauserRegistry":"0x0000000000000000000000000000000000000000","token":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","instantSlasher":"0x922d6956c99e12dfeb3224dea977d0939758a1fe","socketRegistry":"0xb0d4afd8879ed9f52b28595d31b441d079b2ca07"}} \ No newline at end of file diff --git a/avs/contracts/src/ReclaimTaskManager.sol b/avs/contracts/src/ReclaimTaskManager.sol index 3ae18c8f..039e01b4 100644 --- a/avs/contracts/src/ReclaimTaskManager.sol +++ b/avs/contracts/src/ReclaimTaskManager.sol @@ -11,6 +11,7 @@ import {IRegistryCoordinator} from "@eigenlayer-middleware/src/interfaces/IRegis import {IStrategy} from "@eigenlayer/contracts/interfaces/IStrategy.sol"; import {IRewardsCoordinator} from "@eigenlayer/contracts/interfaces/IRewardsCoordinator.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { OwnableUpgradeable } from "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol"; import "./IReclaimTaskManager.sol"; import "./utils/Random.sol"; import "./utils/Claims.sol"; diff --git a/avs/utils/anvil/start-anvil-chain-with-el-and-avs-deployed.sh b/avs/utils/anvil/start-anvil-chain-with-el-and-avs-deployed.sh index 40644700..3488e20b 100755 --- a/avs/utils/anvil/start-anvil-chain-with-el-and-avs-deployed.sh +++ b/avs/utils/anvil/start-anvil-chain-with-el-and-avs-deployed.sh @@ -25,12 +25,18 @@ set -e docker run --rm -d --name anvil -p 8545:8545 \ --entrypoint anvil \ --env ANVIL_IP_ADDR=0.0.0.0 \ - ghcr.io/foundry-rs/foundry:v1.0.0 + ghcr.io/foundry-rs/foundry:v1.2.2 echo "Waiting for Anvil to start..." sleep 2 -npm run deploy:eigen-core +cd ../../contracts/lib/eigenlayer-middleware/lib/eigenlayer-contracts +forge script script/deploy/devnet/deploy_from_scratch.s.sol \ + --rpc-url http://localhost:8545 \ + --broadcast \ + --private-key $PRIVATE_KEY \ + --sig "run(string memory configFile)" \ + -- local/deploy_from_scratch.slashing.anvil.config.json echo "Deployed Eigen Core contracts" npm run deploy:reclaim-debug diff --git a/package.json b/package.json index 4b3fa5c7..f2fd66ad 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,6 @@ "verify:root-ca": "npm run run:tsc -- src/scripts/verify-root-ca.ts", "create:claim": "npm run run:tsc -- src/scripts/generate-receipt.ts", "build:contracts": "cd avs/contracts && forge build --via-ir", - "deploy:eigen-core": "cd avs/contracts && forge script script/DeployEigenLayerCore.s.sol --rpc-url http://localhost:8545 --broadcast --via-ir --revert-strings debug", "deploy:reclaim-debug": "cd avs/contracts && forge script script/ReclaimDeployer.s.sol --rpc-url http://localhost:8545 --broadcast --via-ir --revert-strings debug", "deploy:contracts": "sh avs/utils/anvil/deploy-all-to-anvil-and-save-state.sh", "deploy:contracts-to-chain": "sh avs/utils/anvil/deploy-to-chain.sh", From e0418e43f8be652bb526459112c5323ad7358ab0 Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Thu, 12 Jun 2025 16:00:14 +0530 Subject: [PATCH 26/26] feat: deployable reclaim contracts --- avs/contracts/config/core/31337.json | 45 -- avs/contracts/config/reclaim/31337.json | 10 - .../script/DeployEigenLayerCore.s.sol | 33 -- avs/contracts/script/ReclaimDeployer.s.sol | 32 +- avs/contracts/script/SetupPayments.s.sol | 10 +- .../script/deployments/core/31337.json | 50 +++ .../script/deployments/reclaim/31337.json | 2 +- .../script/utils/CoreDeploymentLib.sol | 402 +----------------- .../script/utils/ReclaimDeploymentLib.sol | 35 +- .../script/utils/SetupPaymentsLib.sol | 26 +- avs/contracts/script/utils/Utils.sol | 16 - ...rt-anvil-chain-with-el-and-avs-deployed.sh | 13 +- 12 files changed, 106 insertions(+), 568 deletions(-) delete mode 100644 avs/contracts/config/core/31337.json delete mode 100644 avs/contracts/config/reclaim/31337.json delete mode 100644 avs/contracts/script/DeployEigenLayerCore.s.sol create mode 100644 avs/contracts/script/deployments/core/31337.json diff --git a/avs/contracts/config/core/31337.json b/avs/contracts/config/core/31337.json deleted file mode 100644 index 03582931..00000000 --- a/avs/contracts/config/core/31337.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "strategyManager": { - "init_paused_status": 0, - "initial_owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "initial_strategy_whitelister": "0x959922be3caee4b8cd9a407cc3ac1c251c2007b1", - "init_withdrawal_delay_blocks": 1 - }, - "delegationManager": { - "init_paused_status": 0, - "init_withdrawal_delay_blocks": 1, - "initial_owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "min_withdrawal_delay_blocks": 50400 - }, - "eigenPodManager": { - "init_paused_status": 0, - "initial_owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" - }, - "allocationManager": { - "init_paused_status": 0, - "initial_owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "deallocation_delay": 0, - "allocation_configuration_delay": 0 - }, - "strategyFactory": { - "init_paused_status": 0, - "initial_owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" - }, - "avsDirectory": { - "init_paused_status": 0, - "initial_owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" - }, - "rewardsCoordinator": { - "init_paused_status": 0, - "initial_owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "rewards_updater": "0x14dC79964da2C08b23698B3D3cc7Ca32193d9955", - "activation_delay": 0, - "default_split_bips": 1000, - "calculation_interval_seconds": 86400, - "MAX_REWARDS_DURATION": 864000, - "MAX_RETROACTIVE_LENGTH": 432000, - "MAX_FUTURE_LENGTH": 86400, - "GENESIS_REWARDS_TIMESTAMP": 1672531200, - "global_operator_commission_bips": 1000 - } -} \ No newline at end of file diff --git a/avs/contracts/config/reclaim/31337.json b/avs/contracts/config/reclaim/31337.json deleted file mode 100644 index 91fa44e5..00000000 --- a/avs/contracts/config/reclaim/31337.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "addresses": { - "rewardsOwner": "0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f", - "rewardsInitiator": "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720" - }, - "keys": { - "rewardsOwner": "0xdbda1821b80551c9d65939329250298aa3472ba22feea921c0cf5d620ea67b97", - "rewardsInitiator": "0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6" - } -} \ No newline at end of file diff --git a/avs/contracts/script/DeployEigenLayerCore.s.sol b/avs/contracts/script/DeployEigenLayerCore.s.sol deleted file mode 100644 index daf8811b..00000000 --- a/avs/contracts/script/DeployEigenLayerCore.s.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.12; - -import {Script} from "forge-std/Script.sol"; -import {console2} from "forge-std/console2.sol"; -import {CoreDeploymentLib} from "./utils/CoreDeploymentLib.sol"; -import {UpgradeableProxyLib} from "./utils/UpgradeableProxyLib.sol"; - -contract DeployEigenlayerCore is Script { - using CoreDeploymentLib for *; - using UpgradeableProxyLib for address; - - address internal deployer; - address internal proxyAdmin; - CoreDeploymentLib.DeploymentData internal deploymentData; - CoreDeploymentLib.DeploymentConfigData internal configData; - - function setUp() public virtual { - deployer = vm.rememberKey(vm.envUint("PRIVATE_KEY")); - vm.label(deployer, "Deployer"); - } - - function run() external { - vm.startBroadcast(deployer); - - configData = CoreDeploymentLib.readDeploymentConfigValues("config/core/", block.chainid); - proxyAdmin = UpgradeableProxyLib.deployProxyAdmin(); - deploymentData = CoreDeploymentLib.deployContracts(deployer, proxyAdmin, configData); - vm.stopBroadcast(); - string memory deploymentPath = "script/deployments/core/"; - CoreDeploymentLib.writeDeploymentJson(deploymentPath, block.chainid, deploymentData); - } -} \ No newline at end of file diff --git a/avs/contracts/script/ReclaimDeployer.s.sol b/avs/contracts/script/ReclaimDeployer.s.sol index f5023fd7..25083c18 100644 --- a/avs/contracts/script/ReclaimDeployer.s.sol +++ b/avs/contracts/script/ReclaimDeployer.s.sol @@ -29,6 +29,7 @@ import "forge-std/Script.sol"; import "forge-std/StdJson.sol"; import "forge-std/console.sol"; import {StrategyFactory} from "@eigenlayer/contracts/strategies/StrategyFactory.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {ContractsRegistry} from "../src/test/ContractsRegistry.sol"; import {ReclaimDeploymentLib} from "../script/utils/ReclaimDeploymentLib.sol"; @@ -74,7 +75,7 @@ contract ReclaimDeployer is Script { CoreDeploymentLib.DeploymentData internal configData; IStrategy strategy; address private deployer; - ERC20Mock public erc20Mock; + IERC20 public erc20Mock; ReclaimDeploymentLib.DeploymentData deployment; using UpgradeableProxyLib for address; @@ -90,16 +91,17 @@ contract ReclaimDeployer is Script { // Eigenlayer contracts vm.startBroadcast(deployer); ReclaimDeploymentLib.SetupConfig memory isConfig = - ReclaimDeploymentLib.readSetupConfigJson("reclaim"); - configData = CoreDeploymentLib.readDeploymentJson("script/deployments/core/", block.chainid); - - erc20Mock = new ERC20Mock(); - FundOperator.fund_operator(address(erc20Mock), isConfig.operator_addr, 15000e18); - FundOperator.fund_operator(address(erc20Mock), isConfig.operator_2_addr, 30000e18); - console.log(isConfig.operator_2_addr); - (bool s,) = isConfig.operator_2_addr.call{value: 0.1 ether}(""); - require(s); - strategy = IStrategy(StrategyFactory(configData.strategyFactory).deployNewStrategy(erc20Mock)); + ReclaimDeploymentLib.readSetupConfigJson("reclaim.json"); + configData = CoreDeploymentLib + .readDeploymentJson("script/deployments/core/", block.chainid); + + // erc20Mock = new ERC20Mock(); + // FundOperator.fund_operator(address(erc20Mock), isConfig.operator_addr, 15000e18); + // FundOperator.fund_operator(address(erc20Mock), isConfig.operator_2_addr, 30000e18); + console.log("op 2", isConfig.operator_2_addr); + // (bool s,) = isConfig.operator_2_addr.call{value: 0.1 ether}(""); + // require(s); + strategy = IStrategy(configData.strategy); rewardscoordinator = configData.rewardsCoordinator; proxyAdmin = UpgradeableProxyLib.deployProxyAdmin(); @@ -109,10 +111,10 @@ contract ReclaimDeployer is Script { ); console.log("instantSlasher", deployment.slasher); - FundOperator.fund_operator( - address(erc20Mock), deployment.serviceManager, 1e18 - ); - deployment.token = address(erc20Mock); + // FundOperator.fund_operator( + // address(erc20Mock), deployment.serviceManager, 1e18 + // ); + deployment.token = address(strategy.underlyingToken()); ReclaimDeploymentLib.writeDeploymentJson(deployment); diff --git a/avs/contracts/script/SetupPayments.s.sol b/avs/contracts/script/SetupPayments.s.sol index 84a764a4..37973714 100644 --- a/avs/contracts/script/SetupPayments.s.sol +++ b/avs/contracts/script/SetupPayments.s.sol @@ -50,7 +50,7 @@ contract SetupPayments is Script, Test { coreDeployment = CoreDeploymentLib.readDeploymentJson("deployments/core/", block.chainid); coreConfig = CoreDeploymentLib.readDeploymentConfigValues("config/core/", block.chainid); reclaimDeployment = ReclaimDeploymentLib.readDeploymentJson("deployments/reclaim/", block.chainid); - reclaimConfig = ReclaimDeploymentLib.readDeploymentConfigValues("config/reclaim/", block.chainid); + reclaimConfig = ReclaimDeploymentLib.readSetupConfigJson("reclaim.json"); rewardsCoordinator = RewardsCoordinator(coreDeployment.rewardsCoordinator); @@ -134,11 +134,11 @@ contract SetupPayments is Script, Test { function createAVSRewardsSubmissions(uint256 numPayments, uint256 amountPerPayment, uint32 startTimestamp) public { ERC20Mock(reclaimDeployment.token).mint(reclaimConfig.rewardsInitiator, amountPerPayment * numPayments); ERC20Mock(reclaimDeployment.token).increaseAllowance( - reclaimDeployment.reclaimServiceManager, amountPerPayment * numPayments + reclaimDeployment.serviceManager, amountPerPayment * numPayments ); uint32 duration = rewardsCoordinator.MAX_REWARDS_DURATION(); SetupPaymentsLib.createAVSRewardsSubmissions( - reclaimDeployment.reclaimServiceManager, + reclaimDeployment.serviceManager, reclaimDeployment.strategy, numPayments, amountPerPayment, @@ -154,7 +154,7 @@ contract SetupPayments is Script, Test { ) public { ERC20Mock(reclaimDeployment.token).mint(reclaimConfig.rewardsInitiator, amountPerPayment * numPayments); ERC20Mock(reclaimDeployment.token).increaseAllowance( - reclaimDeployment.reclaimServiceManager, amountPerPayment * numPayments + reclaimDeployment.serviceManager, amountPerPayment * numPayments ); uint32 duration = 0; address[] memory operators = new address[](2); @@ -164,7 +164,7 @@ contract SetupPayments is Script, Test { uint256 numOperators = operators.length; SetupPaymentsLib.createOperatorDirectedAVSRewardsSubmissions( - reclaimDeployment.reclaimServiceManager, + reclaimDeployment.serviceManager, operators, numOperators, reclaimDeployment.strategy, diff --git a/avs/contracts/script/deployments/core/31337.json b/avs/contracts/script/deployments/core/31337.json new file mode 100644 index 00000000..bed6a31c --- /dev/null +++ b/avs/contracts/script/deployments/core/31337.json @@ -0,0 +1,50 @@ +{ + "addresses": { + "TestToken": "0x09635F643e140090A9A8Dcd712eD6285858ceBef", + "allocationManager": "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6", + "allocationManagerImplementation": "0x9A9f2CCfdE556A7E9Ff0848998Aa4a0CFD8863AE", + "avsDirectory": "0x5FC8d32690cc91D4c39d9d3abcBD16989F875707", + "avsDirectoryImplementation": "0x9A676e781A523b5d0C0e43731313A708CB607508", + "baseStrategyImplementation": "0x7a2088a1bFc9d81c55368AE168C2C02570cB814F", + "delegationManager": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", + "delegationManagerImplementation": "0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0", + "eigenLayerPauserReg": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + "eigenLayerProxyAdmin": "0x5FbDB2315678afecb367f032d93F642f64180aa3", + "eigenPodBeacon": "0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e", + "eigenPodImplementation": "0x610178dA211FEF7D417bC0e6FeD39F05609AD788", + "eigenPodManager": "0x0165878A594ca255338adfa4d48449f69242Eb8F", + "eigenPodManagerImplementation": "0x0B306BF915C4d645ff596e518fAf3F9669b97016", + "emptyContract": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "numStrategiesDeployed": 0, + "permissionController": "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318", + "permissionControllerImplementation": "0x68B1D87F95878fE05B998F19b66F4baba5De1aed", + "rewardsCoordinator": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853", + "rewardsCoordinatorImplementation": "0x959922bE3CAee4b8Cd9a407cc3ac1C251C2007B1", + "strategies": { + "WETH": "0xc5a5C42992dECbae36851359345FE25997F5C42d" + }, + "strategy": "0xc5a5C42992dECbae36851359345FE25997F5C42d", + "strategyManager": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", + "strategyManagerImplementation": "0x0DCd1Bf9A1b36cE34237eEaFef220932846BCD82", + "token": { + "tokenProxyAdmin": "0x0000000000000000000000000000000000000000", + "EIGEN": "0x0000000000000000000000000000000000000000", + "bEIGEN": "0x0000000000000000000000000000000000000000", + "EIGENImpl": "0x0000000000000000000000000000000000000000", + "bEIGENImpl": "0x0000000000000000000000000000000000000000", + "eigenStrategy": "0x0000000000000000000000000000000000000000", + "eigenStrategyImpl": "0x0000000000000000000000000000000000000000" + } + }, + "chainInfo": { + "chainId": 31337, + "deploymentBlock": 0 + }, + "parameters": { + "communityMultisig": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "executorMultisig": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "operationsMultisig": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "pauserMultisig": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "timelock": "0x0000000000000000000000000000000000000000" + } +} \ No newline at end of file diff --git a/avs/contracts/script/deployments/reclaim/31337.json b/avs/contracts/script/deployments/reclaim/31337.json index ea439b91..273da294 100644 --- a/avs/contracts/script/deployments/reclaim/31337.json +++ b/avs/contracts/script/deployments/reclaim/31337.json @@ -1 +1 @@ -{"lastUpdate":{"timestamp":"1749016107","block_number":"33"},"addresses":{"proxyAdmin":"0x809d550fca64d94bd9f66e60752a544199cfac3d","serviceManager":"0x1291be112d480055dafd8a610b7d1e203891c274","serviceManagerImpl":"0x8198f5d8f8cffe8f9c413d98a0a55aeb8ab9fbb7","taskManager":"0x82e01223d51eb87e16a03e24687edf0f294da6f1","registryCoordinator":"0x7969c5ed335650692bc04293b07f5bf2e7a673c0","blsapkRegistry":"0xc351628eb244ec633d5f21fbd6621e1a683b1181","indexRegistry":"0xcbeaf3bde82155f56486fb5a1072cb8baaf547cc","stakeRegistry":"0xb7278a61aa25c888815afc32ad3cc52ff24fe575","operatorStateRetriever":"0x5081a39b8a5f0e35a8d959395a630b68b74dd30f","strategy":"0x2b961e3959b79326a8e7f64ef0d2d825707669b5","pauserRegistry":"0x0000000000000000000000000000000000000000","token":"0x0e801d84fa97b50751dbf25036d067dcf18858bf","instantSlasher":"0x922d6956c99e12dfeb3224dea977d0939758a1fe","socketRegistry":"0xb0d4afd8879ed9f52b28595d31b441d079b2ca07"}} \ No newline at end of file +{"lastUpdate":{"timestamp":"1749724169","block_number":"13"},"addresses":{"proxyAdmin":"0xa82ff9afd8f496c3d6ac40e2a0f282e47488cfc9","serviceManager":"0x851356ae760d987e095750cceb3bc6014560891c","serviceManagerImpl":"0xb0d4afd8879ed9f52b28595d31b441d079b2ca07","taskManager":"0x70e0ba845a1a0f2da3359c97e0285013525ffc49","registryCoordinator":"0x99bba657f2bbc93c02d617f8ba121cb8fc104acf","blsapkRegistry":"0x8f86403a4de0bb5791fa46b8e795c547942fe4cf","indexRegistry":"0x5eb3bc0a489c5a8288765d2336659ebca68fcd00","stakeRegistry":"0x95401dc811bb5740090279ba06cfa8fcf6113778","operatorStateRetriever":"0x5f3f1dbd7b74c6b46e8c44f98792a1daf8d69154","strategy":"0xc5a5c42992decbae36851359345fe25997f5c42d","pauserRegistry":"0x0000000000000000000000000000000000000000","token":"0x09635f643e140090a9a8dcd712ed6285858cebef","instantSlasher":"0x1291be112d480055dafd8a610b7d1e203891c274","socketRegistry":"0x809d550fca64d94bd9f66e60752a544199cfac3d"}} \ No newline at end of file diff --git a/avs/contracts/script/utils/CoreDeploymentLib.sol b/avs/contracts/script/utils/CoreDeploymentLib.sol index f6e2d842..ca8d2c9d 100644 --- a/avs/contracts/script/utils/CoreDeploymentLib.sol +++ b/avs/contracts/script/utils/CoreDeploymentLib.sol @@ -40,39 +40,8 @@ library CoreDeploymentLib { using Strings for *; using UpgradeableProxyLib for address; - string internal constant EIGENLAYER_VERSION = "v1.4.0-testnet-holesky"; Vm internal constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code"))))); - struct StrategyManagerConfig { - uint256 initPausedStatus; - uint256 initWithdrawalDelayBlocks; - } - - struct DelegationManagerConfig { - uint256 initPausedStatus; - uint256 withdrawalDelayBlocks; - } - - struct EigenPodManagerConfig { - uint256 initPausedStatus; - } - - struct RewardsCoordinatorConfig { - uint256 initPausedStatus; - uint256 maxRewardsDuration; - uint256 maxRetroactiveLength; - uint256 maxFutureLength; - uint256 genesisRewardsTimestamp; - address updater; - uint256 activationDelay; - uint256 calculationIntervalSeconds; - uint256 globalOperatorCommissionBips; - } - - struct StrategyFactoryConfig { - uint256 initPausedStatus; - } - struct DeploymentData { address delegationManager; address avsDirectory; @@ -85,294 +54,7 @@ library CoreDeploymentLib { address strategyFactory; address strategyBeacon; address permissionController; - } - - function deployContracts(address deployer, address proxyAdmin, DeploymentConfigData memory configData) - internal - returns (DeploymentData memory) - { - DeploymentData memory result; - - result.delegationManager = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); - result.avsDirectory = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); - result.strategyManager = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); - result.allocationManager = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); - result.avsDirectory = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); - result.rewardsCoordinator = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); - result.eigenPodBeacon = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); - result.pauserRegistry = address( - new PauserRegistry( - new address[](0), // Empty array for pausers - proxyAdmin // ProxyAdmin as the unpauser - ) - ); - result.strategyFactory = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); - result.eigenPodManager = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); - result.permissionController = UpgradeableProxyLib.setUpEmptyProxy(proxyAdmin); - - // Deploy the implementation contracts, using the proxy contracts as inputs - address delegationManagerImpl = address( - new DelegationManager( - IStrategyManager(result.strategyManager), - IEigenPodManager(result.eigenPodManager), - IAllocationManager(result.allocationManager), - IPauserRegistry(result.pauserRegistry), - IPermissionController(result.permissionController), - uint32(0), // TODO: check minWithdrawalDelay - EIGENLAYER_VERSION - ) - ); - address permissionControllerImpl = address(new PermissionController(EIGENLAYER_VERSION)); - - address avsDirectoryImpl = address( - new AVSDirectory( - IDelegationManager(result.delegationManager), - IPauserRegistry(result.pauserRegistry), // _DEALLOCATION_DELAY: 17.5 days in seconds), - EIGENLAYER_VERSION - ) - ); - - address strategyManagerImpl = address( - new StrategyManager( - IDelegationManager(result.delegationManager), IPauserRegistry(result.pauserRegistry), EIGENLAYER_VERSION - ) - ); - - address strategyFactoryImpl = address( - new StrategyFactory( - IStrategyManager(result.strategyManager), IPauserRegistry(result.pauserRegistry), EIGENLAYER_VERSION - ) - ); - - address allocationManagerImpl = address( - new AllocationManager( - IDelegationManager(result.delegationManager), - IPauserRegistry(result.pauserRegistry), - IPermissionController(result.permissionController), - // IAVSDirectory(result.avsDirectory), - uint32(0), // _DEALLOCATION_DELAY - uint32(0), // _ALLOCATION_CONFIGURATION_DELAY - EIGENLAYER_VERSION - ) - ); - - address ethPOSDeposit; - if (block.chainid == 1) { - ethPOSDeposit = 0x00000000219ab540356cBB839Cbe05303d7705Fa; - } else { - // For non-mainnet chains, you might want to deploy a mock or read from a config - // This assumes you have a similar config setup as in M2_Deploy_From_Scratch.s.sol - /// TODO: Handle Eth pos - } - - address eigenPodManagerImpl = address( - new EigenPodManager( - IETHPOSDeposit(ethPOSDeposit), - IBeacon(result.eigenPodBeacon), - IDelegationManager(result.delegationManager), - IPauserRegistry(result.pauserRegistry), - EIGENLAYER_VERSION - ) - ); - - /// TODO: Get actual values - uint32 CALCULATION_INTERVAL_SECONDS = 1 days; - uint32 MAX_REWARDS_DURATION = uint32(configData.rewardsCoordinator.maxRewardsDuration); - uint32 MAX_RETROACTIVE_LENGTH = uint32(configData.rewardsCoordinator.maxRetroactiveLength); - uint32 MAX_FUTURE_LENGTH = 1 days; - uint32 GENESIS_REWARDS_TIMESTAMP = 10 days; - IRewardsCoordinatorTypes.RewardsCoordinatorConstructorParams memory rewardsCoordinatorParams = - IRewardsCoordinatorTypes.RewardsCoordinatorConstructorParams( - IDelegationManager(result.delegationManager), - IStrategyManager(result.strategyManager), - IAllocationManager(result.allocationManager), - IPauserRegistry(result.pauserRegistry), - IPermissionController(result.permissionController), - CALCULATION_INTERVAL_SECONDS, - MAX_REWARDS_DURATION, - MAX_RETROACTIVE_LENGTH, - MAX_FUTURE_LENGTH, - GENESIS_REWARDS_TIMESTAMP, - EIGENLAYER_VERSION - ); - address rewardsCoordinatorImpl = address(new RewardsCoordinator(rewardsCoordinatorParams)); - - uint64 GENESIS_TIME = 1_564_000; - - address eigenPodImpl = address( - new EigenPod( - IETHPOSDeposit(ethPOSDeposit), - IEigenPodManager(result.eigenPodManager), - GENESIS_TIME, - EIGENLAYER_VERSION - ) - ); - address baseStrategyImpl = address( - new StrategyBase( - IStrategyManager(result.strategyManager), IPauserRegistry(result.pauserRegistry), EIGENLAYER_VERSION - ) - ); - /// TODO: PauserRegistry isn't upgradeable - - // Deploy and configure the strategy beacon - result.strategyBeacon = address(new UpgradeableBeacon(baseStrategyImpl)); - - // Upgrade contracts - /// TODO: Get from config - bytes memory upgradeCall = abi.encodeCall( - DelegationManager.initialize, - ( - proxyAdmin, // initialOwner - // IPauserRegistry(result.pauserRegistry), // _pauserRegistry - configData.delegationManager.initPausedStatus // initialPausedStatus - ) - ); - UpgradeableProxyLib.upgradeAndCall(result.delegationManager, delegationManagerImpl, upgradeCall); - - // Upgrade StrategyManager contract - upgradeCall = abi.encodeCall( - StrategyManager.initialize, - ( - proxyAdmin, // initialOwner - result.strategyFactory, // initialStrategyWhitelister - // IPauserRegistry(result.pauserRegistry), // _pauserRegistry - configData.strategyManager.initPausedStatus // initialPausedStatus - ) - ); - - UpgradeableProxyLib.upgradeAndCall(result.strategyManager, strategyManagerImpl, upgradeCall); - UpgradeableProxyLib.upgrade(result.permissionController, permissionControllerImpl); - - // Upgrade StrategyFactory contract - upgradeCall = abi.encodeCall( - StrategyFactory.initialize, - ( - proxyAdmin, // initialOwner - // IPauserRegistry(result.pauserRegistry), // _pauserRegistry - configData.strategyFactory.initPausedStatus, // initialPausedStatus - IBeacon(result.strategyBeacon) - ) - ); - UpgradeableProxyLib.upgradeAndCall(result.strategyFactory, strategyFactoryImpl, upgradeCall); - - // Upgrade EigenPodManager contract - upgradeCall = abi.encodeCall( - EigenPodManager.initialize, - ( - proxyAdmin, // initialOwner - // IPauserRegistry(result.pauserRegistry), // _pauserRegistry - configData.eigenPodManager.initPausedStatus // initialPausedStatus - ) - ); - UpgradeableProxyLib.upgradeAndCall(result.eigenPodManager, eigenPodManagerImpl, upgradeCall); - - // Upgrade AVSDirectory contract - upgradeCall = abi.encodeCall( - AVSDirectory.initialize, - ( - proxyAdmin, // initialOwner - // IPauserRegistry(result.pauserRegistry), // _pauserRegistry - 0 // TODO: AVS Missing configinitialPausedStatus - ) - ); - UpgradeableProxyLib.upgradeAndCall(result.avsDirectory, avsDirectoryImpl, upgradeCall); - - // Upgrade RewardsCoordinator contract - upgradeCall = abi.encodeCall( - RewardsCoordinator.initialize, - ( - deployer, // initialOwner - // IPauserRegistry(result.pauserRegistry), // _pauserRegistry - configData.rewardsCoordinator.initPausedStatus, // initialPausedStatus - /// TODO: is there a setter and is this expected? - deployer, // rewards updater - uint32(configData.rewardsCoordinator.activationDelay), // _activationDelay - uint16(configData.rewardsCoordinator.globalOperatorCommissionBips) // _globalCommissionBips - ) - ); - UpgradeableProxyLib.upgradeAndCall(result.rewardsCoordinator, rewardsCoordinatorImpl, upgradeCall); - - // Upgrade EigenPod contract - upgradeCall = abi.encodeCall( - EigenPod.initialize, - // TODO: Double check this - (address(result.eigenPodManager)) // _podOwner - ); - UpgradeableProxyLib.upgradeAndCall(result.eigenPodBeacon, eigenPodImpl, upgradeCall); - - // Upgrade AllocationManager contract - upgradeCall = abi.encodeCall( - AllocationManager.initialize, - // TODO: Double check this - ( - deployer, // initialOwner - // IPauserRegistry(result.pauserRegistry), // _pauserRegistry - configData.delegationManager.initPausedStatus // initialPausedStatus - ) - ); - UpgradeableProxyLib.upgradeAndCall(result.allocationManager, allocationManagerImpl, upgradeCall); - - return result; - } - - struct DeploymentConfigData { - StrategyManagerConfig strategyManager; - DelegationManagerConfig delegationManager; - EigenPodManagerConfig eigenPodManager; - RewardsCoordinatorConfig rewardsCoordinator; - StrategyFactoryConfig strategyFactory; - } - // StrategyConfig[] strategies; - - function readDeploymentConfigValues(string memory directoryPath, string memory fileName) - internal - returns (DeploymentConfigData memory) - { - string memory pathToFile = string.concat(directoryPath, fileName); - - require(vm.exists(pathToFile), "Deployment file does not exist"); - - string memory json = vm.readFile(pathToFile); - - DeploymentConfigData memory data; - - // StrategyManager start - data.strategyManager.initPausedStatus = json.readUint(".strategyManager.init_paused_status"); - data.strategyManager.initWithdrawalDelayBlocks = - uint32(json.readUint(".strategyManager.init_withdrawal_delay_blocks")); - // StrategyManager config end - - // DelegationManager config start - data.delegationManager.initPausedStatus = json.readUint(".delegationManager.init_paused_status"); - data.delegationManager.withdrawalDelayBlocks = json.readUint(".delegationManager.init_withdrawal_delay_blocks"); - // DelegationManager config end - - // EigenPodManager config start - data.eigenPodManager.initPausedStatus = json.readUint(".eigenPodManager.init_paused_status"); - // EigenPodManager config end - - // RewardsCoordinator config start - data.rewardsCoordinator.initPausedStatus = json.readUint(".rewardsCoordinator.init_paused_status"); - data.rewardsCoordinator.maxRewardsDuration = json.readUint(".rewardsCoordinator.MAX_REWARDS_DURATION"); - data.rewardsCoordinator.maxRetroactiveLength = json.readUint(".rewardsCoordinator.MAX_RETROACTIVE_LENGTH"); - data.rewardsCoordinator.maxFutureLength = json.readUint(".rewardsCoordinator.MAX_FUTURE_LENGTH"); - data.rewardsCoordinator.genesisRewardsTimestamp = json.readUint(".rewardsCoordinator.GENESIS_REWARDS_TIMESTAMP"); - data.rewardsCoordinator.updater = json.readAddress(".rewardsCoordinator.rewards_updater"); - data.rewardsCoordinator.activationDelay = json.readUint(".rewardsCoordinator.activation_delay"); - data.rewardsCoordinator.calculationIntervalSeconds = - json.readUint(".rewardsCoordinator.calculation_interval_seconds"); - data.rewardsCoordinator.globalOperatorCommissionBips = - json.readUint(".rewardsCoordinator.global_operator_commission_bips"); - // RewardsCoordinator config end - - return data; - } - - function readDeploymentConfigValues(string memory directoryPath, uint256 chainId) - internal - returns (DeploymentConfigData memory) - { - return readDeploymentConfigValues(directoryPath, string.concat(vm.toString(chainId), ".json")); + address strategy; } function readDeploymentJson(string memory directoryPath, uint256 chainId) public returns (DeploymentData memory) { @@ -387,91 +69,17 @@ library CoreDeploymentLib { string memory json = vm.readFile(pathToFile); DeploymentData memory data; - data.strategyFactory = json.readAddress(".addresses.strategyFactory"); + data.strategy = json.readAddress(".addresses.strategy"); + data.strategyFactory = json.readAddress(".addresses.strategyManager"); data.strategyManager = json.readAddress(".addresses.strategyManager"); data.eigenPodManager = json.readAddress(".addresses.eigenPodManager"); - data.delegationManager = json.readAddress(".addresses.delegation"); + data.delegationManager = json.readAddress(".addresses.delegationManager"); data.avsDirectory = json.readAddress(".addresses.avsDirectory"); data.rewardsCoordinator = json.readAddress(".addresses.rewardsCoordinator"); data.allocationManager = json.readAddress(".addresses.allocationManager"); data.permissionController = json.readAddress(".addresses.permissionController"); + data.pauserRegistry = json.readAddress(".addresses.eigenLayerPauserReg"); return data; } - - /// TODO: Need to be able to read json from eigenlayer-contracts repo for holesky/mainnet and output the json here - function writeDeploymentJson(DeploymentData memory data) internal { - writeDeploymentJson("deployments/core/", block.chainid, data); - } - - function writeDeploymentJson(string memory path, uint256 chainId, DeploymentData memory data) internal { - address proxyAdmin = address(UpgradeableProxyLib.getProxyAdmin(data.strategyManager)); - - string memory deploymentData = _generateDeploymentJson(data, proxyAdmin); - - string memory fileName = string.concat(path, vm.toString(chainId), ".json"); - if (!vm.exists(path)) { - vm.createDir(path, true); - } - - vm.writeFile(fileName, deploymentData); - console2.log("Deployment artifacts written to:", fileName); - } - - function _generateDeploymentJson(DeploymentData memory data, address proxyAdmin) - private - view - returns (string memory) - { - return string.concat( - '{"lastUpdate":{"timestamp":"', - vm.toString(block.timestamp), - '","block_number":"', - vm.toString(block.number), - '"},"addresses":', - _generateContractsJson(data, proxyAdmin), - "}" - ); - } - - function _generateContractsJson(DeploymentData memory data, address proxyAdmin) - private - view - returns (string memory) - { - /// TODO: namespace contracts -> {avs, core} - return string.concat( - '{"proxyAdmin":"', - proxyAdmin.toHexString(), - '","delegation":"', - data.delegationManager.toHexString(), - '","delegationManagerImpl":"', - data.delegationManager.getImplementation().toHexString(), - '","avsDirectory":"', - data.avsDirectory.toHexString(), - '","avsDirectoryImpl":"', - data.avsDirectory.getImplementation().toHexString(), - '","strategyManager":"', - data.strategyManager.toHexString(), - '","strategyManagerImpl":"', - data.strategyManager.getImplementation().toHexString(), - '","eigenPodManager":"', - data.eigenPodManager.toHexString(), - '","eigenPodManagerImpl":"', - data.eigenPodManager.getImplementation().toHexString(), - '","strategyFactory":"', - data.strategyFactory.toHexString(), - '","rewardsCoordinator":"', - data.rewardsCoordinator.toHexString(), - '","pauserRegistry":"', - data.pauserRegistry.toHexString(), - '","strategyBeacon":"', - data.strategyBeacon.toHexString(), - '","allocationManager":"', - data.allocationManager.toHexString(), - '","permissionController":"', - data.permissionController.toHexString(), - '"}' - ); - } } \ No newline at end of file diff --git a/avs/contracts/script/utils/ReclaimDeploymentLib.sol b/avs/contracts/script/utils/ReclaimDeploymentLib.sol index 660c9363..1e188348 100644 --- a/avs/contracts/script/utils/ReclaimDeploymentLib.sol +++ b/avs/contracts/script/utils/ReclaimDeploymentLib.sol @@ -93,7 +93,7 @@ library ReclaimDeploymentLib { ) internal returns (DeploymentData memory) { /// read EL deployment address CoreDeploymentLib.DeploymentData memory coredata = - readCoreDeploymentJson("script/deployments/core/", block.chainid); + CoreDeploymentLib.readDeploymentJson("script/deployments/core/", block.chainid); address avsdirectory = coredata.avsDirectory; DeploymentData memory result; @@ -253,11 +253,12 @@ library ReclaimDeploymentLib { return readDeploymentJson("script/deployments/reclaim/", chainId); } - function readSetupConfigJson(string memory directoryPath) + function readSetupConfigJson( + string memory fileName + ) internal view returns (SetupConfig memory) { - string memory fileName = string.concat(directoryPath, ".json"); require(vm.exists(fileName), "Deployment file does not exist"); string memory json = vm.readFile(fileName); @@ -373,34 +374,6 @@ library ReclaimDeploymentLib { ); } - function readCoreDeploymentJson(string memory directoryPath, uint256 chainId) - internal - returns (CoreDeploymentLib.DeploymentData memory) - { - return readCoreDeploymentJson(directoryPath, string.concat(vm.toString(chainId), ".json")); - } - - function readCoreDeploymentJson(string memory path, string memory fileName) - internal - returns (CoreDeploymentLib.DeploymentData memory) - { - string memory pathToFile = string.concat(path, fileName); - - require(vm.exists(pathToFile), "Deployment file does not exist"); - - string memory json = vm.readFile(pathToFile); - - CoreDeploymentLib.DeploymentData memory data; - data.strategyFactory = json.readAddress(".addresses.strategyFactory"); - data.strategyManager = json.readAddress(".addresses.strategyManager"); - data.eigenPodManager = json.readAddress(".addresses.eigenPodManager"); - data.delegationManager = json.readAddress(".addresses.delegation"); - data.avsDirectory = json.readAddress(".addresses.avsDirectory"); - data.pauserRegistry = json.readAddress(".addresses.pauserRegistry"); - - return data; - } - function verify_deployment(DeploymentData memory result) internal view { IBLSApkRegistry blsapkregistry = ISlashingRegistryCoordinator(result.slashingRegistryCoordinator).blsApkRegistry(); diff --git a/avs/contracts/script/utils/SetupPaymentsLib.sol b/avs/contracts/script/utils/SetupPaymentsLib.sol index e0ca94b5..101688e5 100644 --- a/avs/contracts/script/utils/SetupPaymentsLib.sol +++ b/avs/contracts/script/utils/SetupPaymentsLib.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; -import {IRewardsCoordinator} from "@eigenlayer/contracts/interfaces/IRewardsCoordinator.sol"; +import {IRewardsCoordinator,IRewardsCoordinatorTypes} from "@eigenlayer/contracts/interfaces/IRewardsCoordinator.sol"; import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol"; import {ECDSAServiceManagerBase} from "@eigenlayer-middleware/src/unaudited/ECDSAServiceManagerBase.sol"; import {Vm} from "forge-std/Vm.sol"; @@ -25,12 +25,12 @@ library SetupPaymentsLib { IRewardsCoordinator.RewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.RewardsSubmission[](numPayments); for (uint256 i = 0; i < numPayments; i++) { - IRewardsCoordinator.StrategyAndMultiplier[] memory strategiesAndMultipliers = - new IRewardsCoordinator.StrategyAndMultiplier[](1); + IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory strategiesAndMultipliers = + new IRewardsCoordinatorTypes.StrategyAndMultiplier[](1); strategiesAndMultipliers[0] = - IRewardsCoordinator.StrategyAndMultiplier({strategy: IStrategy(strategy), multiplier: 10000}); + IRewardsCoordinatorTypes.StrategyAndMultiplier({strategy: IStrategy(strategy), multiplier: 10000}); - IRewardsCoordinator.RewardsSubmission memory rewardsSubmission = IRewardsCoordinator.RewardsSubmission({ + IRewardsCoordinatorTypes.RewardsSubmission memory rewardsSubmission = IRewardsCoordinatorTypes.RewardsSubmission({ strategiesAndMultipliers: strategiesAndMultipliers, token: IStrategy(strategy).underlyingToken(), amount: amountPerPayment, @@ -58,18 +58,18 @@ library SetupPaymentsLib { IRewardsCoordinator.OperatorReward[] memory operatorRewards = new IRewardsCoordinator.OperatorReward[](2); for (uint256 i = 0; i < 2; i++) { operatorRewards[i] = - IRewardsCoordinator.OperatorReward({operator: operators[i], amount: operatorRewardAmount}); + IRewardsCoordinatorTypes.OperatorReward({operator: operators[i], amount: operatorRewardAmount}); } IRewardsCoordinator.OperatorDirectedRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorDirectedRewardsSubmission[](numPayments); for (uint256 i = 0; i < numPayments; i++) { - IRewardsCoordinator.StrategyAndMultiplier[] memory strategiesAndMultipliers = - new IRewardsCoordinator.StrategyAndMultiplier[](1); + IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory strategiesAndMultipliers = + new IRewardsCoordinatorTypes.StrategyAndMultiplier[](1); strategiesAndMultipliers[0] = - IRewardsCoordinator.StrategyAndMultiplier({strategy: IStrategy(strategy), multiplier: 10000}); + IRewardsCoordinatorTypes.StrategyAndMultiplier({strategy: IStrategy(strategy), multiplier: 10000}); - IRewardsCoordinator.OperatorDirectedRewardsSubmission memory rewardsSubmission = IRewardsCoordinator + IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission memory rewardsSubmission = IRewardsCoordinatorTypes .OperatorDirectedRewardsSubmission({ strategiesAndMultipliers: strategiesAndMultipliers, token: IStrategy(strategy).underlyingToken(), @@ -111,7 +111,7 @@ library SetupPaymentsLib { // this workflow assumes a new root submitted for every payment claimed. So we get the latest rood index to process a claim for uint256 rootIndex = rewardsCoordinator.getDistributionRootsLength() - 1; - IRewardsCoordinator.RewardsMerkleClaim memory claim = IRewardsCoordinator.RewardsMerkleClaim({ + IRewardsCoordinator.RewardsMerkleClaim memory claim = IRewardsCoordinatorTypes.RewardsMerkleClaim({ rootIndex: uint32(rootIndex), earnerIndex: uint32(indexToProve), earnerTreeProof: proof, @@ -167,7 +167,7 @@ library SetupPaymentsLib { IRewardsCoordinator.EarnerTreeMerkleLeaf[] memory leaves = new IRewardsCoordinator.EarnerTreeMerkleLeaf[](earners.length); for (uint256 i = 0; i < earners.length; i++) { - leaves[i] = IRewardsCoordinator.EarnerTreeMerkleLeaf({ + leaves[i] = IRewardsCoordinatorTypes.EarnerTreeMerkleLeaf({ earner: earners[i], earnerTokenRoot: createTokenRoot(tokenLeaves) }); @@ -198,7 +198,7 @@ library SetupPaymentsLib { view returns (IRewardsCoordinator.TokenTreeMerkleLeaf memory) { - IRewardsCoordinator.TokenTreeMerkleLeaf memory leaf = IRewardsCoordinator.TokenTreeMerkleLeaf({ + IRewardsCoordinator.TokenTreeMerkleLeaf memory leaf = IRewardsCoordinatorTypes.TokenTreeMerkleLeaf({ token: IStrategy(strategy).underlyingToken(), cumulativeEarnings: TOKEN_EARNINGS }); diff --git a/avs/contracts/script/utils/Utils.sol b/avs/contracts/script/utils/Utils.sol index 4ea2e832..d10ada2d 100644 --- a/avs/contracts/script/utils/Utils.sol +++ b/avs/contracts/script/utils/Utils.sol @@ -25,22 +25,6 @@ contract Utils is Script { } } - function convertOperatorStatusToString(IRegistryCoordinator.OperatorStatus operatorStatus) - public - pure - returns (string memory) - { - if (operatorStatus == IRegistryCoordinator.OperatorStatus.NEVER_REGISTERED) { - return "NEVER_REGISTERED"; - } else if (operatorStatus == IRegistryCoordinator.OperatorStatus.REGISTERED) { - return "REGISTERED"; - } else if (operatorStatus == IRegistryCoordinator.OperatorStatus.DEREGISTERED) { - return "DEREGISTERED"; - } else { - return "UNKNOWN"; - } - } - // Forge scripts best practice: https://book.getfoundry.sh/tutorials/best-practices#scripts function readInput(string memory inputFileName) internal returns (string memory) { string memory inputDir = string.concat(vm.projectRoot(), "/script/input/"); diff --git a/avs/utils/anvil/start-anvil-chain-with-el-and-avs-deployed.sh b/avs/utils/anvil/start-anvil-chain-with-el-and-avs-deployed.sh index 3488e20b..68af70a9 100755 --- a/avs/utils/anvil/start-anvil-chain-with-el-and-avs-deployed.sh +++ b/avs/utils/anvil/start-anvil-chain-with-el-and-avs-deployed.sh @@ -9,6 +9,8 @@ parent_path=$( ) cd "$parent_path" +EIGEN_CONTRACTS_DIR=../../contracts/lib/eigenlayer-middleware/lib/eigenlayer-contracts + cleanup() { echo "Executing cleanup function..." set +e @@ -30,13 +32,20 @@ docker run --rm -d --name anvil -p 8545:8545 \ echo "Waiting for Anvil to start..." sleep 2 -cd ../../contracts/lib/eigenlayer-middleware/lib/eigenlayer-contracts -forge script script/deploy/devnet/deploy_from_scratch.s.sol \ +cd $EIGEN_CONTRACTS_DIR +forge script script/deploy/local/deploy_from_scratch.slashing.s.sol \ --rpc-url http://localhost:8545 \ --broadcast \ --private-key $PRIVATE_KEY \ --sig "run(string memory configFile)" \ -- local/deploy_from_scratch.slashing.anvil.config.json +# back to the original directory +# and copy in the deployment data +cd "$parent_path" + +cp "$EIGEN_CONTRACTS_DIR/script/output/devnet/SLASHING_deploy_from_scratch_deployment_data.json" \ + ../../contracts/script/deployments/core/31337.json + echo "Deployed Eigen Core contracts" npm run deploy:reclaim-debug