diff --git a/.gitignore b/.gitignore index cf20bba3..6bd71076 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/payments.json \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index c8ec71e1..fba9e008 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,12 +1,9 @@ [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 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 0af8370d..8b90c09a 100644 --- a/avs/contracts/foundry.toml +++ b/avs/contracts/foundry.toml @@ -5,11 +5,12 @@ 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/eigenlayer-contracts/lib/openzeppelin-contracts/", - "@openzeppelin-upgrades/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable/", + "@openzeppelin/=lib/openzeppelin-contracts/", + "@openzeppelin-upgrades/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/", "forge-std/=lib/forge-std/src/" ] @@ -24,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 index c5b419a8..3fb5b610 160000 --- a/avs/contracts/lib/eigenlayer-middleware +++ b/avs/contracts/lib/eigenlayer-middleware @@ -1 +1 @@ -Subproject commit c5b419a82fcca1b64aacd32026ce8d4459b80e35 +Subproject commit 3fb5b61076475108bd87d4e6c7352fd60b46af1c diff --git a/avs/contracts/lib/forge-std b/avs/contracts/lib/forge-std index 978ac6fa..33539934 160000 --- a/avs/contracts/lib/forge-std +++ b/avs/contracts/lib/forge-std @@ -1 +1 @@ -Subproject commit 978ac6fadb62f5f0b723c996f64be52eddba6801 +Subproject commit 3353993420c6e488a2914ce02d88174e80ad80f8 diff --git a/avs/contracts/mockData/.gitadd b/avs/contracts/mockData/.gitadd new file mode 100644 index 00000000..e69de29b 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/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 - ); - } -} 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 new file mode 100644 index 00000000..25083c18 --- /dev/null +++ b/avs/contracts/script/ReclaimDeployer.s.sol @@ -0,0 +1,123 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.9; + +import {CoreDeploymentLib} from "./utils/CoreDeploymentLib.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"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +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; + IERC20 public erc20Mock; + ReclaimDeploymentLib.DeploymentData deployment; + + using UpgradeableProxyLib for address; + + address proxyAdmin; + + function setUp() public virtual { + deployer = vm.rememberKey(vm.envUint("PRIVATE_KEY")); + vm.label(deployer, "Deployer"); + } + + function run() external { + // Eigenlayer contracts + vm.startBroadcast(deployer); + ReclaimDeploymentLib.SetupConfig memory isConfig = + 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(); + require(address(strategy) != address(0)); + deployment = ReclaimDeploymentLib.deployContracts( + proxyAdmin, configData, address(strategy), isConfig, msg.sender + ); + console.log("instantSlasher", deployment.slasher); + + // FundOperator.fund_operator( + // address(erc20Mock), deployment.serviceManager, 1e18 + // ); + deployment.token = address(strategy.underlyingToken()); + + ReclaimDeploymentLib.writeDeploymentJson(deployment); + + vm.stopBroadcast(); + } +} \ No newline at end of file diff --git a/avs/contracts/script/SetupPayments.s.sol b/avs/contracts/script/SetupPayments.s.sol new file mode 100644 index 00000000..37973714 --- /dev/null +++ b/avs/contracts/script/SetupPayments.s.sol @@ -0,0 +1,243 @@ +// 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 { + address private deployer; + CoreDeploymentLib.DeploymentData coreDeployment; + CoreDeploymentLib.DeploymentConfigData coreConfig; + + ReclaimDeploymentLib.DeploymentData reclaimDeployment; + ReclaimDeploymentLib.SetupConfig reclaimConfig; + + 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; + uint256 constant NUM_EARNERS = 8; + + uint32 numPayments = 8; + uint32 indexToProve = 0; + uint32 amountPerPayment = 100; + + 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.readSetupConfigJson("reclaim.json"); + + 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 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) { + 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(address recipient) 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.serviceManager, amountPerPayment * numPayments + ); + uint32 duration = rewardsCoordinator.MAX_REWARDS_DURATION(); + SetupPaymentsLib.createAVSRewardsSubmissions( + reclaimDeployment.serviceManager, + 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.serviceManager, amountPerPayment * numPayments + ); + uint32 duration = 0; + address[] memory operators = new address[](2); + operators[0] = operator1; + operators[1] = operator2; + + uint256 numOperators = operators.length; + + SetupPaymentsLib.createOperatorDirectedAVSRewardsSubmissions( + reclaimDeployment.serviceManager, + 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); + + 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) + { + 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; + } +} 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 new file mode 100644 index 00000000..273da294 --- /dev/null +++ b/avs/contracts/script/deployments/reclaim/31337.json @@ -0,0 +1 @@ +{"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/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/contracts/script/utils/CoreDeploymentLib.sol b/avs/contracts/script/utils/CoreDeploymentLib.sol new file mode 100644 index 00000000..ca8d2c9d --- /dev/null +++ b/avs/contracts/script/utils/CoreDeploymentLib.sol @@ -0,0 +1,85 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.12; + +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 {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 {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"; +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 {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 {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 { + 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 delegationManager; + address avsDirectory; + address strategyManager; + address eigenPodManager; + address allocationManager; + address rewardsCoordinator; + address eigenPodBeacon; + address pauserRegistry; + address strategyFactory; + address strategyBeacon; + address permissionController; + address strategy; + } + + 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 returns (DeploymentData memory) { + string memory pathToFile = string.concat(path, fileName); + + require(vm.exists(pathToFile), "Deployment file does not exist"); + + string memory json = vm.readFile(pathToFile); + + DeploymentData memory data; + 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.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; + } +} \ 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 new file mode 100644 index 00000000..1e188348 --- /dev/null +++ b/avs/contracts/script/utils/ReclaimDeploymentLib.sol @@ -0,0 +1,386 @@ +// SPDX-License-Identifier: UNLICENSED +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 {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 {ReclaimSlashingRegistryCoordinator} from "../../src/ReclaimSlashingRegistryCoordinator.sol"; +import {IPermissionController} from "@eigenlayer/contracts/interfaces/IPermissionController.sol"; +import {IAVSRegistrar} from "@eigenlayer/contracts/interfaces/IAVSRegistrar.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 {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 serviceManager; + address taskManager; + address slashingRegistryCoordinator; + address operatorStateRetriever; + address blsapkRegistry; + address indexRegistry; + address stakeRegistry; + address socketRegistry; + address strategy; + address pauserRegistry; + address token; + address slasher; + } + + 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; + uint256 rewardsInitiatorKey; + } + + function deployContracts( + address proxyAdmin, + CoreDeploymentLib.DeploymentData memory core, + address strategy, + SetupConfig memory setupConfig, + address admin + ) internal returns (DeploymentData memory) { + /// read EL deployment address + CoreDeploymentLib.DeploymentData memory coredata = + CoreDeploymentLib.readDeploymentJson("script/deployments/core/", block.chainid); + address avsdirectory = coredata.avsDirectory; + + DeploymentData memory result; + + // First, deploy upgradeable proxy contracts that will point to the implementations. + 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 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 ReclaimSlashingRegistryCoordinator( + IStakeRegistry(result.stakeRegistry), + IBLSApkRegistry(result.blsapkRegistry), + IIndexRegistry(result.indexRegistry), + ISocketRegistry(result.socketRegistry), + IAllocationManager(core.allocationManager), + IPauserRegistry(coredata.pauserRegistry), + MIDDLEWARE_VERSION + ) + ); + + 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; + + 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 + ); + + bytes memory taskmanagerupgradecall = abi.encodeCall( + ReclaimTaskManager.initialize, + (admin, address(0)) + ); + 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); + + // 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; + } + + function readDeploymentJson(uint256 chainId) internal returns (DeploymentData memory) { + return readDeploymentJson("script/deployments/reclaim/", chainId); + } + + function readSetupConfigJson( + string memory fileName + ) + internal view + returns (SetupConfig memory) + { + 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), "Deployment file does not exist"); + + string memory json = vm.readFile(fileName); + + DeploymentData memory data; + 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; + } + + /// write to default output path + function writeDeploymentJson(DeploymentData memory data) internal { + writeDeploymentJson("script/deployments/reclaim/", block.chainid, data); + } + + function writeDeploymentJson(string memory outputPath, uint256 chainId, DeploymentData memory data) internal { + address proxyAdmin = address(UpgradeableProxyLib.getProxyAdmin(data.serviceManager)); + + 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 _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(), + '","serviceManager":"', + data.serviceManager.toHexString(), + '","serviceManagerImpl":"', + data.serviceManager.getImplementation().toHexString(), + '","taskManager":"', + data.taskManager.toHexString(), + '","registryCoordinator":"', + data.slashingRegistryCoordinator.toHexString(), + '","blsapkRegistry":"', + data.blsapkRegistry.toHexString(), + '","indexRegistry":"', + data.indexRegistry.toHexString(), + '","stakeRegistry":"', + data.stakeRegistry.toHexString(), + '","operatorStateRetriever":"', + data.operatorStateRetriever.toHexString(), + '","strategy":"', + data.strategy.toHexString(), + '","pauserRegistry":"', + data.pauserRegistry.toHexString(), + '","token":"', + data.token.toHexString(), + '","instantSlasher":"', + data.slasher.toHexString(), + '","socketRegistry":"', + data.socketRegistry.toHexString(), + '"}' + ); + } + + 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/script/utils/SetupPaymentsLib.sol b/avs/contracts/script/utils/SetupPaymentsLib.sol new file mode 100644 index 00000000..101688e5 --- /dev/null +++ b/avs/contracts/script/utils/SetupPaymentsLib.sol @@ -0,0 +1,315 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +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"; + +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++) { + IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory strategiesAndMultipliers = + new IRewardsCoordinatorTypes.StrategyAndMultiplier[](1); + strategiesAndMultipliers[0] = + IRewardsCoordinatorTypes.StrategyAndMultiplier({strategy: IStrategy(strategy), multiplier: 10000}); + + IRewardsCoordinatorTypes.RewardsSubmission memory rewardsSubmission = IRewardsCoordinatorTypes.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] = + IRewardsCoordinatorTypes.OperatorReward({operator: operators[i], amount: operatorRewardAmount}); + } + + IRewardsCoordinator.OperatorDirectedRewardsSubmission[] memory rewardsSubmissions = + new IRewardsCoordinator.OperatorDirectedRewardsSubmission[](numPayments); + for (uint256 i = 0; i < numPayments; i++) { + IRewardsCoordinatorTypes.StrategyAndMultiplier[] memory strategiesAndMultipliers = + new IRewardsCoordinatorTypes.StrategyAndMultiplier[](1); + strategiesAndMultipliers[0] = + IRewardsCoordinatorTypes.StrategyAndMultiplier({strategy: IStrategy(strategy), multiplier: 10000}); + + IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission memory rewardsSubmission = IRewardsCoordinatorTypes + .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 = IRewardsCoordinatorTypes.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] = IRewardsCoordinatorTypes.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 = IRewardsCoordinatorTypes.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; + } +} diff --git a/avs/contracts/script/utils/UpgradeableProxyLib.sol b/avs/contracts/script/utils/UpgradeableProxyLib.sol new file mode 100644 index 00000000..d501ea9b --- /dev/null +++ b/avs/contracts/script/utils/UpgradeableProxyLib.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.12; + +import {Vm} from "forge-std/Vm.sol"; +import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import "@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/avs/contracts/script/utils/Utils.sol b/avs/contracts/script/utils/Utils.sol index 4cf599e6..d10ada2d 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,71 +25,29 @@ 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/" - ); + 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 0fc4c3c1..f7b8b29e 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; - } +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; - /** - * @dev See {IERC20-balanceOf}. - */ - function balanceOf( - address account - ) public view virtual override returns (uint256) { - return _balances[account]; - } +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 {} } diff --git a/avs/contracts/src/IReclaimServiceManager.sol b/avs/contracts/src/IReclaimTaskManager.sol similarity index 70% rename from avs/contracts/src/IReclaimServiceManager.sol rename to avs/contracts/src/IReclaimTaskManager.sol index 9a29b41c..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); @@ -11,7 +11,7 @@ interface IReclaimServiceManager { struct ClaimRequest { /** * Name of the provider. - * @example "http" + * @example "http" */ string provider; /** @@ -32,14 +32,22 @@ interface IReclaimServiceManager { * Address of the requester. */ address owner; + /** + * Fee to pay for the claim. + */ + uint256 fee; } - struct Operator { - /** ETH address */ - address addr; - /** Reclaim RPC Url to connect to */ - string url; - } + struct ReclaimOperator { + /** + * ETH address + */ + address addr; + /** + * Reclaim RPC Url to connect to + */ + string url; + } struct Task { ClaimRequest request; @@ -56,25 +64,26 @@ interface IReclaimServiceManager { /** * Operators selected for the task. */ - Operator[] operators; + ReclaimOperator[] operators; /** * Total fee paid for the task. */ 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; } @@ -92,6 +101,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 @@ -99,22 +112,7 @@ 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 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 updateTaskCreationMetadata(TaskCreationMetadata memory metadata) external; /** * Create a new task. * @param request ClaimRequest @@ -122,16 +120,9 @@ 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 3f279084..57d55e7b 100644 --- a/avs/contracts/src/ReclaimServiceManager.sol +++ b/avs/contracts/src/ReclaimServiceManager.sol @@ -1,370 +1,144 @@ // SPDX-License-Identifier: UNLICENSED 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 "@openzeppelin-upgrades/contracts/utils/cryptography/ECDSAUpgradeable.sol"; -import "@eigenlayer/contracts/permissions/Pausable.sol"; -import {IRegistryCoordinator} from "@eigenlayer-middleware/src/interfaces/IRegistryCoordinator.sol"; -import "./IReclaimServiceManager.sol"; -import "./utils/Random.sol"; -import "./utils/Claims.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 {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 - ECDSAServiceManagerBase, - IReclaimServiceManager, - Pausable -{ - using BytesLib for bytes; - using ECDSAUpgradeable for bytes32; - - /* 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; - /** - * Admins of the contract. - */ - address[] public admins; - - OperatorMetadata[] public registeredOperators; - - /* MODIFIERS */ - modifier onlyOperator() { - require( - ECDSAStakeRegistry(stakeRegistry).operatorRegistered(msg.sender) - == - true, - "Operator must be the caller" - ); - _; - } - - constructor( - address _avsDirectory, - address _stakeRegistry, - address _delegationManager - ) - ECDSAServiceManagerBase( - _avsDirectory, - _stakeRegistry, - address(0), // TODO: payments - _delegationManager - ) - {} - - function setup(address initialAdmin) external initializer { - taskCreationMetadata = TaskCreationMetadata( - // 30m - 30 * 60, - // 1m - 1, - // 5m - 5 * 60 - ); - admins.push(initialAdmin); - } - - /* FUNCTIONS */ - - /// @inheritdoc IServiceManagerUI - function updateAVSMetadataURI( - string memory _metadataURI - ) external override virtual onlyAdmin { - _updateAVSMetadataURI(_metadataURI); - } - - function updateTaskCreationMetadata( - TaskCreationMetadata memory newMetadata - ) external onlyAdmin { - if(newMetadata.maxTaskLifetimeS != 0) { - taskCreationMetadata.maxTaskLifetimeS = newMetadata - .maxTaskLifetimeS; - } - - if(newMetadata.minSignaturesPerTask != 0) { - taskCreationMetadata.minSignaturesPerTask = newMetadata - .minSignaturesPerTask; - } - - if(newMetadata.maxTaskCreationDelayS != 0) { - taskCreationMetadata.maxTaskCreationDelayS = newMetadata - .maxTaskCreationDelayS; - } - } - - function whitelistAddressAsOperator( - address operator, - bool isWhitelisted - ) external onlyAdmin { - if(isWhitelisted) { - whitelistedOperators.push(operator); - return; - } +contract ReclaimServiceManager is ServiceManagerBase, IAVSRegistrar { + IReclaimTaskManager public immutable taskManager; + ISlashingRegistryCoordinator public immutable slashingRegistryCoordinator; - for(uint i = 0; i < whitelistedOperators.length; i++) { - if(whitelistedOperators[i] == operator) { - delete whitelistedOperators[i]; - return; - } - } + address[] public whitelistedOperators; - 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(uint i = 0; i < registeredOperators.length; i++) { - if(registeredOperators[i].addr == metadata.addr) { - delete registeredOperators[i]; - return; - } - } - - revert("Operator not found"); - } - - // update operator metadata - for (uint 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 (uint 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 { - 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"); - - // 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; - - // 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) + /// @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 reclaim task manager" ); - // store hash of task onchain, emit event, and increase taskNum - allTaskHashes[latestTaskNum] = keccak256(abi.encode(newTask)); - emit NewTaskCreated(latestTaskNum, newTask); - 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); - } + 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; + slashingRegistryCoordinator = _slashingRegistryCoordinator; + } - function taskCompleted( - CompletedTask memory completedTask, - uint32 referenceTaskIndex + function registerOperator( + address operator, + address avs, + uint32[] calldata operatorSetIds, + bytes calldata data ) 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 (uint 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]; + function deregisterOperator( + address operator, + address avs, uint32[] + calldata operatorSetIds + ) external { - // TODO: distribute fees + } - emit TaskCompleted(referenceTaskIndex, completedTask); + function supportsAVS( + address avs + ) external view returns (bool) { + return true; } - // HELPER + function registerOperatorSets( + uint256[] calldata operatorSetIds + ) external { + // For example, forward to SlashingRegistryCoordinator: + } - // for a whitelist to count -- operator must either be whitelisted - // or be an admin - function isOperatorWhitelisted(address operator) public view returns (bool) { - if(isAdmin(operator)) { - return true; - } + function initialize( + address initialOwner, + address rewardsInitiator + ) external initializer { + __ServiceManagerBase_init(initialOwner, rewardsInitiator); + whitelistedOperators = new address[](0); + _allocationManager.setAVSRegistrar( + address(this), slashingRegistryCoordinator + ); + _allocationManager.updateAVSMetadataURI( + address(this), + "TODO" + ); - for(uint i = 0; i < whitelistedOperators.length; i++) { - if(whitelistedOperators[i] == operator) { - return true; - } - } + _permissionController.setAppointee( + address(this), + address(slashingRegistryCoordinator), + address(_allocationManager), + IAllocationManager.createOperatorSets.selector + ); + } - return false; - } + function addOperatorToWhitelist( + address operator + ) external onlyOwner { + require( + !isOperatorWhitelisted(operator), + "addOperatorToWhitelist: operator already whitelisted" + ); - function operatorHasMinimumWeight(address operator) public view returns (bool) { - uint opWeight = ECDSAStakeRegistry(stakeRegistry) - .getOperatorWeight(operator); - uint minWeight = ECDSAStakeRegistry(stakeRegistry).minimumWeight(); - return opWeight >= minWeight; - } + whitelistedOperators.push(operator); + } - /** - * @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) { + function removeOperatorFromWhitelist( + address operator + ) external onlyOwner { require( - count <= registeredOperators.length, - "Internal: Not enough operators" + isOperatorWhitelisted(operator), + "removeOperatorFromWhitelist: operator not whitelisted" ); - 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; + for (uint256 i = 0; i < whitelistedOperators.length; i++) { + if (whitelistedOperators[i] == operator) { + whitelistedOperators[i] = whitelistedOperators[ + whitelistedOperators.length - 1 + ]; + whitelistedOperators.pop(); + break; } - - output[i].addr = item.addr; - output[i].url = item.url; - i++; } - - return output; } - 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 + 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/contracts/src/ReclaimTaskManager.sol b/avs/contracts/src/ReclaimTaskManager.sol new file mode 100644 index 00000000..039e01b4 --- /dev/null +++ b/avs/contracts/src/ReclaimTaskManager.sol @@ -0,0 +1,373 @@ +// 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 { OwnableUpgradeable } from "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.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 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 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/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/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..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,9 +9,7 @@ parent_path=$( ) cd "$parent_path" -set -a -source ./utils.sh -set +a +EIGEN_CONTRACTS_DIR=../../contracts/lib/eigenlayer-middleware/lib/eigenlayer-contracts cleanup() { echo "Executing cleanup function..." @@ -24,19 +22,34 @@ 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.2.2 + +echo "Waiting for Anvil to start..." +sleep 2 + +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 +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/avs/utils/contract-data-gen.sh b/avs/utils/contract-data-gen.sh new file mode 100644 index 00000000..27f8bd94 --- /dev/null +++ b/avs/utils/contract-data-gen.sh @@ -0,0 +1,13 @@ +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/AllocationManager.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 \ + avs/contracts/out/SocketRegistry.sol/*.json \ \ No newline at end of file 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/docs/avs.md b/docs/avs.md index e33dc273..ab4da3ce 100644 --- a/docs/avs.md +++ b/docs/avs.md @@ -132,13 +132,14 @@ 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 + - before generating types, 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 e507ef00..f2fd66ad 100644 --- a/package.json +++ b/package.json @@ -15,19 +15,20 @@ "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", - "build-contracts": "cd avs/contracts && forge build", + "build:contracts": "cd avs/contracts && forge build --via-ir", + "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", "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", - "start:chain": "bash ./avs/utils/anvil/start-anvil-chain-with-el-and-avs-deployed.sh", + "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", + "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/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..3435e76d 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 { @@ -109,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 @@ -122,7 +128,8 @@ export async function createClaimOnAvs({ : '', }), owner: wallet!.address, - requestedAt: unixTimestampSeconds() + requestedAt: unixTimestampSeconds(), + fee: fee } if(!payer) { @@ -165,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/config.ts b/src/avs/config.ts index cae44bea..3e94a029 100644 --- a/src/avs/config.ts +++ b/src/avs/config.ts @@ -4,17 +4,21 @@ 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: '0x1291be112d480055dafd8a610b7d1e203891c274', + delegationManagerAddress: '0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0', + stakeRegistryAddress: '0x4826533b4897376654bb4d4ad88b7fafd0c98528', + avsDirectoryAddress: '0xdc64a140aa3e981100a9beca4e685f962f0cf6c9', + rewardsCoordinatorAddress: '0x610178da211fef7d417bc0e6fed39f05609ad788', + slashingCoordinatorAddress: '0x7969c5ed335650692bc04293b07f5bf2e7a673c0' }, '17000': { rpcUrl: getEnvVariable('RPC_URL') || 'https://rpc.holesky.ethpandaops.io', contractAddress: '0x0861afc305999bfD3028dB66145395BdD7299366', delegationManagerAddress: '0xA44151489861Fe9e3055d95adC98FbD462B948e7', stakeRegistryAddress: '0xDa11C9Da04Ab02C4AF9374B27A5E727944D3E1dD', - avsDirectoryAddress: '0x055733000064333CaDDbC92763c58BF0192fFeBf' + avsDirectoryAddress: '0x055733000064333CaDDbC92763c58BF0192fFeBf', + rewardsCoordinatorAddress: '', + slashingCoordinatorAddress: '' } } diff --git a/src/avs/contracts/AVSDirectory.ts b/src/avs/contracts/AVSDirectory.ts new file mode 100644 index 00000000..2307cce2 --- /dev/null +++ b/src/avs/contracts/AVSDirectory.ts @@ -0,0 +1,891 @@ +/* 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 ISignatureUtilsMixinTypes { + 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: { + "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,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; + "transferOwnership(address)": FunctionFragment; + "unpause(uint256)": FunctionFragment; + "updateAVSMetadataURI(string)": FunctionFragment; + "version()": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "OPERATOR_AVS_REGISTRATION_TYPEHASH" + | "OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH" + | "OPERATOR_SET_REGISTRATION_TYPEHASH" + | "avsOperatorStatus" + | "calculateOperatorAVSRegistrationDigestHash" + | "cancelSalt" + | "delegation" + | "deregisterOperatorFromAVS" + | "domainSeparator" + | "initialize" + | "operatorSaltIsSpent" + | "owner" + | "pause" + | "pauseAll" + | "paused(uint8)" + | "paused()" + | "pauserRegistry" + | "registerOperatorToAVS" + | "renounceOwnership" + | "transferOwnership" + | "unpause" + | "updateAVSMetadataURI" + | "version" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "OPERATOR_AVS_REGISTRATION_TYPEHASH", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "OPERATOR_SET_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, 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, ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiryStruct] + ): string; + encodeFunctionData( + functionFragment: "renounceOwnership", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "transferOwnership", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "unpause", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "updateAVSMetadataURI", + values: [string] + ): string; + encodeFunctionData(functionFragment: "version", values?: undefined): string; + + decodeFunctionResult( + functionFragment: "OPERATOR_AVS_REGISTRATION_TYPEHASH", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "OPERATOR_SET_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: "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; + "Initialized(uint8)": EventFragment; + "OperatorAVSRegistrationStatusUpdated(address,address,uint8)": EventFragment; + "OwnershipTransferred(address,address)": EventFragment; + "Paused(address,uint256)": 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: "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 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: { + 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( + avs: string, + operator: 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, + initialPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + operatorSaltIsSpent( + operator: string, + salt: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean] & { isSpent: 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: ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiryStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + 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; + + 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( + avs: string, + operator: 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, + initialPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + operatorSaltIsSpent( + operator: string, + salt: 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: ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiryStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + 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; + + 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( + avs: string, + operator: 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, + initialPausedStatus: BigNumberish, + overrides?: CallOverrides + ): Promise; + + operatorSaltIsSpent( + operator: string, + salt: 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: ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiryStruct, + overrides?: CallOverrides + ): Promise; + + renounceOwnership(overrides?: CallOverrides): Promise; + + transferOwnership( + newOwner: string, + overrides?: CallOverrides + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: CallOverrides + ): Promise; + + updateAVSMetadataURI( + 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; + + "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; + + "Unpaused(address,uint256)"( + account?: string | null, + newPausedStatus?: null + ): UnpausedEventFilter; + Unpaused( + account?: string | null, + newPausedStatus?: null + ): UnpausedEventFilter; + }; + + estimateGas: { + OPERATOR_AVS_REGISTRATION_TYPEHASH( + overrides?: CallOverrides + ): Promise; + + OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH( + overrides?: CallOverrides + ): Promise; + + OPERATOR_SET_REGISTRATION_TYPEHASH( + overrides?: CallOverrides + ): Promise; + + avsOperatorStatus( + avs: string, + operator: 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, + initialPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + operatorSaltIsSpent( + operator: string, + salt: 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: ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiryStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + 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; + + version(overrides?: CallOverrides): Promise; + }; + + populateTransaction: { + OPERATOR_AVS_REGISTRATION_TYPEHASH( + overrides?: CallOverrides + ): Promise; + + OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH( + overrides?: CallOverrides + ): Promise; + + OPERATOR_SET_REGISTRATION_TYPEHASH( + overrides?: CallOverrides + ): Promise; + + avsOperatorStatus( + avs: string, + operator: 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, + initialPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + operatorSaltIsSpent( + operator: string, + salt: 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: ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiryStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + 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; + + version(overrides?: CallOverrides): Promise; + }; +} 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/DelegationManager.ts b/src/avs/contracts/DelegationManager.ts new file mode 100644 index 00000000..c1ce7783 --- /dev/null +++ b/src/avs/contracts/DelegationManager.ts @@ -0,0 +1,2270 @@ +/* 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 IDelegationManagerTypes { + export type WithdrawalStruct = { + staker: string; + delegatedTo: string; + withdrawer: string; + nonce: BigNumberish; + startBlock: BigNumberish; + strategies: string[]; + scaledShares: BigNumberish[]; + }; + + export type WithdrawalStructOutput = [ + string, + string, + string, + BigNumber, + number, + string[], + BigNumber[] + ] & { + staker: string; + delegatedTo: string; + withdrawer: string; + nonce: BigNumber; + startBlock: number; + strategies: string[]; + scaledShares: BigNumber[]; + }; + + export type QueuedWithdrawalParamsStruct = { + strategies: string[]; + depositShares: BigNumberish[]; + __deprecated_withdrawer: string; + }; + + export type QueuedWithdrawalParamsStructOutput = [ + string[], + BigNumber[], + string + ] & { + strategies: string[]; + depositShares: BigNumber[]; + __deprecated_withdrawer: string; + }; +} + +export declare namespace ISignatureUtilsMixinTypes { + 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; + "allocationManager()": FunctionFragment; + "beaconChainETHStrategy()": FunctionFragment; + "calculateDelegationApprovalDigestHash(address,address,address,bytes32,uint256)": FunctionFragment; + "calculateWithdrawalRoot((address,address,address,uint256,uint32,address[],uint256[]))": 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,uint256,uint64)": FunctionFragment; + "delegateTo(address,(bytes,uint256),bytes32)": FunctionFragment; + "delegatedTo(address)": FunctionFragment; + "delegationApprover(address)": FunctionFragment; + "delegationApproverSaltIsSpent(address,bytes32)": FunctionFragment; + "depositScalingFactor(address,address)": FunctionFragment; + "domainSeparator()": FunctionFragment; + "eigenPodManager()": FunctionFragment; + "getDepositedShares(address)": FunctionFragment; + "getOperatorShares(address,address[])": 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)": FunctionFragment; + "operatorShares(address,address)": FunctionFragment; + "owner()": FunctionFragment; + "pause(uint256)": FunctionFragment; + "pauseAll()": FunctionFragment; + "paused(uint8)": FunctionFragment; + "paused()": FunctionFragment; + "pauserRegistry()": FunctionFragment; + "pendingWithdrawals(bytes32)": FunctionFragment; + "permissionController()": FunctionFragment; + "queueWithdrawals((address[],uint256[],address)[])": FunctionFragment; + "queuedWithdrawals(bytes32)": FunctionFragment; + "redelegate(address,(bytes,uint256),bytes32)": FunctionFragment; + "registerAsOperator(address,uint32,string)": FunctionFragment; + "renounceOwnership()": FunctionFragment; + "slashOperatorShares(address,address,uint64,uint64)": FunctionFragment; + "strategyManager()": FunctionFragment; + "transferOwnership(address)": FunctionFragment; + "undelegate(address)": FunctionFragment; + "unpause(uint256)": FunctionFragment; + "updateOperatorMetadataURI(address,string)": FunctionFragment; + "version()": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "DELEGATION_APPROVAL_TYPEHASH" + | "allocationManager" + | "beaconChainETHStrategy" + | "calculateDelegationApprovalDigestHash" + | "calculateWithdrawalRoot" + | "completeQueuedWithdrawal" + | "completeQueuedWithdrawals" + | "convertToDepositShares" + | "cumulativeWithdrawalsQueued" + | "decreaseDelegatedShares" + | "delegateTo" + | "delegatedTo" + | "delegationApprover" + | "delegationApproverSaltIsSpent" + | "depositScalingFactor" + | "domainSeparator" + | "eigenPodManager" + | "getDepositedShares" + | "getOperatorShares" + | "getOperatorsShares" + | "getQueuedWithdrawal" + | "getQueuedWithdrawalRoots" + | "getQueuedWithdrawals" + | "getSlashableSharesInQueue" + | "getWithdrawableShares" + | "increaseDelegatedShares" + | "initialize" + | "isDelegated" + | "isOperator" + | "minWithdrawalDelayBlocks" + | "modifyOperatorDetails" + | "operatorShares" + | "owner" + | "pause" + | "pauseAll" + | "paused(uint8)" + | "paused()" + | "pauserRegistry" + | "pendingWithdrawals" + | "permissionController" + | "queueWithdrawals" + | "queuedWithdrawals" + | "redelegate" + | "registerAsOperator" + | "renounceOwnership" + | "slashOperatorShares" + | "strategyManager" + | "transferOwnership" + | "undelegate" + | "unpause" + | "updateOperatorMetadataURI" + | "version" + ): FunctionFragment; + + encodeFunctionData( + functionFragment: "DELEGATION_APPROVAL_TYPEHASH", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "allocationManager", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "beaconChainETHStrategy", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "calculateDelegationApprovalDigestHash", + values: [string, string, string, BytesLike, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "calculateWithdrawalRoot", + values: [IDelegationManagerTypes.WithdrawalStruct] + ): string; + encodeFunctionData( + functionFragment: "completeQueuedWithdrawal", + values: [IDelegationManagerTypes.WithdrawalStruct, string[], boolean] + ): string; + encodeFunctionData( + functionFragment: "completeQueuedWithdrawals", + values: [IDelegationManagerTypes.WithdrawalStruct[], string[][], boolean[]] + ): string; + encodeFunctionData( + functionFragment: "convertToDepositShares", + values: [string, string[], BigNumberish[]] + ): string; + encodeFunctionData( + functionFragment: "cumulativeWithdrawalsQueued", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "decreaseDelegatedShares", + values: [string, BigNumberish, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "delegateTo", + values: [ + string, + ISignatureUtilsMixinTypes.SignatureWithExpiryStruct, + BytesLike + ] + ): string; + encodeFunctionData(functionFragment: "delegatedTo", values: [string]): string; + encodeFunctionData( + functionFragment: "delegationApprover", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "delegationApproverSaltIsSpent", + values: [string, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "depositScalingFactor", + values: [string, string] + ): string; + encodeFunctionData( + functionFragment: "domainSeparator", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "eigenPodManager", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "getDepositedShares", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "getOperatorShares", + values: [string, string[]] + ): string; + encodeFunctionData( + 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, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "initialize", + values: [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: [string, 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: "permissionController", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "queueWithdrawals", + values: [IDelegationManagerTypes.QueuedWithdrawalParamsStruct[]] + ): string; + encodeFunctionData( + functionFragment: "queuedWithdrawals", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "redelegate", + values: [ + string, + ISignatureUtilsMixinTypes.SignatureWithExpiryStruct, + BytesLike + ] + ): string; + encodeFunctionData( + functionFragment: "registerAsOperator", + values: [string, BigNumberish, string] + ): string; + encodeFunctionData( + functionFragment: "renounceOwnership", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "slashOperatorShares", + values: [string, string, BigNumberish, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "strategyManager", + values?: undefined + ): 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] + ): string; + encodeFunctionData(functionFragment: "version", values?: undefined): string; + + decodeFunctionResult( + functionFragment: "DELEGATION_APPROVAL_TYPEHASH", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "allocationManager", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "beaconChainETHStrategy", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "calculateDelegationApprovalDigestHash", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "calculateWithdrawalRoot", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "completeQueuedWithdrawal", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "completeQueuedWithdrawals", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "convertToDepositShares", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "cumulativeWithdrawalsQueued", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "decreaseDelegatedShares", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "delegateTo", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "delegatedTo", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "delegationApprover", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "delegationApproverSaltIsSpent", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "depositScalingFactor", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "domainSeparator", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "eigenPodManager", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getDepositedShares", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getOperatorShares", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getOperatorsShares", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getQueuedWithdrawal", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getQueuedWithdrawalRoots", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getQueuedWithdrawals", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getSlashableSharesInQueue", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "getWithdrawableShares", + 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: "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: "permissionController", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "queueWithdrawals", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "queuedWithdrawals", + data: BytesLike + ): Result; + decodeFunctionResult(functionFragment: "redelegate", data: BytesLike): Result; + decodeFunctionResult( + functionFragment: "registerAsOperator", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "renounceOwnership", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "slashOperatorShares", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "strategyManager", + 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; + decodeFunctionResult(functionFragment: "version", data: BytesLike): Result; + + events: { + "DelegationApproverUpdated(address,address)": EventFragment; + "DepositScalingFactorUpdated(address,address,uint256)": EventFragment; + "Initialized(uint8)": EventFragment; + "OperatorMetadataURIUpdated(address,string)": 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; + "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; + "Unpaused(address,uint256)": EventFragment; + }; + + getEvent(nameOrSignatureOrTopic: "DelegationApproverUpdated"): EventFragment; + getEvent( + nameOrSignatureOrTopic: "DepositScalingFactorUpdated" + ): 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: "SlashingWithdrawalCompleted" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "SlashingWithdrawalQueued"): EventFragment; + getEvent(nameOrSignatureOrTopic: "StakerDelegated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "StakerForceUndelegated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "StakerUndelegated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Unpaused"): EventFragment; +} + +export interface DelegationApproverUpdatedEventObject { + operator: string; + newDelegationApprover: string; +} +export type DelegationApproverUpdatedEvent = TypedEvent< + [string, string], + DelegationApproverUpdatedEventObject +>; + +export type DelegationApproverUpdatedEventFilter = + TypedEventFilter; + +export interface DepositScalingFactorUpdatedEventObject { + staker: string; + strategy: string; + newDepositScalingFactor: BigNumber; +} +export type DepositScalingFactorUpdatedEvent = TypedEvent< + [string, string, BigNumber], + DepositScalingFactorUpdatedEventObject +>; + +export type DepositScalingFactorUpdatedEventFilter = + TypedEventFilter; + +export interface InitializedEventObject { + version: number; +} +export type InitializedEvent = TypedEvent<[number], InitializedEventObject>; + +export type InitializedEventFilter = TypedEventFilter; + +export interface OperatorMetadataURIUpdatedEventObject { + operator: string; + metadataURI: string; +} +export type OperatorMetadataURIUpdatedEvent = TypedEvent< + [string, string], + OperatorMetadataURIUpdatedEventObject +>; + +export type OperatorMetadataURIUpdatedEventFilter = + TypedEventFilter; + +export interface OperatorRegisteredEventObject { + operator: string; + delegationApprover: string; +} +export type OperatorRegisteredEvent = TypedEvent< + [string, string], + 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 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; +} +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 SlashingWithdrawalCompletedEventObject { + withdrawalRoot: string; +} +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 SlashingWithdrawalQueuedEventFilter = + 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 UnpausedEventObject { + account: string; + newPausedStatus: BigNumber; +} +export type UnpausedEvent = TypedEvent< + [string, BigNumber], + UnpausedEventObject +>; + +export type UnpausedEventFilter = 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]>; + + allocationManager(overrides?: CallOverrides): Promise<[string]>; + + beaconChainETHStrategy(overrides?: CallOverrides): Promise<[string]>; + + calculateDelegationApprovalDigestHash( + staker: string, + operator: string, + approver: string, + approverSalt: BytesLike, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise<[string]>; + + calculateWithdrawalRoot( + withdrawal: IDelegationManagerTypes.WithdrawalStruct, + overrides?: CallOverrides + ): Promise<[string]>; + + completeQueuedWithdrawal( + withdrawal: IDelegationManagerTypes.WithdrawalStruct, + tokens: string[], + receiveAsTokens: boolean, + overrides?: Overrides & { from?: string } + ): Promise; + + completeQueuedWithdrawals( + withdrawals: IDelegationManagerTypes.WithdrawalStruct[], + tokens: string[][], + receiveAsTokens: boolean[], + overrides?: Overrides & { from?: string } + ): Promise; + + convertToDepositShares( + staker: string, + strategies: string[], + withdrawableShares: BigNumberish[], + overrides?: CallOverrides + ): Promise<[BigNumber[]]>; + + cumulativeWithdrawalsQueued( + staker: string, + overrides?: CallOverrides + ): Promise<[BigNumber] & { totalQueued: BigNumber }>; + + decreaseDelegatedShares( + staker: string, + curDepositShares: BigNumberish, + beaconChainSlashingFactorDecrease: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + delegateTo( + operator: string, + approverSignatureAndExpiry: ISignatureUtilsMixinTypes.SignatureWithExpiryStruct, + approverSalt: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + delegatedTo( + staker: string, + overrides?: CallOverrides + ): Promise<[string] & { operator: string }>; + + delegationApprover( + operator: string, + overrides?: CallOverrides + ): Promise<[string]>; + + delegationApproverSaltIsSpent( + delegationApprover: string, + salt: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean] & { spent: boolean }>; + + depositScalingFactor( + staker: string, + strategy: string, + overrides?: CallOverrides + ): Promise<[BigNumber]>; + + domainSeparator(overrides?: CallOverrides): Promise<[string]>; + + eigenPodManager(overrides?: CallOverrides): Promise<[string]>; + + getDepositedShares( + staker: string, + overrides?: CallOverrides + ): Promise<[string[], BigNumber[]]>; + + getOperatorShares( + operator: string, + strategies: string[], + overrides?: CallOverrides + ): Promise<[BigNumber[]]>; + + 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, + prevDepositShares: BigNumberish, + addedShares: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + initialize( + initialOwner: string, + initialPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + isDelegated(staker: string, overrides?: CallOverrides): Promise<[boolean]>; + + isOperator(operator: string, overrides?: CallOverrides): Promise<[boolean]>; + + minWithdrawalDelayBlocks(overrides?: CallOverrides): Promise<[number]>; + + modifyOperatorDetails( + operator: string, + newDelegationApprover: string, + overrides?: Overrides & { from?: string } + ): Promise; + + operatorShares( + operator: string, + strategy: string, + overrides?: CallOverrides + ): Promise<[BigNumber] & { shares: 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( + withdrawalRoot: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean] & { pending: boolean }>; + + permissionController(overrides?: CallOverrides): Promise<[string]>; + + queueWithdrawals( + 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( + initDelegationApprover: string, + allocationDelay: BigNumberish, + metadataURI: string, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + slashOperatorShares( + operator: string, + strategy: string, + prevMaxMagnitude: BigNumberish, + newMaxMagnitude: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + strategyManager(overrides?: CallOverrides): Promise<[string]>; + + 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( + operator: string, + metadataURI: string, + overrides?: Overrides & { from?: string } + ): Promise; + + version(overrides?: CallOverrides): Promise<[string]>; + }; + + DELEGATION_APPROVAL_TYPEHASH(overrides?: CallOverrides): Promise; + + allocationManager(overrides?: CallOverrides): Promise; + + beaconChainETHStrategy(overrides?: CallOverrides): Promise; + + calculateDelegationApprovalDigestHash( + staker: string, + operator: string, + approver: string, + approverSalt: BytesLike, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise; + + calculateWithdrawalRoot( + withdrawal: IDelegationManagerTypes.WithdrawalStruct, + overrides?: CallOverrides + ): Promise; + + completeQueuedWithdrawal( + withdrawal: IDelegationManagerTypes.WithdrawalStruct, + tokens: string[], + receiveAsTokens: boolean, + overrides?: Overrides & { from?: string } + ): Promise; + + completeQueuedWithdrawals( + withdrawals: IDelegationManagerTypes.WithdrawalStruct[], + tokens: string[][], + receiveAsTokens: boolean[], + overrides?: Overrides & { from?: string } + ): Promise; + + convertToDepositShares( + staker: string, + strategies: string[], + withdrawableShares: BigNumberish[], + overrides?: CallOverrides + ): Promise; + + cumulativeWithdrawalsQueued( + staker: string, + overrides?: CallOverrides + ): Promise; + + decreaseDelegatedShares( + staker: string, + curDepositShares: BigNumberish, + beaconChainSlashingFactorDecrease: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + delegateTo( + operator: string, + approverSignatureAndExpiry: ISignatureUtilsMixinTypes.SignatureWithExpiryStruct, + approverSalt: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + delegatedTo(staker: string, overrides?: CallOverrides): Promise; + + delegationApprover( + operator: string, + overrides?: CallOverrides + ): Promise; + + delegationApproverSaltIsSpent( + delegationApprover: string, + salt: BytesLike, + overrides?: CallOverrides + ): Promise; + + depositScalingFactor( + staker: string, + strategy: string, + overrides?: CallOverrides + ): Promise; + + domainSeparator(overrides?: CallOverrides): Promise; + + eigenPodManager(overrides?: CallOverrides): Promise; + + getDepositedShares( + staker: string, + overrides?: CallOverrides + ): Promise<[string[], BigNumber[]]>; + + getOperatorShares( + operator: string, + strategies: string[], + overrides?: CallOverrides + ): Promise; + + 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, + prevDepositShares: BigNumberish, + addedShares: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + initialize( + initialOwner: string, + initialPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + isDelegated(staker: string, overrides?: CallOverrides): Promise; + + isOperator(operator: string, overrides?: CallOverrides): Promise; + + minWithdrawalDelayBlocks(overrides?: CallOverrides): Promise; + + modifyOperatorDetails( + operator: string, + newDelegationApprover: string, + overrides?: Overrides & { from?: string } + ): Promise; + + operatorShares( + operator: string, + strategy: 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( + withdrawalRoot: BytesLike, + overrides?: CallOverrides + ): Promise; + + permissionController(overrides?: CallOverrides): Promise; + + queueWithdrawals( + params: IDelegationManagerTypes.QueuedWithdrawalParamsStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + queuedWithdrawals( + withdrawalRoot: BytesLike, + overrides?: CallOverrides + ): Promise; + + redelegate( + newOperator: string, + newOperatorApproverSig: ISignatureUtilsMixinTypes.SignatureWithExpiryStruct, + approverSalt: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + registerAsOperator( + initDelegationApprover: string, + allocationDelay: BigNumberish, + metadataURI: string, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + slashOperatorShares( + operator: string, + strategy: string, + prevMaxMagnitude: BigNumberish, + newMaxMagnitude: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + strategyManager(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( + operator: string, + metadataURI: string, + overrides?: Overrides & { from?: string } + ): Promise; + + version(overrides?: CallOverrides): Promise; + + callStatic: { + DELEGATION_APPROVAL_TYPEHASH(overrides?: CallOverrides): Promise; + + allocationManager(overrides?: CallOverrides): Promise; + + beaconChainETHStrategy(overrides?: CallOverrides): Promise; + + calculateDelegationApprovalDigestHash( + staker: string, + operator: string, + approver: string, + approverSalt: BytesLike, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise; + + calculateWithdrawalRoot( + withdrawal: IDelegationManagerTypes.WithdrawalStruct, + overrides?: CallOverrides + ): Promise; + + completeQueuedWithdrawal( + withdrawal: IDelegationManagerTypes.WithdrawalStruct, + tokens: string[], + receiveAsTokens: boolean, + overrides?: CallOverrides + ): Promise; + + completeQueuedWithdrawals( + withdrawals: IDelegationManagerTypes.WithdrawalStruct[], + tokens: string[][], + receiveAsTokens: boolean[], + overrides?: CallOverrides + ): Promise; + + convertToDepositShares( + staker: string, + strategies: string[], + withdrawableShares: BigNumberish[], + overrides?: CallOverrides + ): Promise; + + cumulativeWithdrawalsQueued( + staker: string, + overrides?: CallOverrides + ): Promise; + + decreaseDelegatedShares( + staker: string, + curDepositShares: BigNumberish, + beaconChainSlashingFactorDecrease: BigNumberish, + overrides?: CallOverrides + ): Promise; + + delegateTo( + operator: string, + approverSignatureAndExpiry: ISignatureUtilsMixinTypes.SignatureWithExpiryStruct, + approverSalt: BytesLike, + overrides?: CallOverrides + ): Promise; + + delegatedTo(staker: string, overrides?: CallOverrides): Promise; + + delegationApprover( + operator: string, + overrides?: CallOverrides + ): Promise; + + delegationApproverSaltIsSpent( + delegationApprover: string, + salt: BytesLike, + overrides?: CallOverrides + ): Promise; + + depositScalingFactor( + staker: string, + strategy: string, + overrides?: CallOverrides + ): Promise; + + domainSeparator(overrides?: CallOverrides): Promise; + + eigenPodManager(overrides?: CallOverrides): Promise; + + getDepositedShares( + staker: string, + overrides?: CallOverrides + ): Promise<[string[], BigNumber[]]>; + + getOperatorShares( + operator: string, + strategies: string[], + overrides?: CallOverrides + ): Promise; + + 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, + prevDepositShares: BigNumberish, + addedShares: BigNumberish, + overrides?: CallOverrides + ): Promise; + + initialize( + initialOwner: string, + initialPausedStatus: BigNumberish, + overrides?: CallOverrides + ): Promise; + + isDelegated(staker: string, overrides?: CallOverrides): Promise; + + isOperator(operator: string, overrides?: CallOverrides): Promise; + + minWithdrawalDelayBlocks(overrides?: CallOverrides): Promise; + + modifyOperatorDetails( + operator: string, + newDelegationApprover: string, + overrides?: CallOverrides + ): Promise; + + operatorShares( + operator: string, + strategy: 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( + withdrawalRoot: BytesLike, + overrides?: CallOverrides + ): Promise; + + permissionController(overrides?: CallOverrides): Promise; + + queueWithdrawals( + params: IDelegationManagerTypes.QueuedWithdrawalParamsStruct[], + overrides?: CallOverrides + ): Promise; + + queuedWithdrawals( + withdrawalRoot: BytesLike, + overrides?: CallOverrides + ): Promise; + + redelegate( + newOperator: string, + newOperatorApproverSig: ISignatureUtilsMixinTypes.SignatureWithExpiryStruct, + approverSalt: BytesLike, + overrides?: CallOverrides + ): Promise; + + registerAsOperator( + initDelegationApprover: string, + allocationDelay: BigNumberish, + metadataURI: string, + overrides?: CallOverrides + ): Promise; + + renounceOwnership(overrides?: CallOverrides): Promise; + + slashOperatorShares( + operator: string, + strategy: string, + prevMaxMagnitude: BigNumberish, + newMaxMagnitude: BigNumberish, + overrides?: CallOverrides + ): Promise; + + strategyManager(overrides?: CallOverrides): Promise; + + transferOwnership( + newOwner: string, + overrides?: CallOverrides + ): Promise; + + undelegate(staker: string, overrides?: CallOverrides): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: CallOverrides + ): Promise; + + updateOperatorMetadataURI( + operator: string, + metadataURI: string, + overrides?: CallOverrides + ): Promise; + + version(overrides?: CallOverrides): Promise; + }; + + filters: { + "DelegationApproverUpdated(address,address)"( + operator?: string | null, + newDelegationApprover?: null + ): DelegationApproverUpdatedEventFilter; + DelegationApproverUpdated( + operator?: string | null, + 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, + metadataURI?: null + ): OperatorMetadataURIUpdatedEventFilter; + OperatorMetadataURIUpdated( + operator?: string | null, + metadataURI?: null + ): OperatorMetadataURIUpdatedEventFilter; + + "OperatorRegistered(address,address)"( + operator?: string | null, + delegationApprover?: null + ): OperatorRegisteredEventFilter; + OperatorRegistered( + operator?: string | null, + delegationApprover?: 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; + + "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 + ): 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; + + "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, + 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; + + "Unpaused(address,uint256)"( + account?: string | null, + newPausedStatus?: null + ): UnpausedEventFilter; + Unpaused( + account?: string | null, + newPausedStatus?: null + ): UnpausedEventFilter; + }; + + estimateGas: { + DELEGATION_APPROVAL_TYPEHASH(overrides?: CallOverrides): Promise; + + allocationManager(overrides?: CallOverrides): Promise; + + beaconChainETHStrategy(overrides?: CallOverrides): Promise; + + calculateDelegationApprovalDigestHash( + staker: string, + operator: string, + approver: string, + approverSalt: BytesLike, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise; + + calculateWithdrawalRoot( + withdrawal: IDelegationManagerTypes.WithdrawalStruct, + overrides?: CallOverrides + ): Promise; + + completeQueuedWithdrawal( + withdrawal: IDelegationManagerTypes.WithdrawalStruct, + tokens: string[], + receiveAsTokens: boolean, + overrides?: Overrides & { from?: string } + ): Promise; + + completeQueuedWithdrawals( + withdrawals: IDelegationManagerTypes.WithdrawalStruct[], + tokens: string[][], + receiveAsTokens: boolean[], + overrides?: Overrides & { from?: string } + ): Promise; + + convertToDepositShares( + staker: string, + strategies: string[], + withdrawableShares: BigNumberish[], + overrides?: CallOverrides + ): Promise; + + cumulativeWithdrawalsQueued( + staker: string, + overrides?: CallOverrides + ): Promise; + + decreaseDelegatedShares( + staker: string, + curDepositShares: BigNumberish, + beaconChainSlashingFactorDecrease: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + delegateTo( + operator: string, + approverSignatureAndExpiry: ISignatureUtilsMixinTypes.SignatureWithExpiryStruct, + approverSalt: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + delegatedTo(staker: string, overrides?: CallOverrides): Promise; + + delegationApprover( + operator: string, + overrides?: CallOverrides + ): Promise; + + delegationApproverSaltIsSpent( + delegationApprover: string, + salt: BytesLike, + overrides?: CallOverrides + ): Promise; + + depositScalingFactor( + staker: string, + strategy: string, + overrides?: CallOverrides + ): Promise; + + domainSeparator(overrides?: CallOverrides): Promise; + + eigenPodManager(overrides?: CallOverrides): Promise; + + getDepositedShares( + staker: string, + overrides?: CallOverrides + ): Promise; + + getOperatorShares( + operator: string, + strategies: string[], + overrides?: CallOverrides + ): Promise; + + 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; + + increaseDelegatedShares( + staker: string, + strategy: string, + prevDepositShares: BigNumberish, + addedShares: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + initialize( + initialOwner: string, + initialPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + isDelegated(staker: string, overrides?: CallOverrides): Promise; + + isOperator(operator: string, overrides?: CallOverrides): Promise; + + minWithdrawalDelayBlocks(overrides?: CallOverrides): Promise; + + modifyOperatorDetails( + operator: string, + newDelegationApprover: string, + overrides?: Overrides & { from?: string } + ): Promise; + + operatorShares( + operator: string, + strategy: 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( + withdrawalRoot: BytesLike, + overrides?: CallOverrides + ): Promise; + + permissionController(overrides?: CallOverrides): Promise; + + queueWithdrawals( + params: IDelegationManagerTypes.QueuedWithdrawalParamsStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + queuedWithdrawals( + withdrawalRoot: BytesLike, + overrides?: CallOverrides + ): Promise; + + redelegate( + newOperator: string, + newOperatorApproverSig: ISignatureUtilsMixinTypes.SignatureWithExpiryStruct, + approverSalt: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + registerAsOperator( + initDelegationApprover: string, + allocationDelay: BigNumberish, + metadataURI: string, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + slashOperatorShares( + operator: string, + strategy: string, + prevMaxMagnitude: BigNumberish, + newMaxMagnitude: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + strategyManager(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( + operator: string, + metadataURI: string, + overrides?: Overrides & { from?: string } + ): Promise; + + version(overrides?: CallOverrides): Promise; + }; + + populateTransaction: { + DELEGATION_APPROVAL_TYPEHASH( + overrides?: CallOverrides + ): Promise; + + allocationManager(overrides?: CallOverrides): Promise; + + beaconChainETHStrategy( + overrides?: CallOverrides + ): Promise; + + calculateDelegationApprovalDigestHash( + staker: string, + operator: string, + approver: string, + approverSalt: BytesLike, + expiry: BigNumberish, + overrides?: CallOverrides + ): Promise; + + calculateWithdrawalRoot( + withdrawal: IDelegationManagerTypes.WithdrawalStruct, + overrides?: CallOverrides + ): Promise; + + completeQueuedWithdrawal( + withdrawal: IDelegationManagerTypes.WithdrawalStruct, + tokens: string[], + receiveAsTokens: boolean, + overrides?: Overrides & { from?: string } + ): Promise; + + completeQueuedWithdrawals( + withdrawals: IDelegationManagerTypes.WithdrawalStruct[], + tokens: string[][], + receiveAsTokens: boolean[], + overrides?: Overrides & { from?: string } + ): Promise; + + convertToDepositShares( + staker: string, + strategies: string[], + withdrawableShares: BigNumberish[], + overrides?: CallOverrides + ): Promise; + + cumulativeWithdrawalsQueued( + staker: string, + overrides?: CallOverrides + ): Promise; + + decreaseDelegatedShares( + staker: string, + curDepositShares: BigNumberish, + beaconChainSlashingFactorDecrease: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + delegateTo( + operator: string, + approverSignatureAndExpiry: ISignatureUtilsMixinTypes.SignatureWithExpiryStruct, + approverSalt: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + delegatedTo( + staker: string, + overrides?: CallOverrides + ): Promise; + + delegationApprover( + operator: string, + overrides?: CallOverrides + ): Promise; + + delegationApproverSaltIsSpent( + delegationApprover: string, + salt: BytesLike, + overrides?: CallOverrides + ): Promise; + + depositScalingFactor( + staker: string, + strategy: string, + overrides?: CallOverrides + ): Promise; + + domainSeparator(overrides?: CallOverrides): Promise; + + eigenPodManager(overrides?: CallOverrides): Promise; + + getDepositedShares( + staker: string, + overrides?: CallOverrides + ): Promise; + + getOperatorShares( + operator: string, + strategies: string[], + overrides?: CallOverrides + ): Promise; + + 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; + + increaseDelegatedShares( + staker: string, + strategy: string, + prevDepositShares: BigNumberish, + addedShares: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + initialize( + initialOwner: string, + initialPausedStatus: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + isDelegated( + staker: string, + overrides?: CallOverrides + ): Promise; + + isOperator( + operator: string, + overrides?: CallOverrides + ): Promise; + + minWithdrawalDelayBlocks( + overrides?: CallOverrides + ): Promise; + + modifyOperatorDetails( + operator: string, + newDelegationApprover: string, + overrides?: Overrides & { from?: string } + ): Promise; + + operatorShares( + operator: string, + strategy: 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( + withdrawalRoot: BytesLike, + overrides?: CallOverrides + ): Promise; + + permissionController( + overrides?: CallOverrides + ): Promise; + + queueWithdrawals( + params: IDelegationManagerTypes.QueuedWithdrawalParamsStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + queuedWithdrawals( + withdrawalRoot: BytesLike, + overrides?: CallOverrides + ): Promise; + + redelegate( + newOperator: string, + newOperatorApproverSig: ISignatureUtilsMixinTypes.SignatureWithExpiryStruct, + approverSalt: BytesLike, + overrides?: Overrides & { from?: string } + ): Promise; + + registerAsOperator( + initDelegationApprover: string, + allocationDelay: BigNumberish, + metadataURI: string, + overrides?: Overrides & { from?: string } + ): Promise; + + renounceOwnership( + overrides?: Overrides & { from?: string } + ): Promise; + + slashOperatorShares( + operator: string, + strategy: string, + prevMaxMagnitude: BigNumberish, + newMaxMagnitude: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + strategyManager(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( + 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 new file mode 100644 index 00000000..048e4455 --- /dev/null +++ b/src/avs/contracts/ECDSAStakeRegistry.ts @@ -0,0 +1,1196 @@ +/* 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 IECDSAStakeRegistryTypes { + export type StrategyParamsStruct = { + strategy: string; + multiplier: BigNumberish; + }; + + export type StrategyParamsStructOutput = [string, BigNumber] & { + strategy: string; + multiplier: BigNumber; + }; + + export type QuorumStruct = { + strategies: IECDSAStakeRegistryTypes.StrategyParamsStruct[]; + }; + + export type QuorumStructOutput = [ + IECDSAStakeRegistryTypes.StrategyParamsStructOutput[] + ] & { strategies: IECDSAStakeRegistryTypes.StrategyParamsStructOutput[] }; +} + +export declare namespace ISignatureUtilsMixinTypes { + 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; + "getLatestOperatorSigningKey(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" + | "getLatestOperatorSigningKey" + | "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: "getLatestOperatorSigningKey", + 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, IECDSAStakeRegistryTypes.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: [ISignatureUtilsMixinTypes.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: [IECDSAStakeRegistryTypes.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: "getLatestOperatorSigningKey", + 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 { + previous: BigNumber; + current: 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 { + previous: IECDSAStakeRegistryTypes.QuorumStructOutput; + current: IECDSAStakeRegistryTypes.QuorumStructOutput; +} +export type QuorumUpdatedEvent = TypedEvent< + [ + IECDSAStakeRegistryTypes.QuorumStructOutput, + IECDSAStakeRegistryTypes.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]>; + + getLatestOperatorSigningKey( + 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: IECDSAStakeRegistryTypes.QuorumStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + isValidSignature( + digest: 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<[IECDSAStakeRegistryTypes.QuorumStructOutput]>; + + registerOperatorWithSignature( + operatorSignature: ISignatureUtilsMixinTypes.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: IECDSAStakeRegistryTypes.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; + + getLatestOperatorSigningKey( + 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: IECDSAStakeRegistryTypes.QuorumStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + isValidSignature( + digest: 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: ISignatureUtilsMixinTypes.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: IECDSAStakeRegistryTypes.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; + + getLatestOperatorSigningKey( + 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: IECDSAStakeRegistryTypes.QuorumStruct, + overrides?: CallOverrides + ): Promise; + + isValidSignature( + digest: 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: ISignatureUtilsMixinTypes.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: IECDSAStakeRegistryTypes.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)"( + previous?: null, + current?: null + ): MinimumWeightUpdatedEventFilter; + MinimumWeightUpdated( + previous?: null, + current?: 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)[]))"( + previous?: null, + current?: null + ): QuorumUpdatedEventFilter; + QuorumUpdated(previous?: null, current?: 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; + + getLatestOperatorSigningKey( + 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: IECDSAStakeRegistryTypes.QuorumStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + isValidSignature( + digest: 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: ISignatureUtilsMixinTypes.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: IECDSAStakeRegistryTypes.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; + + getLatestOperatorSigningKey( + 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: IECDSAStakeRegistryTypes.QuorumStruct, + overrides?: Overrides & { from?: string } + ): Promise; + + isValidSignature( + digest: 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: ISignatureUtilsMixinTypes.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: IECDSAStakeRegistryTypes.QuorumStruct, + operators: string[], + overrides?: Overrides & { from?: string } + ): Promise; + + updateStakeThreshold( + thresholdWeight: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + }; +} 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 6fad2440..65611568 100644 --- a/src/avs/contracts/ReclaimServiceManager.ts +++ b/src/avs/contracts/ReclaimServiceManager.ts @@ -26,92 +26,7 @@ import type { OnEvent, } from "./common"; -export declare namespace IReclaimServiceManager { - export type ClaimRequestStruct = { - provider: string; - claimUserId: BytesLike; - claimHash: BytesLike; - requestedAt: BigNumberish; - owner: string; - }; - - export type ClaimRequestStructOutput = [ - string, - string, - string, - number, - string - ] & { - provider: string; - claimUserId: string; - claimHash: string; - requestedAt: number; - owner: string; - }; - - 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; - }; - - export type TaskCreationMetadataStructOutput = [number, number, number] & { - maxTaskLifetimeS: number; - minSignaturesPerTask: number; - maxTaskCreationDelayS: number; - }; -} - -export declare namespace IPaymentCoordinator { +export declare namespace IRewardsCoordinatorTypes { export type StrategyAndMultiplierStruct = { strategy: string; multiplier: BigNumberish; @@ -122,30 +37,62 @@ export declare namespace IPaymentCoordinator { multiplier: BigNumber; }; - export type RangePaymentStruct = { - strategiesAndMultipliers: IPaymentCoordinator.StrategyAndMultiplierStruct[]; + export type RewardsSubmissionStruct = { + strategiesAndMultipliers: IRewardsCoordinatorTypes.StrategyAndMultiplierStruct[]; token: string; amount: BigNumberish; startTimestamp: BigNumberish; duration: BigNumberish; }; - export type RangePaymentStructOutput = [ - IPaymentCoordinator.StrategyAndMultiplierStructOutput[], + export type RewardsSubmissionStructOutput = [ + IRewardsCoordinatorTypes.StrategyAndMultiplierStructOutput[], string, BigNumber, number, number ] & { - strategiesAndMultipliers: IPaymentCoordinator.StrategyAndMultiplierStructOutput[]; + strategiesAndMultipliers: IRewardsCoordinatorTypes.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: IRewardsCoordinatorTypes.StrategyAndMultiplierStruct[]; + token: string; + operatorRewards: IRewardsCoordinatorTypes.OperatorRewardStruct[]; + startTimestamp: BigNumberish; + duration: BigNumberish; + description: string; + }; + + export type OperatorDirectedRewardsSubmissionStructOutput = [ + IRewardsCoordinatorTypes.StrategyAndMultiplierStructOutput[], + string, + IRewardsCoordinatorTypes.OperatorRewardStructOutput[], + number, + number, + string + ] & { + strategiesAndMultipliers: IRewardsCoordinatorTypes.StrategyAndMultiplierStructOutput[]; + token: string; + operatorRewards: IRewardsCoordinatorTypes.OperatorRewardStructOutput[]; + startTimestamp: number; + duration: number; + description: string; + }; } -export declare namespace ISignatureUtils { +export declare namespace ISignatureUtilsMixinTypes { export type SignatureWithSaltAndExpiryStruct = { signature: BytesLike; salt: BytesLike; @@ -161,115 +108,93 @@ export declare namespace ISignatureUtils { export interface ReclaimServiceManagerInterface extends utils.Interface { functions: { - "admins(uint256)": FunctionFragment; - "allTaskHashes(uint32)": FunctionFragment; + "addOperatorToWhitelist(address)": FunctionFragment; + "addPendingAdmin(address)": FunctionFragment; "avsDirectory()": FunctionFragment; - "checkSignerAddress((string,bytes32,bytes32,uint32,address),bytes)": FunctionFragment; - "createNewTask((string,bytes32,bytes32,uint32,address),bytes)": FunctionFragment; + "createAVSRewardsSubmission(((address,uint96)[],address,uint256,uint32,uint32)[])": FunctionFragment; + "createOperatorDirectedAVSRewardsSubmission(((address,uint96)[],address,(address,uint256)[],uint32,uint32,string)[])": FunctionFragment; "deregisterOperatorFromAVS(address)": FunctionFragment; - "encodeClaimRequest((string,bytes32,bytes32,uint32,address))": FunctionFragment; - "getMetadataForOperator(address)": FunctionFragment; + "deregisterOperatorFromOperatorSets(address,uint32[])": FunctionFragment; "getOperatorRestakedStrategies(address)": FunctionFragment; "getRestakeableStrategies()": FunctionFragment; - "isAdmin(address)": 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; - "payForRange(((address,uint96)[],address,uint256,uint32,uint32)[])": 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; - "setPauserRegistry(address)": FunctionFragment; - "setup(address)": FunctionFragment; - "stakeRegistry()": FunctionFragment; - "taskCompleted((((string,bytes32,bytes32,uint32,address),uint32,uint32,uint8,(address,string)[],uint256),bytes[]),uint32)": FunctionFragment; - "taskCreationMetadata()": FunctionFragment; + "rewardsInitiator()": FunctionFragment; + "setAppointee(address,address,bytes4)": FunctionFragment; + "setClaimerFor(address)": FunctionFragment; + "setRewardsInitiator(address)": FunctionFragment; + "slashingRegistryCoordinator()": FunctionFragment; + "taskManager()": FunctionFragment; "transferOwnership(address)": FunctionFragment; - "unpause(uint256)": FunctionFragment; "updateAVSMetadataURI(string)": FunctionFragment; - "updateOperatorMetadata((address,string))": FunctionFragment; - "updateTaskCreationMetadata((uint32,uint8,uint32))": FunctionFragment; - "whitelistAddressAsOperator(address,bool)": FunctionFragment; "whitelistedOperators(uint256)": FunctionFragment; }; getFunction( nameOrSignatureOrTopic: - | "admins" - | "allTaskHashes" + | "addOperatorToWhitelist" + | "addPendingAdmin" | "avsDirectory" - | "checkSignerAddress" - | "createNewTask" + | "createAVSRewardsSubmission" + | "createOperatorDirectedAVSRewardsSubmission" | "deregisterOperatorFromAVS" - | "encodeClaimRequest" - | "getMetadataForOperator" + | "deregisterOperatorFromOperatorSets" | "getOperatorRestakedStrategies" | "getRestakeableStrategies" - | "isAdmin" + | "initialize" | "isOperatorWhitelisted" - | "latestTaskNum" - | "operatorHasMinimumWeight" | "owner" - | "pause" - | "pauseAll" - | "paused(uint8)" - | "paused()" - | "pauserRegistry" - | "payForRange" | "registerOperatorToAVS" - | "registeredOperators" + | "removeAdmin" + | "removeAppointee" + | "removeOperatorFromWhitelist" + | "removePendingAdmin" | "renounceOwnership" - | "setPauserRegistry" - | "setup" - | "stakeRegistry" - | "taskCompleted" - | "taskCreationMetadata" + | "rewardsInitiator" + | "setAppointee" + | "setClaimerFor" + | "setRewardsInitiator" + | "slashingRegistryCoordinator" + | "taskManager" | "transferOwnership" - | "unpause" | "updateAVSMetadataURI" - | "updateOperatorMetadata" - | "updateTaskCreationMetadata" - | "whitelistAddressAsOperator" | "whitelistedOperators" ): FunctionFragment; encodeFunctionData( - functionFragment: "admins", - values: [BigNumberish] + functionFragment: "addOperatorToWhitelist", + values: [string] ): string; encodeFunctionData( - functionFragment: "allTaskHashes", - values: [BigNumberish] + functionFragment: "addPendingAdmin", + values: [string] ): string; encodeFunctionData( functionFragment: "avsDirectory", values?: undefined ): string; encodeFunctionData( - functionFragment: "checkSignerAddress", - values: [IReclaimServiceManager.ClaimRequestStruct, BytesLike] + functionFragment: "createAVSRewardsSubmission", + values: [IRewardsCoordinatorTypes.RewardsSubmissionStruct[]] ): string; encodeFunctionData( - functionFragment: "createNewTask", - values: [IReclaimServiceManager.ClaimRequestStruct, BytesLike] + functionFragment: "createOperatorDirectedAVSRewardsSubmission", + 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", @@ -279,120 +204,99 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { functionFragment: "getRestakeableStrategies", values?: undefined ): string; - encodeFunctionData(functionFragment: "isAdmin", values: [string]): string; encodeFunctionData( - functionFragment: "isOperatorWhitelisted", - values: [string] - ): string; - encodeFunctionData( - functionFragment: "latestTaskNum", - values?: undefined + functionFragment: "initialize", + values: [string, string] ): string; encodeFunctionData( - functionFragment: "operatorHasMinimumWeight", + functionFragment: "isOperatorWhitelisted", 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: "payForRange", - values: [IPaymentCoordinator.RangePaymentStruct[]] + functionFragment: "removeOperatorFromWhitelist", + values: [string] ): string; encodeFunctionData( - functionFragment: "registerOperatorToAVS", - values: [string, ISignatureUtils.SignatureWithSaltAndExpiryStruct] + functionFragment: "removePendingAdmin", + values: [string] ): string; encodeFunctionData( - functionFragment: "registeredOperators", - values: [BigNumberish] + functionFragment: "renounceOwnership", + values?: undefined ): string; encodeFunctionData( - functionFragment: "renounceOwnership", + functionFragment: "rewardsInitiator", values?: undefined ): string; encodeFunctionData( - functionFragment: "setPauserRegistry", + functionFragment: "setAppointee", + values: [string, string, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "setClaimerFor", values: [string] ): string; - encodeFunctionData(functionFragment: "setup", values: [string]): string; encodeFunctionData( - functionFragment: "stakeRegistry", - values?: undefined + functionFragment: "setRewardsInitiator", + values: [string] ): string; encodeFunctionData( - functionFragment: "taskCompleted", - values: [IReclaimServiceManager.CompletedTaskStruct, BigNumberish] + functionFragment: "slashingRegistryCoordinator", + values?: undefined ): 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: "admins", data: BytesLike): Result; decodeFunctionResult( - functionFragment: "allTaskHashes", + functionFragment: "addOperatorToWhitelist", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "avsDirectory", + functionFragment: "addPendingAdmin", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "checkSignerAddress", + functionFragment: "avsDirectory", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "createNewTask", + functionFragment: "createAVSRewardsSubmission", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "deregisterOperatorFromAVS", + functionFragment: "createOperatorDirectedAVSRewardsSubmission", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "encodeClaimRequest", + functionFragment: "deregisterOperatorFromAVS", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "getMetadataForOperator", + functionFragment: "deregisterOperatorFromOperatorSets", data: BytesLike ): Result; decodeFunctionResult( @@ -403,41 +307,30 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { functionFragment: "getRestakeableStrategies", data: BytesLike ): Result; - decodeFunctionResult(functionFragment: "isAdmin", data: BytesLike): Result; + decodeFunctionResult(functionFragment: "initialize", data: BytesLike): Result; decodeFunctionResult( functionFragment: "isOperatorWhitelisted", 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)", + functionFragment: "registerOperatorToAVS", data: BytesLike ): Result; - decodeFunctionResult(functionFragment: "paused()", data: BytesLike): Result; decodeFunctionResult( - functionFragment: "pauserRegistry", + functionFragment: "removeAdmin", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "payForRange", + functionFragment: "removeAppointee", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "registerOperatorToAVS", + functionFragment: "removeOperatorFromWhitelist", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "registeredOperators", + functionFragment: "removePendingAdmin", data: BytesLike ): Result; decodeFunctionResult( @@ -445,41 +338,35 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "setPauserRegistry", - data: BytesLike - ): Result; - decodeFunctionResult(functionFragment: "setup", data: BytesLike): Result; - decodeFunctionResult( - functionFragment: "stakeRegistry", + functionFragment: "rewardsInitiator", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "taskCompleted", + functionFragment: "setAppointee", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "taskCreationMetadata", + functionFragment: "setClaimerFor", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "transferOwnership", + functionFragment: "setRewardsInitiator", data: BytesLike ): Result; - decodeFunctionResult(functionFragment: "unpause", data: BytesLike): Result; decodeFunctionResult( - functionFragment: "updateAVSMetadataURI", + functionFragment: "slashingRegistryCoordinator", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "updateOperatorMetadata", + functionFragment: "taskManager", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "updateTaskCreationMetadata", + functionFragment: "transferOwnership", data: BytesLike ): Result; decodeFunctionResult( - functionFragment: "whitelistAddressAsOperator", + functionFragment: "updateAVSMetadataURI", data: BytesLike ): Result; decodeFunctionResult( @@ -489,21 +376,13 @@ export interface ReclaimServiceManagerInterface extends utils.Interface { events: { "Initialized(uint8)": EventFragment; - "NewTaskCreated(uint32,((string,bytes32,bytes32,uint32,address),uint32,uint32,uint8,(address,string)[],uint256))": EventFragment; "OwnershipTransferred(address,address)": EventFragment; - "Paused(address,uint256)": EventFragment; - "PauserRegistrySet(address,address)": EventFragment; - "TaskCompleted(uint32,(((string,bytes32,bytes32,uint32,address),uint32,uint32,uint8,(address,string)[],uint256),bytes[]))": EventFragment; - "Unpaused(address,uint256)": EventFragment; + "RewardsInitiatorUpdated(address,address)": EventFragment; }; getEvent(nameOrSignatureOrTopic: "Initialized"): EventFragment; - getEvent(nameOrSignatureOrTopic: "NewTaskCreated"): EventFragment; getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; - getEvent(nameOrSignatureOrTopic: "Paused"): EventFragment; - getEvent(nameOrSignatureOrTopic: "PauserRegistrySet"): EventFragment; - getEvent(nameOrSignatureOrTopic: "TaskCompleted"): EventFragment; - getEvent(nameOrSignatureOrTopic: "Unpaused"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RewardsInitiatorUpdated"): EventFragment; } export interface InitializedEventObject { @@ -513,17 +392,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; @@ -536,47 +404,17 @@ export type OwnershipTransferredEvent = TypedEvent< export type OwnershipTransferredEventFilter = TypedEventFilter; -export interface PausedEventObject { - account: string; - newPausedStatus: BigNumber; +export interface RewardsInitiatorUpdatedEventObject { + prevRewardsInitiator: string; + newRewardsInitiator: string; } -export type PausedEvent = TypedEvent<[string, BigNumber], PausedEventObject>; - -export type PausedEventFilter = TypedEventFilter; - -export interface PauserRegistrySetEventObject { - pauserRegistry: string; - newPauserRegistry: string; -} -export type PauserRegistrySetEvent = TypedEvent< +export type RewardsInitiatorUpdatedEvent = TypedEvent< [string, string], - PauserRegistrySetEventObject + RewardsInitiatorUpdatedEventObject >; -export type PauserRegistrySetEventFilter = - 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 type RewardsInitiatorUpdatedEventFilter = + TypedEventFilter; export interface ReclaimServiceManager extends BaseContract { connect(signerOrProvider: Signer | Provider | string): this; @@ -605,24 +443,25 @@ export interface ReclaimServiceManager extends BaseContract { removeListener: OnEvent; functions: { - admins(arg0: BigNumberish, overrides?: CallOverrides): Promise<[string]>; + addOperatorToWhitelist( + operator: string, + overrides?: Overrides & { from?: string } + ): Promise; - allTaskHashes( - arg0: BigNumberish, - overrides?: CallOverrides - ): Promise<[string]>; + addPendingAdmin( + admin: string, + overrides?: Overrides & { from?: string } + ): Promise; avsDirectory(overrides?: CallOverrides): Promise<[string]>; - checkSignerAddress( - request: IReclaimServiceManager.ClaimRequestStruct, - requestSignature: BytesLike, - overrides?: CallOverrides - ): Promise<[string]>; + createAVSRewardsSubmission( + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; - createNewTask( - request: IReclaimServiceManager.ClaimRequestStruct, - requestSignature: BytesLike, + createOperatorDirectedAVSRewardsSubmission( + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; @@ -631,157 +470,122 @@ export interface ReclaimServiceManager extends BaseContract { 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[]]>; - isAdmin(_admin: string, overrides?: CallOverrides): Promise<[boolean]>; + initialize( + initialOwner: string, + rewardsInitiator: string, + overrides?: Overrides & { from?: string } + ): Promise; isOperatorWhitelisted( operator: string, 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]>; - - payForRange( - rangePayments: IPaymentCoordinator.RangePaymentStruct[], + 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 } ): Promise; - setPauserRegistry( - newPauserRegistry: string, + rewardsInitiator(overrides?: CallOverrides): Promise<[string]>; + + setAppointee( + appointee: string, + target: string, + selector: BytesLike, overrides?: Overrides & { from?: string } ): Promise; - setup( - initialAdmin: string, + setClaimerFor( + claimer: string, overrides?: Overrides & { from?: string } ): Promise; - stakeRegistry(overrides?: CallOverrides): Promise<[string]>; - - taskCompleted( - completedTask: IReclaimServiceManager.CompletedTaskStruct, - referenceTaskIndex: BigNumberish, + setRewardsInitiator( + newRewardsInitiator: string, overrides?: Overrides & { from?: string } ): Promise; - taskCreationMetadata( - overrides?: CallOverrides - ): Promise< - [number, number, number] & { - maxTaskLifetimeS: number; - minSignaturesPerTask: number; - maxTaskCreationDelayS: number; - } - >; + slashingRegistryCoordinator(overrides?: CallOverrides): Promise<[string]>; + + 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]>; }; - admins(arg0: BigNumberish, overrides?: CallOverrides): Promise; + addOperatorToWhitelist( + operator: string, + overrides?: Overrides & { from?: string } + ): Promise; - allTaskHashes(arg0: BigNumberish, overrides?: CallOverrides): Promise; + addPendingAdmin( + admin: string, + overrides?: Overrides & { from?: string } + ): Promise; avsDirectory(overrides?: CallOverrides): Promise; - checkSignerAddress( - request: IReclaimServiceManager.ClaimRequestStruct, - requestSignature: BytesLike, - overrides?: CallOverrides - ): Promise; + createAVSRewardsSubmission( + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; - createNewTask( - request: IReclaimServiceManager.ClaimRequestStruct, - requestSignature: BytesLike, + createOperatorDirectedAVSRewardsSubmission( + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; @@ -790,160 +594,119 @@ export interface ReclaimServiceManager extends BaseContract { 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; - isAdmin(_admin: string, overrides?: CallOverrides): Promise; + initialize( + initialOwner: string, + rewardsInitiator: string, + overrides?: Overrides & { from?: string } + ): Promise; isOperatorWhitelisted( operator: string, 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; - - payForRange( - rangePayments: IPaymentCoordinator.RangePaymentStruct[], + 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 } ): Promise; - setPauserRegistry( - newPauserRegistry: string, + rewardsInitiator(overrides?: CallOverrides): Promise; + + setAppointee( + appointee: string, + target: string, + selector: BytesLike, overrides?: Overrides & { from?: string } ): Promise; - setup( - initialAdmin: string, + setClaimerFor( + claimer: string, overrides?: Overrides & { from?: string } ): Promise; - stakeRegistry(overrides?: CallOverrides): Promise; - - taskCompleted( - completedTask: IReclaimServiceManager.CompletedTaskStruct, - referenceTaskIndex: BigNumberish, + setRewardsInitiator( + newRewardsInitiator: string, overrides?: Overrides & { from?: string } ): Promise; - taskCreationMetadata( - overrides?: CallOverrides - ): Promise< - [number, number, number] & { - maxTaskLifetimeS: number; - minSignaturesPerTask: number; - maxTaskCreationDelayS: number; - } - >; + slashingRegistryCoordinator(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 ): Promise; callStatic: { - admins(arg0: BigNumberish, overrides?: CallOverrides): Promise; - - allTaskHashes( - arg0: BigNumberish, + addOperatorToWhitelist( + operator: string, overrides?: CallOverrides - ): Promise; + ): Promise; + + addPendingAdmin(admin: string, overrides?: CallOverrides): Promise; avsDirectory(overrides?: CallOverrides): Promise; - checkSignerAddress( - request: IReclaimServiceManager.ClaimRequestStruct, - requestSignature: BytesLike, + createAVSRewardsSubmission( + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], overrides?: CallOverrides - ): Promise; + ): Promise; - createNewTask( - request: IReclaimServiceManager.ClaimRequestStruct, - requestSignature: BytesLike, + createOperatorDirectedAVSRewardsSubmission( + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], overrides?: CallOverrides ): Promise; @@ -952,129 +715,89 @@ export interface ReclaimServiceManager extends BaseContract { 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; - isAdmin(_admin: string, overrides?: CallOverrides): Promise; - - isOperatorWhitelisted( - operator: string, + initialize( + initialOwner: string, + rewardsInitiator: string, overrides?: CallOverrides - ): Promise; - - latestTaskNum(overrides?: CallOverrides): Promise; + ): Promise; - operatorHasMinimumWeight( + isOperatorWhitelisted( 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; - - "paused(uint8)"( - index: BigNumberish, - overrides?: CallOverrides - ): Promise; - - "paused()"(overrides?: CallOverrides): Promise; + removeAdmin(admin: string, overrides?: CallOverrides): Promise; - pauserRegistry(overrides?: CallOverrides): Promise; - - payForRange( - rangePayments: IPaymentCoordinator.RangePaymentStruct[], + removeAppointee( + appointee: string, + target: string, + selector: BytesLike, overrides?: CallOverrides ): 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; - setPauserRegistry( - newPauserRegistry: string, + rewardsInitiator(overrides?: CallOverrides): Promise; + + setAppointee( + appointee: string, + target: string, + selector: BytesLike, overrides?: CallOverrides ): Promise; - setup(initialAdmin: string, overrides?: CallOverrides): Promise; - - stakeRegistry(overrides?: CallOverrides): Promise; + setClaimerFor(claimer: string, overrides?: CallOverrides): Promise; - taskCompleted( - completedTask: IReclaimServiceManager.CompletedTaskStruct, - referenceTaskIndex: BigNumberish, + setRewardsInitiator( + newRewardsInitiator: string, overrides?: CallOverrides ): Promise; - taskCreationMetadata( - overrides?: CallOverrides - ): Promise< - [number, number, number] & { - maxTaskLifetimeS: number; - minSignaturesPerTask: number; - maxTaskCreationDelayS: number; - } - >; + slashingRegistryCoordinator(overrides?: CallOverrides): Promise; + + 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 @@ -1085,15 +808,6 @@ 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))"( - taskIndex?: BigNumberish | null, - task?: null - ): NewTaskCreatedEventFilter; - NewTaskCreated( - taskIndex?: BigNumberish | null, - task?: null - ): NewTaskCreatedEventFilter; - "OwnershipTransferred(address,address)"( previousOwner?: string | null, newOwner?: string | null @@ -1103,59 +817,36 @@ 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; - - "TaskCompleted(uint32,(((string,bytes32,bytes32,uint32,address),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; + "RewardsInitiatorUpdated(address,address)"( + prevRewardsInitiator?: null, + newRewardsInitiator?: null + ): RewardsInitiatorUpdatedEventFilter; + RewardsInitiatorUpdated( + prevRewardsInitiator?: null, + newRewardsInitiator?: null + ): RewardsInitiatorUpdatedEventFilter; }; estimateGas: { - admins(arg0: BigNumberish, overrides?: CallOverrides): Promise; + addOperatorToWhitelist( + operator: string, + overrides?: Overrides & { from?: string } + ): Promise; - allTaskHashes( - arg0: BigNumberish, - overrides?: CallOverrides + addPendingAdmin( + admin: string, + overrides?: Overrides & { from?: string } ): Promise; avsDirectory(overrides?: CallOverrides): Promise; - checkSignerAddress( - request: IReclaimServiceManager.ClaimRequestStruct, - requestSignature: BytesLike, - overrides?: CallOverrides + createAVSRewardsSubmission( + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } ): Promise; - createNewTask( - request: IReclaimServiceManager.ClaimRequestStruct, - requestSignature: BytesLike, + createOperatorDirectedAVSRewardsSubmission( + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; @@ -1164,126 +855,97 @@ export interface ReclaimServiceManager extends BaseContract { 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; - isAdmin(_admin: string, overrides?: CallOverrides): Promise; - - isOperatorWhitelisted( - operator: string, - overrides?: CallOverrides + initialize( + initialOwner: string, + rewardsInitiator: string, + overrides?: Overrides & { from?: string } ): Promise; - latestTaskNum(overrides?: CallOverrides): Promise; - - operatorHasMinimumWeight( + isOperatorWhitelisted( operator: string, overrides?: CallOverrides ): Promise; owner(overrides?: CallOverrides): Promise; - pause( - newPausedStatus: BigNumberish, + registerOperatorToAVS( + operator: string, + operatorSignature: ISignatureUtilsMixinTypes.SignatureWithSaltAndExpiryStruct, overrides?: Overrides & { from?: string } ): Promise; - pauseAll(overrides?: Overrides & { from?: string }): Promise; - - "paused(uint8)"( - index: BigNumberish, - overrides?: CallOverrides + removeAdmin( + admin: string, + overrides?: Overrides & { from?: string } ): Promise; - "paused()"(overrides?: CallOverrides): Promise; - - pauserRegistry(overrides?: CallOverrides): Promise; - - payForRange( - rangePayments: IPaymentCoordinator.RangePaymentStruct[], + 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 + removePendingAdmin( + pendingAdmin: string, + overrides?: Overrides & { from?: string } ): Promise; renounceOwnership( overrides?: Overrides & { from?: string } ): Promise; - setPauserRegistry( - newPauserRegistry: string, + rewardsInitiator(overrides?: CallOverrides): Promise; + + setAppointee( + appointee: string, + target: string, + selector: BytesLike, overrides?: Overrides & { from?: string } ): Promise; - setup( - initialAdmin: string, + setClaimerFor( + claimer: string, overrides?: Overrides & { from?: string } ): Promise; - stakeRegistry(overrides?: CallOverrides): Promise; - - taskCompleted( - completedTask: IReclaimServiceManager.CompletedTaskStruct, - referenceTaskIndex: BigNumberish, + setRewardsInitiator( + newRewardsInitiator: string, overrides?: Overrides & { from?: string } ): Promise; - taskCreationMetadata(overrides?: CallOverrides): Promise; + slashingRegistryCoordinator(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 @@ -1291,27 +953,25 @@ export interface ReclaimServiceManager extends BaseContract { }; populateTransaction: { - admins( - arg0: BigNumberish, - overrides?: CallOverrides + addOperatorToWhitelist( + operator: string, + overrides?: Overrides & { from?: string } ): Promise; - allTaskHashes( - arg0: BigNumberish, - overrides?: CallOverrides + addPendingAdmin( + admin: string, + overrides?: Overrides & { from?: string } ): Promise; avsDirectory(overrides?: CallOverrides): Promise; - checkSignerAddress( - request: IReclaimServiceManager.ClaimRequestStruct, - requestSignature: BytesLike, - overrides?: CallOverrides + createAVSRewardsSubmission( + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } ): Promise; - createNewTask( - request: IReclaimServiceManager.ClaimRequestStruct, - requestSignature: BytesLike, + createOperatorDirectedAVSRewardsSubmission( + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], overrides?: Overrides & { from?: string } ): Promise; @@ -1320,18 +980,14 @@ export interface ReclaimServiceManager extends BaseContract { 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; @@ -1339,9 +995,10 @@ export interface ReclaimServiceManager extends BaseContract { overrides?: CallOverrides ): Promise; - isAdmin( - _admin: string, - overrides?: CallOverrides + initialize( + initialOwner: string, + rewardsInitiator: string, + overrides?: Overrides & { from?: string } ): Promise; isOperatorWhitelisted( @@ -1349,106 +1006,75 @@ 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; - - payForRange( - rangePayments: IPaymentCoordinator.RangePaymentStruct[], + 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 + removePendingAdmin( + pendingAdmin: string, + overrides?: Overrides & { from?: string } ): Promise; renounceOwnership( overrides?: Overrides & { from?: string } ): Promise; - setPauserRegistry( - newPauserRegistry: string, + rewardsInitiator(overrides?: CallOverrides): Promise; + + setAppointee( + appointee: string, + target: string, + selector: BytesLike, overrides?: Overrides & { from?: string } ): Promise; - setup( - initialAdmin: string, + setClaimerFor( + claimer: string, overrides?: Overrides & { from?: string } ): Promise; - stakeRegistry(overrides?: CallOverrides): Promise; - - taskCompleted( - completedTask: IReclaimServiceManager.CompletedTaskStruct, - referenceTaskIndex: BigNumberish, + setRewardsInitiator( + newRewardsInitiator: string, overrides?: Overrides & { from?: string } ): Promise; - taskCreationMetadata( + slashingRegistryCoordinator( 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 new file mode 100644 index 00000000..ab0190da --- /dev/null +++ b/src/avs/contracts/RewardsCoordinator.ts @@ -0,0 +1,2806 @@ +/* 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 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; + }; + + 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: IRewardsCoordinatorTypes.EarnerTreeMerkleLeafStruct; + tokenIndices: BigNumberish[]; + tokenTreeProofs: BytesLike[]; + tokenLeaves: IRewardsCoordinatorTypes.TokenTreeMerkleLeafStruct[]; + }; + + export type RewardsMerkleClaimStructOutput = [ + number, + number, + string, + IRewardsCoordinatorTypes.EarnerTreeMerkleLeafStructOutput, + number[], + string[], + IRewardsCoordinatorTypes.TokenTreeMerkleLeafStructOutput[] + ] & { + rootIndex: number; + earnerIndex: number; + earnerTreeProof: string; + earnerLeaf: IRewardsCoordinatorTypes.EarnerTreeMerkleLeafStructOutput; + tokenIndices: number[]; + tokenTreeProofs: string[]; + tokenLeaves: IRewardsCoordinatorTypes.TokenTreeMerkleLeafStructOutput[]; + }; + + export type StrategyAndMultiplierStruct = { + strategy: string; + multiplier: BigNumberish; + }; + + export type StrategyAndMultiplierStructOutput = [string, BigNumber] & { + strategy: string; + multiplier: BigNumber; + }; + + export type RewardsSubmissionStruct = { + strategiesAndMultipliers: IRewardsCoordinatorTypes.StrategyAndMultiplierStruct[]; + token: string; + amount: BigNumberish; + startTimestamp: BigNumberish; + duration: BigNumberish; + }; + + export type RewardsSubmissionStructOutput = [ + IRewardsCoordinatorTypes.StrategyAndMultiplierStructOutput[], + string, + BigNumber, + number, + number + ] & { + strategiesAndMultipliers: IRewardsCoordinatorTypes.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: IRewardsCoordinatorTypes.StrategyAndMultiplierStruct[]; + token: string; + operatorRewards: IRewardsCoordinatorTypes.OperatorRewardStruct[]; + startTimestamp: BigNumberish; + duration: BigNumberish; + description: string; + }; + + export type OperatorDirectedRewardsSubmissionStructOutput = [ + IRewardsCoordinatorTypes.StrategyAndMultiplierStructOutput[], + string, + IRewardsCoordinatorTypes.OperatorRewardStructOutput[], + number, + number, + string + ] & { + strategiesAndMultipliers: IRewardsCoordinatorTypes.StrategyAndMultiplierStructOutput[]; + token: string; + operatorRewards: IRewardsCoordinatorTypes.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; + "allocationManager()": 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; + "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; + "currRewardsCalculationEndTimestamp()": FunctionFragment; + "defaultOperatorSplitBips()": FunctionFragment; + "delegationManager()": FunctionFragment; + "disableRoot(uint32)": 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,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; + "owner()": FunctionFragment; + "pause(uint256)": FunctionFragment; + "pauseAll()": FunctionFragment; + "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; + "setOperatorSetSplit(address,(address,uint32),uint16)": FunctionFragment; + "setRewardsForAllSubmitter(address,bool)": FunctionFragment; + "setRewardsUpdater(address)": FunctionFragment; + "strategyManager()": FunctionFragment; + "submissionNonce(address)": FunctionFragment; + "submitRoot(bytes32,uint32)": FunctionFragment; + "transferOwnership(address)": FunctionFragment; + "unpause(uint256)": FunctionFragment; + "version()": FunctionFragment; + }; + + getFunction( + nameOrSignatureOrTopic: + | "CALCULATION_INTERVAL_SECONDS" + | "GENESIS_REWARDS_TIMESTAMP" + | "MAX_FUTURE_LENGTH" + | "MAX_RETROACTIVE_LENGTH" + | "MAX_REWARDS_DURATION" + | "activationDelay" + | "allocationManager" + | "beaconChainETHStrategy" + | "calculateEarnerLeafHash" + | "calculateTokenLeafHash" + | "checkClaim" + | "claimerFor" + | "createAVSRewardsSubmission" + | "createOperatorDirectedAVSRewardsSubmission" + | "createOperatorDirectedOperatorSetRewardsSubmission" + | "createRewardsForAllEarners" + | "createRewardsForAllSubmission" + | "cumulativeClaimed" + | "currRewardsCalculationEndTimestamp" + | "defaultOperatorSplitBips" + | "delegationManager" + | "disableRoot" + | "getCurrentClaimableDistributionRoot" + | "getCurrentDistributionRoot" + | "getDistributionRootAtIndex" + | "getDistributionRootsLength" + | "getOperatorAVSSplit" + | "getOperatorPISplit" + | "getOperatorSetSplit" + | "getRootIndexFromHash" + | "initialize" + | "isAVSRewardsSubmissionHash" + | "isOperatorDirectedAVSRewardsSubmissionHash" + | "isOperatorDirectedOperatorSetRewardsSubmissionHash" + | "isRewardsForAllSubmitter" + | "isRewardsSubmissionForAllEarnersHash" + | "isRewardsSubmissionForAllHash" + | "owner" + | "pause" + | "pauseAll" + | "paused(uint8)" + | "paused()" + | "pauserRegistry" + | "permissionController" + | "processClaim" + | "processClaims" + | "renounceOwnership" + | "rewardsUpdater" + | "setActivationDelay" + | "setClaimerFor(address)" + | "setClaimerFor(address,address)" + | "setDefaultOperatorSplit" + | "setOperatorAVSSplit" + | "setOperatorPISplit" + | "setOperatorSetSplit" + | "setRewardsForAllSubmitter" + | "setRewardsUpdater" + | "strategyManager" + | "submissionNonce" + | "submitRoot" + | "transferOwnership" + | "unpause" + | "version" + ): 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: "allocationManager", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "beaconChainETHStrategy", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "calculateEarnerLeafHash", + values: [IRewardsCoordinatorTypes.EarnerTreeMerkleLeafStruct] + ): string; + encodeFunctionData( + functionFragment: "calculateTokenLeafHash", + values: [IRewardsCoordinatorTypes.TokenTreeMerkleLeafStruct] + ): string; + encodeFunctionData( + functionFragment: "checkClaim", + values: [IRewardsCoordinatorTypes.RewardsMerkleClaimStruct] + ): string; + encodeFunctionData(functionFragment: "claimerFor", values: [string]): string; + encodeFunctionData( + functionFragment: "createAVSRewardsSubmission", + values: [IRewardsCoordinatorTypes.RewardsSubmissionStruct[]] + ): string; + encodeFunctionData( + functionFragment: "createOperatorDirectedAVSRewardsSubmission", + values: [ + string, + IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[] + ] + ): string; + encodeFunctionData( + functionFragment: "createOperatorDirectedOperatorSetRewardsSubmission", + values: [ + OperatorSetStruct, + IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[] + ] + ): string; + encodeFunctionData( + functionFragment: "createRewardsForAllEarners", + values: [IRewardsCoordinatorTypes.RewardsSubmissionStruct[]] + ): string; + encodeFunctionData( + functionFragment: "createRewardsForAllSubmission", + values: [IRewardsCoordinatorTypes.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: "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: "getOperatorSetSplit", + values: [string, OperatorSetStruct] + ): string; + encodeFunctionData( + functionFragment: "getRootIndexFromHash", + values: [BytesLike] + ): string; + encodeFunctionData( + functionFragment: "initialize", + values: [string, BigNumberish, string, BigNumberish, BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "isAVSRewardsSubmissionHash", + values: [string, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "isOperatorDirectedAVSRewardsSubmissionHash", + values: [string, BytesLike] + ): string; + encodeFunctionData( + functionFragment: "isOperatorDirectedOperatorSetRewardsSubmissionHash", + 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: "permissionController", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "processClaim", + values: [IRewardsCoordinatorTypes.RewardsMerkleClaimStruct, string] + ): string; + encodeFunctionData( + functionFragment: "processClaims", + values: [IRewardsCoordinatorTypes.RewardsMerkleClaimStruct[], string] + ): string; + encodeFunctionData( + functionFragment: "renounceOwnership", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "rewardsUpdater", + values?: undefined + ): string; + encodeFunctionData( + functionFragment: "setActivationDelay", + values: [BigNumberish] + ): string; + encodeFunctionData( + functionFragment: "setClaimerFor(address)", + values: [string] + ): string; + encodeFunctionData( + functionFragment: "setClaimerFor(address,address)", + values: [string, 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: "setOperatorSetSplit", + values: [string, OperatorSetStruct, BigNumberish] + ): 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; + encodeFunctionData(functionFragment: "version", values?: undefined): 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: "allocationManager", + 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: "createOperatorDirectedOperatorSetRewardsSubmission", + 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: "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: "getOperatorSetSplit", + 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: "isOperatorDirectedOperatorSetRewardsSubmissionHash", + 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: "permissionController", + 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(address)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setClaimerFor(address,address)", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setDefaultOperatorSplit", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setOperatorAVSSplit", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setOperatorPISplit", + data: BytesLike + ): Result; + decodeFunctionResult( + functionFragment: "setOperatorSetSplit", + 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; + decodeFunctionResult(functionFragment: "version", 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; + "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; + "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: "OperatorDirectedOperatorSetRewardsSubmissionCreated" + ): EventFragment; + getEvent(nameOrSignatureOrTopic: "OperatorPISplitBipsSet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OperatorSetSplitBipsSet"): EventFragment; + getEvent(nameOrSignatureOrTopic: "OwnershipTransferred"): EventFragment; + getEvent(nameOrSignatureOrTopic: "Paused"): 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: IRewardsCoordinatorTypes.RewardsSubmissionStructOutput; +} +export type AVSRewardsSubmissionCreatedEvent = TypedEvent< + [ + string, + BigNumber, + string, + IRewardsCoordinatorTypes.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: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStructOutput; +} +export type OperatorDirectedAVSRewardsSubmissionCreatedEvent = TypedEvent< + [ + string, + string, + string, + BigNumber, + IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStructOutput + ], + OperatorDirectedAVSRewardsSubmissionCreatedEventObject +>; + +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; + activatedAt: number; + oldOperatorPISplitBips: number; + newOperatorPISplitBips: number; +} +export type OperatorPISplitBipsSetEvent = TypedEvent< + [string, string, number, number, number], + OperatorPISplitBipsSetEventObject +>; + +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; +} +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 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: IRewardsCoordinatorTypes.RewardsSubmissionStructOutput; +} +export type RewardsSubmissionForAllCreatedEvent = TypedEvent< + [ + string, + BigNumber, + string, + IRewardsCoordinatorTypes.RewardsSubmissionStructOutput + ], + RewardsSubmissionForAllCreatedEventObject +>; + +export type RewardsSubmissionForAllCreatedEventFilter = + TypedEventFilter; + +export interface RewardsSubmissionForAllEarnersCreatedEventObject { + tokenHopper: string; + submissionNonce: BigNumber; + rewardsSubmissionHash: string; + rewardsSubmission: IRewardsCoordinatorTypes.RewardsSubmissionStructOutput; +} +export type RewardsSubmissionForAllEarnersCreatedEvent = TypedEvent< + [ + string, + BigNumber, + string, + IRewardsCoordinatorTypes.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]>; + + allocationManager(overrides?: CallOverrides): Promise<[string]>; + + beaconChainETHStrategy(overrides?: CallOverrides): Promise<[string]>; + + calculateEarnerLeafHash( + leaf: IRewardsCoordinatorTypes.EarnerTreeMerkleLeafStruct, + overrides?: CallOverrides + ): Promise<[string]>; + + calculateTokenLeafHash( + leaf: IRewardsCoordinatorTypes.TokenTreeMerkleLeafStruct, + overrides?: CallOverrides + ): Promise<[string]>; + + checkClaim( + claim: IRewardsCoordinatorTypes.RewardsMerkleClaimStruct, + overrides?: CallOverrides + ): Promise<[boolean]>; + + claimerFor( + earner: string, + overrides?: CallOverrides + ): Promise<[string] & { claimer: string }>; + + createAVSRewardsSubmission( + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createOperatorDirectedAVSRewardsSubmission( + avs: string, + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createOperatorDirectedOperatorSetRewardsSubmission( + operatorSet: OperatorSetStruct, + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createRewardsForAllEarners( + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createRewardsForAllSubmission( + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + cumulativeClaimed( + earner: string, + token: string, + overrides?: CallOverrides + ): Promise<[BigNumber] & { totalClaimed: BigNumber }>; + + currRewardsCalculationEndTimestamp( + overrides?: CallOverrides + ): Promise<[number]>; + + defaultOperatorSplitBips(overrides?: CallOverrides): Promise<[number]>; + + delegationManager(overrides?: CallOverrides): Promise<[string]>; + + disableRoot( + rootIndex: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + getCurrentClaimableDistributionRoot( + overrides?: CallOverrides + ): Promise<[IRewardsCoordinatorTypes.DistributionRootStructOutput]>; + + getCurrentDistributionRoot( + overrides?: CallOverrides + ): Promise<[IRewardsCoordinatorTypes.DistributionRootStructOutput]>; + + getDistributionRootAtIndex( + index: BigNumberish, + overrides?: CallOverrides + ): Promise<[IRewardsCoordinatorTypes.DistributionRootStructOutput]>; + + getDistributionRootsLength(overrides?: CallOverrides): Promise<[BigNumber]>; + + getOperatorAVSSplit( + operator: string, + avs: string, + overrides?: CallOverrides + ): Promise<[number]>; + + getOperatorPISplit( + operator: string, + overrides?: CallOverrides + ): Promise<[number]>; + + getOperatorSetSplit( + operator: string, + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise<[number]>; + + getRootIndexFromHash( + rootHash: BytesLike, + overrides?: CallOverrides + ): Promise<[number]>; + + initialize( + initialOwner: string, + initialPausedStatus: BigNumberish, + _rewardsUpdater: string, + _activationDelay: BigNumberish, + _defaultSplitBips: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + isAVSRewardsSubmissionHash( + avs: string, + hash: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean] & { valid: boolean }>; + + isOperatorDirectedAVSRewardsSubmissionHash( + avs: string, + hash: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean] & { valid: boolean }>; + + isOperatorDirectedOperatorSetRewardsSubmissionHash( + avs: string, + hash: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean] & { valid: boolean }>; + + isRewardsForAllSubmitter( + submitter: string, + overrides?: CallOverrides + ): Promise<[boolean] & { valid: boolean }>; + + isRewardsSubmissionForAllEarnersHash( + avs: string, + hash: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean] & { valid: boolean }>; + + isRewardsSubmissionForAllHash( + avs: string, + hash: BytesLike, + overrides?: CallOverrides + ): Promise<[boolean] & { valid: 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]>; + + permissionController(overrides?: CallOverrides): Promise<[string]>; + + processClaim( + claim: IRewardsCoordinatorTypes.RewardsMerkleClaimStruct, + recipient: string, + overrides?: Overrides & { from?: string } + ): Promise; + + processClaims( + claims: IRewardsCoordinatorTypes.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(address)"( + claimer: string, + overrides?: Overrides & { from?: string } + ): Promise; + + "setClaimerFor(address,address)"( + earner: string, + 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; + + setOperatorSetSplit( + operator: string, + operatorSet: OperatorSetStruct, + split: BigNumberish, + 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( + avs: string, + overrides?: CallOverrides + ): Promise<[BigNumber] & { nonce: 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; + + version(overrides?: CallOverrides): Promise<[string]>; + }; + + 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; + + allocationManager(overrides?: CallOverrides): Promise; + + beaconChainETHStrategy(overrides?: CallOverrides): Promise; + + calculateEarnerLeafHash( + leaf: IRewardsCoordinatorTypes.EarnerTreeMerkleLeafStruct, + overrides?: CallOverrides + ): Promise; + + calculateTokenLeafHash( + leaf: IRewardsCoordinatorTypes.TokenTreeMerkleLeafStruct, + overrides?: CallOverrides + ): Promise; + + checkClaim( + claim: IRewardsCoordinatorTypes.RewardsMerkleClaimStruct, + overrides?: CallOverrides + ): Promise; + + claimerFor(earner: string, overrides?: CallOverrides): Promise; + + createAVSRewardsSubmission( + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createOperatorDirectedAVSRewardsSubmission( + avs: string, + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createOperatorDirectedOperatorSetRewardsSubmission( + operatorSet: OperatorSetStruct, + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createRewardsForAllEarners( + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createRewardsForAllSubmission( + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + cumulativeClaimed( + earner: string, + token: string, + overrides?: CallOverrides + ): Promise; + + currRewardsCalculationEndTimestamp( + overrides?: CallOverrides + ): Promise; + + defaultOperatorSplitBips(overrides?: CallOverrides): Promise; + + delegationManager(overrides?: CallOverrides): Promise; + + disableRoot( + rootIndex: BigNumberish, + overrides?: Overrides & { from?: string } + ): 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; + + getOperatorSetSplit( + operator: string, + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + getRootIndexFromHash( + rootHash: BytesLike, + overrides?: CallOverrides + ): Promise; + + initialize( + initialOwner: string, + initialPausedStatus: BigNumberish, + _rewardsUpdater: string, + _activationDelay: BigNumberish, + _defaultSplitBips: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + isAVSRewardsSubmissionHash( + avs: string, + hash: BytesLike, + overrides?: CallOverrides + ): Promise; + + isOperatorDirectedAVSRewardsSubmissionHash( + avs: string, + hash: BytesLike, + overrides?: CallOverrides + ): Promise; + + isOperatorDirectedOperatorSetRewardsSubmissionHash( + avs: string, + hash: BytesLike, + overrides?: CallOverrides + ): Promise; + + isRewardsForAllSubmitter( + submitter: string, + overrides?: CallOverrides + ): Promise; + + isRewardsSubmissionForAllEarnersHash( + avs: string, + hash: BytesLike, + overrides?: CallOverrides + ): Promise; + + isRewardsSubmissionForAllHash( + avs: string, + hash: 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; + + permissionController(overrides?: CallOverrides): Promise; + + processClaim( + claim: IRewardsCoordinatorTypes.RewardsMerkleClaimStruct, + recipient: string, + overrides?: Overrides & { from?: string } + ): Promise; + + processClaims( + claims: IRewardsCoordinatorTypes.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(address)"( + claimer: string, + overrides?: Overrides & { from?: string } + ): Promise; + + "setClaimerFor(address,address)"( + earner: string, + 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; + + setOperatorSetSplit( + operator: string, + operatorSet: OperatorSetStruct, + split: BigNumberish, + 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(avs: 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; + + version(overrides?: CallOverrides): 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; + + allocationManager(overrides?: CallOverrides): Promise; + + beaconChainETHStrategy(overrides?: CallOverrides): Promise; + + calculateEarnerLeafHash( + leaf: IRewardsCoordinatorTypes.EarnerTreeMerkleLeafStruct, + overrides?: CallOverrides + ): Promise; + + calculateTokenLeafHash( + leaf: IRewardsCoordinatorTypes.TokenTreeMerkleLeafStruct, + overrides?: CallOverrides + ): Promise; + + checkClaim( + claim: IRewardsCoordinatorTypes.RewardsMerkleClaimStruct, + overrides?: CallOverrides + ): Promise; + + claimerFor(earner: string, overrides?: CallOverrides): Promise; + + createAVSRewardsSubmission( + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], + overrides?: CallOverrides + ): Promise; + + createOperatorDirectedAVSRewardsSubmission( + avs: string, + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], + overrides?: CallOverrides + ): Promise; + + createOperatorDirectedOperatorSetRewardsSubmission( + operatorSet: OperatorSetStruct, + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], + overrides?: CallOverrides + ): Promise; + + createRewardsForAllEarners( + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], + overrides?: CallOverrides + ): Promise; + + createRewardsForAllSubmission( + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], + overrides?: CallOverrides + ): Promise; + + cumulativeClaimed( + earner: string, + token: string, + overrides?: CallOverrides + ): Promise; + + currRewardsCalculationEndTimestamp( + overrides?: CallOverrides + ): Promise; + + defaultOperatorSplitBips(overrides?: CallOverrides): Promise; + + delegationManager(overrides?: CallOverrides): Promise; + + disableRoot( + rootIndex: BigNumberish, + 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; + + getOperatorSetSplit( + operator: string, + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + getRootIndexFromHash( + rootHash: BytesLike, + overrides?: CallOverrides + ): Promise; + + initialize( + initialOwner: string, + initialPausedStatus: BigNumberish, + _rewardsUpdater: string, + _activationDelay: BigNumberish, + _defaultSplitBips: BigNumberish, + overrides?: CallOverrides + ): Promise; + + isAVSRewardsSubmissionHash( + avs: string, + hash: BytesLike, + overrides?: CallOverrides + ): Promise; + + isOperatorDirectedAVSRewardsSubmissionHash( + avs: string, + hash: BytesLike, + overrides?: CallOverrides + ): Promise; + + isOperatorDirectedOperatorSetRewardsSubmissionHash( + avs: string, + hash: BytesLike, + overrides?: CallOverrides + ): Promise; + + isRewardsForAllSubmitter( + submitter: string, + overrides?: CallOverrides + ): Promise; + + isRewardsSubmissionForAllEarnersHash( + avs: string, + hash: BytesLike, + overrides?: CallOverrides + ): Promise; + + isRewardsSubmissionForAllHash( + avs: string, + hash: 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; + + permissionController(overrides?: CallOverrides): Promise; + + processClaim( + claim: IRewardsCoordinatorTypes.RewardsMerkleClaimStruct, + recipient: string, + overrides?: CallOverrides + ): Promise; + + processClaims( + claims: IRewardsCoordinatorTypes.RewardsMerkleClaimStruct[], + recipient: string, + overrides?: CallOverrides + ): Promise; + + renounceOwnership(overrides?: CallOverrides): Promise; + + rewardsUpdater(overrides?: CallOverrides): Promise; + + setActivationDelay( + _activationDelay: BigNumberish, + overrides?: CallOverrides + ): Promise; + + "setClaimerFor(address)"( + claimer: string, + overrides?: CallOverrides + ): Promise; + + "setClaimerFor(address,address)"( + earner: string, + 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; + + setOperatorSetSplit( + operator: string, + operatorSet: OperatorSetStruct, + split: BigNumberish, + overrides?: CallOverrides + ): Promise; + + setRewardsForAllSubmitter( + _submitter: string, + _newValue: boolean, + overrides?: CallOverrides + ): Promise; + + setRewardsUpdater( + _rewardsUpdater: string, + overrides?: CallOverrides + ): Promise; + + strategyManager(overrides?: CallOverrides): Promise; + + submissionNonce(avs: string, overrides?: CallOverrides): Promise; + + submitRoot( + root: BytesLike, + rewardsCalculationEndTimestamp: BigNumberish, + overrides?: CallOverrides + ): Promise; + + transferOwnership( + newOwner: string, + overrides?: CallOverrides + ): Promise; + + unpause( + newPausedStatus: BigNumberish, + overrides?: CallOverrides + ): Promise; + + version(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; + + "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, + activatedAt?: null, + oldOperatorPISplitBips?: null, + newOperatorPISplitBips?: null + ): OperatorPISplitBipsSetEventFilter; + OperatorPISplitBipsSet( + caller?: string | null, + operator?: string | null, + activatedAt?: null, + oldOperatorPISplitBips?: null, + 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 + ): 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; + + "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; + + allocationManager(overrides?: CallOverrides): Promise; + + beaconChainETHStrategy(overrides?: CallOverrides): Promise; + + calculateEarnerLeafHash( + leaf: IRewardsCoordinatorTypes.EarnerTreeMerkleLeafStruct, + overrides?: CallOverrides + ): Promise; + + calculateTokenLeafHash( + leaf: IRewardsCoordinatorTypes.TokenTreeMerkleLeafStruct, + overrides?: CallOverrides + ): Promise; + + checkClaim( + claim: IRewardsCoordinatorTypes.RewardsMerkleClaimStruct, + overrides?: CallOverrides + ): Promise; + + claimerFor(earner: string, overrides?: CallOverrides): Promise; + + createAVSRewardsSubmission( + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createOperatorDirectedAVSRewardsSubmission( + avs: string, + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createOperatorDirectedOperatorSetRewardsSubmission( + operatorSet: OperatorSetStruct, + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createRewardsForAllEarners( + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createRewardsForAllSubmission( + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + cumulativeClaimed( + earner: string, + token: string, + overrides?: CallOverrides + ): Promise; + + currRewardsCalculationEndTimestamp( + overrides?: CallOverrides + ): Promise; + + defaultOperatorSplitBips(overrides?: CallOverrides): Promise; + + delegationManager(overrides?: CallOverrides): Promise; + + disableRoot( + rootIndex: BigNumberish, + overrides?: Overrides & { from?: string } + ): 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; + + getOperatorSetSplit( + operator: string, + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + getRootIndexFromHash( + rootHash: BytesLike, + overrides?: CallOverrides + ): Promise; + + initialize( + initialOwner: string, + initialPausedStatus: BigNumberish, + _rewardsUpdater: string, + _activationDelay: BigNumberish, + _defaultSplitBips: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + isAVSRewardsSubmissionHash( + avs: string, + hash: BytesLike, + overrides?: CallOverrides + ): Promise; + + isOperatorDirectedAVSRewardsSubmissionHash( + avs: string, + hash: BytesLike, + overrides?: CallOverrides + ): Promise; + + isOperatorDirectedOperatorSetRewardsSubmissionHash( + avs: string, + hash: BytesLike, + overrides?: CallOverrides + ): Promise; + + isRewardsForAllSubmitter( + submitter: string, + overrides?: CallOverrides + ): Promise; + + isRewardsSubmissionForAllEarnersHash( + avs: string, + hash: BytesLike, + overrides?: CallOverrides + ): Promise; + + isRewardsSubmissionForAllHash( + avs: string, + hash: 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; + + permissionController(overrides?: CallOverrides): Promise; + + processClaim( + claim: IRewardsCoordinatorTypes.RewardsMerkleClaimStruct, + recipient: string, + overrides?: Overrides & { from?: string } + ): Promise; + + processClaims( + claims: IRewardsCoordinatorTypes.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(address)"( + claimer: string, + overrides?: Overrides & { from?: string } + ): Promise; + + "setClaimerFor(address,address)"( + earner: string, + 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; + + setOperatorSetSplit( + operator: string, + operatorSet: OperatorSetStruct, + split: BigNumberish, + 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(avs: 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; + + version(overrides?: CallOverrides): 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; + + allocationManager(overrides?: CallOverrides): Promise; + + beaconChainETHStrategy( + overrides?: CallOverrides + ): Promise; + + calculateEarnerLeafHash( + leaf: IRewardsCoordinatorTypes.EarnerTreeMerkleLeafStruct, + overrides?: CallOverrides + ): Promise; + + calculateTokenLeafHash( + leaf: IRewardsCoordinatorTypes.TokenTreeMerkleLeafStruct, + overrides?: CallOverrides + ): Promise; + + checkClaim( + claim: IRewardsCoordinatorTypes.RewardsMerkleClaimStruct, + overrides?: CallOverrides + ): Promise; + + claimerFor( + earner: string, + overrides?: CallOverrides + ): Promise; + + createAVSRewardsSubmission( + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createOperatorDirectedAVSRewardsSubmission( + avs: string, + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createOperatorDirectedOperatorSetRewardsSubmission( + operatorSet: OperatorSetStruct, + operatorDirectedRewardsSubmissions: IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createRewardsForAllEarners( + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + createRewardsForAllSubmission( + rewardsSubmissions: IRewardsCoordinatorTypes.RewardsSubmissionStruct[], + overrides?: Overrides & { from?: string } + ): Promise; + + cumulativeClaimed( + earner: string, + token: string, + overrides?: CallOverrides + ): Promise; + + currRewardsCalculationEndTimestamp( + overrides?: CallOverrides + ): Promise; + + defaultOperatorSplitBips( + overrides?: CallOverrides + ): Promise; + + delegationManager(overrides?: CallOverrides): Promise; + + disableRoot( + rootIndex: BigNumberish, + overrides?: Overrides & { from?: string } + ): 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; + + getOperatorSetSplit( + operator: string, + operatorSet: OperatorSetStruct, + overrides?: CallOverrides + ): Promise; + + getRootIndexFromHash( + rootHash: BytesLike, + overrides?: CallOverrides + ): Promise; + + initialize( + initialOwner: string, + initialPausedStatus: BigNumberish, + _rewardsUpdater: string, + _activationDelay: BigNumberish, + _defaultSplitBips: BigNumberish, + overrides?: Overrides & { from?: string } + ): Promise; + + isAVSRewardsSubmissionHash( + avs: string, + hash: BytesLike, + overrides?: CallOverrides + ): Promise; + + isOperatorDirectedAVSRewardsSubmissionHash( + avs: string, + hash: BytesLike, + overrides?: CallOverrides + ): Promise; + + isOperatorDirectedOperatorSetRewardsSubmissionHash( + avs: string, + hash: BytesLike, + overrides?: CallOverrides + ): Promise; + + isRewardsForAllSubmitter( + submitter: string, + overrides?: CallOverrides + ): Promise; + + isRewardsSubmissionForAllEarnersHash( + avs: string, + hash: BytesLike, + overrides?: CallOverrides + ): Promise; + + isRewardsSubmissionForAllHash( + avs: string, + hash: 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; + + permissionController( + overrides?: CallOverrides + ): Promise; + + processClaim( + claim: IRewardsCoordinatorTypes.RewardsMerkleClaimStruct, + recipient: string, + overrides?: Overrides & { from?: string } + ): Promise; + + processClaims( + claims: IRewardsCoordinatorTypes.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(address)"( + claimer: string, + overrides?: Overrides & { from?: string } + ): Promise; + + "setClaimerFor(address,address)"( + earner: string, + 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; + + setOperatorSetSplit( + operator: string, + operatorSet: OperatorSetStruct, + split: BigNumberish, + 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( + avs: 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; + + 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 new file mode 100644 index 00000000..59cbece5 --- /dev/null +++ b/src/avs/contracts/factories/AVSDirectory__factory.ts @@ -0,0 +1,645 @@ +/* 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", + }, + { + name: "_pauserRegistry", + type: "address", + internalType: "contract IPauserRegistry", + }, + { + name: "_version", + type: "string", + internalType: "string", + }, + ], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "OPERATOR_AVS_REGISTRATION_TYPEHASH", + inputs: [], + outputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH", + inputs: [], + outputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "OPERATOR_SET_REGISTRATION_TYPEHASH", + inputs: [], + outputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "avsOperatorStatus", + inputs: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "uint8", + internalType: "enum IAVSDirectoryTypes.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: "initialPausedStatus", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "operatorSaltIsSpent", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "salt", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "isSpent", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "owner", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "pause", + inputs: [ + { + name: "newPausedStatus", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "pauseAll", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "paused", + inputs: [ + { + name: "index", + type: "uint8", + internalType: "uint8", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "paused", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "pauserRegistry", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IPauserRegistry", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "registerOperatorToAVS", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + 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", + }, + ], + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "renounceOwnership", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "transferOwnership", + inputs: [ + { + name: "newOwner", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "unpause", + inputs: [ + { + name: "newPausedStatus", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "updateAVSMetadataURI", + inputs: [ + { + name: "metadataURI", + type: "string", + internalType: "string", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "version", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "event", + name: "AVSMetadataURIUpdated", + inputs: [ + { + name: "avs", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "metadataURI", + type: "string", + indexed: false, + internalType: "string", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Initialized", + inputs: [ + { + name: "version", + type: "uint8", + indexed: false, + internalType: "uint8", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OperatorAVSRegistrationStatusUpdated", + inputs: [ + { + name: "operator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "avs", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "status", + type: "uint8", + indexed: false, + internalType: "enum IAVSDirectoryTypes.OperatorAVSRegistrationStatus", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OwnershipTransferred", + inputs: [ + { + name: "previousOwner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newOwner", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Paused", + inputs: [ + { + name: "account", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newPausedStatus", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Unpaused", + inputs: [ + { + name: "account", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newPausedStatus", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "CurrentlyPaused", + inputs: [], + }, + { + type: "error", + name: "InputAddressZero", + inputs: [], + }, + { + type: "error", + name: "InvalidNewPausedStatus", + inputs: [], + }, + { + type: "error", + name: "InvalidShortString", + inputs: [], + }, + { + type: "error", + name: "InvalidSignature", + inputs: [], + }, + { + type: "error", + name: "OnlyPauser", + inputs: [], + }, + { + type: "error", + name: "OnlyUnpauser", + inputs: [], + }, + { + type: "error", + name: "OperatorAlreadyRegisteredToAVS", + inputs: [], + }, + { + type: "error", + name: "OperatorNotRegisteredToAVS", + inputs: [], + }, + { + type: "error", + name: "OperatorNotRegisteredToEigenLayer", + inputs: [], + }, + { + type: "error", + name: "SaltSpent", + inputs: [], + }, + { + type: "error", + name: "SignatureExpired", + inputs: [], + }, + { + type: "error", + name: "StringTooLong", + inputs: [ + { + name: "str", + type: "string", + internalType: "string", + }, + ], + }, +] as const; + +const _bytecode = + "0x60e0806040523461039257611a388038038061001a816103df565b9283398101906060818303126103425780516001600160a01b038116810361033e5760208201516001600160a01b0381169283820361033e576040810151906001600160401b0382116102ee57019284601f850112156102955783516001600160401b03811161028157610097601f8201601f19166020016103df565b9481865260208601966020838301011161022c57815f926020809301895e860101521561021d5760805260a052601f8151116101e157519051602082106101d1575b1760c0525f5460ff8160081c1661017c5760ff80821603610142575b6040516116339081610405823960805181818161018801528181610d0e01528181610dfa0152610fce015260a0518181816103a8015261095d015260c051818181610ed5015261136e0152f35b60ff90811916175f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a1806100f5565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b5f198260200360031b1b166100d9565b60449060405192839163305a27a960e01b8352602060048401525180918160248501528484015e5f828201840152601f01601f19168101030190fd5b6339b190bb60e11b5f5260045ffd5b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b5f80fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b6040519190601f01601f191682016001600160401b038111838210176102815760405256fe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b5f3560e01c8063136439dd14610fb8578063374823b514610f6f57806349075da314610f1157806354fd4d5014610ebd578063595c6a6714610de85780635ac86ab714610db55780635c975abb14610d98578063715018a614610d3d578063886f119514610cf95780638da5cb5b14610cd15780639926ee7d14610826578063a1060c88146107f2578063a364f4da1461070f578063a98fb355146105af578063c825fe6814610575578063cd6dc6871461044b578063d79aceab14610411578063dce974b9146103d7578063df5cf72314610393578063ec76f4421461035b578063f2fde38b146102cc578063f698da25146102aa5763fabc1cbc0361000e57346102a5576020366003190112610288576004357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156102a05760206004916040519283809263755b36bd60e11b82525afa908115610295575f9161024a575b506001600160a01b0316330361023b5760665419811981160361022c57806066556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a2005b63c61dca5d60e01b5f5260045ffd5b63794821ff60e01b5f5260045ffd5b90506020813d60201161028d575b81610265602093836111a2565b8101031261028857516001600160a01b0381168103610284575f6101dd565b5f80fd5b6110b2565b3d9150610258565b6040513d5f823e3d90fd5b611239565b611062565b346102a5575f3660031901126102885760206102c4611342565b604051908152f35b346102a5576020366003190112610288576102e5611152565b6102ed6114ad565b6001600160a01b038116156103075761030590611505565b005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346102a557602036600319011261028857335f52609960205260405f206004355f5260205260405f20600160ff198254161790555f80f35b346102a5575f366003190112610288576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346102a5575f3660031901126102885760206040517f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe4958152f35b346102a5575f3660031901126102885760206040517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd8152f35b346102a557604036600319011261028857610464611152565b5f5460ff8160081c161591828093610568575b8015610551575b156104f55760ff1982166001175f556104a891836104e4575b506104a360243561143d565b611505565b6104ae57005b61ff00195f54165f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160018152a1005b61ffff1916610101175f5583610497565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b15801561047e5750600160ff83161461047e565b50600160ff831610610477565b346102a5575f3660031901126102885760206040517f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f9298152f35b346102a55760203660031901126102885760043567ffffffffffffffff811161070a57366023820112156107055780600401359067ffffffffffffffff82116106ac573660248383010111610653577fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437139082602460405192602084528260208501520160408301375f604084830101526040813394601f80199101168101030190a2005b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b6111c4565b611102565b346102a557602036600319011261028857610728611152565b60018060665416146107e357335f52609860205260405f2060018060a01b0382165f5260205260ff60405f20541660028110156107cf576001036107c057335f8181526098602090815260408083206001600160a01b0395909516808452948252808320805460ff19169055519182529192917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191a3005b6352df45c960e01b5f5260045ffd5b634e487b7160e01b5f52602160045260245ffd5b63840a48d560e01b5f5260045ffd5b346102a55760803660031901126102885760206102c4610810611152565b610818611168565b9060643591604435916112a4565b346102a55760403660031901126102885761083f611152565b6024359067ffffffffffffffff821161070a5760606003198336030112610c8057604051916060830183811067ffffffffffffffff821117610c6c57604052806004013567ffffffffffffffff8111610c1b578101366023820112156107055760048101356108ad8161121d565b916108bb60405193846111a2565b8183523660248284010111610bc657815f9260246020930183860137830101528352602083019160248201358352604460408501920135825260018060665416146107e357335f52609860205260405f2060018060a01b0382165f5260205260ff60405f20541660028110156107cf57600114610bb75760018060a01b03811693845f52609960205260405f2084515f5260205260ff60405f205416610ba8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156102a0576020602491604051928380926336b87bd760e11b82528a60048301525afa908115610295575f91610b79575b5015610b6a576109cd845184519033856112a4565b905192514211610b5b576109e1838261154d565b60058195929510156107cf578690159485610b48575b50508315610a8a575b50505015610a7b57815f52609960205260405f2090515f5260205260405f20600160ff19825416179055335f52609860205260405f20815f5260205260405f20600160ff1982541617905560405190600182527ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4160203393a3005b638baa579f60e01b5f5260045ffd5b5f935090610ac2610ad08594936040519283916020830195630b135d3f60e11b8752602484015260406044840152606483019061117e565b03601f1981018352826111a2565b51915afa3d15610b41573d610ae48161121d565b90610af260405192836111a2565b81523d5f602083013e5b81610b33575b81610b11575b50838080610a00565b90506020818051810103126102885760200151630b135d3f60e11b1483610b08565b905060208151101590610b02565b6060610afc565b6001600160a01b031614935085876109f7565b630819bdcd60e01b5f5260045ffd5b639f88c8af60e01b5f5260045ffd5b610b9b915060203d602011610ba1575b610b9381836111a2565b81019061128c565b866109b8565b503d610b89565b630d4c4c9160e21b5f5260045ffd5b631aa528bb60e11b5f5260045ffd5b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b346102a5575f366003190112610288576033546040516001600160a01b039091168152602090f35b346102a5575f366003190112610288576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346102a5575f36600319011261028857610d556114ad565b603380546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346102a5575f366003190112610288576020606654604051908152f35b346102a55760203660031901126102885760043560ff81168091036102845760016020911b806066541614604051908152f35b346102a5575f366003190112610288577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156102a05760206024916040519283809263237dfb4760e11b82523360048301525afa908115610295575f91610e9e575b5015610e8f575f196066556040515f1981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2005b631d77d47760e21b5f5260045ffd5b610eb7915060203d602011610ba157610b9381836111a2565b81610e55565b346102a5575f36600319011261028857610f0d610ef97f000000000000000000000000000000000000000000000000000000000000000061146f565b60405191829160208352602083019061117e565b0390f35b346102a557604036600319011261028857610f2a611152565b610f32611168565b9060018060a01b03165f52609860205260405f209060018060a01b03165f5260205260ff60405f20541660405160028210156107cf576020918152f35b346102a5576040366003190112610288576001600160a01b03610f90611152565b165f52609960205260405f206024355f52602052602060ff60405f2054166040519015158152f35b34611062576020366003190112610288576004357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156102a05760206024916040519283809263237dfb4760e11b82523360048301525afa908115610295575f91611043575b5015610e8f576066548181160361022c576103059061143d565b61105c915060203d602011610ba157610b9381836111a2565b82611029565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b600435906001600160a01b038216820361028457565b602435906001600160a01b038216820361028457565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b90601f8019910116810190811067ffffffffffffffff821117610c6c57604052565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b67ffffffffffffffff8111610c6c57601f01601f191660200190565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b90816020910312610288575180151581036102845790565b9290916040519260208401947fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd865260018060a01b0316604085015260018060a01b03166060840152608083015260a082015260a0815261130660c0826111a2565b519020611311611342565b9060405190602082019261190160f01b8452602283015260428201526042815261133c6062826111a2565b51902090565b6040600a6020825161135484826111a2565b828152016922b4b3b2b72630bcb2b960b11b8152206113927f000000000000000000000000000000000000000000000000000000000000000061146f565b8051156114295760ff60f81b6020820151169080516001101561142957602160ff60f81b91015116835190602082019283526021820152600281526113d86022826111a2565b51902082519160208301937f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f855283015260608201524660808201523060a082015260a0815261133c60c0826111a2565b634e487b7160e01b5f52603260045260245ffd5b806066556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2565b60ff811690601f821161149e576040519161148b6040846111a2565b6020808452838101919036833783525290565b632cd44ac360e21b5f5260045ffd5b6033546001600160a01b031633036114c157565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b9060418151145f146115795761157591602082015190606060408401519301515f1a90611582565b9091565b50505f90600290565b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116115f2576020935f9360ff60809460405194855216868401526040830152606082015282805260015afa15610295575f516001600160a01b038116156115ea57905f90565b505f90600190565b505050505f9060039056fea2646970667358221220734132c58aaab6f4e1eadff2c7f14583ca5166549a3189ee341984030e34054364736f6c634300081c0033"; + +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, + _pauserRegistry: string, + _version: string, + overrides?: Overrides & { from?: string } + ): 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, + _pauserRegistry, + _version, + 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/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/DelegationManager__factory.ts b/src/avs/contracts/factories/DelegationManager__factory.ts new file mode 100644 index 00000000..1d2b5911 --- /dev/null +++ b/src/avs/contracts/factories/DelegationManager__factory.ts @@ -0,0 +1,1916 @@ +/* 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 { + DelegationManager, + DelegationManagerInterface, +} from "../DelegationManager"; + +const _abi = [ + { + type: "constructor", + inputs: [ + { + name: "_strategyManager", + type: "address", + internalType: "contract IStrategyManager", + }, + { + name: "_eigenPodManager", + type: "address", + internalType: "contract IEigenPodManager", + }, + { + name: "_allocationManager", + type: "address", + internalType: "contract IAllocationManager", + }, + { + name: "_pauserRegistry", + type: "address", + internalType: "contract IPauserRegistry", + }, + { + name: "_permissionController", + type: "address", + internalType: "contract IPermissionController", + }, + { + name: "_MIN_WITHDRAWAL_DELAY", + type: "uint32", + internalType: "uint32", + }, + { + name: "_version", + type: "string", + internalType: "string", + }, + ], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "DELEGATION_APPROVAL_TYPEHASH", + inputs: [], + outputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "allocationManager", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IAllocationManager", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "beaconChainETHStrategy", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IStrategy", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "calculateDelegationApprovalDigestHash", + inputs: [ + { + name: "staker", + type: "address", + internalType: "address", + }, + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "approver", + type: "address", + internalType: "address", + }, + { + name: "approverSalt", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "expiry", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "calculateWithdrawalRoot", + inputs: [ + { + name: "withdrawal", + type: "tuple", + internalType: "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[]", + }, + ], + }, + ], + outputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "pure", + }, + { + type: "function", + name: "completeQueuedWithdrawal", + inputs: [ + { + 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: "tokens", + type: "address[]", + internalType: "contract IERC20[]", + }, + { + name: "receiveAsTokens", + type: "bool", + internalType: "bool", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "completeQueuedWithdrawals", + inputs: [ + { + 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: "tokens", + type: "address[][]", + internalType: "contract IERC20[][]", + }, + { + name: "receiveAsTokens", + type: "bool[]", + internalType: "bool[]", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "convertToDepositShares", + inputs: [ + { + name: "staker", + type: "address", + internalType: "address", + }, + { + name: "strategies", + type: "address[]", + internalType: "contract IStrategy[]", + }, + { + name: "withdrawableShares", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + outputs: [ + { + name: "", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "cumulativeWithdrawalsQueued", + inputs: [ + { + name: "staker", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "totalQueued", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "decreaseDelegatedShares", + inputs: [ + { + name: "staker", + type: "address", + internalType: "address", + }, + { + name: "curDepositShares", + type: "uint256", + internalType: "uint256", + }, + { + name: "beaconChainSlashingFactorDecrease", + type: "uint64", + internalType: "uint64", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "delegateTo", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "approverSignatureAndExpiry", + type: "tuple", + internalType: "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: "delegatedTo", + inputs: [ + { + name: "staker", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "delegationApprover", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "delegationApproverSaltIsSpent", + inputs: [ + { + name: "delegationApprover", + type: "address", + internalType: "address", + }, + { + name: "salt", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "spent", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "depositScalingFactor", + inputs: [ + { + name: "staker", + type: "address", + internalType: "address", + }, + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "domainSeparator", + inputs: [], + outputs: [ + { + name: "", + type: "bytes32", + internalType: "bytes32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "eigenPodManager", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IEigenPodManager", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getDepositedShares", + 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: "getOperatorsShares", + inputs: [ + { + name: "operators", + type: "address[]", + internalType: "address[]", + }, + { + name: "strategies", + type: "address[]", + internalType: "contract IStrategy[]", + }, + ], + outputs: [ + { + name: "", + type: "uint256[][]", + internalType: "uint256[][]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getQueuedWithdrawal", + inputs: [ + { + name: "withdrawalRoot", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "withdrawal", + type: "tuple", + internalType: "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: "getQueuedWithdrawalRoots", + inputs: [ + { + name: "staker", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "bytes32[]", + internalType: "bytes32[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getQueuedWithdrawals", + inputs: [ + { + name: "staker", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "withdrawals", + type: "tuple[]", + internalType: "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: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + ], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getWithdrawableShares", + inputs: [ + { + name: "staker", + type: "address", + internalType: "address", + }, + { + name: "strategies", + type: "address[]", + internalType: "contract IStrategy[]", + }, + ], + outputs: [ + { + name: "withdrawableShares", + type: "uint256[]", + internalType: "uint256[]", + }, + { + name: "depositShares", + type: "uint256[]", + internalType: "uint256[]", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "increaseDelegatedShares", + inputs: [ + { + name: "staker", + type: "address", + internalType: "address", + }, + { + name: "strategy", + type: "address", + internalType: "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", + }, + { + type: "function", + name: "isDelegated", + inputs: [ + { + name: "staker", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "isOperator", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "minWithdrawalDelayBlocks", + inputs: [], + outputs: [ + { + name: "", + type: "uint32", + internalType: "uint32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "modifyOperatorDetails", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "newDelegationApprover", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "operatorShares", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + ], + outputs: [ + { + name: "shares", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "owner", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "pause", + inputs: [ + { + name: "newPausedStatus", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "pauseAll", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "paused", + inputs: [ + { + name: "index", + type: "uint8", + internalType: "uint8", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "paused", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "pauserRegistry", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IPauserRegistry", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "pendingWithdrawals", + inputs: [ + { + name: "withdrawalRoot", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "pending", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "permissionController", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IPermissionController", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "queueWithdrawals", + inputs: [ + { + name: "params", + type: "tuple[]", + internalType: "struct IDelegationManagerTypes.QueuedWithdrawalParams[]", + components: [ + { + name: "strategies", + type: "address[]", + internalType: "contract IStrategy[]", + }, + { + name: "depositShares", + type: "uint256[]", + internalType: "uint256[]", + }, + { + name: "__deprecated_withdrawer", + type: "address", + internalType: "address", + }, + ], + }, + ], + outputs: [ + { + name: "", + type: "bytes32[]", + internalType: "bytes32[]", + }, + ], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "queuedWithdrawals", + inputs: [ + { + name: "withdrawalRoot", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "withdrawal", + type: "tuple", + internalType: "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[]", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "redelegate", + inputs: [ + { + 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: [ + { + name: "withdrawalRoots", + type: "bytes32[]", + internalType: "bytes32[]", + }, + ], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "registerAsOperator", + inputs: [ + { + name: "initDelegationApprover", + type: "address", + internalType: "address", + }, + { + name: "allocationDelay", + type: "uint32", + internalType: "uint32", + }, + { + name: "metadataURI", + type: "string", + internalType: "string", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "renounceOwnership", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "slashOperatorShares", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + { + name: "prevMaxMagnitude", + type: "uint64", + internalType: "uint64", + }, + { + name: "newMaxMagnitude", + type: "uint64", + internalType: "uint64", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "strategyManager", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IStrategyManager", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "transferOwnership", + inputs: [ + { + name: "newOwner", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "undelegate", + inputs: [ + { + name: "staker", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "withdrawalRoots", + type: "bytes32[]", + internalType: "bytes32[]", + }, + ], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "unpause", + inputs: [ + { + name: "newPausedStatus", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "updateOperatorMetadataURI", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "metadataURI", + type: "string", + internalType: "string", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "version", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "event", + name: "DelegationApproverUpdated", + inputs: [ + { + name: "operator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newDelegationApprover", + type: "address", + indexed: false, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "DepositScalingFactorUpdated", + inputs: [ + { + name: "staker", + type: "address", + indexed: false, + internalType: "address", + }, + { + name: "strategy", + type: "address", + indexed: false, + internalType: "contract IStrategy", + }, + { + name: "newDepositScalingFactor", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Initialized", + inputs: [ + { + name: "version", + type: "uint8", + indexed: false, + internalType: "uint8", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OperatorMetadataURIUpdated", + inputs: [ + { + name: "operator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "metadataURI", + type: "string", + indexed: false, + internalType: "string", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OperatorRegistered", + inputs: [ + { + name: "operator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "delegationApprover", + type: "address", + indexed: false, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OperatorSharesDecreased", + inputs: [ + { + name: "operator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "staker", + type: "address", + indexed: false, + internalType: "address", + }, + { + name: "strategy", + type: "address", + indexed: false, + internalType: "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: "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", + inputs: [ + { + name: "previousOwner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newOwner", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Paused", + inputs: [ + { + name: "account", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newPausedStatus", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "SlashingWithdrawalCompleted", + inputs: [ + { + name: "withdrawalRoot", + type: "bytes32", + indexed: false, + internalType: "bytes32", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "SlashingWithdrawalQueued", + inputs: [ + { + name: "withdrawalRoot", + type: "bytes32", + indexed: false, + internalType: "bytes32", + }, + { + name: "withdrawal", + type: "tuple", + indexed: false, + internalType: "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, + }, + { + type: "event", + name: "StakerDelegated", + inputs: [ + { + name: "staker", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "operator", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "StakerForceUndelegated", + inputs: [ + { + name: "staker", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "operator", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "StakerUndelegated", + inputs: [ + { + name: "staker", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "operator", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Unpaused", + inputs: [ + { + name: "account", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newPausedStatus", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "ActivelyDelegated", + inputs: [], + }, + { + type: "error", + name: "CallerCannotUndelegate", + inputs: [], + }, + { + type: "error", + name: "CurrentlyPaused", + inputs: [], + }, + { + type: "error", + name: "FullySlashed", + inputs: [], + }, + { + type: "error", + name: "InputAddressZero", + inputs: [], + }, + { + type: "error", + name: "InputArrayLengthMismatch", + inputs: [], + }, + { + type: "error", + name: "InputArrayLengthZero", + inputs: [], + }, + { + type: "error", + name: "InvalidNewPausedStatus", + inputs: [], + }, + { + type: "error", + name: "InvalidPermissions", + inputs: [], + }, + { + type: "error", + name: "InvalidShortString", + inputs: [], + }, + { + type: "error", + name: "InvalidSignature", + inputs: [], + }, + { + type: "error", + name: "InvalidSnapshotOrdering", + inputs: [], + }, + { + type: "error", + name: "NotActivelyDelegated", + inputs: [], + }, + { + type: "error", + name: "OnlyAllocationManager", + inputs: [], + }, + { + type: "error", + name: "OnlyEigenPodManager", + inputs: [], + }, + { + type: "error", + name: "OnlyPauser", + inputs: [], + }, + { + type: "error", + name: "OnlyStrategyManagerOrEigenPodManager", + inputs: [], + }, + { + type: "error", + name: "OnlyUnpauser", + inputs: [], + }, + { + type: "error", + name: "OperatorNotRegistered", + inputs: [], + }, + { + type: "error", + name: "OperatorsCannotUndelegate", + inputs: [], + }, + { + type: "error", + name: "SaltSpent", + inputs: [], + }, + { + type: "error", + name: "SignatureExpired", + inputs: [], + }, + { + type: "error", + name: "StringTooLong", + inputs: [ + { + name: "str", + type: "string", + internalType: "string", + }, + ], + }, + { + type: "error", + name: "WithdrawalDelayNotElapsed", + inputs: [], + }, + { + type: "error", + name: "WithdrawalNotQueued", + inputs: [], + }, + { + type: "error", + name: "WithdrawerNotCaller", + inputs: [], + }, +] as const; + +const _bytecode = + "0x61016080604052346104bb576163358038038061001b81610508565b92833981019060e08183031261046b578051906001600160a01b0382168203610467576020810151906001600160a01b03821682036104675760408101516001600160a01b03811681036104675760608201516001600160a01b03811694909390858503610467576080840151946001600160a01b03861686036104675760a08501519463ffffffff861686036104675760c0810151906001600160401b03821161041757019688601f890112156103be5787516001600160401b0381116103aa576100f0601f8201601f1916602001610508565b98818a5260208a019a6020838301011161035557815f9260208093018d5e8a010152156103465760805260a05260c05260e0526101005261012052601f81511161030a57519051602082106102fa575b17610140525f5460ff8160081c166102a55760ff8082160361026b575b604051615e07908161052e82396080518181816107ef0152818161113d01528181611b420152612a0a015260a051818181610d7101528181610dd9015281816132eb0152614df7015260c051818181610eff015281816110250152818161181d015281816120ad0152818161279c0152818161335601528181614423015281816145390152614dca015260e051818181610c4a01528181610e2b015281816116760152818161194c01528181612461015281816130c701528181613b2401528181613c0d015261563101526101005181818161228b015281816148ce01528181614a600152614bab015261012051818181610fe101526147890152610140518181816110f301526138f90152f35b60ff90811916175f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a18061015d565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b5f198260200360031b1b16610140565b60449060405192839163305a27a960e01b8352602060048401525180918160248501528484015e5f828201840152601f01601f19168101030190fd5b6339b190bb60e11b5f5260045ffd5b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b5f80fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b6040519190601f01601f191682016001600160401b038111838210176103aa5760405256fe608060405260043610612b30575f3560e01c806304a4f9791461034b5780630b9f487a146103465780630dd8dd0214610341578063136439dd1461033c57806325df922e146103375780632aa6d8881461033257806339b70e381461032d5780633c651cf2146103285780633cdeb5e0146103235780633e28391d1461031e5780634657e26a146103195780634665bcda1461031457806354b7c96c1461030f57806354fd4d501461030a578063595c6a6714610305578063597b36da146103005780635ac86ab7146102fb5780635c975abb146102f65780635d975e88146102f15780635dd68579146102ec578063601bb36f146102e757806360a0d1ce146102e257806365da1264146102dd57806366d5ba93146102d85780636d70f7ae146102d35780636e174448146102ce578063715018a6146102c9578063778e55f3146102c457806378296ec5146102bf578063886f1195146102ba5780638da5cb5b146102b557806390041347146102b05780639104c319146102ab5780639435bb43146102a657806399f5371b146102a1578063a17884841461029c578063a33a343314610297578063b7f06ebe14610292578063bb45fef21461028d578063bfae3fd214610288578063c448feb814610283578063c978f7ac1461027e578063ca8aa7c714610279578063cd6dc68714610274578063da8be8641461026f578063e4cc3f901461026a578063eea9064b14610265578063f0e0e67614610260578063f2fde38b1461025b578063f698da2514610256578063fabc1cbc146102515763fd8aa88d03612b3057612abb565b6129ef565b6129d5565b612944565b612883565b612673565b6125b9565b61257a565b612490565b61244c565b6122d4565b61226f565b612229565b6121db565b6121ac565b611f5a565b611dfb565b611d38565b611c26565b611bff565b611bd1565b611b71565b611b2d565b611a99565b611a55565b6119fa565b61193c565b6118f0565b6118ae565b61186b565b6117ef565b611632565b611547565b611432565b611367565b611334565b6112fa565b61112b565b6110db565b611054565b611010565b610fcc565b610f81565b610f2d565b610da0565b610d5c565b610bd7565b610a66565b6107d4565b610682565b6104b0565b6103ff565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b5f9103126103fa57565b6103a0565b34610439575f3660031901126103fa5760206040517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad8152f35b610350565b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b6001600160a01b0381160361049f57565b5f80fd5b35906104ae8261048e565b565b346104395760a03660031901126103fa5760206104f76004356104d28161048e565b6024356104de8161048e565b6044356104ea8161048e565b6064359160843593612b93565b604051908152f35b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b9181601f84011215610644578235916001600160401b03831161063f576020808501948460051b01011161063a57565b6105b1565b610558565b6104ff565b60206040818301928281528451809452019201905f5b81811061066c5750505090565b825184526020938401939092019160010161065f565b346104395760203660031901126103fa576004356001600160401b0381116107cf576106b290369060040161060a565b906106ca6106c4600280606654161490565b15612c3d565b6106d2613a1a565b6106db82612c53565b335f908152609a60205260409020549092906001600160a01b03165f5b82811061071d576107198561070d600160c955565b60405191829182610649565b0390f35b8061075a6107376107316001948789612cde565b80612d00565b905061075161074784888a612cde565b6020810190612d00565b91905014612dbf565b6107be61077f61077861077161073185898b612cde565b3691610947565b8533613bfd565b866107b6876107ae6107a46107478861079c61073182878a612cde565b959097612cde565b9490923691610947565b9236916109bb565b908633613f03565b6107c88288612de2565b52016106f8565b61043e565b346104395760203660031901126103fa576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600435813b1561089d5760206024926040519384809263237dfb4760e11b82523360048301525afa9182156108985761086792610853915f91610869575b50612e69565b61086260665482811614612e7f565b614293565b005b61088b915060203d602011610891575b61088381836108f1565b810190612e49565b5f61084d565b503d610879565b612e5e565b612df6565b634e487b7160e01b5f52604160045260245ffd5b60e081019081106001600160401b038211176108d157604052565b6108a2565b604081019081106001600160401b038211176108d157604052565b90601f801991011681019081106001600160401b038211176108d157604052565b604051906104ae60e0836108f1565b604051906104ae6040836108f1565b6001600160401b0381116108d15760051b60200190565b92919061095381610930565b9361096160405195866108f1565b602085838152019160051b810192831161063a57905b82821061098357505050565b6020809183356109928161048e565b815201910190610977565b9080601f83011215610644578160206109b893359101610947565b90565b9291906109c781610930565b936109d560405195866108f1565b602085838152019160051b810192831161063a57905b8282106109f757505050565b81358152602091820191016109eb565b9080601f83011215610644578160206109b8933591016109bb565b90602080835192838152019201905f5b818110610a3f5750505090565b8251845260209384019390920191600101610a32565b9060206109b8928181520190610a22565b346104395760603660031901126103fa57600435610a838161048e565b6024356001600160401b0381116107cf57610aa290369060040161099d565b906044356001600160401b0381116107cf57610ac2903690600401610a07565b6001600160a01b038281165f818152609a60205260409020549093610aea9286921690613bfd565b610af48451612c53565b935f5b8151811015610b7857600190855f5260a2602052610b67610b4b610b4660405f20610b32610b258689612de2565b516001600160a01b031690565b60018060a01b03165f5260205260405f2090565b612eb7565b610b558388612de2565b51610b608488612de2565b51916142c5565b610b718289612de2565b5201610af7565b604051806107198882610a55565b6024359063ffffffff8216820361049f57565b359063ffffffff8216820361049f57565b9181601f84011215610644578235916001600160401b03831161063f576020838186019501011161063a57565b346104395760603660031901126103fa57600435610bf48161048e565b610bfc610b86565b6044356001600160401b0381116107cf57610c1b903690600401610baa565b610c26939193613a1a565b335f908152609a6020526040902054610c48906001600160a01b031615612eda565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561089d57604051632b6241f360e11b815233600482015263ffffffff9490941660248501525f908490604490829084905af1918215610898577f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b670809093610d3593610d42575b50610ce481336142e1565b610cee3333614341565b6040516001600160a01b0391909116815233907fa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c190602090a2604051918291339583612ef0565b0390a2610867600160c955565b80610d505f610d56936108f1565b806103f0565b5f610cd9565b34610439575f3660031901126103fa576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346104395760803660031901126103fa57600435610dbd8161048e565b602435610dc98161048e565b6064356044356001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633148015610efb575b15610eec57610e0f613a1a565b6001600160a01b038481165f908152609a6020526040902054167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031694909390853b1561089d5760405163152667d960e31b81526001600160a01b0386811660048301528316602482015295602090879060449082905afa95861561089857610eb396610ead915f91610ebd575b50838361450b565b9461470b565b610867600160c955565b610edf915060203d602011610ee5575b610ed781836108f1565b810190612f17565b5f610ea5565b503d610ecd565b63045206a560e21b5f5260045ffd5b50337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610e02565b346104395760203660031901126103fa576020610f6f600435610f4f8161048e565b6001600160a01b039081165f908152609960205260409020600101541690565b6040516001600160a01b039091168152f35b346104395760203660031901126103fa576020610fc2600435610fa38161048e565b6001600160a01b039081165f908152609a602052604090205416151590565b6040519015158152f35b34610439575f3660031901126103fa576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610439575f3660031901126103fa576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346104395760403660031901126103fa576110b06004356110748161048e565b602435906110818261048e565b61109261108d82614787565b612f2c565b61109a613a1a565b6110ab6110a6826134cb565b612f42565b6142e1565b600160c955005b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b34610439575f3660031901126103fa576107196111177f000000000000000000000000000000000000000000000000000000000000000061482c565b6040519182916020835260208301906110b7565b34610439575f3660031901126103fa577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561089d5760206024916040519283809263237dfb4760e11b82523360048301525afa8015610898576111a0915f916108695750612e69565b61086761425f565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b91909160e0818403126112f55761125f610912565b92611269826104a3565b8452611277602083016104a3565b6020850152611288604083016104a3565b6040850152606082013560608501526112a360808301610b99565b608085015260a08201356001600160401b0381116112f057816112c791840161099d565b60a085015260c08201356001600160401b0381116112f0576112e99201610a07565b60c0830152565b6111f9565b6111a8565b346104395760203660031901126103fa576004356001600160401b0381116107cf576104f761132f602092369060040161124a565b612f58565b346104395760203660031901126103fa5760043560ff811680910361049f5760016020911b806066541614604051908152f35b34610439575f3660031901126103fa576020606654604051908152f35b90602080835192838152019201905f5b8181106113a15750505090565b82516001600160a01b0316845260209384019390920191600101611394565b80516001600160a01b039081168352602080830151821690840152604080830151909116908301526060808201519083015260808082015163ffffffff16908301526109b89160c061142160a084015160e060a085015260e0840190611384565b9201519060c0818403910152610a22565b346104395760203660031901126103fa5761147461071961145d600435611457612f83565b50614884565b6040929192519384936040855260408501906113c0565b908382036020850152610a22565b9080602083519182815201916020808360051b8301019401925f915b8383106114ad57505050505090565b90919293946020806114cb600193601f198682030187528951610a22565b9701930193019193929061149e565b929160408401936040815282518095526060810194602060608260051b8401019401905f5b81811061151c575050506109b89394506020818403910152611482565b909194602080611538600193605f19888203018c5289516113c0565b970198019101969190966114ff565b346104395760203660031901126103fa576004356115648161048e565b60018060a01b03165f5260a360205260405f20604051808260208294549384815201905f5260205f20925f5b8181106116085750506115a5925003826108f1565b80516115b081612fb9565b906115ba81613008565b925f5b8281106115d657505050610719604051928392836114da565b806115ec6115e660019385612de2565b51614884565b6115f68389612de2565b526116018287612de2565b52016115bd565b8454835260019485019486945060209093019201611590565b6001600160401b0381160361049f57565b346104395760803660031901126103fa5760043561164f8161048e565b60243561165b8161048e565b6044359161166883611621565b60643561167481611621565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036117e05761171e611718611726926116b6613a1a565b6117106116ec876116d78860018060a01b03165f52609860205260405f2090565b9060018060a01b03165f5260205260405f2090565b5461170a6001600160401b038a166001600160401b0385168361570c565b906149be565b968686614b49565b85613078565b938383614c50565b604080516001600160a01b0384811682526020820186905292909216917fdd611f4ef63f4385f1756c86ce1f1f389a9013ba6fa07daba8528291bc2d3c309190a261177f61177382614dac565b6001600160a01b031690565b91823b1561089d5760405163debe1eab60e01b81526001600160a01b039290921660048301526024820152905f908290604490829084905af18015610898576117cc57610867600160c955565b80610d505f6117da936108f1565b5f610eb3565b6323d871a560e01b5f5260045ffd5b346104395760603660031901126103fa5760043561180c8161048e565b60443560243561181b82611621565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361185c576110b092611857613a1a565b613085565b633213a66160e21b5f5260045ffd5b346104395760203660031901126103fa576004356118888161048e565b60018060a01b03165f52609a602052602060018060a01b0360405f205416604051908152f35b346104395760203660031901126103fa576114746107196118d96004356118d48161048e565b6132e9565b604092919251938493604085526040850190611384565b346104395760203660031901126103fa576020610fc26004356119128161048e565b6134cb565b60409060031901126103fa5760043561192f8161048e565b906024356109b88161048e565b346104395761194a36611917565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561089d5760405163152667d960e31b81526001600160a01b0384811660048301528216602482015291602090839060449082905afa90811561089857610719936119c9935f936119d9575b506149fd565b6040519081529081906020820190565b6119f391935060203d602011610ee557610ed781836108f1565b915f6119c3565b34610439575f3660031901126103fa57611a12614e38565b603380546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b34610439576020611a90611a6836611917565b6001600160a01b039182165f9081526098855260408082209290931681526020919091522090565b54604051908152f35b346104395760403660031901126103fa57600435611ab68161048e565b6024356001600160401b0381116107cf57611af67f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b6708090913690600401610baa565b9092611b0461108d82614787565b611b106110a6826134cb565b611b2860405192839260018060a01b03169583612ef0565b0390a2005b34610439575f3660031901126103fa576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610439575f3660031901126103fa576033546040516001600160a01b039091168152602090f35b9060406003198301126103fa57600435611bb28161048e565b91602435906001600160401b0382116107cf576109b89160040161099d565b3461043957610719611beb611be536611b99565b906134fe565b604051918291602083526020830190610a22565b34610439575f3660031901126103fa5760206040515f516020615db25f395f51905f528152f35b346104395760603660031901126103fa576004356001600160401b0381116107cf57611c5690369060040161060a565b6024356001600160401b0381116107cf57611c7590369060040161060a565b916044356001600160401b0381116107cf57611c9890939193369060040161060a565b90611caa6106c4600480606654161490565b611cb2613a1a565b3686900360de1901925f5b86811015610eb3578060051b90818901359186831215611d225783821015611d1d57600192611cf1611d17928a018a612d00565b90611d128d611d09611d04888d8d613571565b613581565b9436910161124a565b614f7b565b01611cbd565b612c85565b612c99565b9060206109b89281815201906113c0565b346104395760203660031901126103fa57600435611d54612f83565b505f5260a460205261071960405f20611dea600660405192611d75846108b6565b80546001600160a01b0316845260018101546001600160a01b0316602085015260028101546001600160a01b0316604085015260038101546060850152611dd3611dc6600483015463ffffffff1690565b63ffffffff166080860152565b611ddf6005820161358b565b60a0850152016135dc565b60c082015260405191829182611d27565b346104395760203660031901126103fa57600435611e188161048e565b60018060a01b03165f52609f602052602060405f2054604051908152f35b6001600160401b0381116108d157601f01601f191660200190565b9060606003198301126103fa57600435611e6a8161048e565b91602435906001600160401b0382116107cf57604082820360031901126112f55760405191611e98836108d6565b80600401356001600160401b0381116112f05781019180602384011215610644576004830135611ec781611e36565b91611ed560405193846108f1565b81835260248583010111611f05576020815f92602480970183860137830101528352013560208201529060443590565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b3461043957611fb9611f6b36611e51565b611f789391929333613726565b92611f81613a1a565b335f908152609a6020526040902054611fa6906001600160a01b031615155b15612eda565b611fb26110a6866134cb565b843361546e565b611fca6106c4600180606654161490565b611fd3336132e9565b611fdf82859395613b15565b335f908152609a602052604090209091906120169084905b80546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b038316337fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433045f80a35f5b855181101561219e575f516020615db25f395f51905f5261206e611773610b25848a612de2565b146120ab575b806120a5612087610b256001948a612de2565b6120918386612de2565b5161209c8488612de2565b519133896145dd565b01612047565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561089d5760405163a3d75e0960e01b815233600482015291602090839060249082905afa9182156108985760019261216e915f91612180575b506001600160401b0361216661214c610b468c610b32610b25896121463360018060a01b03165f5260a260205260405f2090565b93612de2565b612160612159878a612de2565b51916152e7565b90615887565b911690615887565b6121788285612de2565b529050612074565b612198915060203d8111610ee557610ed781836108f1565b5f612112565b6107198561070d600160c955565b346104395760203660031901126103fa576004355f52609e602052602060ff60405f2054166040519015158152f35b346104395760403660031901126103fa576004356121f88161048e565b6024359060018060a01b03165f52609c60205260405f20905f52602052602060ff60405f2054166040519015158152f35b346104395760206104f761226a610b4661224236611917565b6001600160a01b039182165f90815260a2875260408082209290931681526020919091522090565b6152e7565b34610439575f3660031901126103fa57602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b90916122c66109b893604084526040840190610a22565b916020818403910152610a22565b34610439576122e236611b99565b6122ec8151612c53565b6122f68251612c53565b61232a836123246123178760018060a01b03165f52609a60205260405f2090565b546001600160a01b031690565b86613bfd565b925f5b815181101561243d5761234e611773612349610b258486612de2565b614dac565b9061235c610b258285612de2565b91803b1561089d5760405163fe243a1760e01b81526001600160a01b038981166004830152939093166024840152602090839060449082905afa8015610898576001925f9161240f575b506123b18286612de2565b526123fe6123e2610b466123d58a60018060a01b03165f5260a260205260405f2090565b610b32610b258689612de2565b6123ec8387612de2565b516123f7848a612de2565b5191614e22565b6124088287612de2565b520161232d565b612430915060203d8111612436575b61242881836108f1565b8101906132da565b5f6123a6565b503d61241e565b604051806107198587836122af565b34610439575f3660031901126103fa576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346104395760403660031901126103fa576004356124ad8161048e565b6124f26024355f54926124d860ff600886901c16158095819661256c575b811561254c575b506136b2565b836124e9600160ff195f5416175f55565b61253557613715565b6124f857005b61250661ff00195f54165f55565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1005b61254761010061ff00195f5416175f55565b613715565b303b1591508161255e575b505f6124d2565b60ff1660011490505f612557565b600160ff82161091506124cb565b346104395760203660031901126103fa5761071961070d60043561259d8161048e565b613726565b8015150361049f57565b604435906104ae826125a2565b346104395760603660031901126103fa576004356001600160401b0381116107cf5760e0600319823603011261261e57602435906001600160401b0382116107cf5761260c61086792369060040161060a565b906126156125ac565b92600401613849565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a207374727563742063616c6c6461746120746f6044820152661bc81cda1bdc9d60ca1b6064820152608490fd5b34610439576126c661268436611e51565b90612690939293613a1a565b335f908152609a60205260409020546126b3906001600160a01b03161515611fa0565b6126bf6110a6856134cb565b833361546e565b6126d76106c4600180606654161490565b6126e0336132e9565b90916126ec8382613b15565b335f908152609a60205260409020612705908390611ff7565b6001600160a01b038216337fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433045f80a35f5b8451811015610eb3575f516020615db25f395f51905f5261275d611773610b258489612de2565b1461279a575b80612794612776610b2560019489612de2565b6127808388612de2565b5161278b8487612de2565b519133886145dd565b01612736565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561089d5760405163a3d75e0960e01b815233600482015291602090839060249082905afa91821561089857600192612842915f91612854575b506001600160401b03612166612835610b468b610b32610b25896121463360018060a01b03165f5260a260205260405f2090565b612160612159878c612de2565b61284c8287612de2565b529050612763565b61286c915060203d8111610ee557610ed781836108f1565b5f612801565b9060206109b8928181520190611482565b346104395760403660031901126103fa576004356001600160401b0381116107cf5736602382011215610644578060040135906128bf82610930565b916128cd60405193846108f1565b8083526024602084019160051b8301019136831161063a57602401905b82821061292a57836024356001600160401b0381116107cf576107199161291861291e92369060040161099d565b9061387a565b60405191829182612872565b6020809183356129398161048e565b8152019101906128ea565b346104395760203660031901126103fa576004356129618161048e565b612969614e38565b6001600160a01b038116156129815761086790614e90565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b34610439575f3660031901126103fa5760206104f76138cd565b346104395760203660031901126103fa576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600435813b1561089d5760206004926040519384809263755b36bd60e11b82525afa918215610898575f92612a78575b5061086791612a73906001600160a01b031633146139c1565b6139d7565b91506020823d602011612ab3575b81612a93602093836108f1565b810103126103fa57612a736108679251612aac8161048e565b9250612a5a565b3d9150612a86565b346104395760203660031901126103fa57600435612ad88161048e565b60018060a01b03165f5260a360205260405f206040519081602082549182815201915f5260205f20905f5b818110612b1a576107198561070d818703826108f1565b8254845260209093019260019283019201612b03565b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad602082019081526001600160a01b0395861692820192909252918416606083015292909116608082015260a081019290925260c080830193909352918152612c0160e0826108f1565b519020612c0c6138cd565b9060405190602082019261190160f01b84526022830152604282015260428152612c376062826108f1565b51902090565b15612c4457565b63840a48d560e01b5f5260045ffd5b90612c5d82610930565b612c6a60405191826108f1565b8281528092612c7b601f1991610930565b0190602036910137565b634e487b7160e01b5f52603260045260245ffd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206f6666736574000000006044820152606490fd5b9190811015611d1d5760051b81013590605e1981360301821215611d22570190565b903590601e1981360301821215611d2257018035906001600160401b038211612d7a57602001918160051b36038313612d3557565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c64617461207461696c20746f6f2073686f72740000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206c656e677468000000006044820152606490fd5b15612dc657565b6343714afd60e01b5f5260045ffd5b805115611d1d5760200190565b8051821015611d1d5760209160051b010190565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b908160209103126103fa57516109b8816125a2565b6040513d5f823e3d90fd5b15612e7057565b631d77d47760e21b5f5260045ffd5b15612e8657565b63c61dca5d60e01b5f5260045ffd5b60408051909190612ea683826108f1565b6001815291601f1901366020840137565b90604051602081018181106001600160401b038211176108d15760405291548252565b15612ee157565b633bf2b50360e11b5f5260045ffd5b90918060409360208452816020850152848401375f828201840152601f01601f1916010190565b908160209103126103fa57516109b881611621565b15612f3357565b63932d94f760e01b5f5260045ffd5b15612f4957565b6325ec6c1f60e01b5f5260045ffd5b604051612c3781612f7560208201946020865260208601906113c0565b03601f1981018352826108f1565b60405190612f90826108b6565b606060c0835f81525f60208201525f60408201525f838201525f60808201528260a08201520152565b90612fc382610930565b612fd060405191826108f1565b8281528092612fe1601f1991610930565b01905f5b828110612ff157505050565b602090612ffc612f83565b82828501015201612fe5565b9061301282610930565b61301f60405191826108f1565b8281528092613030601f1991610930565b01905f5b82811061304057505050565b806060602080938501015201613034565b634e487b7160e01b5f52601160045260245ffd5b906001820180921161307357565b613051565b9190820180921161307357565b6001600160a01b038181165f908152609a602052604090205416156131d6576001600160a01b0381165f908152609a602052604090206130c490612317565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561089d5760405163152667d960e31b81526001600160a01b03851660048201525f516020615db25f395f51905f52602482015291602090839060449082905afa908115610898576104ae956131ab935f936131b1575b506131a590613188610b4661316e8860018060a01b03165f5260a260205260405f2090565b5f516020615db25f395f51905f525f5260205260405f2090565b936001600160401b0380670de0b6b3a76400005b931691166158fc565b91614e22565b91614cc3565b6131a59193506131cf9060203d602011610ee557610ed781836108f1565b9290613149565b505050565b9080601f830112156106445781516131f281610930565b9261320060405194856108f1565b81845260208085019260051b82010192831161063a57602001905b8282106132285750505090565b815181526020918201910161321b565b9190916040818403126103fa5780516001600160401b0381116107cf57810183601f820112156106445780519061326e82610930565b9161327c60405193846108f1565b80835260208084019160051b8301019186831161063a57602001905b8282106132c0575050509260208201516001600160401b0381116107cf576109b892016131db565b6020809183516132cf8161048e565b815201910190613298565b908160209103126103fa575190565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169190823b1561089d576040516394f649dd60e01b81526001600160a01b0382166004820152925f90849060249082905afa8015610898575f935f916134a3575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561089d5760405163fe243a1760e01b81526001600160a01b039390931660048401525f516020615db25f395f51905f526024840152602090839060449082905afa918215610898575f92613482575b50811561347d576133e96133e48551613065565b612c53565b936133f76133e48251613065565b92613418613406835188612de2565b5f516020615db25f395f51905f529052565b613423825185612de2565b525f5b8151811015613477578061345b613442610b2560019486612de2565b61344c838a612de2565b6001600160a01b039091169052565b6134658185612de2565b516134708287612de2565b5201613426565b50505090565b919050565b61349c91925060203d6020116124365761242881836108f1565b905f6133d0565b90506134c29193503d805f833e6134ba81836108f1565b810190613238565b9290925f613353565b6001600160a01b031680151590816134e1575090565b5f818152609a60205260409020546001600160a01b031614919050565b91909161350b8351612c53565b905f5b845181101561356a576001600160a01b038281165f908152609860205260409020600192916135589190613542848a612de2565b511660018060a01b03165f5260205260405f2090565b546135638286612de2565b520161350e565b5090925050565b9190811015611d1d5760051b0190565b356109b8816125a2565b90604051918281549182825260208201905f5260205f20925f5b8181106135ba5750506104ae925003836108f1565b84546001600160a01b03168352600194850194879450602090930192016135a5565b90604051918281549182825260208201905f5260205f20925f5b81811061360b5750506104ae925003836108f1565b84548352600194850194879450602090930192016135f6565b90604051613631816108b6565b82546001600160a01b039081168252600184015416602082015291829060c0906136ad9060069060028101546001600160a01b0316604086015260038101546060860152613696613689600483015463ffffffff1690565b63ffffffff166080870152565b6136a26005820161358b565b60a0860152016135dc565b910152565b156136b957565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b6137216104ae92614293565b614e90565b61372e613a1a565b6001600160a01b038082165f908152609a6020526040902054161561382457613756816134cb565b61381557613777906001600160a01b03811633819003613782575b506152fa565b906104ae600160c955565b6001600160a01b0382165f908152609a60205260409020546001600160a01b03166137ac81614787565b80156137f0575b6137bc90613833565b6001600160a01b0316907ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a5f80a35f613771565b506001600160a01b038181165f908152609960205260409020600101541633146137b3565b6311ca333560e31b5f5260045ffd5b63a5c7c44560e01b5f5260045ffd5b1561383a57565b631e499a2360e11b5f5260045ffd5b90611d126138739493926138646106c4600480606654161490565b61386c613a1a565b369061124a565b600160c955565b906138858251613008565b915f5b8151811015613477576001906138b1846001600160a01b036138aa8487612de2565b51166134fe565b6138bb8287612de2565b526138c68186612de2565b5001613888565b600a60206040516138df6040826108f1565b828152016922b4b3b2b72630bcb2b960b11b81522061391d7f000000000000000000000000000000000000000000000000000000000000000061482c565b805115611d1d5760ff60f81b60208201511690805160011015611d1d57612f7591612c3791602160ff60f81b91015116604051906020820192835260218201526002815261396c6022826108f1565b519020604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f602082019081529181019590955260608501919091524660808501523060a08501529291829060c0820190565b156139c857565b63794821ff60e01b5f5260045ffd5b6139e8606654198219811614612e7f565b806066556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a2565b600260c95414613a2b57600260c955565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b6020818303126103fa578051906001600160401b0382116107cf57019080601f83011215610644578151613aa381610930565b92613ab160405194856108f1565b81845260208085019260051b82010192831161063a57602001905b828210613ad95750505090565b602080918351613ae881611621565b815201910190613acc565b6001600160a01b0390911681526040602082018190526109b892910190611384565b9190613b218151612c53565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561089d57815f91613b769660405180988194829363547afb8760e01b845260048401613af3565b03915afa938415610898575f94613bd9575b505f5b815181101561356a5780613bc8613ba7610b2560019486612de2565b613bc1613bb4848a612de2565b516001600160401b031690565b905f61450b565b613bd28286612de2565b5201613b8b565b613bf69194503d805f833e613bee81836108f1565b810190613a70565b925f613b88565b929190613c0a8251612c53565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561089d57815f91613c5f9460405180968194829363547afb8760e01b845260048401613af3565b03915afa918215610898575f92613cbd575b505f5b8151811015613cb55780613ca4613c90610b2560019486612de2565b613c9d613bb48488612de2565b908961450b565b613cae8287612de2565b5201613c74565b509193505050565b613cd29192503d805f833e613bee81836108f1565b905f613c71565b15613ce057565b6339b190bb60e11b5f5260045ffd5b15613cf657565b63796cc52560e01b5f5260045ffd5b6001600160a01b03918216815291166020820152604081019190915260600190565b5f1981146130735760010190565b91613d4e9183549060031b91821b915f19901b19161790565b9055565b919091828210613d6157505050565b5f5260205f2091820191015b818110613d78575050565b5f8155600101613d6d565b90600160401b81116108d15781548183556104ae92613d52565b8151916001600160401b0383116108d157602090613dbb8484613d83565b01905f5260205f205f5b838110613dd25750505050565b82516001600160a01b031681830155602090920191600101613dc5565b8151916001600160401b0383116108d157602090613e0d8484613d83565b01905f5260205f205f5b838110613e245750505050565b600190602084519401938184015501613e17565b815181546001600160a01b039182166001600160a01b0319918216178355602084015160018401805491841691831691909117905560408401516002840180549190931691161790556060820151600382015560808201516104ae9260069160c09190613ebe9063ffffffff16600486019063ffffffff1663ffffffff19825416179055565b613ecf60a082015160058601613d9d565b01519101613def565b91613ef5906109b8949284526060602085015260608401906113c0565b916040818403910152610a22565b9194939190613f1c6001600160a01b0383161515613cd9565b613f2886511515613cef565b613f328651612c53565b613f3c8751612c53565b915f5b885181101561412057613f58612349610b25838c612de2565b90613f7e8a610b32610b25846121468b60018060a01b03165f5260a260205260405f2090565b91613fa0613f8b84612eb7565b613f95848c612de2565b516123f7858c612de2565b613faa8388612de2565b52613fc8613fb784612eb7565b613fc1848c612de2565b519061550f565b613fd28387612de2565b528a826001600160a01b0386166140d4575b50506001600160a01b031691613ffd610b25838d612de2565b614007838b612de2565b51843b1561089d57614035946020925f8b6040519889958694859363724af42360e01b855260048501613d05565b03925af190811561089857828c926001955f916140b6575b501561405d575b50505001613f3f565b61226a614094610b2561409a937f8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f965f8755612de2565b92612eb7565b906140ab6040519283928b84613d05565b0390a1895f82614054565b6140ce915060203d81116124365761242881836108f1565b5f61404d565b610b2581836141016140ef610b256141069661411998612de2565b6140f9848d612de2565b51908b61551c565b612de2565b6141108489612de2565b51908987614d42565b8a82613fe4565b5092907f26b2aae26516e8719ef50ea2f6831a2efbd4e37dccdf0f6936b27bc08e793e309550614248929450614243969761416b8360018060a01b03165f52609f60205260405f2090565b546001600160a01b0384165f908152609f6020526040902061418d8154613d27565b90556141b761419a610912565b6001600160a01b0386168152966001600160a01b03166020880152565b6001600160a01b038416604087015260608601524363ffffffff16608086015260a085015260c08401526141ea83612f58565b95869161420f614202845f52609e60205260405f2090565b805460ff19166001179055565b61422a85614225855f5260a460205260405f2090565b613e38565b6001600160a01b03165f90815260a36020526040902090565b615a74565b506142596040519283928684613ed8565b0390a190565b5f196066556040515f1981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2565b806066556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2565b6109b892916142d66142dc926152e7565b906157e7565b6157e7565b6001600160a01b039081165f8181526099602090815260409182902060010180546001600160a01b0319169590941694851790935551928352917f773b54c04d756fcc5e678111f7d730de3be98192000799eee3d63716055a87c69190a2565b91906143546106c4600180606654161490565b61435d836132e9565b61436a8284969396613b15565b9161438984611ff78360018060a01b03165f52609a60205260405f2090565b6001600160a01b038481169082167fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433045f80a35f5b8651811015614502575f516020615db25f395f51905f526143e4611773610b25848b612de2565b14614421575b8061441b6143fd610b256001948b612de2565b6144078387612de2565b516144128489612de2565b5191868a6145dd565b016143bd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561089d5760405163a3d75e0960e01b81526001600160a01b038416600482015291602090839060249082905afa918215610898576001926144d2915f916144e4575b506001600160401b036121666144c5610b468d610b32610b25896121468d60018060a01b03165f5260a260205260405f2090565b612160612159878b612de2565b6144dc8286612de2565b5290506143ea565b6144fc915060203d8111610ee557610ed781836108f1565b5f614491565b50505050509050565b91906001600160a01b03165f516020615db25f395f51905f5214614537576001600160401b0391501690565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561089d5760405163a3d75e0960e01b81526001600160a01b03939093166004840152602090839060249082905afa908115610898576109b8925f926145bc575b506001600160401b0380670de0b6b3a764000061319c565b6145d691925060203d602011610ee557610ed781836108f1565b905f6145a4565b909380156146fc5783156146f5576001600160a01b038581165f90815260a2602090815260408083209387168352929052207f8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f916146589161464a9161226a91610b469091895f84615599565b604051918291868984613d05565b0390a16001600160a01b038085165f908152609a602052604090205416614680575b50505050565b6146e97f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c936146c3846116d78560018060a01b03165f52609860205260405f2090565b6146ce828254613078565b90556040516001600160a01b03909316959293849384613d05565b0390a25f80808061467a565b5050505050565b630a33bc6960e21b5f5260045ffd5b9192909480156146fc57841561477f5761464a61226a7f8be932bac54561f27260f95463d9b8ab37e06b2842e5ee2404157cc13df6eb8f93610b466146589460018060a01b038b165f5260a2602052896147788a60405f209060018060a01b03165f5260205260405f2090565b9384615599565b505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561089d57604051631beb2b9760e31b81526001600160a01b0390911660048201523360248201523060448201525f80356001600160e01b03191660648301529091602091839160849183915af1908115610898575f91614813575090565b6109b8915060203d6020116108915761088381836108f1565b60ff811690601f821161485b57604051916148486040846108f1565b6020808452838101919036833783525290565b632cd44ac360e21b5f5260045ffd5b9063ffffffff8091169116019063ffffffff821161307357565b6148a26148a791614893612f83565b505f5260a460205260405f2090565b613624565b9060a082016148b7815151612c53565b906148f36148cc608086015163ffffffff1690565b7f00000000000000000000000000000000000000000000000000000000000000009061486a565b63ffffffff431663ffffffff8216105f1461498157845161492e91906001600160a01b031660208701516001600160a01b0316845191615620565b939290925b60c08101915f5b85515181101561497857806149676149556001938751612de2565b51614960838b612de2565b5190615887565b6149718288612de2565b520161493a565b50929350935050565b5083516149a7906001600160a01b031660208601516001600160a01b0316835191613bfd565b93929092614933565b5f1981019190821161307357565b9190820391821161307357565b63ffffffff5f199116019063ffffffff821161307357565b9063ffffffff8091169116039063ffffffff821161307357565b614a589060018060a01b031691825f5260a5602052614a37614a328260405f209060018060a01b03165f5260205260405f2090565b61573b565b925f5260a560205260405f209060018060a01b03165f5260205260405f2090565b614a90614a8b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff43166149e3565b6149cb565b8154919063ffffffff165f5b838110614aff5750505f926109b89492614ac99281158614614ace5750506001600160e01b03841661170a565b615768565b614aec614af391614ae161170a946149b0565b905f5260205f200190565b5460201c90565b6001600160e01b031690565b90928082169080831860011c820180921161307357835f528463ffffffff8360205f20015416115f14614b355750925b90614a9c565b939150600181018091116130735790614b2f565b6001600160a01b039081165f81815260a5602090815260408083209486168352939052919091209094939291614ba391614b829061573b565b955f5260a560205260405f209060018060a01b03165f5260205260405f2090565b614bd6614a8b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff43166149e3565b8154919063ffffffff165f5b838110614c0657505094614ac9916109b8959681155f14614ace57505f905061170a565b90928082169080831860011c820180921161307357835f528463ffffffff8360205f20015416115f14614c3c5750925b90614be2565b939150600181018091116130735790614c36565b60018060a01b031691825f526098602052614c7e8260405f209060018060a01b03165f5260205260405f2090565b918254828103908111613073577f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd9355614cbe6040519283925f84613d05565b0390a2565b91909160018060a01b031691825f52609860205260405f205f516020615db25f395f51905f525f5260205260405f2090815491838303928311613073577f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd935f516020615db25f395f51905f5293614cbe925560405193849384613d05565b6001600160a01b039081165f818152609860209081526040808320948716835293905291909120805491948083039493928511613073577f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd94614cbe925560405193849384613d05565b6001600160a01b03165f516020615db25f395f51905f5203614df5577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690565b6109b89291612160614e33926152e7565b615887565b6033546001600160a01b03163303614e4c57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b15614edf57565b6316110d3560e21b5f5260045ffd5b15614ef557565b6387c9d21960e01b5f5260045ffd5b15614f0b57565b6378f67ae160e11b5f5260045ffd5b5f60066104ae92828155826001820155826002820155826003820155826004820155614f4f8360058301805490828155613d52565b01805490828155613d52565b91908260409103126103fa576020825192015190565b356109b88161048e565b93929360a0810192614f908451518214612dbf565b6040820151614fb290614fab906001600160a01b0316611773565b3314614ed8565b614fbb82612f58565b614fdf614fda614fd3835f52609e60205260405f2090565b5460ff1690565b614eee565b7f1f40400889274ed07b24845e5054a87a0cab969eb1277aafe61ae352e7c32a006150a961505261501a6148cc608088015163ffffffff1690565b61503163ffffffff821663ffffffff431611614f04565b86516001600160a01b031660208801516001600160a01b03168a5191615620565b9261506f8161506a61422a895160018060a01b031690565b615b19565b5061508a615085825f5260a460205260405f2090565b614f1a565b6119c961509f825f52609e60205260405f2090565b805460ff19169055565b0390a182516001600160a01b03165f908152609a602052604090206150cd90612317565b83516150e5906001600160a01b031682885191613bfd565b5f5b875180518210156152da5790888888886151098f96610b258761234992612de2565b61512561511a8760c0860151612de2565b51614960888d612de2565b9687156152cb5786929190156151e25792516001600160a01b039384169361516c93615167939092909161516191610b25918591169951612de2565b95613571565b614f71565b91813b1561089d57604051630bab906360e21b81526001600160a01b039485166004820152908416602482015291909216604482015260648101939093525f908390608490829084905af1918215610898576001926151ce575b505b016150e7565b80610d505f6151dc936108f1565b5f6151c6565b8c516001600160a01b039182169896501693506151fe92505050565b9061520d610b25848d51612de2565b93803b1561089d57615239945f6040948551978895869485936350ff722560e01b855260048501613d05565b03925af18015610898578961528391600194848b5f925f94615288575b505161527191610b25916001600160a01b03165b9551612de2565b61527b8689612de2565b51938961470b565b6151c8565b610b2591945061526a9350916152b76152719360403d81116152c4575b6152af81836108f1565b810190614f5b565b9490949592505091615256565b503d6152a5565b505050505050600191506151c8565b5050505050505050509050565b51806109b85750670de0b6b3a764000090565b6109b89061530f6106c4600280606654161490565b6001600160a01b0381165f908152609a60205260409020606092919061533490612317565b906153626153528260018060a01b03165f52609a60205260405f2090565b80546001600160a01b0319169055565b6001600160a01b038281169082167ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af446765f80a361539d816132e9565b919094855190811561545057506153b390612c53565b926153bf868284613bfd565b915f5b875181101561544657600190615435896153da612e95565b6153e2612e95565b906154046153fb610b25876153f5612e95565b96612de2565b61344c83612dd5565b61540e858b612de2565b5161541883612dd5565b52615423858a612de2565b5161542d84612dd5565b528787613f03565b61543f8289612de2565b52016153c2565b5093955050505050565b955050505050565b1561545f57565b630d4c4c9160e21b5f5260045ffd5b6001600160a01b038281165f9081526099602052604090206001015491949116929083156146f5576104ae9461550591855f52609c60205260405f20815f526020526154c96154c460ff60405f20541615151590565b615458565b6154f7614202826154ea8960018060a01b03165f52609c60205260405f2090565b905f5260205260405f2090565b856020850195865193612b93565b9051915192615949565b906121606109b8926152e7565b6001600160a01b039081165f81815260a560209081526040808320948616835293905291909120909291615574916155539061573b565b935f5260a560205260405f209060018060a01b03165f5260205260405f2090565b908201809211613073576104ae916001600160e01b0316904363ffffffff1690615c28565b92909182156155dc576155bb82614e336155b561226a88612eb7565b86615887565b9080820180921161307357830180931161307357613d4e926142dc916157e7565b50613d4e91506142dc61226a84612eb7565b9161561963ffffffff9160409396959660018060a01b03168552606060208601526060850190611384565b9416910152565b9392909161562e8151612c53565b927f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692833b1561089d57604051632535f40360e21b8152935f92859283918291615686918890600485016155ee565b03915afa918215610898575f926156c8575b505f5b8151811015613cb557806156b7613c90610b2560019486612de2565b6156c18287612de2565b520161569b565b6156dd9192503d805f833e613bee81836108f1565b905f615698565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b91906157198282856158fc565b92821561573657096157285790565b600181018091116130735790565b6156f8565b8054908161574a57505f919050565b815f19810111613073575f525f199060205f2001015460201c614af3565b916001600160401b03809116911603906001600160401b038211613073576001600160401b036109b8921690615887565b8115615736570490565b156157aa57565b60405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b6044820152606490fd5b5f19670de0b6b3a7640000820991670de0b6b3a764000082029182808510940393808503941461587b57670de0b6b3a764000082916158278684116157a3565b09600182190182168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b50906109b89250615799565b5f19828209828202918280831092039180830392146158eb577faccb18165bd6fe31ae1cf318dc5b51eee0e1ba569b88cd74c1773b91fac1066993670de0b6b3a7640000916158d78484116157a3565b0990828211900360ee1b910360121c170290565b50670de0b6b3a76400009250500490565b90915f198383099280830292838086109503948086039514615926579082916158278684116157a3565b5050906109b89250615799565b1561593a57565b638baa579f60e01b5f5260045ffd5b90924211615a505761595b8284615d01565b9390926005851015615a4b576104ae94159384615a35575b508315615983575b505050615933565b5f935090612f756159bb8594936040519283916020830195630b135d3f60e11b875260248401526040604484015260648301906110b7565b51915afa3d15615a2e573d6159cf81611e36565b906159dd60405192836108f1565b81523d5f602083013e5b81615a20575b816159fc575b505f808061597b565b9050615a19630b135d3f60e11b91602080825183010191016132da565b145f6159f3565b9050602081511015906159ed565b60606159e7565b6001600160a01b0384811691161493505f615973565b6156e4565b630819bdcd60e01b5f5260045ffd5b8054821015611d1d575f5260205f2001905f90565b6001810190825f528160205260405f2054155f14615ad7578054600160401b8110156108d157615ac4615aae826001879401855584615a5f565b819391549060031b91821b915f19901b19161790565b905554915f5260205260405f2055600190565b5050505f90565b80548015615b05575f190190615af48282615a5f565b8154905f199060031b1b1916905555565b634e487b7160e01b5f52603160045260245ffd5b6001810191805f528260205260405f2054928315155f14615bb4575f1984018481116130735783545f19810194908511613073575f9585836154ea94615b679803615b6d575b505050615ade565b55600190565b615b9d615b9791615b8e615b84615bab9588615a5f565b90549060031b1c90565b92839187615a5f565b90613d35565b85905f5260205260405f2090565b555f8080615b5f565b505050505f90565b15615bc357565b63151b8e3f60e11b5f5260045ffd5b8054600160401b8110156108d157615bef91600182018155615a5f565b615c1557815160209283015190921b63ffffffff191663ffffffff909216919091179055565b634e487b7160e01b5f525f60045260245ffd5b805480615c64575b50615c5f6104ae93615c4f615c43610921565b63ffffffff9095168552565b6001600160e01b03166020840152565b615bd2565b805f1981011161307357815f5263ffffffff615cd2615cc95f198460205f200101615cbf615cb160405192615c98846108d6565b548681169081855260201c602085015263ffffffff1690565b858916958691161115615bbc565b5163ffffffff1690565b63ffffffff1690565b03615c30576104ae93925090614ae1615cea926149b0565b9063ffffffff82549181199060201b169116179055565b9060418151145f14615d2d57615d2991602082015190606060408401519301515f1a90615d36565b9091565b50505f90600290565b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411615da6576020935f9360ff60809460405194855216868401526040830152606082015282805260015afa15610898575f516001600160a01b03811615615d9e57905f90565b505f90600190565b505050505f9060039056fe000000000000000000000000beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0a264697066735822122088bd6d641c9bc34dfff8fa4227926f10f9e6811614994cef01c36ed04f52c75d64736f6c634300081c0033"; + +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, + _eigenPodManager: string, + _allocationManager: string, + _pauserRegistry: string, + _permissionController: string, + _MIN_WITHDRAWAL_DELAY: BigNumberish, + _version: string, + overrides?: Overrides & { from?: string } + ): Promise { + return super.deploy( + _strategyManager, + _eigenPodManager, + _allocationManager, + _pauserRegistry, + _permissionController, + _MIN_WITHDRAWAL_DELAY, + _version, + overrides || {} + ) as Promise; + } + override getDeployTransaction( + _strategyManager: string, + _eigenPodManager: string, + _allocationManager: string, + _pauserRegistry: string, + _permissionController: string, + _MIN_WITHDRAWAL_DELAY: BigNumberish, + _version: string, + overrides?: Overrides & { from?: string } + ): TransactionRequest { + return super.getDeployTransaction( + _strategyManager, + _eigenPodManager, + _allocationManager, + _pauserRegistry, + _permissionController, + _MIN_WITHDRAWAL_DELAY, + _version, + 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..d25b6758 --- /dev/null +++ b/src/avs/contracts/factories/ECDSAStakeRegistry__factory.ts @@ -0,0 +1,883 @@ +/* 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: "getLatestOperatorSigningKey", + 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 IECDSAStakeRegistryTypes.Quorum", + components: [ + { + name: "strategies", + type: "tuple[]", + internalType: "struct IECDSAStakeRegistryTypes.StrategyParams[]", + components: [ + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + { + name: "multiplier", + type: "uint96", + internalType: "uint96", + }, + ], + }, + ], + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "isValidSignature", + inputs: [ + { + name: "digest", + 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 IECDSAStakeRegistryTypes.Quorum", + components: [ + { + name: "strategies", + type: "tuple[]", + internalType: "struct IECDSAStakeRegistryTypes.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 ISignatureUtilsMixinTypes.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 IECDSAStakeRegistryTypes.Quorum", + components: [ + { + name: "strategies", + type: "tuple[]", + internalType: "struct IECDSAStakeRegistryTypes.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: "previous", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + { + name: "current", + 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: "previous", + type: "tuple", + indexed: false, + internalType: "struct IECDSAStakeRegistryTypes.Quorum", + components: [ + { + name: "strategies", + type: "tuple[]", + internalType: "struct IECDSAStakeRegistryTypes.StrategyParams[]", + components: [ + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + { + name: "multiplier", + type: "uint96", + internalType: "uint96", + }, + ], + }, + ], + }, + { + name: "current", + type: "tuple", + indexed: false, + internalType: "struct IECDSAStakeRegistryTypes.Quorum", + components: [ + { + name: "strategies", + type: "tuple[]", + internalType: "struct IECDSAStakeRegistryTypes.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 = + "0x60a080604052346100d957604051601f61297238819003918201601f19168301916001600160401b038311848410176100c55780849260209460405283398101031261007557516001600160a01b03811681036100715760805260405161284b908161012782396080518161165a0152f35b5f80fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fdfe608060405260043610611152575f3560e01c8062cf2ab51461019a5780630dba3394146101955780631626ba7e146101905780631703a0181461018b5780631e4cd85e14610186578063314f3a49146101815780633b242e4a1461017c5780633d5611f61461017757806340bf2fb7146101725780635140a5481461016d5780635e1042e8146101685780635ef5332914610163578063696255be1461015e578063715018a614610159578063743c31f414610154578063857dc1901461014f5780638da5cb5b1461014a578063955f2d901461014557806398ec1ac914610140578063a2ce5fd11461013b578063ab11899514610136578063b933fa7414610131578063dec5d1f61461012c578063ec7fbb31146101275763f2fde38b03611152576110c1565b611081565b61101d565b610fae565b610e9c565b610d91565b610d6a565b610d1c565b610cf4565b610bd5565b610b8a565b610b2f565b610aa4565b610a80565b610a3d565b610977565b61095a565b6108c6565b6107dc565b6107b1565b610784565b610738565b6105c1565b6104d1565b61047a565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b602081019081106001600160401b0382111761031757604052565b6102e8565b606081019081106001600160401b0382111761031757604052565b604081019081106001600160401b0382111761031757604052565b90601f801991011681019081106001600160401b0382111761031757604052565b60405190610382604083610352565b565b6001600160401b0381116103175760051b60200190565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b6001600160a01b0381160361040557565b5f80fd5b9080601f8301121561047557813561042081610384565b9261042e6040519485610352565b81845260208085019260051b82010192831161047057602001905b8282106104565750505090565b602080918335610465816103f4565b815201910190610449565b61039b565b61028f565b346104be5760203660031901126104b9576004356001600160401b0381116104b4576104ad6104b2913690600401610409565b6117e4565b005b61023f565b6101ef565b61019f565b63ffffffff81160361040557565b346104be5760203660031901126104b95760206104fe63ffffffff6004356104f8816104c3565b16611841565b604051908152f35b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b6001600160401b03811161031757601f01601f191660200190565b81601f820112156104755780359061058d8261055b565b9261059b6040519485610352565b828452602083830101116105bc57815f926020809301838601378301015290565b610506565b346104be5760403660031901126104b9576004356024356001600160401b0381116104b4576105f4903690600401610576565b908151820191606081602085019403126104b95760208101516001600160401b0381116104b457810183603f820112156104755760208101519061063782610384565b916106456040519384610352565b8083526020808085019260051b840101019186831161047057604001905b8282106106bb5750505060408201516001600160401b0381116104b45760606106976106a496602061069e948701016111b5565b930161126d565b92611ad6565b604051630b135d3f60e11b815280602081015b0390f35b6020809183516106ca816103f4565b815201910190610663565b5f9103126104b957565b602060408184019251938281528451809452019201905f5b8181106107045750505090565b825180516001600160a01b031685526020908101516001600160601b031681860152604090940193909201916001016106f7565b346104be575f3660031901126104b9576060604051610756816102fc565b526106b7604051610766816102fc565b61076e611278565b81526040519182916020835260208301906106df565b346104be5760203660031901126104b95760206104fe63ffffffff6004356107ab816104c3565b16611968565b346104be575f3660031901126104b95760206001600160e01b036107d3611bb9565b16604051908152f35b346104be5760203660031901126104b9576004356107f9816103f4565b6001600160a01b03165f908152606d602090815260409091206001600160e01b03906107d390611bfd565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b346104be5760403660031901126104b9576004356001600160401b0381116104b45760606003198236030112610955576040516109028161031c565b81600401356001600160401b038111610950576104b29261092b60449260043691840101610576565b835260248101356020840152013560408201526024359061094b826103f4565b6112ef565b610875565b610824565b346104be575f3660031901126104b9576020606754604051908152f35b346104be5760403660031901126104b9576004356001600160401b0381116104b457366023820112156104755780600401356109b281610384565b916109c06040519384610352565b8183526024602084019260051b820101903682116104705760248101925b828410610a0e57602435856001600160401b0382116104b457610a086104b2923690600401610576565b50611429565b83356001600160401b03811161047557602091610a32839260243691870101610409565b8152019301926109de565b346104be5760403660031901126104b9576020600435610a5c816103f4565b6001600160a01b039081165f908152606a8352604090206107d39060243590611a35565b346104be5760203660031901126104b9576104b2600435610a9f611c97565b611cef565b346104be5760403660031901126104b9576024356004356001600160401b0382116104b4577f713ca53b88d6eb63f5b1854cb8cbdd736ec51eda225e46791aa9298b0160648f610afb6104b2933690600401610409565b91610b04611c97565b60675481606755610b276040519283928360209093929193604081019481520152565b0390a16117e4565b346104be575f3660031901126104b957610b47611c97565b603380546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346104be5760203660031901126104b957600435610ba7816103f4565b335f52606e60205260ff60405f20541615610bc6576104b29033611de9565b6325ec6c1f60e01b5f5260045ffd5b346104be575f3660031901126104b957335f908152606e60205260409020610c0790610c03905b5460ff1690565b1590565b610bc657610c1e610c19606554611e7a565b606555565b335f908152606e60205260409020805460ff19169055610c45610c40336120be565b6121ef565b5050606854610c6a90610c5e906001600160a01b031681565b6001600160a01b031690565b803b15610cef576040516351b27a6d60e11b8152336004820152905f908290602490829084905af18015610cea57610cd0575b6068546001600160a01b0316337f31e0adfec71bccee37b6e83a90c2fedb17d8f1693fee863c4771e7bfe2aed5805f80a3005b80610cde5f610ce493610352565b806106d5565b5f610c9d565b6115a5565b611488565b346104be575f3660031901126104b9576033546040516001600160a01b039091168152602090f35b346104be5760403660031901126104b95760206104fe600435610d3e816103f4565b60243590610d4b826104c3565b60018060a01b03165f52606d835263ffffffff60405f20911690611a35565b346104be5760203660031901126104b95760206104fe600435610d8c816103f4565b6115f2565b346104be5760203660031901126104b957600435610dae816103f4565b60018060a01b03165f52606a602052602060018060a01b036107d360405f20611bfd565b919060208382031261095557604051610dea816102fc565b80938035906001600160401b038211610950570182601f8201121561047557803590610e1582610384565b93610e236040519586610352565b82855260208086019360061b8301019181831161047057602001925b828410610e4d575050505052565b6040848303126109555760405190610e6482610337565b8435610e6f816103f4565b82526020850135906001600160601b03821682036104055782602092836040950152815201930192610e3f565b346104be5760603660031901126104b957600435610eb9816103f4565b6044356024356001600160401b0382116104b457610ede610f26923690600401610dd2565b905f5493610f0c610ef6610c038760ff9060081c1690565b80968197610fa0575b8115610f80575b50611766565b84610f1d600160ff195f5416175f55565b610f6957611ee6565b610f2c57005b610f3a61ff00195f54165f55565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1005b610f7b61010061ff00195f5416175f55565b611ee6565b303b15915081610f92575b505f610f06565b60ff1660011490505f610f8b565b600160ff8216109150610eff565b346104be575f3660031901126104b957606c5480610fdd575060205f5b6040516001600160e01b039091168152f35b805f1981011161101857606c5f527f2b4a51ab505fc96a0952efda2ba61bcd3078d4c02c39a186ec16f21883fbe0150154602090811c610fcb565b6115b0565b346104be5760403660031901126104b9576004356001600160401b0381116104b45761104d903690600401610dd2565b602435906001600160401b0382116104b4576104ad6110736104b2933690600401610409565b9161107c611c97565b611fc7565b346104be5760203660031901126104b95760043561109e816103f4565b60018060a01b03165f52606e602052602060ff60405f2054166040519015158152f35b346104be5760203660031901126104b9576004356110de816103f4565b6110e6611c97565b6001600160a01b038116156110fe576104b290611da1565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b9080601f83011215610475578151916111cd83610384565b926111db6040519485610352565b80845260208085019160051b830101918383116104705760208101915b83831061120757505050505090565b82516001600160401b03811161047557820185603f82011215610475576020810151916112338361055b565b6112406040519182610352565b83815260408385010188106105bc575f602085819660408397018386015e830101528152019201916111f8565b5190610382826104c3565b6066549061128582610384565b916112936040519384610352565b80835260665f9081525f5160206127f65f395f51905f52602085015b8383106112bc5750505050565b6001602081926040516112ce81610337565b8554848060a01b038116825260a01c838201528152019201920191906112af565b335f908152606e6020526040902090919061130990610bfc565b6113ed576113529061131f610c19606554611c27565b335f908152606e6020526040902061133e90805460ff19166001179055565b61134a610c40336120be565b505033611de9565b60685461136990610c5e906001600160a01b031681565b803b15610cef57604051639926ee7d60e01b8152915f918391829084908290611396903360048401611c59565b03925af18015610cea576113d9575b506068546001600160a01b0316337fa453db612af59e5521d6ab9284dc3e2d06af286eb1b1b7b771fce4716c19f2c15f80a3565b80610cde5f6113e793610352565b5f6113a5565b6342ee68b560e01b5f5260045ffd5b634e487b7160e01b5f52603260045260245ffd5b80518210156114245760209160051b010190565b6113fc565b805115611424576020015180516065540361144757610382906117e4565b63169efb5b60e11b5f5260045ffd5b9061146082610384565b61146d6040519182610352565b828152809261147e601f1991610384565b0190602036910137565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b6020818303126104b9578051906001600160401b0382116104b457019080601f8301121561047557815161150e81610384565b9261151c6040519485610352565b81845260208085019260051b82010192831161047057602001905b8282106115445750505090565b8151815260209182019101611537565b6060602091604081019360018060a01b031681526040838201528451809452019201905f5b8181106115865750505090565b82516001600160a01b0316845260209384019390920191600101611579565b6040513d5f823e3d90fd5b634e487b7160e01b5f52601160045260245ffd5b8181029291811591840414171561101857565b906001820180921161101857565b9190820180921161101857565b6115fa611278565b915f906116078451611456565b915f5b8551811015611653578061164d6116346116266001948a611410565b51516001600160a01b031690565b61163e8388611410565b6001600160a01b039091169052565b0161160a565b50909290917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169190823b15610cef57604051639004134760e01b8152925f928492839182916116ae9160048401611554565b03915afa908115610cea575f91611744575b505f915b84518310156117225761171a6001916117146116e08686611410565b5161170e61170260206116f38a8d611410565b5101516001600160601b031690565b6001600160601b031690565b906115c4565b906115e5565b9201916116c4565b915050611733919250612710900490565b606754811061173f5790565b505f90565b61176091503d805f833e6117588183610352565b8101906114db565b5f6116c0565b1561176d57565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b9190915f838201938412911290801582169115161761101857565b905f805b83518210156118225760019061181a906118146001600160a01b0361180d8689611410565b51166120be565b906117c9565b9101906117e8565b905061182f9192506121ef565b5050565b5f1981019190821161101857565b438110156119245761185290612274565b606b549063ffffffff165f5b8281106118bf5750508061187b57505f5b6001600160e01b031690565b6118b361188a6118ba92611833565b606b5f527fbd43cb8ece8cd1863bcd6082d65c5b0d25665b1ce17980f0da43c0ed545f98b40190565b5460201c90565b61186f565b90918082169080831860011c820180921161101857606b5f527fbd43cb8ece8cd1863bcd6082d65c5b0d25665b1ce17980f0da43c0ed545f98b482015463ffffffff168410156119125750915b9061185e565b92915061191e906115d7565b9061190c565b606460405162461bcd60e51b815260206004820152602060248201527f436865636b706f696e74733a20626c6f636b206e6f7420796574206d696e65646044820152fd5b438110156119245761197990612274565b606c549063ffffffff165f5b8281106119d05750508061199857505f90565b6118b36119a76118ba92611833565b606c5f527f2b4a51ab505fc96a0952efda2ba61bcd3078d4c02c39a186ec16f21883fbe0160190565b90918082169080831860011c820180921161101857606c5f527f2b4a51ab505fc96a0952efda2ba61bcd3078d4c02c39a186ec16f21883fbe01682015463ffffffff16841015611a235750915b90611985565b929150611a2f906115d7565b90611a1d565b904381101561192457611a4790612274565b81549063ffffffff165f5b828110611a8257505080611a6757505f919050565b6118ba91611a776118b392611833565b905f5260205f200190565b90918082169080831860011c820180921161101857845f528363ffffffff611ab48460205f200163ffffffff90541690565b161115611ac45750915b90611a52565b929150611ad0906115d7565b90611abe565b939291938151905f955f9381518403611baa578315611b9b579291905f935b838510611b0c575050505050610382929350612460565b909192939460018060a01b03611b228784611410565b51169863ffffffff88169143831015611b8c57611b77611b8192611b658d600196815f52606a602052611b5e888060a01b039160405f20611a35565b16926122dc565b87611b708b89611410565b5191612300565b611714898c612435565b950193929190611af5565b63e64f180f60e01b5f5260045ffd5b63251f56a160e21b5f5260045ffd5b631fec674760e31b5f5260045ffd5b606b5480611bc657505f90565b805f1981011161101857606b5f527fbd43cb8ece8cd1863bcd6082d65c5b0d25665b1ce17980f0da43c0ed545f98b3015460201c90565b80549081611c0b5750505f90565b815f19810111611018575f525f199060205f2001015460201c90565b5f1981146110185760010190565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9060018060a01b031681526040602082015260806040611c84845160608386015260a0850190611c35565b9360208101516060850152015191015290565b6033546001600160a01b03163303611cab57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b611cf843612274565b6001600160e01b038211611d4c577f9324f7e5a7c0288808a634ccde44b8e979676474b22e29ee9dd569b55e791a4b91602091611d41906001600160e01b03831690606c612620565b5050604051908152a1565b60405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20326044820152663234206269747360c81b6064820152608490fd5b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b6001600160a01b039081165f818152606a6020526040902090929190611e0e90611bfd565b6001600160a01b0390921692911690828214611e7557805f52606a602052611e398360405f206124d1565b50506040516001600160a01b03909216825243917fd061168252f441733658f09e4d8f5b2d998ed4ef24a2bbfd6ceca52ea131500290602090a4565b505050565b8015611018575f190190565b15611e8d57565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b611f1f929161107c91611eff60ff5f5460081c16611e86565b60018060a01b03166001600160601b0360a01b6068541617606855611cef565b611f3860ff5f5460081c16611f3381611e86565b611e86565b61038233611da1565b606654600160401b81101561031757600181016066556066548110156114245760665f5281516020929092015160a01b6001600160a01b0319166001600160a01b0392909216919091175f5160206127f65f395f51905f5290910155565b9091611fb6611fc4936040845260408401906106df565b9160208184039101526106df565b90565b611fd0816124fb565b156120975760405191611fe2836102fc565b611fea611278565b83526066545f6066558061205d575b505f5b82518051821015612023579061201d61201782600194611410565b51611f41565b01611ffc565b505091907f23aad4e61744ece164130aa415c1616e80136b0f0770e56589438b90b269265e9161205860405192839283611f9f565b0390a1565b60665f525f5160206127f65f395f51905f52015f5160206127f65f395f51905f525b81811061208c5750611ff9565b5f815560010161207f565b63d173577960e01b5f5260045ffd5b81810392915f13801582851316918412161761101857565b6001600160a01b0381165f818152606d6020526040812090929083906120e390611bfd565b60018060e01b0316938461211260ff61210c8660018060a01b03165f52606e60205260405f2090565b54161590565b1561218757612120916120a6565b9384156121805761216a6121657f88770dc862e47a7ed586907857eb1b75e4c5ffc8b707c7ee10eb74d6885fe5949460018060a01b03165f52606d60205260405f2090565b6124ac565b50505b604080519182526020820192909252a290565b5050505090565b505050612193816115f2565b61219d84826120a6565b938415612180576121e8826121e37f88770dc862e47a7ed586907857eb1b75e4c5ffc8b707c7ee10eb74d6885fe5949560018060a01b03165f52606d60205260405f2090565b6124d1565b505061216d565b9061220b6001600160e01b03612203611bb9565b1692836117c9565b9061221543612274565b6001600160e01b038311611d4c57612239906001600160e01b03841690606b612620565b505060408051848152602081018490527f86dcf86b12dfeedea74ae9300dbdaa193bcce5809369c8177ea2f4eaaa65729b9181908101612058565b63ffffffff81116122885763ffffffff1690565b60405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608490fd5b6001600160a01b03918216911610156122f157565b63ba50f91160e01b5f5260045ffd5b91909161230d8284612736565b9390926005851015612421576123369415938461240b575b50831561234b575b50505015151590565b61233c57565b638baa579f60e01b5f5260045ffd5b5f9350906123836123918594936040519283916020830195630b135d3f60e11b87526024840152604060448401526064830190611c35565b03601f198101835282610352565b51915afa3d15612404573d6123a58161055b565b906123b36040519283610352565b81523d5f602083013e5b816123f6575b816123d2575b505f808061232d565b90506123ef630b135d3f60e11b916020808251830101910161276b565b145f6123c9565b9050602081511015906123c3565b60606123bd565b6001600160a01b0384811691161493505f612325565b634e487b7160e01b5f52602160045260245ffd5b9063ffffffff1643811015611b8c57611fc49160018060a01b03165f52606d60205260405f20611a35565b9063ffffffff1643811015611b8c5761247881611841565b821161249d5761248790611968565b1161248e57565b63e121632f60e01b5f5260045ffd5b634b05a0f760e11b5f5260045ffd5b5f6124c0916124ba43612274565b90612620565b6001600160e01b0391821692911690565b6124da43612274565b6001600160e01b038311611d4c576124c0926001600160e01b031691612620565b515f919082805b82518210156125515761251b610c5e6116268486611410565b906001600160a01b03808316911610156122f1576125486001919561171461170260206116f38789611410565b91019093612502565b5050509061271014155f14612564575f90565b600190565b805490600160401b8210156103175760018201808255821015611424575f9081526020902001815160209283015190921b63ffffffff191663ffffffff92909216919091179055565b906040516125bf81610337565b602081935463ffffffff81168352811c910152565b156125db57565b60405162461bcd60e51b815260206004820152601b60248201527f436865636b706f696e743a2064656372656173696e67206b65797300000000006044820152606490fd5b909291928382548015155f1461270c579260209291846126586126536126486126d298611833565b855f5260205f200190565b6125b2565b9363ffffffff61267d61266f875163ffffffff1690565b8284169283911611156125d4565b61269761268e875163ffffffff1690565b63ffffffff1690565b036126d657506126c492611a776126ad92611833565b9063ffffffff82549181199060201b169116179055565b01516001600160e01b031690565b9190565b915050612707916126f46126e8610373565b63ffffffff9093168352565b6001600160e01b03881682860152612569565b6126c4565b50506127319161271d6126e8610373565b6001600160e01b0385166020830152612569565b5f9190565b9060418151145f146127625761275e91602082015190606060408401519301515f1a9061277a565b9091565b50505f90600290565b908160209103126104b9575190565b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116127ea576020935f9360ff60809460405194855216868401526040830152606082015282805260015afa15610cea575f516001600160a01b038116156127e257905f90565b505f90600190565b505050505f9060039056fe46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e94354a264697066735822122065228802ecf42e415d7efdffc5621990f8f9b914239e66be849ad464a8dd1c2164736f6c634300081c0033"; + +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/ERC20Mock__factory.ts b/src/avs/contracts/factories/ERC20Mock__factory.ts new file mode 100644 index 00000000..bc83770a --- /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 = + "0x608080604052346102c557610012610312565b61001a610312565b81516001600160401b0381116101d857600354600181811c911680156102bb575b60208210146101ba57601f8111610258575b50602092601f82116001146101f757928192935f926101ec575b50508160011b915f199060031b1c1916176003555b80516001600160401b0381116101d857600454600181811c911680156101ce575b60208210146101ba57601f8111610157575b50602091601f82116001146100f7579181925f926100ec575b50508160011b915f199060031b1c1916176004555b604051610a3c90816103358239f35b0151905082806100c8565b601f1982169260045f52805f20915f5b85811061013f57508360019510610127575b505050811b016004556100dd565b01515f1960f88460031b161c19169055828080610119565b91926020600181928685015181550194019201610107565b60045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f830160051c810191602084106101b0575b601f0160051c01905b8181106101a557506100af565b5f8155600101610198565b909150819061018f565b634e487b7160e01b5f52602260045260245ffd5b90607f169061009d565b634e487b7160e01b5f52604160045260245ffd5b015190508380610067565b601f1982169360035f52805f20915f5b8681106102405750836001959610610228575b505050811b0160035561007c565b01515f1960f88460031b161c1916905583808061021a565b91926020600181928685015181550194019201610207565b60035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f830160051c810191602084106102b1575b601f0160051c01905b8181106102a6575061004d565b5f8155600101610299565b9091508190610290565b90607f169061003b565b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405190602082016001600160401b038111838210176101d8576040525f825256fe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b5f3560e01c806306fdde031461059f578063095ea7b31461057957806318160ddd1461055c57806323b872dd1461049f578063313ce56714610484578063395093511461043657806340c10f191461037957806370a082311461034257806395d89b4114610227578063a457c2d714610184578063a9059cbb146101535763dd62ed3e0361000e573461014e5760403660031901126101495761011261073b565b61011a610755565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b6106c1565b610671565b3461014e5760403660031901126101495761017961016f61073b565b6024359033610890565b602060405160018152f35b3461014e5760403660031901126101495761019d61073b565b60243590335f52600160205260405f2060018060a01b0382165f5260205260405f2054918083106101d4576101799203903361078c565b60405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608490fd5b3461014e575f366003190112610149576040515f6004548060011c90600181168015610338575b6020831081146103245782855290811561030857506001146102b3575b50819003601f01601f191681019067ffffffffffffffff82118183101761029f5761029b82918260405282610711565b0390f35b634e487b7160e01b5f52604160045260245ffd5b905060045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5f905b8282106102f25750602091508201018261026b565b60018160209254838588010152019101906102dd565b90506020925060ff191682840152151560051b8201018261026b565b634e487b7160e01b5f52602260045260245ffd5b91607f169161024e565b3461014e576020366003190112610149576001600160a01b0361036361073b565b165f525f602052602060405f2054604051908152f35b3461014e5760403660031901126101495761039261073b565b6001600160a01b031660243581156103f1577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020826103d55f9460025461076b565b60025584845283825260408420818154019055604051908152a3005b60405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606490fd5b3461014e5760403660031901126101495761017961045261073b565b335f52600160205260405f2060018060a01b0382165f5260205261047d60405f20602435905461076b565b903361078c565b3461014e575f36600319011261014957602060405160128152f35b3461014e576060366003190112610149576104b861073b565b6104c0610755565b6001600160a01b0382165f9081526001602081815260408084203385529091529091205492604435929184016104fb575b6101799350610890565b82841061051757610512836101799503338361078c565b6104f1565b60405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b3461014e575f366003190112610149576020600254604051908152f35b3461014e5760403660031901126101495761017961059561073b565b602435903361078c565b34610671575f366003190112610149576040515f6003548060011c90600181168015610667575b6020831081146103245782855290811561030857506001146106125750819003601f01601f191681019067ffffffffffffffff82118183101761029f5761029b82918260405282610711565b905060035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5f905b8282106106515750602091508201018261026b565b600181602092548385880101520191019061063c565b91607f16916105c6565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361075157565b5f80fd5b602435906001600160a01b038216820361075157565b9190820180921161077857565b634e487b7160e01b5f52601160045260245ffd5b6001600160a01b031690811561083f576001600160a01b03169182156107ef5760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591835f526001825260405f20855f5282528060405f2055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b6001600160a01b03169081156109b3576001600160a01b031691821561096257815f525f60205260405f205481811061090e57817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fdfea26469706673582212203e3c704f1582f9a42519d44672ec33c5b3c97e0aee53fd51e9f68e4fb353cd4264736f6c634300081c0033"; + +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 5eae44a0..7def2627 100644 --- a/src/avs/contracts/factories/ReclaimServiceManager__factory.ts +++ b/src/avs/contracts/factories/ReclaimServiceManager__factory.ts @@ -15,58 +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: "_delegationManager", + name: "rewards_coordinator", type: "address", internalType: "address", }, + { + name: "allocationManager", + type: "address", + internalType: "contract IAllocationManager", + }, + { + name: "_permissionController", + type: "address", + internalType: "contract IPermissionController", + }, + { + name: "_taskManager", + type: "address", + internalType: "contract IReclaimTaskManager", + }, ], stateMutability: "nonpayable", }, { type: "function", - name: "admins", + name: "addOperatorToWhitelist", inputs: [ { - name: "", - type: "uint256", - internalType: "uint256", - }, - ], - outputs: [ - { - name: "", + name: "operator", type: "address", internalType: "address", }, ], - stateMutability: "view", + outputs: [], + stateMutability: "nonpayable", }, { type: "function", - name: "allTaskHashes", + name: "addPendingAdmin", inputs: [ { - name: "", - type: "uint32", - internalType: "uint32", - }, - ], - outputs: [ - { - name: "", - type: "bytes32", - internalType: "bytes32", + name: "admin", + type: "address", + internalType: "address", }, ], - stateMutability: "view", + outputs: [], + stateMutability: "nonpayable", }, { type: "function", @@ -83,96 +91,124 @@ const _abi = [ }, { type: "function", - name: "checkSignerAddress", + name: "createAVSRewardsSubmission", inputs: [ { - name: "request", - type: "tuple", - internalType: "struct IReclaimServiceManager.ClaimRequest", + name: "rewardsSubmissions", + type: "tuple[]", + internalType: "struct IRewardsCoordinatorTypes.RewardsSubmission[]", components: [ { - name: "provider", - type: "string", - internalType: "string", + name: "strategiesAndMultipliers", + type: "tuple[]", + internalType: + "struct IRewardsCoordinatorTypes.StrategyAndMultiplier[]", + components: [ + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + { + name: "multiplier", + type: "uint96", + internalType: "uint96", + }, + ], }, { - name: "claimUserId", - type: "bytes32", - internalType: "bytes32", + name: "token", + type: "address", + internalType: "contract IERC20", }, { - name: "claimHash", - type: "bytes32", - internalType: "bytes32", + name: "amount", + type: "uint256", + internalType: "uint256", }, { - name: "requestedAt", + name: "startTimestamp", type: "uint32", internalType: "uint32", }, { - name: "owner", - type: "address", - internalType: "address", + name: "duration", + type: "uint32", + internalType: "uint32", }, ], }, - { - name: "requestSignature", - type: "bytes", - internalType: "bytes", - }, ], - outputs: [ - { - name: "", - type: "address", - internalType: "address", - }, - ], - stateMutability: "pure", + outputs: [], + stateMutability: "nonpayable", }, { type: "function", - name: "createNewTask", + name: "createOperatorDirectedAVSRewardsSubmission", inputs: [ { - name: "request", - type: "tuple", - internalType: "struct IReclaimServiceManager.ClaimRequest", + name: "operatorDirectedRewardsSubmissions", + type: "tuple[]", + internalType: + "struct IRewardsCoordinatorTypes.OperatorDirectedRewardsSubmission[]", components: [ { - name: "provider", - type: "string", - internalType: "string", + name: "strategiesAndMultipliers", + type: "tuple[]", + internalType: + "struct IRewardsCoordinatorTypes.StrategyAndMultiplier[]", + components: [ + { + name: "strategy", + type: "address", + internalType: "contract IStrategy", + }, + { + name: "multiplier", + type: "uint96", + internalType: "uint96", + }, + ], }, { - name: "claimUserId", - type: "bytes32", - internalType: "bytes32", + name: "token", + type: "address", + internalType: "contract IERC20", }, { - name: "claimHash", - type: "bytes32", - internalType: "bytes32", + name: "operatorRewards", + type: "tuple[]", + internalType: "struct IRewardsCoordinatorTypes.OperatorReward[]", + components: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint256", + internalType: "uint256", + }, + ], }, { - name: "requestedAt", + name: "startTimestamp", type: "uint32", internalType: "uint32", }, { - name: "owner", - type: "address", - internalType: "address", + name: "duration", + type: "uint32", + internalType: "uint32", + }, + { + name: "description", + type: "string", + internalType: "string", }, ], }, - { - name: "requestSignature", - type: "bytes", - internalType: "bytes", - }, ], outputs: [], stateMutability: "nonpayable", @@ -192,87 +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", - }, - ], - }, - ], - 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", }, @@ -301,22 +278,21 @@ const _abi = [ }, { type: "function", - name: "isAdmin", + name: "initialize", inputs: [ { - name: "_admin", + name: "initialOwner", type: "address", internalType: "address", }, - ], - outputs: [ { - name: "", - type: "bool", - internalType: "bool", + name: "rewardsInitiator", + type: "address", + internalType: "address", }, ], - stateMutability: "view", + outputs: [], + stateMutability: "nonpayable", }, { type: "function", @@ -339,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: [], @@ -397,182 +400,81 @@ 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", + name: "pendingAdmin", + type: "address", + internalType: "address", }, ], - outputs: [ - { - name: "", - type: "bool", - internalType: "bool", - }, - ], - 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: "payForRange", + name: "setAppointee", 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", - 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", - }, - ], - }, - ], - outputs: [], - stateMutability: "nonpayable", - }, - { - type: "function", - name: "registeredOperators", - inputs: [ - { - name: "", - type: "uint256", - internalType: "uint256", - }, - ], - outputs: [ - { - name: "addr", + name: "target", type: "address", internalType: "address", }, { - name: "url", - type: "string", - internalType: "string", + name: "selector", + type: "bytes4", + internalType: "bytes4", }, ], - stateMutability: "view", - }, - { - type: "function", - name: "renounceOwnership", - inputs: [], outputs: [], stateMutability: "nonpayable", }, { type: "function", - name: "setPauserRegistry", + name: "setClaimerFor", inputs: [ { - name: "newPauserRegistry", + name: "claimer", type: "address", - internalType: "contract IPauserRegistry", + internalType: "address", }, ], outputs: [], @@ -580,10 +482,10 @@ const _abi = [ }, { type: "function", - name: "setup", + name: "setRewardsInitiator", inputs: [ { - name: "initialAdmin", + name: "newRewardsInitiator", type: "address", internalType: "address", }, @@ -593,137 +495,26 @@ const _abi = [ }, { type: "function", - name: "stakeRegistry", + name: "slashingRegistryCoordinator", inputs: [], outputs: [ { name: "", type: "address", - internalType: "address", + internalType: "contract ISlashingRegistryCoordinator", }, ], 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: "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", + name: "taskManager", inputs: [], outputs: [ { - name: "maxTaskLifetimeS", - type: "uint32", - internalType: "uint32", - }, - { - name: "minSignaturesPerTask", - type: "uint8", - internalType: "uint8", - }, - { - name: "maxTaskCreationDelayS", - type: "uint32", - internalType: "uint32", + name: "", + type: "address", + internalType: "contract IReclaimTaskManager", }, ], stateMutability: "view", @@ -741,19 +532,6 @@ const _abi = [ outputs: [], stateMutability: "nonpayable", }, - { - type: "function", - name: "unpause", - inputs: [ - { - name: "newPausedStatus", - type: "uint256", - internalType: "uint256", - }, - ], - outputs: [], - stateMutability: "nonpayable", - }, { type: "function", name: "updateAVSMetadataURI", @@ -767,79 +545,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", - }, - ], - }, - ], - 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", @@ -872,96 +577,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: "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", @@ -983,167 +598,47 @@ const _abi = [ }, { type: "event", - name: "Paused", + name: "RewardsInitiatorUpdated", inputs: [ { - name: "account", + name: "prevRewardsInitiator", type: "address", - indexed: true, + indexed: false, internalType: "address", }, { - name: "newPausedStatus", - type: "uint256", + name: "newRewardsInitiator", + type: "address", indexed: false, - internalType: "uint256", + internalType: "address", }, ], 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: "error", + name: "DelayPeriodNotPassed", + inputs: [], }, { - 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: "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: "OnlyRegistryCoordinator", + 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: "OnlyRewardsInitiator", + inputs: [], + }, + { + type: "error", + name: "OnlyStakeRegistry", + inputs: [], }, ] as const; const _bytecode = - "0x61010060405234801561001157600080fd5b50604051614c04380380614c0483398101604081905261003091610146565b6001600160a01b0380841660a052808316608052600060c081905290821660e052839083908361005e61006a565b50505050505050610189565b600054610100900460ff16156100d65760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015610128576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b80516001600160a01b038116811461014157600080fd5b919050565b60008060006060848603121561015b57600080fd5b6101648461012a565b92506101726020850161012a565b91506101806040850161012a565b90509250925092565b60805160a05160c05160e0516149f561020f600039600061214c015260008181611ec30152611f990152600081816103ce015281816123930152818161250d015261257d0152600081816103a7015281816107e2015281816111cd015281816114dd01528181611960015281816119d10152818161200401526129d901526149f56000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c8063715018a611610125578063a98fb355116100ad578063d5dba76d1161007c578063d5dba76d14610514578063e481af9d14610527578063f289a7fb1461052f578063f2fde38b14610582578063fabc1cbc1461059557600080fd5b8063a98fb355146104bb578063aa5b9cad146104ce578063abd3b6bd146104e1578063b224b9791461050157600080fd5b806394bb371b116100f457806394bb371b146104415780639926ee7d14610461578063a3524f9514610474578063a364f4da14610487578063a551c1b81461049a57600080fd5b8063715018a6146103f0578063886f1195146103f85780638b00ce7c1461040b5780638da5cb5b1461043057600080fd5b80632e8da829116101a85780635c975abb116101775780635c975abb14610374578063630868dc1461037c57806366d382031461038f57806368304835146103a25780636b3aa72e146103c957600080fd5b80632e8da8291461031657806333cfb7b714610329578063595c6a67146103495780635ac86ab71461035157600080fd5b80631b445516116101ef5780631b4455161461028c5780631be785ac1461029f5780631ee3ca10146102b257806324d7806c146102c55780632d89f6fc146102e857600080fd5b806310d67a2f14610221578063136439dd1461023657806314bfd6d01461024957806316bd83c314610279575b600080fd5b61023461022f36600461349a565b6105a8565b005b6102346102443660046134b7565b610664565b61025c6102573660046134b7565b6107a3565b6040516001600160a01b0390911681526020015b60405180910390f35b610234610287366004613674565b6107cd565b61023461029a3660046136a8565b610b35565b6102346102ad36600461372b565b610b4b565b6102346102c0366004613789565b610c44565b6102d86102d336600461349a565b610d03565b6040519015158152602001610270565b6103086102f63660046137d9565b60cb6020526000908152604090205481565b604051908152602001610270565b6102d861032436600461349a565b610d8c565b61033c61033736600461349a565b610df9565b60405161027091906137f4565b610234610e0a565b6102d861035f366004613840565b609854600160ff9092169190911b9081161490565b609854610308565b61025c61038a3660046134b7565b610ed1565b61023461039d36600461349a565b610ee1565b61025c7f000000000000000000000000000000000000000000000000000000000000000081565b61025c7f000000000000000000000000000000000000000000000000000000000000000081565b61023461106c565b60975461025c906001600160a01b031681565b60c95461041b9063ffffffff1681565b60405163ffffffff9091168152602001610270565b6033546001600160a01b031661025c565b61045461044f36600461349a565b611080565b60405161027091906138d2565b61023461046f3660046138e5565b6111c2565b610234610482366004613b4a565b611269565b61023461049536600461349a565b6114d2565b6104ad6104a83660046134b7565b611523565b604051610270929190613c94565b6102346104c9366004613cb8565b6115e5565b61025c6104dc366004613cec565b611613565b6104f46104ef366004613d53565b61164a565b6040516102709190613d87565b61023461050f366004613cec565b611673565b6102d861052236600461349a565b61193c565b61033c611a5c565b60ca546105599063ffffffff8082169160ff64010000000082041691650100000000009091041683565b6040805163ffffffff948516815260ff9093166020840152921691810191909152606001610270565b61023461059036600461349a565b611a6b565b6102346105a33660046134b7565b611ae1565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061061f9190613d9a565b6001600160a01b0316336001600160a01b0316146106585760405162461bcd60e51b815260040161064f90613db7565b60405180910390fd5b61066181611c3d565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d09190613e01565b6106ec5760405162461bcd60e51b815260040161064f90613e1e565b609854818116146107655760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161064f565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b60cd81815481106107b357600080fd5b6000918252602090912001546001600160a01b0316905081565b60405163ec7fbb3160e01b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ec7fbb3190602401602060405180830381865afa158015610831573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108559190613e01565b15156001146108a65760405162461bcd60e51b815260206004820152601b60248201527f4f70657261746f72206d757374206265207468652063616c6c65720000000000604482015260640161064f565b80516001600160a01b0316331461090e5760405162461bcd60e51b815260206004820152602660248201527f4d657461646174612061646472657373206d757374206d61746368207468652060448201526531b0b63632b960d11b606482015260840161064f565b6020810151511580156109f35760005b60ce548110156109b55782600001516001600160a01b031660ce828154811061094957610949613e66565b60009182526020909120600290910201546001600160a01b0316036109ad5760ce818154811061097b5761097b613e66565b60009182526020822060029091020180546001600160a01b0319168155906109a66001830182613437565b5050505050565b60010161091e565b5060405162461bcd60e51b815260206004820152601260248201527113dc195c985d1bdc881b9bdd08199bdd5b9960721b604482015260640161064f565b60005b60ce54811015610aa85782600001516001600160a01b031660ce8281548110610a2157610a21613e66565b60009182526020909120600290910201546001600160a01b031603610aa0578260ce8281548110610a5457610a54613e66565b600091825260209182902083516002929092020180546001600160a01b0319166001600160a01b03909216919091178155908201516001820190610a989082613f02565b505050505050565b6001016109f6565b5060ce805460018101825560009190915282517fd36cd1c74ef8d7326d8021b776c18fb5a5724b7f7bc93c2f42e43e10ef27d12a600290920291820180546001600160a01b0319166001600160a01b03909216919091178155602084015184927fd36cd1c74ef8d7326d8021b776c18fb5a5724b7f7bc93c2f42e43e10ef27d12b01906109a69082613f02565b610b3d611d34565b610b478282611d8e565b5050565b610b5433610d03565b610b705760405162461bcd60e51b815260040161064f90613fc0565b8015610bc75760cc80546001810182556000919091527f47197230e1e4b29fc0bd84d7d78966c0925452aff72a2a121538b102457e9ebe0180546001600160a01b0384166001600160a01b03199091161790555050565b60005b60cc548110156109b557826001600160a01b031660cc8281548110610bf157610bf1613e66565b6000918252602090912001546001600160a01b031603610c3c5760cc8181548110610c1e57610c1e613e66565b600091825260209091200180546001600160a01b0319169055505050565b600101610bca565b610c4d33610d03565b610c695760405162461bcd60e51b815260040161064f90613fc0565b805163ffffffff1615610c9257805160ca805463ffffffff191663ffffffff9092169190911790555b602081015160ff1615610cc557602081015160ca805460ff9092166401000000000264ff00000000199092169190911790555b604081015163ffffffff1615610661576040015160ca805463ffffffff909216650100000000000268ffffffff000000000019909216919091179055565b6000610d176033546001600160a01b031690565b6001600160a01b03163303610d2e57506001919050565b60005b60cd54811015610d8357826001600160a01b031660cd8281548110610d5857610d58613e66565b6000918252602090912001546001600160a01b031603610d7b5750600192915050565b600101610d31565b50600092915050565b6000610d9782610d03565b15610da457506001919050565b60005b60cc54811015610d8357826001600160a01b031660cc8281548110610dce57610dce613e66565b6000918252602090912001546001600160a01b031603610df15750600192915050565b600101610da7565b6060610e0482611ffe565b92915050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610e52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e769190613e01565b610e925760405162461bcd60e51b815260040161064f90613e1e565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60cc81815481106107b357600080fd5b600054610100900460ff1615808015610f015750600054600160ff909116105b80610f1b5750303b158015610f1b575060005460ff166001145b610f7e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161064f565b6000805460ff191660011790558015610fa1576000805461ff0019166101001790555b60408051606081018252610708815260016020820181905261012c919092015260ca805468ffffffffffffffffff191666012c010000070817905560cd805491820181556000527f83978b4c69c48dd978ab43fe30f077615294f938fb7f936d9eb340e51ea7db2e0180546001600160a01b0319166001600160a01b0384161790558015610b47576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b611074611d34565b61107e600061232a565b565b60408051808201909152600081526060602082015260005b60ce548110156109b557826001600160a01b031660ce82815481106110bf576110bf613e66565b60009182526020909120600290910201546001600160a01b0316036111ba5760ce81815481106110f1576110f1613e66565b60009182526020918290206040805180820190915260029092020180546001600160a01b03168252600181018054929391929184019161113090613e7c565b80601f016020809104026020016040519081016040528092919081815260200182805461115c90613e7c565b80156111a95780601f1061117e576101008083540402835291602001916111a9565b820191906000526020600020905b81548152906001019060200180831161118c57829003601f168201915b505050505081525050915050919050565b600101611098565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461120a5760405162461bcd60e51b815260040161064f90613fed565b61121382610d8c565b61125f5760405162461bcd60e51b815260206004820152601860248201527f4f70657261746f72206e6f742077686974656c69737465640000000000000000604482015260640161064f565b610b47828261237c565b63ffffffff8116600090815260cb6020908152604091829020548451925190926112959290910161416d565b604051602081830303815290604052805190602001201461131e5760405162461bcd60e51b815260206004820152603d60248201527f737570706c696564207461736b20646f6573206e6f74206d617463682074686560448201527f206f6e65207265636f7264656420696e2074686520636f6e7472616374000000606482015260840161064f565b81516040015163ffffffff42811691161161136e5760405162461bcd60e51b815260206004820152601060248201526f15185cdac81a185cc8195e1c1a5c995960821b604482015260640161064f565b6040805160c0810182528351518201519181019182528351516080908101516001600160a01b03166060830152845160209081015163ffffffff1682840152600160a08401529282528285015192820192909252835190910151516000906001600160401b038111156113e3576113e36134d0565b60405190808252806020026020018201604052801561140c578160200160208202803683370190505b50905060005b81518110156114715784516080015180518290811061143357611433613e66565b60200260200101516000015182828151811061145157611451613e66565b6001600160a01b0390921660209283029190910190910152600101611412565b5061147c82826123ca565b63ffffffff8316600081815260cb602052604080822091909155517fa5be567caa88ff11b6da2cf017f9cefffcafa24111a9ecbf0b0bc476944f0f09906114c4908790614180565b60405180910390a250505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461151a5760405162461bcd60e51b815260040161064f90613fed565b610661816124ee565b60ce818154811061153357600080fd5b6000918252602090912060029091020180546001820180546001600160a01b0390921693509061156290613e7c565b80601f016020809104026020016040519081016040528092919081815260200182805461158e90613e7c565b80156115db5780601f106115b0576101008083540402835291602001916115db565b820191906000526020600020905b8154815290600101906020018083116115be57829003601f168201915b5050505050905082565b6115ee33610d03565b61160a5760405162461bcd60e51b815260040161064f90613fc0565b61066181612566565b600080836040516020016116279190614205565b604051602081830303815290604052905061164281846125b2565b949350505050565b60608160405160200161165d9190614205565b6040516020818303038152906040529050919050565b60808201516001600160a01b031633146117395760008260405160200161169a9190614205565b604051602081830303815290604052905060006116b782846125b2565b905083608001516001600160a01b0316816001600160a01b0316146117365760405162461bcd60e51b815260206004820152602f60248201527f5369676e6572206f6620726571756573745369676e6174757265206973206e6f60448201526e3a103932b8bab2b9ba1737bbb732b960891b606482015260840161064f565b50505b60006117498360600151426125f3565b60ca5490915063ffffffff65010000000000909104811690821611156117b15760405162461bcd60e51b815260206004820152601e60248201527f526571756573742074696d657374616d7020746f6f2066617220617761790000604482015260640161064f565b6040805161016081018252606060c08201819052600060e08301819052610100830181905261012083018190526101408301819052928201839052808201839052608082015260a081019190915283815263ffffffff4281166020830181905260ca5461181f92169061422e565b63ffffffff1660408281019190915260ca54640100000000900460ff1660608301525160009061185390839060200161416d565b60408051808303601f19018152919052805160209091012060ca5490915061188690640100000000900460ff1682612628565b608083015260405161189c90839060200161416d565b60408051601f19818403018152828252805160209182012060c9805463ffffffff908116600090815260cb90945293909220555416907f7738d1b30deac7824a0580de02efde3bb766c7b7b5ea79da34869ebd887cebf3906118ff90859061416d565b60405180910390a260c95461191b9063ffffffff16600161422e565b60c9805463ffffffff191663ffffffff929092169190911790555050505050565b6040516398ec1ac960e01b81526001600160a01b03828116600483015260009182917f000000000000000000000000000000000000000000000000000000000000000016906398ec1ac990602401602060405180830381865afa1580156119a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119cb919061424a565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166340bf2fb76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a51919061424a565b909110159392505050565b6060611a666129d3565b905090565b611a73611d34565b6001600160a01b038116611ad85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161064f565b6106618161232a565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b589190613d9a565b6001600160a01b0316336001600160a01b031614611b885760405162461bcd60e51b815260040161064f90613db7565b609854198119609854191614611c065760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161064f565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610798565b6001600160a01b038116611ccb5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161064f565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b0316331461107e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161064f565b60005b81811015611f8157828282818110611dab57611dab613e66565b9050602002810190611dbd9190614263565b611dce90604081019060200161349a565b6001600160a01b03166323b872dd3330868686818110611df057611df0613e66565b9050602002810190611e029190614263565b604080516001600160e01b031960e087901b1681526001600160a01b039485166004820152939092166024840152013560448201526064016020604051808303816000875af1158015611e59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7d9190613e01565b50828282818110611e9057611e90613e66565b9050602002810190611ea29190614263565b611eb390604081019060200161349a565b6001600160a01b031663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000858585818110611ef457611ef4613e66565b9050602002810190611f069190614263565b604080516001600160e01b031960e086901b1681526001600160a01b039093166004840152013560248201526044016020604051808303816000875af1158015611f54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f789190613e01565b50600101611d91565b50604051630da22a8b60e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631b44551690611fd09085908590600401614313565b600060405180830381600087803b158015611fea57600080fd5b505af1158015610a98573d6000803e3d6000fd5b606060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631703a0186040518163ffffffff1660e01b8152600401600060405180830381865afa158015612060573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612088919081019061442d565b8051519091506000816001600160401b038111156120a8576120a86134d0565b6040519080825280602002602001820160405280156120d1578160200160208202803683370190505b50905060005b828110156121315783518051829081106120f3576120f3613e66565b60200260200101516000015182828151811061211157612111613e66565b6001600160a01b03909216602092830291909101909101526001016120d7565b50604051639004134760e01b81526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906390041347906121839089908690600401614535565b600060405180830381865afa1580156121a0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526121c89190810190614594565b90506000836001600160401b038111156121e4576121e46134d0565b60405190808252806020026020018201604052801561220d578160200160208202803683370190505b5090506000805b8581101561225457600084828151811061223057612230613e66565b6020026020010151111561224c578161224881614629565b9250505b600101612214565b506000816001600160401b0381111561226f5761226f6134d0565b604051908082528060200260200182016040528015612298578160200160208202803683370190505b50905060005b8681101561231d5760008582815181106122ba576122ba613e66565b60200260200101511115612315578381815181106122da576122da613e66565b60200260200101518282815181106122f4576122f4613e66565b60200260200101906001600160a01b031690816001600160a01b0316815250505b60010161229e565b5098975050505050505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051639926ee7d60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639926ee7d90611fd09085908590600401614642565b60008260200151511161240f5760405162461bcd60e51b815260206004820152600d60248201526c4e6f207369676e61747572657360981b604482015260640161064f565b600061241a83612b10565b905060005b82518110156124e8576000805b83518110156124915784838151811061244757612447613e66565b60200260200101516001600160a01b031684828151811061246a5761246a613e66565b60200260200101516001600160a01b0316036124895760019150612491565b60010161242c565b50806124df5760405162461bcd60e51b815260206004820152601960248201527f4d697373696e67207769746e657373207369676e617475726500000000000000604482015260640161064f565b5060010161241f565b50505050565b6040516351b27a6d60e11b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063a364f4da906024015b600060405180830381600087803b15801561255257600080fd5b505af11580156109a6573d6000803e3d6000fd5b60405163a98fb35560e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a98fb35590612538908490600401613d87565b6000806125bf8451612bdf565b846040516020016125d192919061468d565b6040516020818303038152906040528051906020012090506116428184612d0a565b60008163ffffffff168363ffffffff16116126175761261283836146e8565b612621565b61262182846146e8565b9392505050565b60ce5460609060ff841611156126805760405162461bcd60e51b815260206004820152601e60248201527f496e7465726e616c3a204e6f7420656e6f756768206f70657261746f72730000604482015260640161064f565b600060ce805480602002602001604051908101604052809291908181526020016000905b8282101561277d576000848152602090819020604080518082019091526002850290910180546001600160a01b0316825260018101805492939192918401916126ec90613e7c565b80601f016020809104026020016040519081016040528092919081815260200182805461271890613e7c565b80156127655780601f1061273a57610100808354040283529160200191612765565b820191906000526020600020905b81548152906001019060200180831161274857829003601f168201915b505050505081525050815260200190600101906126a4565b50508251929350600091505060ff86166001600160401b038111156127a4576127a46134d0565b6040519080825280602002602001820160405280156127ea57816020015b6040805180820190915260008152606060208201528152602001906001900390816127c25790505b50905060005b81518160ff1610156129c957600083116128725760405162461bcd60e51b815260206004820152603760248201527f496e7465726e616c3a204665657320746f6f206c6f772e204e6f206f7065726160448201527f746f7273206c65667420746f207069636b2066726f6d2e000000000000000000606482015260840161064f565b6000836128bb61288560ff85168a614704565b60408051446020808301919091524282840152606080830194909452825180830390940184526080909101909152815191012090565b6128c5919061472d565b905060008582815181106128db576128db613e66565b60200260200101519050856001866128f39190614741565b8151811061290357612903613e66565b602002602001015186838151811061291d5761291d613e66565b6020908102919091010152612933600186614741565b9450612942816000015161193c565b61294d5750506127f0565b8060000151848460ff168151811061296757612967613e66565b6020026020010151600001906001600160a01b031690816001600160a01b0316815250508060200151848460ff16815181106129a5576129a5613e66565b60200260200101516020018190525082806129bf90614754565b93505050506127f0565b5095945050505050565b606060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631703a0186040518163ffffffff1660e01b8152600401600060405180830381865afa158015612a35573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a5d919081019061442d565b905060008160000151516001600160401b03811115612a7e57612a7e6134d0565b604051908082528060200260200182016040528015612aa7578160200160208202803683370190505b50905060005b825151811015612b09578251805182908110612acb57612acb613e66565b602002602001015160000151828281518110612ae957612ae9613e66565b6001600160a01b0390921660209283029190910190910152600101612aad565b5092915050565b60606000612b218360000151612d26565b905060008360200151516001600160401b03811115612b4257612b426134d0565b604051908082528060200260200182016040528015612b6b578160200160208202803683370190505b50905060005b846020015151811015612bd757612ba58386602001518381518110612b9857612b98613e66565b60200260200101516125b2565b828281518110612bb757612bb7613e66565b6001600160a01b0390921660209283029190910190910152600101612b71565b509392505050565b606081600003612c065750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612c305780612c1a81614629565b9150612c299050600a83614773565b9150612c0a565b6000816001600160401b03811115612c4a57612c4a6134d0565b6040519080825280601f01601f191660200182016040528015612c74576020820181803683370190505b509050815b8515612d0157612c8a600182614741565b90506000612c99600a88614773565b612ca490600a614787565b612cae9088614741565b612cb990603061479e565b905060008160f81b905080848481518110612cd657612cd6613e66565b60200101906001600160f81b031916908160001a905350612cf8600a89614773565b97505050612c79565b50949350505050565b6000806000612d198585612d96565b91509150612bd781612e04565b6060612d568260000151604051602001612d4291815260200190565b604051602081830303815290604052612fba565b612d638360200151613173565b612d76846040015163ffffffff16612bdf565b612d838560600151612bdf565b60405160200161165d94939291906147b7565b6000808251604103612dcc5760208301516040840151606085015160001a612dc0878285856132d5565b94509450505050612dfd565b8251604003612df55760208301516040840151612dea8683836133c2565b935093505050612dfd565b506000905060025b9250929050565b6000816004811115612e1857612e1861483d565b03612e205750565b6001816004811115612e3457612e3461483d565b03612e815760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161064f565b6002816004811115612e9557612e9561483d565b03612ee25760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161064f565b6003816004811115612ef657612ef661483d565b03612f4e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161064f565b6004816004811115612f6257612f6261483d565b036106615760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161064f565b6060600082516002612fcc9190614787565b6001600160401b03811115612fe357612fe36134d0565b6040519080825280601f01601f19166020018201604052801561300d576020820181803683370190505b5060408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b602082015290915060005b84518110156131495781825186838151811061305957613059613e66565b016020015161306b919060f81c614773565b8151811061307b5761307b613e66565b01602001516001600160f81b03191683613096836002614787565b815181106130a6576130a6613e66565b60200101906001600160f81b031916908160001a9053508182518683815181106130d2576130d2613e66565b01602001516130e4919060f81c61472d565b815181106130f4576130f4613e66565b01602001516001600160f81b0319168361310f836002614787565b61311a906001614704565b8151811061312a5761312a613e66565b60200101906001600160f81b031916908160001a90535060010161303b565b508160405160200161315b9190614853565b60405160208183030381529060405292505050919050565b60408051602880825260608281019093526000919060208201818036833701905050905060005b60148110156132ac5760006131b0826013614741565b6131bb906008614787565b6131c690600261495c565b6131d9906001600160a01b038716614773565b60f81b9050600060108260f81c6131f09190614968565b60f81b905060008160f81c6010613207919061498a565b8360f81c61321591906149a6565b60f81b9050613223826133fc565b8561322f866002614787565b8151811061323f5761323f613e66565b60200101906001600160f81b031916908160001a90535061325f816133fc565b8561326b866002614787565b613276906001614704565b8151811061328657613286613e66565b60200101906001600160f81b031916908160001a905350506001909201915061319a9050565b50806040516020016132be9190614853565b604051602081830303815290604052915050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561330c57506000905060036133b9565b8460ff16601b1415801561332457508460ff16601c14155b1561333557506000905060046133b9565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613389573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166133b2576000600192509250506133b9565b9150600090505b94509492505050565b6000806001600160ff1b038316816133df60ff86901c601b614704565b90506133ed878288856132d5565b9350935050505b935093915050565b6000600a60f883901c10156134235761341a60f883901c603061479e565b60f81b92915050565b61341a60f883901c605761479e565b919050565b50805461344390613e7c565b6000825580601f10613453575050565b601f01602090049060005260206000209081019061066191905b80821115613481576000815560010161346d565b5090565b6001600160a01b038116811461066157600080fd5b6000602082840312156134ac57600080fd5b813561262181613485565b6000602082840312156134c957600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715613508576135086134d0565b60405290565b604051606081016001600160401b0381118282101715613508576135086134d0565b60405160c081016001600160401b0381118282101715613508576135086134d0565b604051602081016001600160401b0381118282101715613508576135086134d0565b604051601f8201601f191681016001600160401b038111828210171561359c5761359c6134d0565b604052919050565b600082601f8301126135b557600080fd5b8135602083016000806001600160401b038411156135d5576135d56134d0565b50601f8301601f19166020016135ea81613574565b9150508281528583830111156135ff57600080fd5b82826020830137600092810160200192909252509392505050565b60006040828403121561362c57600080fd5b6136346134e6565b9050813561364181613485565b815260208201356001600160401b0381111561365c57600080fd5b613668848285016135a4565b60208301525092915050565b60006020828403121561368657600080fd5b81356001600160401b0381111561369c57600080fd5b6116428482850161361a565b600080602083850312156136bb57600080fd5b82356001600160401b038111156136d157600080fd5b8301601f810185136136e257600080fd5b80356001600160401b038111156136f857600080fd5b8560208260051b840101111561370d57600080fd5b6020919091019590945092505050565b801515811461066157600080fd5b6000806040838503121561373e57600080fd5b823561374981613485565b915060208301356137598161371d565b809150509250929050565b803563ffffffff8116811461343257600080fd5b803560ff8116811461343257600080fd5b6000606082840312801561379c57600080fd5b506137a561350e565b6137ae83613764565b81526137bc60208401613778565b60208201526137cd60408401613764565b60408201529392505050565b6000602082840312156137eb57600080fd5b61262182613764565b602080825282518282018190526000918401906040840190835b818110156138355783516001600160a01b031683526020938401939092019160010161380e565b509095945050505050565b60006020828403121561385257600080fd5b61262182613778565b60005b8381101561387657818101518382015260200161385e565b50506000910152565b6000815180845261389781602086016020860161385b565b601f01601f19169290920160200192915050565b60018060a01b0381511682526000602082015160406020850152611642604085018261387f565b60208152600061262160208301846138ab565b600080604083850312156138f857600080fd5b823561390381613485565b915060208301356001600160401b0381111561391e57600080fd5b83016060818603121561393057600080fd5b61393861350e565b81356001600160401b0381111561394e57600080fd5b61395a878285016135a4565b8252506020828101359082015260409182013591810191909152919491935090915050565b600060a0828403121561399157600080fd5b60405160a081016001600160401b03811182821017156139b3576139b36134d0565b60405290508082356001600160401b038111156139cf57600080fd5b6139db858286016135a4565b82525060208381013590820152604080840135908201526139fe60608401613764565b60608201526080830135613a1181613485565b6080919091015292915050565b60006001600160401b03821115613a3757613a376134d0565b5060051b60200190565b600082601f830112613a5257600080fd5b8135613a65613a6082613a1e565b613574565b8082825260208201915060208360051b860101925085831115613a8757600080fd5b602085015b838110156129c95780356001600160401b03811115613aaa57600080fd5b613ab9886020838a010161361a565b84525060209283019201613a8c565b600082601f830112613ad957600080fd5b8135613ae7613a6082613a1e565b8082825260208201915060208360051b860101925085831115613b0957600080fd5b602085015b838110156129c95780356001600160401b03811115613b2c57600080fd5b613b3b886020838a01016135a4565b84525060209283019201613b0e565b60008060408385031215613b5d57600080fd5b82356001600160401b03811115613b7357600080fd5b830160408186031215613b8557600080fd5b613b8d6134e6565b81356001600160401b03811115613ba357600080fd5b820160c08188031215613bb557600080fd5b613bbd613530565b81356001600160401b03811115613bd357600080fd5b613bdf8982850161397f565b825250613bee60208301613764565b6020820152613bff60408301613764565b6040820152613c1060608301613778565b606082015260808201356001600160401b03811115613c2e57600080fd5b613c3a89828501613a41565b60808301525060a09182013591810191909152815260208201356001600160401b03811115613c6857600080fd5b613c7487828501613ac8565b6020830152508093505050613c8b60208401613764565b90509250929050565b6001600160a01b03831681526040602082018190526000906116429083018461387f565b600060208284031215613cca57600080fd5b81356001600160401b03811115613ce057600080fd5b611642848285016135a4565b60008060408385031215613cff57600080fd5b82356001600160401b03811115613d1557600080fd5b613d218582860161397f565b92505060208301356001600160401b03811115613d3d57600080fd5b613d49858286016135a4565b9150509250929050565b600060208284031215613d6557600080fd5b81356001600160401b03811115613d7b57600080fd5b6116428482850161397f565b602081526000612621602083018461387f565b600060208284031215613dac57600080fd5b815161262181613485565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215613e1357600080fd5b81516126218161371d565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680613e9057607f821691505b602082108103613eb057634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115613efd57806000526020600020601f840160051c81016020851015613edd5750805b601f840160051c820191505b818110156109a65760008155600101613ee9565b505050565b81516001600160401b03811115613f1b57613f1b6134d0565b613f2f81613f298454613e7c565b84613eb6565b6020601f821160018114613f635760008315613f4b5750848201515b600019600385901b1c1916600184901b1784556109a6565b600084815260208120601f198516915b82811015613f935787850151825560209485019460019092019101613f73565b5084821015613fb15786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60208082526013908201527221b0b63632b91034b9903737ba1030b236b4b760691b604082015260600190565b6020808252604a908201527f4543445341536572766963654d616e61676572426173652e6f6e6c795374616b60408201527f6552656769737472793a2063616c6c6572206973206e6f7420746865207374616060820152696b65526567697374727960b01b608082015260a00190565b6000815160a0845261407260a085018261387f565b602084810151908601526040808501519086015260608085015163ffffffff16908601526080938401516001600160a01b031693909401929092525090919050565b6000815160c084526140c960c085018261405d565b905063ffffffff602084015116602085015263ffffffff604084015116604085015260ff60608401511660608501526080830151848203608086015281815180845260208401915060208160051b85010160208401935060005b8281101561415457601f1986830301845261413f8286516138ab565b60209586019594909401939150600101614123565b5060a087015160a0890152809550505050505092915050565b60208152600061262160208301846140b4565b60208152600082516040602084015261419c60608401826140b4565b602085810151858303601f19016040870152805180845292935081019181840191600582901b85010160005b828110156141f957601f198683030184526141e482865161387f565b602095860195949094019391506001016141c8565b50979650505050505050565b602081526000612621602083018461405d565b634e487b7160e01b600052601160045260246000fd5b63ffffffff8181168382160190811115610e0457610e04614218565b60006020828403121561425c57600080fd5b5051919050565b60008235609e1983360301811261427957600080fd5b9190910192915050565b803561343281613485565b6bffffffffffffffffffffffff8116811461066157600080fd5b81835260208301925060008160005b848110156143095781356142ca81613485565b6001600160a01b0316865260208201356142e38161428e565b6bffffffffffffffffffffffff16602087015260409586019591909101906001016142b7565b5093949350505050565b6020808252810182905260006040600584901b830181019083018583609e1936839003015b8782101561442057868503603f19018452823581811261435757600080fd5b8901803536829003601e1901811261436e57600080fd5b81016020810190356001600160401b0381111561438a57600080fd5b8060061b360382131561439c57600080fd5b60a088526143ae60a0890182846142a8565b9150506143bd60208301614283565b6001600160a01b03166020880152604082810135908801526143e160608301613764565b63ffffffff1660608801526143f860808301613764565b63ffffffff811660808901529150955050602093840193929092019160019190910190614338565b5092979650505050505050565b60006020828403121561443f57600080fd5b81516001600160401b0381111561445557600080fd5b82016020818503121561446757600080fd5b61446f613552565b81516001600160401b0381111561448557600080fd5b80830192505084601f83011261449a57600080fd5b81516144a8613a6082613a1e565b8082825260208201915060208360061b8601019250878311156144ca57600080fd5b6020850194505b8285101561452857604085890312156144e957600080fd5b6144f16134e6565b85516144fc81613485565b8152602086015161450c8161428e565b80602083015250808352506020820191506040850194506144d1565b8352509095945050505050565b6001600160a01b0383168152604060208083018290528351918301829052600091908401906060840190835b818110156145885783516001600160a01b0316835260209384019390920191600101614561565b50909695505050505050565b6000602082840312156145a657600080fd5b81516001600160401b038111156145bc57600080fd5b8201601f810184136145cd57600080fd5b80516145db613a6082613a1e565b8082825260208201915060208360051b8501019250868311156145fd57600080fd5b6020840193505b8284101561461f578351825260209384019390910190614604565b9695505050505050565b60006001820161463b5761463b614218565b5060010190565b60018060a01b038316815260406020820152600082516060604084015261466c60a084018261387f565b90506020840151606084015260408401516080840152809150509392505050565b7f19457468657265756d205369676e6564204d6573736167653a0a0000000000008152600083516146c581601a85016020880161385b565b8351908301906146dc81601a84016020880161385b565b01601a01949350505050565b63ffffffff8281168282160390811115610e0457610e04614218565b80820180821115610e0457610e04614218565b634e487b7160e01b600052601260045260246000fd5b60008261473c5761473c614717565b500690565b81810381811115610e0457610e04614218565b600060ff821660ff810361476a5761476a614218565b60010192915050565b60008261478257614782614717565b500490565b8082028115828204841417610e0457610e04614218565b60ff8181168382160190811115610e0457610e04614218565b600085516147c9818460208a0161385b565b600560f91b90830190815285516147e7816001840160208a0161385b565b600560f91b60019290910191820152845161480981600284016020890161385b565b600181830101915050600560f91b6001820152835161482f81600284016020880161385b565b016002019695505050505050565b634e487b7160e01b600052602160045260246000fd5b61060f60f31b81526000825161487081600285016020870161385b565b9190910160020192915050565b6001815b60018411156133f45780850481111561489c5761489c614218565b60018416156148aa57908102905b60019390931c928002614881565b6000826148c757506001610e04565b816148d457506000610e04565b81600181146148ea57600281146148f457614910565b6001915050610e04565b60ff84111561490557614905614218565b50506001821b610e04565b5060208310610133831016604e8410600b8410161715614933575081810a610e04565b614940600019848461487d565b806000190482111561495457614954614218565b029392505050565b600061262183836148b8565b600060ff83168061497b5761497b614717565b8060ff84160491505092915050565b60ff8181168382160290811690818114612b0957612b09614218565b60ff8281168282160390811115610e0457610e0461421856fea26469706673582212205b54d39db01ec87955542a63c3a53e876a29b21585e12d554ae6989e796dedf764736f6c634300081a0033"; + "0x61018080604052346102dc57604051601f612f9838819003918201601f19168301916001600160401b038311848410176102c85780849260e0946040528339810103126102785780516001600160a01b0381168103610274576020820151916001600160a01b0383168303610274576040810151906001600160a01b03821682036102745760608101516001600160a01b0381169290839003610274576080820151926001600160a01b03841684036102745760a0830151926001600160a01b03841684036102745760c00151946001600160a01b03861686036102745760805260c0528460e052610100526101205260a0525f5460ff8160081c1661021f5760ff808216036101e5575b506101405261016052604051612c6e908161032a823960805181818161077f0152818161086b01528181610d8901526110ed015260a0518181816105a301526112ff015260c0518181816101e1015281816109120152610bd3015260e05181818161054a0152818161083b01528181610d6101528181611e7801526125b6015261010051818181611fc501526126150152610120518181816106a901528181610c60015281816113db01528181611705015281816117840152611825015261014051816107f001526101605181818161049d01526113450152f35b60ff90811916175f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a18261010a565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b5f80fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fdfe60806040526004361015610071575b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b5f5f3560e01c80631785f53c146118015780631fdb0cfd1461176a578063279432eb146116e15780632e8da829146116b457806333cfb7b7146116905780633bc28c8c1461166b578063485cc9551461122b57806352efdca014611163578063630868dc1461111c5780636b3aa72e146110d8578063715018a61461107b5780638da5cb5b1461105357806396d356c514610eca5780639926ee7d14610cc55780639da16d8e14610c3c578063a0169ddd14610baf578063a20b99bf146108d4578063a364f4da1461081f578063a50a640e146107db578063a98fb35514610733578063ba5508801461068f578063c1a8e2c5146104cc578063cf1d6b4214610488578063e481af9d1461045d578063f2fde38b146103cc578063fc299dee146103a45763fce36c7d146101a5575061000e565b3461039f576020366003190112610284576004356001600160401b03811161039a576101d5903690600401611c2b565b91906101df612953565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690825b8481106103365750813b15610331576040519363fce36c7d60e01b855280602486016020600488015252604485019060448160051b8701019280928690609e1983360301905b8483106102945788808b8181808c0381838f5af18015610289576102735750f35b8161027d91611ab2565b6102845780f35b6118fc565b6040513d84823e3d90fd5b9091929394956043198a82030182528635908382121561032c5760208091876001940190608063ffffffff610318826102de6102d0878061251c565b60a0885260a0880191612550565b95898060a01b036102f08983016119b6565b1688870152604081013560408701528361030c60608301611ccb565b16606087015201611ccb565b169101529801920193019190949392610252565b6124d7565b611cdc565b8061036b610352602061034c6001958a88612833565b01612439565b604061035f848a88612833565b01359030903390612976565b61039461037e602061034c848a88612833565b85604061038c858b89612833565b0135916129c1565b0161020c565b61194c565b6118ac565b503461039f57366003190112610284576065546040516001600160a01b039091168152602090f35b503461039f576020366003190112610284576103e661199c565b6103ee612855565b6001600160a01b03811615610409576104069061290b565b80f35b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b503461039f57366003190112610284576104846104786125b4565b60405191829182611a15565b0390f35b503461039f57366003190112610284576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461039f576040366003190112610284576104e661199c565b90602435916001600160401b03831161039a573660238401121561068a5782600401359261051384611cb4565b936105216040519586611ab2565b8085526024602086019160051b8301019136831161068557602401905b82821061066d575050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361065e576040519061058582611a83565b6001600160a01b0390811682523060208301908152604083019485527f000000000000000000000000000000000000000000000000000000000000000090911693909190843b1561033157604051636e3492b560e01b815260206004820181905292516001600160a01b03908116602483015293519093166044840152516060606484015280516084840181905260a48401929190910190845b81811061064257505050818394818581819503925af18015610289576102735750f35b825163ffffffff1684526020938401939092019160010161061f565b634394dbdf60e11b8252600482fd5b6020809161067a84611ccb565b81520191019061053e565b611bd2565b611ad3565b503461039f5761069e366119ca565b916106a7612855565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692833b1561033157604051630664120160e01b81523060048201526001600160a01b0392831660248201529290911660448301526001600160e01b0319166064820152829182908290818381608481015b03925af18015610289576102735750f35b503461039f576020366003190112610284576004356001600160401b03811161039a573660238201121561068a57610775903690602481600401359101611b47565b61077d612855565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561033157826107228193829360405194858094819363a98fb35560e01b83526020600484015260248301906122ea565b503461039f57366003190112610284576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461039f5760203660031901126102845761083961199c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361065e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610331576040516351b27a6d60e11b81526001600160a01b03909216600483015282919082908290602490829084905af18015610289576102735750f35b503461039f576020366003190112610284576004356001600160401b03811161039a57610905903690600401611c2b565b610910929192612953565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316825b828110610afa5750803b156103315760405191634e5cd2fd60e11b835280604484013060048601526040602486015252606483019460648260051b8501019181869060be19813603015b8383106109a7578880898181808b0381838e5af18015610289576102735750f35b9091929394606319888203018a5285358281121561032c578301906109dd6109cf838061251c565b60c0845260c0840191612550565b916001600160a01b036109f2602083016119b6565b1660208301526020610a07604083018361251c565b848603604086015280865294909101938c905b808210610aca5750505063ffffffff610a3560608301611ccb565b16606083015263ffffffff610a4c60808301611ccb565b16608083015260a0810135601e198236030181121561032c5701906020823592016001600160401b038311610ac5578236038113610ac05783836020948594938460a0879660019a03910152818452848401378d838284010152601f8019910116010197019a019301919098939298610986565b612492565b61244d565b909194604080600192838060a01b03610ae28a6119b6565b16815260208901356020820152019601920190610a1a565b909291829483955b610b1a610b10858585612353565b604081019061237a565b9050871015610b6a57610b31610b10858585612353565b881015610b56576001916020610b4e928a60061b01013590611dd4565b960195610b02565b634e487b7160e01b86526032600452602486fd5b600192949593919650610ba990610b9381308a610b8e602061034c898d3395612353565b612976565b84610ba4602061034c868a8d612353565b6129c1565b0161093c565b503461039f57602036600319011261028457610bc961199c565b610bd1612855565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103315760405163a0169ddd60e01b81526001600160a01b03909216600483015282919082908290602490829084905af18015610289576102735750f35b503461039f57602036600319011261028457610c5661199c565b610c5e612855565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561033157604051634f906cf960e01b81523060048201526001600160a01b03909116602482015282918290829081838160448101610722565b503461039f57604036600319011261028457610cdf61199c565b6024356001600160401b03811161039a5760606003198236030112610e795760405191610d0b83611a83565b81600401356001600160401b038111610e285782013660238201121561068a57610d3f903690602460048201359101611b47565b8352602083019060248301358252604460408501930135835260018060a01b037f0000000000000000000000000000000000000000000000000000000000000000163303610e19577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561033157859485610dfb93819560405197889687958694639926ee7d60e01b865260018060a01b0316600486015260406024860152516060604486015260a48501906122ea565b9151606484015251608483015203925af18015610289576102735750f35b634394dbdf60e11b8552600485fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b503461039f57602036600319011261028457610ee461199c565b610eec612855565b610ef581611d2f565b15610ff0576001600160a01b0316815b60975480821015610fea5782610f1a83611a57565b905460039190911b1c6001600160a01b031614610f3a5750600101610f05565b9091505f198101908111610fd65790610f70610f58610f9493611a57565b905460039190911b1c6001600160a01b031691611a57565b81546001600160a01b0393841660039290921b91821b9390911b1916919091179055565b6097548015610fc2575f1901610fa981611a57565b81549060018060a01b039060031b1b1916905560975580f35b634e487b7160e01b82526031600452602482fd5b634e487b7160e01b83526011600452602483fd5b50505080f35b60405162461bcd60e51b815260206004820152603560248201527f72656d6f76654f70657261746f7246726f6d57686974656c6973743a206f70656044820152741c985d1bdc881b9bdd081dda1a5d195b1a5cdd1959605a1b6064820152608490fd5b503461039f57366003190112610284576033546040516001600160a01b039091168152602090f35b503461039f578060031936011261028457611094612855565b603380546001600160a01b0319811690915581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461039f57366003190112610284576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461039f576020366003190112610284576004359060975482101561116057602061114783611a57565b905460405160039290921b1c6001600160a01b03168152f35b80fd5b503461039f5760203660031901126102845761117d61199c565b611185612855565b61118e81611d2f565b6111c957609754600160401b8110156111b55790610f708260016104069401609755611a57565b634e487b7160e01b83526041600452602483fd5b60405162461bcd60e51b815260206004820152603460248201527f6164644f70657261746f72546f57686974656c6973743a206f70657261746f7260448201527308185b1c9958591e481dda1a5d195b1a5cdd195960621b6064820152608490fd5b503461039f5760403660031901126102845761124561199c565b602435906001600160a01b03821682036116675782549160ff8360081c16159283809461165a575b8015611643575b156115e75760ff1981166001178555836115d6575b5060ff845460081c161561157d576112a36112a89261290b565b6128ad565b6020906040516112b88382611ab2565b8381525f3681378051906001600160401b03821161156957600160401b821161156957839060975483609755808410611508575b500160978552845b8281106114cd5750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169050803b15610331576040516334f65bfd60e21b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660248201819052908590818160448183885af18015610289576114b8575b5050813b15610331578460405163a982182160e01b8152306004820152604060248201526004604482015263544f444f60e01b6064820152818160848183885af18015610289576114a3575b50507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561033157859260848492836040519586948593634a86c03760e11b855230600486015260248501526044840152630130fc2760e51b60648401525af180156102895761148e575b5050611458575080f35b7f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989061ff0019835416835560405160018152a180f35b8161149891611ab2565b61028457825f61144e565b816114ad91611ab2565b61028457845f6113d7565b816114c291611ab2565b61028457845f61138b565b81516001600160a01b03167f354a83ed9988f79f6038d4c7a7dadbad8af32f4ad6df893e0e5807a1b1944ff9820155908401906001016112f4565b7f354a83ed9988f79f6038d4c7a7dadbad8af32f4ad6df893e0e5807a1b1944ff901837f354a83ed9988f79f6038d4c7a7dadbad8af32f4ad6df893e0e5807a1b1944ff9015b81811061155b57506112ec565b87815586935060010161154e565b634e487b7160e01b85526041600452602485fd5b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b61ffff19166101011784555f611289565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b50303b1580156112745750600160ff821614611274565b50600160ff82161061126d565b8280fd5b503461039f5760203660031901126102845761040661168861199c565b6112a3612855565b3461039f576020366003190112610284576104846104786116af61199c565b611e76565b3461039f5760203660031901126102845760206116d76116d261199c565b611d2f565b6040519015158152f35b503461039f576020366003190112610284576116fb61199c565b611703612855565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b156103315760405163eb5a4e8760e01b81523060048201526001600160a01b03909116602482015282918290829081838160448101610722565b503461039f57611779366119ca565b91611782612855565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692833b1561033157604051634a86c03760e11b81523060048201526001600160a01b0392831660248201529290911660448301526001600160e01b031916606482015282918290829081838160848101610722565b50346118ac5760203660031901126102845761181b61199c565b611823612855565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156103315760405163268959e560e01b81523060048201526001600160a01b039290921660248301525f908290604490829084905af180156118a157611893575080f35b61189f91505f90611ab2565b005b6040513d5f823e3d90fd5b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b600435906001600160a01b03821682036119b257565b5f80fd5b35906001600160a01b03821682036119b257565b6060906003190112610284576004356001600160a01b03811681036119b257906024356001600160a01b03811681036119b257906044356001600160e01b0319811681036119b25790565b60206040818301928281528451809452019201905f5b818110611a385750505090565b82516001600160a01b0316845260209384019390920191600101611a2b565b609754811015611a6f5760975f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b606081019081106001600160401b03821117611a9e57604052565b634e487b7160e01b5f52604160045260245ffd5b90601f801991011681019081106001600160401b03821117611a9e57604052565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b6001600160401b038111611a9e57601f01601f191660200190565b929192611b5382611b2c565b91611b616040519384611ab2565b829481845281830111611b7d578281602093845f960137010152565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b9181601f8401121561068a578235916001600160401b038311611c5b576020808501948460051b01011161068557565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b6001600160401b038111611a9e5760051b60200190565b359063ffffffff821682036119b257565b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b609754905f5b828110611d43575050505f90565b611d4c81611a57565b905460039190911b1c6001600160a01b0390811690831614611d7057600101611d35565b505050600190565b90816020910312610284575160ff811681036119b25790565b90611d9b82611cb4565b611da86040519182611ab2565b8281528092611db9601f1991611cb4565b0190602036910137565b908151811015611a6f570160200190565b91908201809211611de157565b634e487b7160e01b5f52601160045260245ffd5b908160409103126102845760405190604082018281106001600160401b03821117611a9e576040528051906001600160a01b03821682036119b257602091835201516bffffffffffffffffffffffff811681036119b257602082015290565b8051821015611a6f5760209160051b010190565b5f198114611de15760010190565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610331576040516309aa152760e11b81526001600160a01b039092166004830152602082602481845afa9182156118a1575f926122b6575b50803b15610331576040519163871ef04960e01b83526004830152602082602481845afa9182156118a1575f92612272575b506001600160c01b038216908115908115612209575b506121ef57805f915b6121ca575061ffff16611f3e81611b2c565b90611f4c6040519283611ab2565b808252611f5b601f1991611b2c565b013660208301375f5f5b82518210806121bf575b15611fbd576001811b84166001600160c01b0316611f96575b611f9190611e68565b611f65565b906001611f919160ff60f81b8460f81b165f1a611fb38287611dc3565b5301919050611f88565b505f939250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690835b815185101561207f576120038583611dc3565b5160f81c833b156103315760405190633ca5a5f560e01b82526004820152602081602481875afa9081156118a1575f9161204d575b5061204590600192611dd4565b940193611ff0565b90506020813d8211612077575b8161206760209383611ab2565b8101031261028457516001612038565b3d915061205a565b61208a919450611d91565b925f905f5b81518110156121b9576120a28183611dc3565b5160f81c843b1561033157604051633ca5a5f560e01b81526004810182905290602082602481895afa9182156118a1575f92612186575b50905f915b8183106120f05750505060010161208f565b909194863b1561033157604080516356e4026d60e11b815260ff841660048201526024810188905290816044818b5afa9182156118a15760019261214f925f91612158575b50838060a01b03905116612149828d611e54565b52611e68565b950191906120de565b612179915060403d811161217f575b6121718183611ab2565b810190611df5565b5f612135565b503d612167565b9091506020813d82116121b1575b816121a160209383611ab2565b810103126102845751905f6120d9565b3d9150612194565b50505050565b506101008110611f6f565b5f198101818111611de15761ffff9116911661ffff8114611de1576001019080611f2c565b50506040516121ff602082611ab2565b5f81525f36813790565b8091503b1561033157602060049160405192838092639aa1653d60e01b82525afa80156118a15760ff915f91612243575b5016155f611f23565b612265915060203d60201161226b575b61225d8183611ab2565b810190611d78565b5f61223a565b503d612253565b9091506020813d6020116122ae575b8161228e60209383611ab2565b8101031261028457516001600160c01b03811681036119b257905f611f0d565b3d9150612281565b9091506020813d6020116122e2575b816122d260209383611ab2565b810103126102845751905f611edb565b3d91506122c5565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206f6666736574000000006044820152606490fd5b9190811015611a6f5760051b8101359060be1981360301821215612375570190565b61230e565b903590601e198136030182121561237557018035906001600160401b0382116123f457602001918160061b360383136123af57565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c64617461207461696c20746f6f2073686f72740000000000000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206c656e677468000000006044820152606490fd5b356001600160a01b03811681036119b25790565b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206c656e67746800006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c64617461206163636573732073747269646500006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206f666673657400006044820152606490fd5b9035601e198236030181121561032c5701602081359101916001600160401b038211610ac5578160061b36038313610ac057565b916020908281520191905f905b80821061256a5750505090565b909192833560018060a01b0381168091036119b25781526020840135906bffffffffffffffffffffffff82168092036119b25760408160019360208394015201940192019061255d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561033157604051639aa1653d60e01b8152602081600481855afa80156118a15760ff915f91612814575b501680156121ef577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316905f9081905b80831061279757506126559150611d91565b925f905f5b843b1561033157604051639aa1653d60e01b8152602081600481895afa80156118a15760ff915f91612779575b50168110156127725760ff8116843b1561033157604051633ca5a5f560e01b81526004810182905290602082602481895afa9182156118a1575f9261273f575b50905f915b8183106126de5750505060010161265a565b909194863b1561033157604080516356e4026d60e11b815260ff841660048201526024810188905290816044818b5afa9182156118a157600192612736925f916121585750838060a01b03905116612149828d611e54565b950191906126cc565b9091506020813d821161276a575b8161275a60209383611ab2565b810103126102845751905f6126c7565b3d915061274d565b5092505050565b612791915060203d811161226b5761225d8183611ab2565b5f612687565b90833b1561033157604051633ca5a5f560e01b815260ff84166004820152602081602481885afa9081156118a1575f916127e2575b506127d990600192611dd4565b92019190612643565b90506020813d821161280c575b816127fc60209383611ab2565b81010312610284575160016127cc565b3d91506127ef565b61282d915060203d60201161226b5761225d8183611ab2565b5f61260b565b9190811015611a6f5760051b81013590609e1981360301821215612375570190565b6033546001600160a01b0316330361286957565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b606554604080516001600160a01b038084168252841660208201529192917fe11cddf1816a43318ca175bbc52cd0185436e9cbead7c83acc54a73e461717e39190a16001600160a01b03166001600160a01b03199190911617606555565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b6065546001600160a01b0316330361296757565b638e79fdb560e01b5f5260045ffd5b6040516323b872dd60e01b60208201526001600160a01b0392831660248201529290911660448301526064808301939093529181526129bf916129ba608483611ab2565b612a87565b565b6001600160a01b038116803b1561033157604051636eb1769f60e11b81523060048201526001600160a01b038416602482015290602090829060449082905afa9081156118a1575f91612a53575b506129bf93612a1d91611dd4565b60405163095ea7b360e01b60208201526001600160a01b03909316602484015260448084019190915282526129ba606483611ab2565b90506020813d602011612a7f575b81612a6e60209383611ab2565b8101031261028457516129bf612a0f565b3d9150612a61565b90612b069160018060a01b03165f8060405193612aa5604086611ab2565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564602086015260208151910182855af13d15612b97573d91612aea83611b2c565b92612af86040519485611ab2565b83523d5f602085013e612b9b565b8051908115918215612b74575b505015612b1c57565b60405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b8192509060209181010312610284576020015180151581036119b2575f80612b13565b6060915b91929015612bfd5750815115612baf575090565b3b15612bb85790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015612c105750805190602001fd5b60405162461bcd60e51b815260206004820152908190612c349060248301906122ea565b0390fdfea2646970667358221220cf84c446bd15381c29ed2bc3c5bff5551d0a0874f415e278d29ab20bd351abde64736f6c634300081c0033"; type ReclaimServiceManagerConstructorParams = | [signer?: Signer] @@ -1164,27 +659,43 @@ export class ReclaimServiceManager__factory extends ContractFactory { override deploy( _avsDirectory: string, + _slashingRegistryCoordinator: string, _stakeRegistry: string, - _delegationManager: string, + rewards_coordinator: string, + allocationManager: string, + _permissionController: string, + _taskManager: string, overrides?: Overrides & { from?: string } ): Promise { return super.deploy( _avsDirectory, + _slashingRegistryCoordinator, _stakeRegistry, - _delegationManager, + rewards_coordinator, + allocationManager, + _permissionController, + _taskManager, overrides || {} ) as Promise; } override getDeployTransaction( _avsDirectory: string, + _slashingRegistryCoordinator: string, _stakeRegistry: string, - _delegationManager: string, + rewards_coordinator: string, + allocationManager: string, + _permissionController: string, + _taskManager: string, overrides?: Overrides & { from?: string } ): TransactionRequest { return super.getDeployTransaction( _avsDirectory, + _slashingRegistryCoordinator, _stakeRegistry, - _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..88a344f2 --- /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 = + "0x61016080604052346104c457615e7e8038038061001b81610511565b92833981019060e081830312610474578051916001600160a01b0383168303610470576020820151926001600160a01b03841684036104705760408301516001600160a01b03811681036104705760608401516001600160a01b0381168103610470576080850151916001600160a01b03831683036104705760a0860151966001600160a01b038816968789036104705760c0810151906001600160401b03821161042057019486601f870112156103c75785516001600160401b0381116103b3576100f0601f8201601f1916602001610511565b9681885260208801986020838301011161035e57815f9260208093018b5e8801015260c05260a05260e05260805261010052601f8151116103225751905160208210610312575b176101205215610303576101405260325460ff8160081c166102ae5760ff80821603610273575b604051615947908161053782396080518181816127e801526137d8015260a051818181610cf701528181610f920152818161158b01528181611bd601528181611f7401528181614323015281816148290152614ab8015260c051818181610ff7015281816114c601528181611c1a01528181611eb0015281816136e60152818161488b01528181614b1a0152615391015260e0518181816110590152818161152a01528181611f130152818161232c01528181612c7c015281816149000152614b8f01526101005181818161141001528181611e46015281816126de01528181613a1101526150710152610120518161193d015261014051818181610b1a01528181611a76015281816122a101526128d80152f35b60ff90811916176032557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a18061015e565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b6339b190bb60e11b5f5260045ffd5b5f198260200360031b1b16610137565b60449060405192839163305a27a960e01b8352602060048401525180918160248501528484015e5f828201840152601f01601f19168101030190fd5b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b5f80fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b6040519190601f01601f191682016001600160401b038111838210176103b35760405256fe6080604052600436106129ba575f3560e01c8062cf2ab51461037a57806303fd34921461037557806304ec635114610370578063054310e61461036b5780630cf4b767146103665780630d3f213414610361578063125e05841461035c57806313542a4e14610357578063136439dd146103525780631478851f1461034d5780631eb812da14610348578063249a0c421461034357806328f61b311461033e578063296bb0641461033957806329d1e0c3146103345780632cdd1e861461032f578063303ca9561461032a5780633c2a7f4c146103255780633eef3a51146103205780635140a5481461031b578063530b97a41461031657806354fd4d50146103115780635865c60c1461030c578063595c6a67146103075780635ac86ab7146103025780635b0b829f146102fd5780635c975abb146102f85780635df45946146102f357806368304835146102ee5780636e3b17db146102e9578063715018a6146102e457806373447992146102df5780638281ab75146102da57806384b0196e146102d557806384ca5213146102d0578063871ef049146102cb578063886f1195146102c65780638da5cb5b146102c15780639aa1653d146102bc5780639e9923c2146102b75780639feab859146102b2578063a65497c6146102ad578063a96f783e146102a8578063b5265787146102a3578063c391425e1461029e578063c63fd50214610299578063ca0de88214610294578063ca8aa7c71461028f578063de1164bb1461028a578063e65797ad14610285578063ea32afae14610280578063f2fde38b1461027b578063f698da2514610276578063fabc1cbc146102715763fd39105a036129ba57612974565b6128c2565b6128a8565b612817565b6127d3565b612766565b61270d565b6126c9565b61268f565b6124fb565b612457565b6123df565b6123c2565b612395565b61235b565b612317565b6122f8565b6122d0565b61228c565b61225c565b612208565b6120d6565b611d53565b611d24565b611cc9565b611c49565b611c05565b611bc1565b611ba4565b611b10565b611ae1565b611a64565b6119f4565b61192b565b6117f0565b61172a565b6112f0565b611157565b610e5a565b610dc6565b610d99565b610cdc565b610cb4565b610c82565b610bfa565b610bcb565b610aff565b610ac4565b610a89565b610a35565b6109c2565b6108d6565b6107f6565b6107be565b61064e565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b038211176104f757604052565b6104c8565b604081019081106001600160401b038211176104f757604052565b90601f801991011681019081106001600160401b038211176104f757604052565b60405190610547604083610517565b565b60405190610547606083610517565b6001600160401b0381116104f75760051b60200190565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b6001600160a01b038116036105d957565b5f80fd5b9080601f830112156106495781356105f481610558565b926106026040519485610517565b81845260208085019260051b82010192831161064457602001905b82821061062a5750505090565b602080918335610639816105c8565b81520191019061061d565b61056f565b61046f565b346107b95760203660031901126107b4576004356001600160401b0381116107af5761067e9036906004016105dd565b61069561068f600480603354161490565b15612a1d565b6040905f60205b82518210156107ad578351906106b28583610517565b60018252803660208401376106f26106da6106cd8587612a59565b516001600160a01b031690565b6106e384612a47565b6001600160a01b039091169052565b6106fa612a6d565b9061072461070b6106cd8688612a59565b6001600160a01b03165f90815260036020526040902090565b5461072e83612a47565b5261075861075361074761074185612a47565b51614c90565b6001600160c01b031690565b61350f565b945f5b865181101561079b578061079561078e61078861077a6001958c612ac1565b516001600160f81b03191690565b60f81c90565b86886136bc565b0161075b565b509450600190930192915061069c9050565b005b61041f565b6103cf565b61037f565b346107b95760203660031901126107b4576004355f526002602052602060405f2054604051908152f35b63ffffffff8116036105d957565b346107b95760603660031901126107b45760243561083661083060043561081c846107e8565b604435905f52600260205260405f20612bb1565b50612bc6565b63ffffffff8082511692169182106108bd5760408161087261089a9460206108809501519063ffffffff82161591821561089e575b50506137bf565b01516001600160c01b031690565b6040516001600160c01b0390911681529081906020820190565b0390f35b9091506108b59063ffffffff165b63ffffffff1690565b115f8061086b565b636cb19aff60e01b5f5260045ffd5b5f9103126107b457565b346107b9575f3660031901126107b4576007546040516001600160a01b039091168152602090f35b6001600160401b0381116104f757601f01601f191660200190565b929192610925826108fe565b916109336040519384610517565b82948184528183011161094f578281602093845f960137010152565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b9080601f83011215610649578160206109bf93359101610919565b90565b346107b95760203660031901126107b4576004356001600160401b0381116107af576109f29036906004016109a4565b335f52600360205260ff600160405f20015416906003821015610a3057610a1e60016107ad9314612ad2565b335f52600360205260405f20546137d5565b6119ae565b346107b95760203660031901126107b4577fa77a91bea7b6d95a8eb5a54878a1d9e3c875e26c86a9b70e3420c5c5db193b626040600435610a74613895565b600a549080600a5582519182526020820152a1005b346107b95760203660031901126107b457600435610aa6816105c8565b60018060a01b03165f526009602052602060405f2054604051908152f35b346107b95760203660031901126107b457600435610ae1816105c8565b60018060a01b03165f526003602052602060405f2054604051908152f35b346107b95760203660031901126107b4576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600435813b15610bc65760206024926040519384809263237dfb4760e11b82523360048301525afa918215610bc1576107ad92610b7e915f91610b92575b50612b67565b610b8d60335482811614612b7d565b613921565b610bb4915060203d602011610bba575b610bac8183610517565b810190612b48565b5f610b78565b503d610ba2565b612b5c565b612ae8565b346107b95760203660031901126107b4576004355f526004602052602060ff60405f2054166040519015158152f35b346107b95760403660031901126107b4576060610c32610830602435600435610c21612b93565b505f52600260205260405f20612bb1565b6040519063ffffffff815116825263ffffffff6020820151166020830152604060018060c01b03910151166040820152f35b6004359060ff821682036105d957565b359060ff821682036105d957565b346107b95760203660031901126107b45760ff610c9d610c64565b165f526005602052602060405f2054604051908152f35b346107b9575f3660031901126107b4576008546040516001600160a01b039091168152602090f35b346107b95760203660031901126107b4576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600435813b15610bc6576020906024604051809481936308f6629d60e31b835260048301525afa8015610bc15761089a915f91610d6a575b506040516001600160a01b0390911681529081906020820190565b610d8c915060203d602011610d92575b610d848183610517565b810190612bf7565b5f610d4f565b503d610d7a565b346107b95760203660031901126107b4576107ad600435610db9816105c8565b610dc1613895565b613953565b346107b95760203660031901126107b4576107ad600435610de6816105c8565b610dee613895565b6139b1565b9080601f83011215610649578135610e0a81610558565b92610e186040519485610517565b81845260208085019260051b82010192831161064457602001905b828210610e405750505090565b602080918335610e4f816107e8565b815201910190610e33565b346107b95760603660031901126107b457600435610e77816105c8565b602435610e83816105c8565b604435906001600160401b0382116107af57610ed9610ea9610ede933690600401610df3565b91610eb2613a0f565b610ec361068f600280603354161490565b600b546001600160a01b03918216911614612c0c565b613a50565b6001600160a01b0382165f9081526003602052604090209091610f77825492610f276001610f1881610f0f88614c90565b94015460ff1690565b610f21816119c2565b14612ad2565b610f41610747610747610f3b5f5460ff1690565b88613e7c565b90610f4d821515613a99565b610f688282166001600160c01b03168314612ea0565b612ea0565b9019166001600160c01b031690565b610f818184614cd4565b6001600160c01b0316156110f8575b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc657835f91610fe5938360405180968195829463f4e24fe560e01b845260048401613aaf565b03925af18015610bc1576110e4575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc6575f604051809263bd29b8cd60e01b8252818381611047898960048401613ad1565b03925af18015610bc1576110d0575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691823b15610bc6576110ac925f928360405180968195829463bd29b8cd60e01b845260048401613ad1565b03925af18015610bc1576110bc57005b806110ca5f6107ad93610517565b806108cc565b806110ca5f6110de93610517565b5f611056565b806110ca5f6110f293610517565b5f610ff4565b6001600160a01b0381165f90815260036020526040902061112390600101805460ff19166002179055565b816001600160a01b0382167f396fdcb180cb0fea26928113fb0fd1c3549863f9cd563e6a184f1d578116c8e45f80a3610f90565b346107b95760203660031901126107b457604061118f61118a60043561117c816105c8565b611184612c22565b506130ce565b613afc565b6111a58251809260208091805184520151910152565bf35b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b60609060031901126112485760405190611211826104dc565b8160043561121e816107e8565b815260243561ffff811681036105d95760208201526044359061ffff821682036105d95760400152565b6111a7565b6001600160601b038116036105d957565b81601f820112156106495780359061127582610558565b926112836040519485610517565b82845260208085019360061b8301019181831161064457602001925b8284106112ad575050505090565b60408483031261124857602060409182516112c7816104fc565b86356112d2816105c8565b8152828701356112e18161124d565b8382015281520193019261129f565b346107b95760c03660031901126107b45761130a366111f8565b6064356113168161124d565b6084356001600160401b0381116107af5761133590369060040161125e565b60a43592611342846107e8565b61134a613895565b5f5460ff1692839161135e60c08410613c1a565b61137861136a86613c30565b60ff1660ff195f5416175f55565b6113828186613fad565b61138a613c42565b946113958551612a8f565b965f5b86518110156113d257806113cc6113c26113b46001948b612a59565b51516001600160a01b031690565b6106e3838d612a59565b01611398565b5086889695966113e0610538565b63ffffffff891681529060208201526113f882612a47565b5261140281612a47565b50600b546001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116929116823b15610bc657604051630130fc2760e51b8152915f918391829161145d919060048401613c8f565b038183865af18015610bc157611690575b506114796001613312565b6114836001613312565b803b15610bc657602060049160405192838092632981eb7760e01b82525afa8015610bc1576114c4915f91611661575b5063ffffffff808416911611613d4a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc6575f6040518092630662d3e160e51b82528183816115188c898d8c60048601613db1565b03925af18015610bc15761164d575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc65760405163136ca0f960e11b815260ff84166004820152905f908290602490829084905af18015610bc157611639575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc65760405163136ca0f960e11b815260ff9390931660048401525f908390602490829084905af18015610bc1577fa34835bc2b673ec37fcf1591a91295b163fc2e181e4ea4e733beb27de1ceac4c9561162093600192611625575b5060405195869586613e0e565b0390a2005b806110ca5f61163393610517565b88611613565b806110ca5f61164793610517565b86611588565b806110ca5f61165b93610517565b86611527565b611683915060203d602011611689575b61167b8183610517565b810190612e75565b886114b3565b503d611671565b806110ca5f61169e93610517565b8761146e565b9181601f84011215610649578235916001600160401b0383116116d1576020838186019501011161064457565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b346107b95760403660031901126107b4576004356001600160401b0381116107af573660238201121561064957806004013561176581610558565b916117736040519384610517565b8183526024602084019260051b820101903682116106445760248101925b8284106117c157602435856001600160401b0382116107af576117bb6107ad9236906004016116a4565b91612c3a565b83356001600160401b038111610649576020916117e58392602436918701016105dd565b815201930192611791565b346107b95760a03660031901126107b45760043561180d816105c8565b61187b60243561181c816105c8565b604435611828816105c8565b6064359060843592611839846105c8565b6032549561185f60ff600889901c1615809881996118f9575b81156118d9575b50612ecc565b86611872600160ff196032541617603255565b6118c057612f2f565b61188157005b61189161ff001960325416603255565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1005b6118d461010061ff00196032541617603255565b612f2f565b303b159150816118eb575b505f611859565b60ff1660011490505f6118e4565b600160ff8216109150611852565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b346107b9575f3660031901126107b4577f000000000000000000000000000000000000000000000000000000000000000060ff8116601f811161199f5761089a916040519161197b604084610517565b60208084528381019190368337835252604051918291602083526020830190611907565b632cd44ac360e21b5f5260045ffd5b634e487b7160e01b5f52602160045260245ffd5b60031115610a3057565b906003821015610a305752565b815181526020918201516040820193926105479201906119cc565b346107b95760203660031901126107b457600435611a11816105c8565b611a19612c22565b5060018060a01b03165f52600360205260405f2060ff600160405192611a3e846104fc565b80548452015416906003821015610a305761089a916020820152604051918291826119d9565b346107b9575f3660031901126107b4577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc65760206024916040519283809263237dfb4760e11b82523360048301525afa8015610bc157611ad9915f91610b925750612b67565b6107ad6138ed565b346107b95760203660031901126107b4576020600160ff611b00610c64565b161b806033541614604051908152f35b346107b95760803660031901126107b457611b29610c64565b606036602319011261124857604051611b41816104dc565b602435611b4d816107e8565b815260443561ffff811681036105d957602082015260643561ffff811681036105d9576040820152611b7d613895565b60ff5f541660ff83161015611b95576107ad91613fad565b637310cff560e11b5f5260045ffd5b346107b9575f3660031901126107b4576020603354604051908152f35b346107b9575f3660031901126107b4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346107b9575f3660031901126107b4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346107b95760403660031901126107b457600435611c66816105c8565b6024356001600160401b0381116107af57611c859036906004016109a4565b6008546001600160a01b03163303611cba576001600160a01b0382165f9081526009602052604090204290556107ad91614068565b6376d8ab1760e11b5f5260045ffd5b346107b9575f3660031901126107b457611ce1613895565b609680546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346107b95760203660031901126107b4576020611d4b600435611d46816105c8565b6130ce565b604051908152f35b346107b95760a03660031901126107b457611d6d366111f8565b606435611d798161124d565b6084356001600160401b0381116107af57611d9890369060040161125e565b611da0613895565b5f5460ff1680611db260c08210613c1a565b611dbe61136a82613c30565b611dc88582613fad565b611dd0613c42565b93611ddb8451612a8f565b955f5b8551811015611e0a5780611e04611dfa6113b46001948a612a59565b6106e3838c612a59565b01611dde565b50848688611e16610538565b63ffffffff88168152906020820152611e2e82612a47565b52611e3881612a47565b50600b546001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811692911690823b15610bc657611e95925f9283604051809681958294630130fc2760e51b845260048401613c8f565b03925af18015610bc15761203f575b50611eae5f613312565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc6575f6040518092633aea0b9d60e11b8252818381611f01888b8d60048501613de6565b03925af18015610bc15761202b575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc65760405163136ca0f960e11b815260ff86166004820152905f908290602490829084905af18015610bc157612017575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc65760405163136ca0f960e11b815260ff9590951660048601525f908590602490829084905af1938415610bc1575f6116209281927fa34835bc2b673ec37fcf1591a91295b163fc2e181e4ea4e733beb27de1ceac4c97612009575060405195869586613e0e565b806110ca8461163393610517565b806110ca5f61202593610517565b85611f71565b806110ca5f61203993610517565b85611f10565b806110ca5f61204d93610517565b85611ea4565b92939161207561208392600f60f81b865260e0602087015260e0860190611907565b908482036040860152611907565b92606083015260018060a01b031660808201525f60a082015260c0818303910152602080835192838152019201905f5b8181106120c05750505090565b82518452602093840193909201916001016120b3565b346107b9575f3660031901126107b45760c854158061216e575b15612131576120fd61414f565b612105614204565b9061089a604051612117602082610517565b5f8082523660208301376040519384933091469186612053565b60405162461bcd60e51b81526020600482015260156024820152741152540dcc4c8e88155b9a5b9a5d1a585b1a5e9959605a1b6044820152606490fd5b5060c954156120f0565b81601f820112156106495780359061218f82610558565b9261219d6040519485610517565b82845260208085019360061b8301019181831161064457602001925b8284106121c7575050505090565b60408483031261124857602060409182516121e1816104fc565b6121ea87610c74565b8152828701356121f9816105c8565b838201528152019301926121b9565b346107b95760a03660031901126107b457600435612225816105c8565b60243590604435906001600160401b0382116107af5760209261224f611d4b933690600401612178565b6064359160843593613121565b346107b95760203660031901126107b457602061227a600435614c90565b6040516001600160c01b039091168152f35b346107b9575f3660031901126107b4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346107b9575f3660031901126107b4576096546040516001600160a01b039091168152602090f35b346107b9575f3660031901126107b457602060ff5f5416604051908152f35b346107b9575f3660031901126107b4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346107b9575f3660031901126107b45760206040517f2bd82124057f0913bc3b772ce7b83e8057c1ad1f3510fc83778be20f10ec5de68152f35b346107b95760203660031901126107b4576107ad6004356123b5816105c8565b6123bd613895565b613f4f565b346107b9575f3660031901126107b4576020600a54604051908152f35b346107b95760203660031901126107b45760206004356123fe816105c8565b600b546040516001600160a01b0392831691909216148152f35b60206040818301928281528451809452019201905f5b81811061243b5750505090565b825163ffffffff1684526020938401939092019160010161242e565b346107b95760403660031901126107b457600435612474816107e8565b602435906001600160401b0382116107af5736602383011215610649578160040135916124a083610558565b926124ae6040519485610517565b8084526024602085019160051b8301019136831161064457602401905b8282106124eb5761089a6124df8686614299565b60405191829182612418565b81358152602091820191016124cb565b346107b95760803660031901126107b457600435612518816105c8565b602435612524816105c8565b6044356001600160401b0381116107af57612543903690600401610df3565b90606435916001600160401b0383116107af576125a76125bf9161256e610ed99536906004016116a4565b959094612579613a0f565b61258a61068f600180603354161490565b600b546001600160a01b03166001600160a01b0390911614612c0c565b9282016125b481846132cf565b879592949195614320565b926125c981613312565b8061265057505050916125dd928194614751565b51905f5b81518110156107ad578061264a61260061078861077a60019587612ac1565b63ffffffff6126416108ac61263761262561261b888c612a59565b5163ffffffff1690565b9460ff165f52600160205260405f2090565b5463ffffffff1690565b91161115613435565b016125e1565b80612662600192989695979498613312565b03612680576107ad956126749161331c565b97935095915050614431565b63354bb8ab60e01b5f5260045ffd5b346107b9575f3660031901126107b45760206040517f4d404e3276e7ac2163d8ee476afa6a41d1f68fb71f2d8b6546b24e55ce01b72a8152f35b346107b9575f3660031901126107b4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346107b9575f3660031901126107b457600b546040516001600160a01b039091168152602090f35b61054790929192606081019361ffff6040809263ffffffff8151168552826020820151166020860152015116910152565b346107b95760203660031901126107b45760ff612781610c64565b612789612b93565b50165f52600160205261089a60405f2061ffff604051916127a9836104dc565b5463ffffffff81168352818160201c16602084015260301c16604082015260405191829182612735565b346107b9575f3660031901126107b4576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346107b95760203660031901126107b457600435612834816105c8565b61283c613895565b6001600160a01b03811615612854576107ad90613f07565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346107b9575f3660031901126107b4576020611d4b615568565b346107b95760203660031901126107b4576004357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc65760206004916040519283809263755b36bd60e11b82525afa908115610bc1575f91612955575b506001600160a01b03163303612946576107ad9061347d565b63794821ff60e01b5f5260045ffd5b61296e915060203d602011610d9257610d848183610517565b5f61292d565b346107b95760203660031901126107b457600435612991816105c8565b60018060a01b03165f526003602052602060ff600160405f200154166111a560405180926119cc565b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b15612a2457565b63840a48d560e01b5f5260045ffd5b634e487b7160e01b5f52603260045260245ffd5b805115612a545760200190565b612a33565b8051821015612a545760209160051b010190565b60408051909190612a7e8382610517565b6001815291601f1901366020840137565b90612a9982610558565b612aa66040519182610517565b8281528092612ab7601f1991610558565b0190602036910137565b908151811015612a54570160200190565b15612ad957565b63aba4733960e01b5f5260045ffd5b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b519081151582036105d957565b908160209103126107b4576109bf90612b3b565b6040513d5f823e3d90fd5b15612b6e57565b631d77d47760e21b5f5260045ffd5b15612b8457565b63c61dca5d60e01b5f5260045ffd5b60405190612ba0826104dc565b5f6040838281528260208201520152565b8054821015612a54575f5260205f2001905f90565b90604051612bd3816104dc565b604081935463ffffffff8116835263ffffffff8160201c166020840152811c910152565b908160209103126107b457516109bf816105c8565b15612c1357565b6366e565df60e01b5f5260045ffd5b60405190612c2f826104fc565b5f6020838281520152565b9190612c4d61068f600480603354161490565b612c6b612c5b5f5460ff1690565b612c66368585610919565b613e7c565b50612c7882845114612e53565b5f917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165b818410612cb3575050505050565b612cd7610788612cc986858798999a9697612e69565b356001600160f81b03191690565b91612ce28688612a59565b51918251813b15610bc6576040516379a0849160e11b815260ff8616600482015290602082602481865afa918215610bc157612d2d9263ffffffff915f91612e35575b501614612e8a565b612d378351612a8f565b955f985f995b85518b1015612dc35788612dbb600192612da6610f638f612d986107476107418f938f6106cd82612d6d92612a59565b6001600160a01b0381165f908152600360205260409020909a9054612d928383612a59565b52612a59565b60ff600192161c1660011490565b838060a01b0316838060a01b03831611612eb6565b9a0199612d3d565b509594809298939950612dd991976001956136bc565b43612def8260ff165f52600560205260405f2090565b557f46077d55330763f16269fd75e5761663f4192d2791747c0189b16ad31db07db460ff60405192169180612e2943829190602083019252565b0390a201929193612ca5565b612e4d915060203d81116116895761167b8183610517565b5f612d25565b15612e5a57565b63aaad13f760e01b5f5260045ffd5b90821015612a54570190565b908160209103126107b457516109bf816107e8565b15612e9157565b638e5aeee760e01b5f5260045ffd5b15612ea757565b63d053aa2160e01b5f5260045ffd5b15612ebd57565b63ba50f91160e01b5f5260045ffd5b15612ed357565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b92919260408051612f408282610517565b601681527520ab29a932b3b4b9ba393ca1b7b7b93234b730ba37b960511b6020820152612f6f82519283610517565b600682526576302e302e3160d01b6020830152612f9c60ff60325460081c16612f9781613ea7565b613ea7565b8051906001600160401b0382116104f757612fc182612fbc60ca54614117565b614e7c565b602090601f831160011461303357610dee946130116123bd989561300986610b8d976105479e9d9b97610dc1975f92613028575b50508160011b915f199060031b1c19161790565b60ca55614f1b565b61301a5f60c855565b6130235f60c955565b613f07565b015190505f80612ff5565b60ca5f52601f19831691907f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee1925f5b8181106130b657506123bd98956001866105479d9c9a96610dc196610dee9b96610b8d9a613011971061309e575b505050811b0160ca55614f1b565b01515f1960f88460031b161c191690555f8080613090565b92936020600181928786015181550195019301613062565b6109bf9060405160208101917f2bd82124057f0913bc3b772ce7b83e8057c1ad1f3510fc83778be20f10ec5de6835260018060a01b0316604082015260408152613119606082610517565b5190206140f1565b919493909260405192602084019460e08501917f4d404e3276e7ac2163d8ee476afa6a41d1f68fb71f2d8b6546b24e55ce01b72a875260018060a01b03166040860152606085015260c060808501528651809152602061010085019701905f5b8181106131ae575050506109bf949561311992849260a084015260c083015203601f198101835282610517565b8251805160ff168a526020908101516001600160a01b0316818b015260409099019890920191600101613181565b359060028210156105d957565b919082604091031261124857604051613201816104fc565b6020808294803584520135910152565b9080601f83011215610649576040519161322c604084610517565b82906040810192831161064457905b8282106132485750505090565b813581526020918201910161323b565b8082039291610100841261124857604051613272816104dc565b6080819561328084866131e9565b835261328f84604087016131e9565b6020840152607f190112611248576132c660409260c08451956132b1876104fc565b6132be8360808301613211565b875201613211565b60208401520152565b9091610140828403126107b4576132e5826131dc565b926020830135906001600160401b0382116107af57604061330b826109bf9487016109a4565b9401613258565b60021115610a3057565b9190610180838203126107b457613332836131dc565b9260208101356001600160401b0381116107af57826133529183016109a4565b926133608360408401613258565b926101408301356001600160401b0381116107af5781613381918501612178565b92610160810135906001600160401b0382116107af57019060608282031261124857604051916133b0836104dc565b80356001600160401b0381116133e4576040926133ce9183016109a4565b8352602081013560208401520135604082015290565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b1561343c57565b63c6b9e76760e01b5f5260045ffd5b90604051613458816104dc565b604061ffff82945463ffffffff81168452818160201c16602085015260301c16910152565b61348e603354198219811614612b7d565b806033556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a2565b906134ca826108fe565b6134d76040519182610517565b8281528092612ab7601f19916108fe565b634e487b7160e01b5f52601160045260245ffd5b5f19811461350a5760010190565b6134e8565b5f81805b61358957506135259061ffff166134c0565b5f5f5b825182108061357e575b15613577576001811b8416613550575b61354b906134fc565b613528565b90600161354b9160ff60f81b8460f81b165f1a61356d8287612ac1565b5301919050613542565b5050905090565b506101008110613532565b5f19810181811161350a5761ffff9116911661ffff811461350a576001019080613513565b6020818303126107b4578051906001600160401b0382116107af57019080601f830112156106495781516135e181610558565b926135ef6040519485610517565b81845260208085019260051b82010192831161064457602001905b8282106136175750505090565b6020809161362484612b3b565b81520191019061360a565b93929190606085016060865281518091526020608087019201905f5b81811061369d575050508481036020860152602080835192838152019201905f5b818110613687575050509060406105479294019060ff169052565b825184526020938401939092019160010161366c565b82516001600160a01b031684526020938401939092019160010161364b565b909291926136c8612a6d565b9060f885901b6001600160f81b0319165f1a6136e383612a47565b537f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031694853b15610bc65761373a955f9283604051809981958294636c3fb4bf60e01b84528a6004850161362f565b03925af1938415610bc1575f9461379b575b505f5b8251811015613794578061376e61376860019388612a59565b51151590565b613779575b0161374f565b61378f8361378a6106cd8488612a59565b614068565b613773565b5050509050565b6137b89194503d805f833e6137b08183610517565b8101906135ae565b925f61374c565b156137c657565b63bbba60cb60e01b5f5260045ffd5b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b15610bc6575f60405180936378219b3f60e11b8252856004830152604060248301528183816138356044820188611907565b03925af1908115610bc1577fec2963ab21c1e50e1e582aa542af2e4bf7bf38e6e1403c27b42e1c5d6e621eaa9261388092613885575b50604051918291602083526020830190611907565b0390a2565b5f61388f91610517565b5f61386b565b6096546001600160a01b031633036138a957565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b5f196033556040515f1981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2565b806033556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2565b600754604080516001600160a01b038084168252841660208201529192917f315457d8a8fe60f04af17c16e2f5a5e1db612b31648e58030360759ef8f3528c9190a16001600160a01b03166001600160a01b03199190911617600755565b600854604080516001600160a01b038084168252841660208201529192917f8f30ab09f43a6c157d7fce7e0a13c003042c1c95e8a72e7a146a21c0caa24dc99190a16001600160a01b03166001600160a01b03199190911617600855565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303613a4157565b6323d871a560e01b5f5260045ffd5b90613a5b82516134c0565b5f5b8351811015613a94576001906001600160f81b0319613a7c8287612a59565b5160f81b165f1a613a8d8285612ac1565b5301613a5d565b509150565b15613aa057565b6368b6a87560e11b5f5260045ffd5b6001600160a01b0390911681526040602082018190526109bf92910190611907565b6040906109bf939281528160208201520190611907565b634e487b7160e01b5f52601260045260245ffd5b5f5160206158f25f395f51905f5290613b13612c22565b505f919006602060c0835b613c13575f935f5160206158f25f395f51905f5260038186818180090908604051613b498582610517565b84368237848185604051613b5d8282610517565b813682378381528360208201528360408201528560608201527f0c19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f5260808201525f5160206158f25f395f51905f5260a082015260056107cf195a01fa8015613c1857613bc790615642565b5191613c13575f5160206158f25f395f51905f5282800914613bfe57505f5160206158f25f395f51905f5260015f94089293613b1e565b92935050613c0a610538565b92835282015290565b613ae8565bfe5b15613c2157565b633cb89c9760e01b5f5260045ffd5b60ff60019116019060ff821161350a57565b60408051909190613c538382610517565b6001815291601f1901825f5b828110613c6b57505050565b602090604051613c7a816104fc565b5f815260608382015282828501015201613c5f565b90604082019060018060a01b031682526040602083015282518091526060820191602060608360051b8301019401925f915b838310613cd057505050505090565b9091929394605f1982820301835285516020606081604085019363ffffffff81511686520151936040838201528451809452019201905f905b808210613d285750505060208060019297019301930191939290613cc1565b82516001600160a01b0316845260209384019390920191600190910190613d09565b15613d5157565b630bd441b960e21b5f5260045ffd5b90602080835192838152019201905f5b818110613d7d5750505090565b825180516001600160a01b031685526020908101516001600160601b03168186015260409094019390920191600101613d70565b906109bf94936001600160601b0360809460ff63ffffffff941685521660208401521660408201528160608201520190613d60565b6001600160601b036109bf949360ff6060941683521660208201528160408201520190613d60565b9395949060c0936001600160601b0363ffffffff94613e5088613e679561ffff6040809263ffffffff8151168552826020820151166020860152015116910152565b16606087015260e0608087015260e0860190613d60565b95613e7181613312565b60a085015216910152565b906001613e8a60ff93614e04565b928392161b1115613e985790565b63ca95733360e01b5f5260045ffd5b15613eae57565b60405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608490fd5b609680546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b600b54604080516001600160a01b038084168252841660208201529192917f9770f3cadfdcbb6f93af935e86047111590c3768271d237e4a2bc0b874bed6939190a16001600160a01b03166001600160a01b03199190911617600b55565b60ff7f3ee6fe8d54610244c3e9d3c066ae4aee997884aa28f10616ae821925401318ac911691825f52600160205260405f2061400063ffffffff835116829063ffffffff1663ffffffff19825416179055565b6020820151815465ffff0000000067ffff000000000000604086015160301b169260201b169067ffffffff00000000191617179055604051809161388082606081019261ffff6040809263ffffffff8151168552826020820151166020860152015116910152565b9060018060a01b0382165f52600360205260405f2060ff6001820154166003811015610a30576001036140e2576140d190546140a860ff5f541684613e7c565b6001600160c01b03908116916140bd90614c90565b1681166001600160c01b0390811691161490565b6140d9575050565b6105479161505c565b6325ec6c1f60e01b5f5260045ffd5b6042906140fc615568565b906040519161190160f01b8352600283015260228201522090565b90600182811c92168015614145575b602083101461413157565b634e487b7160e01b5f52602260045260245ffd5b91607f1691614126565b604051905f8260ca549161416283614117565b80835292600181169081156141e55750600114614186575b61054792500383610517565b5060ca5f90815290917f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee15b8183106141c95750509060206105479282010161417a565b60209193508060019154838589010152019101909184926141b1565b6020925061054794915060ff191682840152151560051b82010161417a565b604051905f8260cb549161421783614117565b80835292600181169081156141e5575060011461423a5761054792500383610517565b5060cb5f90815290917fa7ce836d032b2bf62b7e2097a8e0a6d8aeb35405ad15271e96d3b0188a1d06fb5b81831061427d5750509060206105479282010161417a565b6020919350806001915483858901015201910190918492614265565b91906142a58151612a8f565b905f5b81518110156142e357806142ca6142c160019385612a59565b51876002615151565b63ffffffff6142d98387612a59565b91169052016142a8565b5090925050565b908160209103126107b4575190565b905f905b6002821061430a57505050565b60208060019285518152019301910190916142fd565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690614354612c22565b5061436161118a846130ce565b91803b15610bc6576040935f610164926143f56020966143e1888a519a8b998a986301e2d35b60e11b8a5260018060a01b031660048a01526143b160248a01825160208091805184520151910152565b80830151805160648b01526020015160848a015201516143d560a4890182516142f9565b015160e48701906142f9565b805161012486015260200151610144850152565b5af1908115610bc1575f91614408575090565b6109bf915060203d60201161442a575b6144228183610517565b8101906142ea565b503d614418565b94918093916144526144589461444a8851855114612e53565b87838a61525b565b86614a7c565b5f5b8251811015614563578061449261448d61447c61078861077a60019689612ac1565b60ff165f52600160205260405f2090565b61344b565b6144a061261b838651612a59565b63ffffffff6144b66108ac845163ffffffff1690565b9116116144c5575b500161445a565b61451b906144d961078861077a8589612ac1565b6144f76144ea856040890151612a59565b516001600160601b031690565b896145096144ea8760208b0151612a59565b91614514878c612a59565b519361533c565b61455d614526612a6d565b61453361077a8488612ac1565b5f1a61453e82612a47565b5361378a602061454e858a612a59565b5101516001600160a01b031690565b5f6144be565b5050505050565b60405190614577826104dc565b60606040838281528260208201520152565b1561459057565b6313ca465760e01b5f5260045ffd5b156145a657565b630c6816cd60e01b5f5260045ffd5b9190820180921161350a57565b156145c957565b631968677d60e11b5f5260045ffd5b600160209183518155019101516003811015610a305760ff80198354169116179055565b9080601f8301121561064957815161461381610558565b926146216040519485610517565b81845260208085019260051b82010192831161064457602001905b8282106146495750505090565b6020809183516146588161124d565b81520191019061463c565b9190916040818403126107b45780516001600160401b0381116107af578361468c9183016145fc565b9260208201516001600160401b0381116107af576109bf92016145fc565b6109bf939260609260018060a01b0316825260208201528160408201520190611907565b6020818303126107b4578051906001600160401b0382116107af57019080601f8301121561064957815161470181610558565b9261470f6040519485610517565b81845260208085019260051b82010192831161064457602001905b8282106147375750505090565b602080918351614746816107e8565b81520191019061472a565b6147f061475c61456a565b946147ea614771610747610f3b5f5460ff1690565b61477a86614c90565b906147848661548b565b6001600160c01b031690614799821515614589565b60018060c01b03166147b36147ae8284161590565b61459f565b6001600160a01b0386165f9081526009602052604090206147e3906147dc9054600a54906145b5565b42116145c2565b1785614cd4565b836137d5565b6001614818816148108460018060a01b03165f52600360205260405f2090565b015460ff1690565b614821816119c2565b03614a17575b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc6575f6040518092631fd93ca960e11b82528183816148798a8960048401613aaf565b03925af18015610bc157614a03575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc657835f9184836148e09560405196879586948593632550477760e01b8552600485016146aa565b03925af18015610bc1575f915f916149df575b50604085015260208401527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc657825f91614952938360405180968195829462bff04d60e01b845260048401613ad1565b03925af1908115610bc1575f916149bd575b5082525f5b81518110156149b857806149b261498e61448d61447c61078861077a60019789612ac1565b63ffffffff6126416108ac6149a761261b878b51612a59565b935163ffffffff1690565b01614969565b505090565b6149d991503d805f833e6149d18183610517565b8101906146ce565b5f614964565b90506149fd91503d805f833e6149f58183610517565b810190614663565b5f6148f3565b806110ca5f614a1193610517565b5f614888565b614a48614a22610538565b838152600160208201526001600160a01b0383165f9081526003602052604090206145d8565b816001600160a01b0382167fe8e68cef1c3a761ed7be7e8463a375f27f7bc335e51824223cacce636ec5c3fe5f80a3614827565b614a8761475c61456a565b6001614aa7816148108460018060a01b03165f52600360205260405f2090565b614ab0816119c2565b03614c43575b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc6575f6040518092631fd93ca960e11b8252818381614b088a8960048401613aaf565b03925af18015610bc157614c2f575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610bc657835f918483614b6f9560405196879586948593632550477760e01b8552600485016146aa565b03925af18015610bc1575f915f91614c13575b50604085015260208401527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691823b15610bc657614be1925f928360405180968195829462bff04d60e01b845260048401613ad1565b03925af1908115610bc1575f91614bf9575b50815290565b614c0d91503d805f833e6149d18183610517565b5f614bf3565b9050614c2991503d805f833e6149f58183610517565b5f614b82565b806110ca5f614c3d93610517565b5f614b17565b614c4e614a22610538565b816001600160a01b0382167fe8e68cef1c3a761ed7be7e8463a375f27f7bc335e51824223cacce636ec5c3fe5f80a3614ab6565b5f1981019190821161350a57565b805f52600260205260405f20549081155f14614cac5750505f90565b5f52600260205260405f20905f19810190811161350a57614ccc91612bb1565b505460401c90565b90614ce7825f52600260205260405f2090565b5480614d345750614d03610547925f52600260205260405f2090565b614d2f614d0e610549565b4363ffffffff168152925b5f60208501526001600160c01b03166040840152565b6155cf565b91614d5f63ffffffff93614d59614d53845f52600260205260405f2090565b91614c82565b90612bb1565b5090614d6f825463ffffffff1690565b43851694168403614d9a57506105479250906001600160401b0382549181199060401b169116179055565b815467ffffffff000000001916602085901b67ffffffff000000001617909155610547929190614d2f90614dd6905f52600260205260405f2090565b91614d19614de2610549565b63ffffffff9095168552565b15614df557565b631019106960e31b5f5260045ffd5b90610100825111614e6d57815115614e6857602082015160019060f81c81901b5b8351821015614e6357600190614e4e614e4461078861077a8689612ac1565b60ff600191161b90565b90614e5a818311614dee565b17910190614e25565b925050565b5f9150565b637da54e4760e11b5f5260045ffd5b601f8111614e88575050565b60ca5f5260205f20906020601f840160051c83019310614ec2575b601f0160051c01905b818110614eb7575050565b5f8155600101614eac565b9091508190614ea3565b601f8211614ed957505050565b5f5260205f20906020601f840160051c83019310614f11575b601f0160051c01905b818110614f06575050565b5f8155600101614efb565b9091508190614ef2565b9081516001600160401b0381116104f757614f4281614f3b60cb54614117565b60cb614ecc565b602092601f8211600114614f7657614f71929382915f926130285750508160011b915f199060031b1c19161790565b60cb55565b60cb5f52601f198216937fa7ce836d032b2bf62b7e2097a8e0a6d8aeb35405ad15271e96d3b0188a1d06fb915f5b868110614fda5750836001959610614fc2575b505050811b0160cb55565b01515f1960f88460031b161c191690555f8080614fb7565b91926020600181928685015181550194019201614fa4565b602080825282516001600160a01b039081168284015281840151166040808401919091529092015160608083015280516080830181905260a09092019201905f5b8181106150405750505090565b825163ffffffff16845260209384019390920191600101615033565b600b54825192936001600160a01b03918216937f000000000000000000000000000000000000000000000000000000000000000090921692909161509f90612a8f565b925f5b86518110156150cd57806150b860019289612ac1565b5160f81c6150c68288612a59565b52016150a2565b509291945092615101906150f16150e2610549565b6001600160a01b039096168652565b6001600160a01b03166020850152565b6040830152803b15610bc657604051636e3492b560e01b8152915f9183918290849082906151329060048301614ff2565b03925af18015610bc1576151435750565b806110ca5f61054793610517565b9190815f528260205260405f2054925f5b8481106151fa5760405162461bcd60e51b815260206004820152605c60248201527f5265676973747279436f6f7264696e61746f722e67657451756f72756d42697460448201527f6d6170496e6465784174426c6f636b4e756d6265723a206e6f206269746d617060648201527f2075706461746520666f756e6420666f72206f70657261746f72496400000000608482015260a490fd5b80850385811161350a576108ac61521091614c82565b61523961522e826152298887905f5260205260405f2090565b612bb1565b505463ffffffff1690565b63ffffffff808616911611156152525750600101615162565b94505050505090565b919290602082019283515f52600460205260ff60405f2054166152d65760408301805142116152c757610547956152bf9386515f5260046020526152a960405f20600160ff19825416179055565b6007546001600160a01b03169651925193613121565b905191615658565b630819bdcd60e01b5f5260045ffd5b636fbefec360e11b5f5260045ffd5b156152ec57565b6356168b4160e11b5f5260045ffd5b908160209103126107b457516109bf8161124d565b1561531757565b634c44995d60e01b5f5260045ffd5b1561532d57565b63b187e86960e01b5f5260045ffd5b6020858101516001600160a01b039081165f8181526003909352604090922054929795969394929361538f9361538293919261537b92911614156152e5565b5160ff1690565b60ff808816911614612e8a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031694853b15610bc657604051635401ed2760e01b8152600481019290925260ff16602482015293602090859060449082905afa928315610bc157610547945f94615441575b508261543992615434615420936001600160601b0361542c61542082998b61578f565b6001600160601b031690565b911611615310565b6157b2565b911610615326565b61542091945092615439926154346154786001600160601b039660203d602011615484575b6154708183610517565b8101906152fb565b969350509250926153fd565b503d615466565b600b546001600160a01b0316803b15610bc657604051632e8da82960e01b81526001600160a01b03929092166004830152602090829060249082905afa908115610bc1575f91615549575b50156154de57565b60405162461bcd60e51b815260206004820152603c60248201527f5265636c61696d536c617368696e675265676973747279436f6f7264696e617460448201527f6f723a206f70657261746f72206e6f742077686974656c6973746564000000006064820152608490fd5b615562915060203d602011610bba57610bac8183610517565b5f6154d6565b6155706157d0565b61557861581b565b6040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a081526155c960c082610517565b51902090565b8054680100000000000000008110156104f7576155f191600182018155612bb1565b61562f57815160208084015160409485015163ffffffff909316911b67ffffffff00000000161767ffffffffffffffff199190931b16919091179055565b634e487b7160e01b5f525f60045260245ffd5b1561564957565b63d51edae360e01b5f5260045ffd5b9190916156658284615841565b9390926005851015610a305761568e94159384615756575b5083156156a3575b50505015151590565b61569457565b638baa579f60e01b5f5260045ffd5b5f9350906156ce6156dc8594936040519283916020830195630b135d3f60e11b875260248401613ad1565b03601f198101835282610517565b51915afa3d1561574f573d6156f0816108fe565b906156fe6040519283610517565b81523d5f602083013e5b81615741575b8161571d575b505f8080615685565b905061573a630b135d3f60e11b91602080825183010191016142ea565b145f615714565b90506020815110159061570e565b6060615708565b6001600160a01b0384811691161493505f61567d565b906001600160601b03809116911602906001600160601b03821691820361350a57565b6157ad6001600160601b039161ffff6020612710950151169061576c565b160490565b6157ad6001600160601b039161ffff6040612710950151169061576c565b6157d861414f565b80519081156157e8576020012090565b505060c85480156157f65790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b615823614204565b8051908115615833576020012090565b505060c95480156157f65790565b9060418151145f1461586d5761586991602082015190606060408401519301515f1a90615876565b9091565b50505f90600290565b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116158e6576020935f9360ff60809460405194855216868401526040830152606082015282805260015afa15610bc1575f516001600160a01b038116156158de57905f90565b505f90600190565b505050505f9060039056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47a26469706673582212205a6c3a08d12dc38c88bb1ff521ffbdbb07f4c645df64318227e1da7aca39944464736f6c634300081c0033"; + +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 new file mode 100644 index 00000000..43cc6d37 --- /dev/null +++ b/src/avs/contracts/factories/RewardsCoordinator__factory.ts @@ -0,0 +1,2750 @@ +/* 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 { + RewardsCoordinator, + RewardsCoordinatorInterface, + IRewardsCoordinatorTypes, +} from "../RewardsCoordinator"; + +const _abi = [ + { + type: "constructor", + inputs: [ + { + 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", + }, + { + type: "function", + name: "CALCULATION_INTERVAL_SECONDS", + inputs: [], + outputs: [ + { + name: "", + type: "uint32", + internalType: "uint32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "GENESIS_REWARDS_TIMESTAMP", + inputs: [], + outputs: [ + { + name: "", + type: "uint32", + internalType: "uint32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "MAX_FUTURE_LENGTH", + inputs: [], + outputs: [ + { + name: "", + type: "uint32", + internalType: "uint32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "MAX_RETROACTIVE_LENGTH", + inputs: [], + outputs: [ + { + name: "", + type: "uint32", + internalType: "uint32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "MAX_REWARDS_DURATION", + inputs: [], + outputs: [ + { + name: "", + type: "uint32", + internalType: "uint32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "activationDelay", + inputs: [], + outputs: [ + { + name: "", + type: "uint32", + internalType: "uint32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "allocationManager", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IAllocationManager", + }, + ], + 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 IRewardsCoordinatorTypes.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 IRewardsCoordinatorTypes.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 IRewardsCoordinatorTypes.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 IRewardsCoordinatorTypes.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 IRewardsCoordinatorTypes.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: "earner", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "claimer", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "createAVSRewardsSubmission", + inputs: [ + { + name: "rewardsSubmissions", + type: "tuple[]", + internalType: "struct IRewardsCoordinatorTypes.RewardsSubmission[]", + 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: "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 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 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: "createRewardsForAllEarners", + inputs: [ + { + name: "rewardsSubmissions", + type: "tuple[]", + internalType: "struct IRewardsCoordinatorTypes.RewardsSubmission[]", + 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: "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 IRewardsCoordinatorTypes.RewardsSubmission[]", + 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: "amount", + type: "uint256", + internalType: "uint256", + }, + { + name: "startTimestamp", + type: "uint32", + internalType: "uint32", + }, + { + name: "duration", + type: "uint32", + internalType: "uint32", + }, + ], + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "cumulativeClaimed", + inputs: [ + { + name: "earner", + type: "address", + internalType: "address", + }, + { + name: "token", + type: "address", + internalType: "contract IERC20", + }, + ], + outputs: [ + { + name: "totalClaimed", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "currRewardsCalculationEndTimestamp", + inputs: [], + outputs: [ + { + name: "", + type: "uint32", + internalType: "uint32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "defaultOperatorSplitBips", + inputs: [], + outputs: [ + { + name: "", + type: "uint16", + internalType: "uint16", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "delegationManager", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IDelegationManager", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "disableRoot", + inputs: [ + { + name: "rootIndex", + type: "uint32", + internalType: "uint32", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "getCurrentClaimableDistributionRoot", + inputs: [], + outputs: [ + { + name: "", + type: "tuple", + internalType: "struct IRewardsCoordinatorTypes.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 IRewardsCoordinatorTypes.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 IRewardsCoordinatorTypes.DistributionRoot", + components: [ + { + name: "root", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "rewardsCalculationEndTimestamp", + type: "uint32", + internalType: "uint32", + }, + { + name: "activatedAt", + type: "uint32", + internalType: "uint32", + }, + { + name: "disabled", + type: "bool", + internalType: "bool", + }, + ], + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getDistributionRootsLength", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getOperatorAVSSplit", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "avs", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "uint16", + internalType: "uint16", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getOperatorPISplit", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "", + type: "uint16", + internalType: "uint16", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "getOperatorSetSplit", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "operatorSet", + type: "tuple", + internalType: "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", + inputs: [ + { + name: "rootHash", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "", + type: "uint32", + internalType: "uint32", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "initialize", + inputs: [ + { + name: "initialOwner", + type: "address", + internalType: "address", + }, + { + name: "initialPausedStatus", + type: "uint256", + internalType: "uint256", + }, + { + name: "_rewardsUpdater", + type: "address", + internalType: "address", + }, + { + name: "_activationDelay", + type: "uint32", + internalType: "uint32", + }, + { + name: "_defaultSplitBips", + type: "uint16", + internalType: "uint16", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "isAVSRewardsSubmissionHash", + inputs: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "hash", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "valid", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "isOperatorDirectedAVSRewardsSubmissionHash", + inputs: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "hash", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "valid", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "isOperatorDirectedOperatorSetRewardsSubmissionHash", + inputs: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "hash", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "valid", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "isRewardsForAllSubmitter", + inputs: [ + { + name: "submitter", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "valid", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "isRewardsSubmissionForAllEarnersHash", + inputs: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "hash", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "valid", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "isRewardsSubmissionForAllHash", + inputs: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "hash", + type: "bytes32", + internalType: "bytes32", + }, + ], + outputs: [ + { + name: "valid", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "owner", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "address", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "pause", + inputs: [ + { + name: "newPausedStatus", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "pauseAll", + inputs: [], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "paused", + inputs: [ + { + name: "index", + type: "uint8", + internalType: "uint8", + }, + ], + outputs: [ + { + name: "", + type: "bool", + internalType: "bool", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "paused", + inputs: [], + outputs: [ + { + name: "", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "pauserRegistry", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IPauserRegistry", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "permissionController", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IPermissionController", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "processClaim", + inputs: [ + { + name: "claim", + type: "tuple", + internalType: "struct IRewardsCoordinatorTypes.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 IRewardsCoordinatorTypes.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 IRewardsCoordinatorTypes.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 IRewardsCoordinatorTypes.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 IRewardsCoordinatorTypes.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 IRewardsCoordinatorTypes.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: "setClaimerFor", + inputs: [ + { + name: "earner", + type: "address", + internalType: "address", + }, + { + name: "claimer", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setDefaultOperatorSplit", + inputs: [ + { + name: "split", + type: "uint16", + internalType: "uint16", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setOperatorAVSSplit", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "split", + type: "uint16", + internalType: "uint16", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setOperatorPISplit", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "split", + type: "uint16", + internalType: "uint16", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setOperatorSetSplit", + inputs: [ + { + name: "operator", + type: "address", + internalType: "address", + }, + { + name: "operatorSet", + type: "tuple", + internalType: "struct OperatorSet", + components: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + { + name: "id", + type: "uint32", + internalType: "uint32", + }, + ], + }, + { + name: "split", + type: "uint16", + internalType: "uint16", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setRewardsForAllSubmitter", + inputs: [ + { + name: "_submitter", + type: "address", + internalType: "address", + }, + { + name: "_newValue", + type: "bool", + internalType: "bool", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "setRewardsUpdater", + inputs: [ + { + name: "_rewardsUpdater", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "strategyManager", + inputs: [], + outputs: [ + { + name: "", + type: "address", + internalType: "contract IStrategyManager", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "submissionNonce", + inputs: [ + { + name: "avs", + type: "address", + internalType: "address", + }, + ], + outputs: [ + { + name: "nonce", + type: "uint256", + internalType: "uint256", + }, + ], + stateMutability: "view", + }, + { + type: "function", + name: "submitRoot", + inputs: [ + { + name: "root", + type: "bytes32", + internalType: "bytes32", + }, + { + name: "rewardsCalculationEndTimestamp", + type: "uint32", + internalType: "uint32", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "transferOwnership", + inputs: [ + { + name: "newOwner", + type: "address", + internalType: "address", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "unpause", + inputs: [ + { + name: "newPausedStatus", + type: "uint256", + internalType: "uint256", + }, + ], + outputs: [], + stateMutability: "nonpayable", + }, + { + type: "function", + name: "version", + inputs: [], + outputs: [ + { + name: "", + type: "string", + internalType: "string", + }, + ], + stateMutability: "view", + }, + { + type: "event", + name: "AVSRewardsSubmissionCreated", + inputs: [ + { + name: "avs", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "submissionNonce", + type: "uint256", + indexed: true, + internalType: "uint256", + }, + { + name: "rewardsSubmissionHash", + type: "bytes32", + indexed: true, + internalType: "bytes32", + }, + { + name: "rewardsSubmission", + type: "tuple", + indexed: false, + internalType: "struct IRewardsCoordinatorTypes.RewardsSubmission", + 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: "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 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", + }, + ], + }, + ], + 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", + type: "address", + internalType: "address", + }, + { + name: "amount", + type: "uint256", + internalType: "uint256", + }, + ], + }, + { + name: "startTimestamp", + type: "uint32", + internalType: "uint32", + }, + { + name: "duration", + type: "uint32", + internalType: "uint32", + }, + { + name: "description", + type: "string", + internalType: "string", + }, + ], + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OperatorPISplitBipsSet", + inputs: [ + { + name: "caller", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "operator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "activatedAt", + type: "uint32", + indexed: false, + internalType: "uint32", + }, + { + name: "oldOperatorPISplitBips", + type: "uint16", + indexed: false, + internalType: "uint16", + }, + { + name: "newOperatorPISplitBips", + type: "uint16", + indexed: false, + internalType: "uint16", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "OperatorSetSplitBipsSet", + inputs: [ + { + name: "caller", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "operator", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "operatorSet", + type: "tuple", + indexed: false, + internalType: "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: "OwnershipTransferred", + inputs: [ + { + name: "previousOwner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newOwner", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Paused", + inputs: [ + { + name: "account", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newPausedStatus", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "RewardsClaimed", + inputs: [ + { + name: "root", + type: "bytes32", + indexed: false, + internalType: "bytes32", + }, + { + name: "earner", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "claimer", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "recipient", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "token", + type: "address", + indexed: false, + internalType: "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 IRewardsCoordinatorTypes.RewardsSubmission", + 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: "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 IRewardsCoordinatorTypes.RewardsSubmission", + 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: "amount", + type: "uint256", + internalType: "uint256", + }, + { + name: "startTimestamp", + type: "uint32", + internalType: "uint32", + }, + { + name: "duration", + type: "uint32", + internalType: "uint32", + }, + ], + }, + ], + anonymous: false, + }, + { + type: "event", + name: "RewardsUpdaterSet", + inputs: [ + { + name: "oldRewardsUpdater", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newRewardsUpdater", + type: "address", + indexed: true, + internalType: "address", + }, + ], + anonymous: false, + }, + { + type: "event", + name: "Unpaused", + inputs: [ + { + name: "account", + type: "address", + indexed: true, + internalType: "address", + }, + { + name: "newPausedStatus", + type: "uint256", + indexed: false, + internalType: "uint256", + }, + ], + anonymous: false, + }, + { + type: "error", + name: "AmountExceedsMax", + inputs: [], + }, + { + type: "error", + name: "AmountIsZero", + inputs: [], + }, + { + type: "error", + name: "CurrentlyPaused", + inputs: [], + }, + { + type: "error", + name: "DurationExceedsMax", + inputs: [], + }, + { + type: "error", + name: "DurationIsZero", + inputs: [], + }, + { + type: "error", + name: "EarningsNotGreaterThanClaimed", + inputs: [], + }, + { + type: "error", + name: "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 = + "0x6101e0806040523461069257614bf78038038061001b816106df565b928339810190602081830312610642578051906001600160401b0382116105f25701610160818303126105a15760405161016081016001600160401b038111828210176104df5760405281516001600160a01b038116810361059d57815260208201516001600160a01b038116810361059d57602082019081526040830151926001600160a01b038416840361059d57604083019384526060810151916001600160a01b038316830361059d57606084019283526080820151946001600160a01b038616860361059d57608085019586526100f860a08401610704565b60a0860190815261010b60c08501610704565b9060c0870191825261011f60e08601610704565b9260e088019384526101346101008701610704565b94610100890195865261014a6101208801610704565b6101208a0190815261014088015190976001600160401b03821161054c57018b601f820112156104f35780516001600160401b0381116104df57610197601f8201601f19166020016106df565b9b818d5260208d019d6020838501011161048a5763ffffffff808f928f8f610140905f602089879b9a889b9a838a9c01905e85010152015260018060a01b039051169d60018060a01b039051169560018060a01b039051169660018060a01b039051169751169751169751169751169751169760018060a01b03905116801561047b5760805283156104675763ffffffff848906166104585763ffffffff620151808506166104495760a05260c05260e05261010052610120526101405261016052610180526101a052601f81511161040d57519051602082106103fd575b176101c0525f5460ff8160081c166103a85760ff8082160361036e575b6040516144e190816107168239608051818181610af501528181611225015281816114cb015261232b015260a051818181611cae0152611d47015260c051818181610da00152613ff9015260e0518181816107c201528181611a5901528181611dca01526120d80152610100518181816117030152613f700152610120518181816119d20152613f3b015261014051818181610d670152613fbb01526101605181818161056a015261370c015261018051818181610ab6015261410001526101a05181818161106c015261329601526101c0518161117d0152f35b60ff90811916175f557f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498602060405160ff8152a180610293565b60405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608490fd5b5f198260200360031b1b16610276565b60449060405192839163305a27a960e01b8352602060048401525180918160248501528484015e5f828201840152601f01601f19168101030190fd5b63223c7b3960e11b5f5260045ffd5b630e06bd3160e01b5f5260045ffd5b634e487b7160e01b5f52601260045260245ffd5b6339b190bb60e11b5f5260045ffd5b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20696e76616c696420737472756374206f66666044820152621cd95d60ea1b6064820152608490fd5b5f80fd5b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b62461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b6040519190601f01601f191682016001600160401b038111838210176104df57604052565b519063ffffffff8216820361059d5756fe6080604052600436106125f4575f3560e01c806218572c146103fa57806304a0c502146103f55780630ca29899146103f05780630e9a53cf146103eb5780630eb38345146103e6578063131433b4146103e1578063136439dd146103dc578063149bc872146103d75780632b9f64a4146103d257806336af41fa146103cd57806337838ed0146103c857806339b70e38146103c35780633a8c0786146103be5780633ccc861d146103b95780633efe1db6146103b45780634596021c146103af5780634657e26a146103aa5780634b943960146103a55780634d18cc35146103a057806354fd4d501461039b57806358baaa3e14610396578063595c6a67146103915780635ac86ab71461038c5780635c975abb146103875780635e9d83481461038257806363f6a7981461037d5780636d21117e14610378578063715018a6146103735780637b8f8b051461036e578063863cb9a914610369578063865c695314610364578063886f11951461035f5780638da5cb5b1461035a5780639104c319146103555780639be3d4e4146103505780639cb9a5fa1461034b5780639d45c281146103465780639de4b35f14610341578063a0169ddd1461033c578063a50a1d9c14610337578063aebd8bae14610332578063b3dbb0e01461032d578063bb7e451f14610328578063bf21a8aa14610323578063c46db6061461031e578063ca8aa7c714610319578063dcbb03b314610314578063de02e5031461030f578063e063f81f1461030a578063e810ce2114610305578063ea4d3c9b14610300578063ed71e6a2146102fb578063f22cef85146102f6578063f2f07ab4146102f1578063f2fde38b146102ec578063f6efbb59146102e7578063f74e8eac146102e2578063f8cd8448146102dd578063f96abf2e146102d8578063fabc1cbc146102d3578063fbf1e2c1146102ce578063fce36c7d146102c95763ff9f6cce036125f4576124f0565b612404565b6123dc565b612310565b612236565b612212565b61208a565b611f72565b611ee1565b611e93565b611d2b565b611cdd565b611c99565b611c6d565b611c20565b611bcd565b611a88565b611a44565b6119f6565b6119b6565b61197b565b61187d565b61182f565b6117ff565b611795565b611727565b6116e7565b61158b565b611550565b611522565b6114fa565b6114b6565b611457565b61142a565b61140d565b6113b2565b611364565b611340565b6112e0565b6112c3565b611290565b611213565b6111e6565b61116b565b61111b565b61109b565b611057565b610fc5565b610e84565b610e04565b610dcf565b610d8b565b610d4b565b610c29565b610bb8565b610b8c565b610ada565b610a9a565b610a07565b61099f565b61074a565b61054e565b610504565b60405162461bcd60e51b815260206004820152602260248201527f45746865722073656e7420746f206e6f6e2d70617961626c652066756e63746960448201526137b760f11b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a207475706c65206461746120746f6f2073686f6044820152611c9d60f21b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f414249206465636f64696e673a20696e76616c6964207475706c65206f666673604482015261195d60f21b6064820152608490fd5b6001600160a01b0381160361050057565b5f80fd5b3461054957602036600319011261054457600435610521816104ef565b60018060a01b03165f5260d1602052602060ff60405f2054166040519015158152f35b61044f565b6103ff565b34610549575f36600319011261054457602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a207374727563742063616c6c6461746120746f6044820152661bc81cda1bdc9d60ca1b6064820152608490fd5b60409060031901126105f457600490565b61058e565b60409060231901126105f457602490565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a727261792073747269646560a81b6064820152608490fd5b9181601f840112156106f1578235916001600160401b038311610698576020808501948460051b01011161069357565b61060a565b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a0e4e4c2f240d8cadccee8d60ab1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f414249206465636f64696e673a20696e76616c69642063616c6c64617461206160448201526a1c9c985e481bd9999cd95d60aa1b6064820152608490fd5b3461054957606036600319011261054457610764366105e3565b6044356001600160401b03811161099a57610783903690600401610663565b919061079d61079761020080606654161490565b15612657565b6107b86107b383356107ae816104ef565b613294565b612677565b6107c0613339565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561099557602060405180926304c1b8eb60e31b825281806108118860048301612795565b03915afa80156109905761082c915f91610961575b506127b0565b5f5b8381106108415761083f6001609755565b005b8061095b61085260019387866128a9565b61087761085e8761266d565b6001600160a01b03165f90815260ce6020526040902090565b54906108828761266d565b6040516108a7816108998587602084019687612b88565b03601f19810183528261272f565b519020877ffff0759ccb371dfb5691798724e70b4fa61cb3bfe730a33ac19fb86a48efc756836108d681613462565b9561091d610910866109036108ea8861266d565b6001600160a01b03165f90815260d76020526040902090565b905f5260205260405f2090565b805460ff19166001179055565b61092681612bc0565b61093261085e8661266d565b55610944604051928392339684612be9565b0390a33090610956602033920161266d565b613597565b0161082e565b610983915060203d602011610989575b61097b818361272f565b810190612750565b5f610826565b503d610971565b6127a5565b61268d565b61049f565b34610549575f366003190112610544576109f96109ba612cdc565b6040519182918291909160608060808301948051845263ffffffff602082015116602085015263ffffffff604082015116604085015201511515910152565b0390f35b8015150361050057565b3461054957604036600319011261054457600435610a24816104ef565b60243590610a31826109fd565b610a396135e0565b60018060a01b0316805f5260d160205260ff60405f205416151582151590827f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c5f80a45f5260d160205260405f209060ff8019835416911515161790555f80f35b34610549575f36600319011261054457602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610549576020366003190112610544576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600435813b156109955760206024926040519384809263237dfb4760e11b82523360048301525afa9182156109905761083f92610b59915f91610b6d575b50612d73565b610b6860665482811614612d89565b61366c565b610b86915060203d6020116109895761097b818361272f565b5f610b53565b34610549576040366003190112610544576020610bb0610bab366105e3565b612d9f565b604051908152f35b3461054957602036600319011261054457600435610bd5816104ef565b60018060a01b03165f5260cc602052602060018060a01b0360405f205416604051908152f35b602060031982011261054457600435906001600160401b03821161099a57610c2591600401610663565b9091565b3461054957610c3736610bfb565b90610c49610797600280606654161490565b335f5260d1602052610c6160ff60405f205416612de8565b610c69613339565b5f5b828110610c7c5761083f6001609755565b80610d45610c8d6001938686612dfe565b335f90815260ce60205260409020546040516020810190610cb48161089986863387612e92565b51902090610cc18361369e565b335f90815260d060205260409020610cde90610910908490610903565b610ce781612bc0565b335f90815260ce60205260409020556040517f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf270482339180610d278782612eb6565b0390a46040610d386020830161266d565b9101359030903390613597565b01610c6b565b34610549575f36600319011261054457602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610549575f366003190112610544576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610549575f36600319011261054457602063ffffffff60cb5460a01c16604051908152f35b90816101009103126105f45790565b34610549576040366003190112610544576004356001600160401b03811161099a57610e37610e62913690600401610df5565b60243590610e44826104ef565b610e55610797600480606654161490565b610e5d613339565b61379d565b6001609755005b63ffffffff81160361050057565b3590610e8282610e69565b565b3461054957604036600319011261054457602435600435610ea482610e69565b610eb5610797600880606654161490565b60cb5491610ecd336001600160a01b03851614612de8565b63ffffffff81169263ffffffff8160c01c16841115610fb65763ffffffff7fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd0891610f18428710612ec7565b610f9c610f45610f3d610f3060ca5463ffffffff1690565b9360a01c63ffffffff1690565b844216612edd565b94610f77610f51612c0c565b88815263ffffffff8316602082015263ffffffff881660408201525f6060820152612ef7565b60cb805463ffffffff60c01b191660c09290921b63ffffffff60c01b16919091179055565b60405163ffffffff9094168452169180602081015b0390a4005b631ca7e50b60e21b5f5260045ffd5b34610549576040366003190112610544576004356001600160401b03811161099a57610ff5903690600401610663565b60243591611002836104ef565b611013610797600480606654161490565b61101b613339565b3681900360fe1901925f5b83811015610e62578060051b83013590858212156110525761104c83600193860161379d565b01611026565b6127da565b34610549575f366003190112610544576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610549576020366003190112610544576004356110b8816104ef565b60018060a01b03165f5260d56020526109f961110660405f2063ffffffff604051916110e3836126f4565b5461ffff8116835261ffff8160101c16602084015260201c166040820152613952565b60405161ffff90911681529081906020820190565b34610549575f36600319011261054457602063ffffffff60cb5460c01c16604051908152f35b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b34610549575f366003190112610544577f000000000000000000000000000000000000000000000000000000000000000060ff8116601f81116111d7576109f991604051916111bb60408461272f565b6020808452838101919036833783525260405191829182611141565b632cd44ac360e21b5f5260045ffd5b346105495760203660031901126105445761083f60043561120681610e69565b61120e6135e0565b6139dc565b34610549575f366003190112610544577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156109955760206024916040519283809263237dfb4760e11b82523360048301525afa801561099057611288915f91610b6d5750612d73565b61083f613638565b346105495760203660031901126105445760043560ff81168091036105005760016020911b806066541614604051908152f35b34610549575f366003190112610544576020606654604051908152f35b34610549576020366003190112610544576004356001600160401b03811161099a57611313611335913690600401610df5565b61132f611329823561132481610e69565b612c66565b50612c9b565b90613ac4565b602060405160018152f35b34610549575f36600319011261054457602061ffff60cb5460e01c16604051908152f35b3461054957604036600319011261054457600435611381816104ef565b6024359060018060a01b03165f5260cf60205260405f20905f52602052602060ff60405f2054166040519015158152f35b34610549575f366003190112610544576113ca6135e0565b603380546001600160a01b031981169091555f906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b34610549575f36600319011261054457602060ca54604051908152f35b346105495760203660031901126105445761083f60043561144a816104ef565b6114526135e0565b613c31565b346105495760403660031901126105445760206114ad600435611479816104ef565b60243590611486826104ef565b60018060a01b03165f5260cd835260405f209060018060a01b03165f5260205260405f2090565b54604051908152f35b34610549575f366003190112610544576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610549575f366003190112610544576033546040516001600160a01b039091168152602090f35b34610549575f36600319011261054457602060405173beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08152f35b34610549575f36600319011261054457611568612c1b565b5060ca545f198101908111611586576109ba6113296109f992612c66565b612bac565b34610549576040366003190112610544576004356115a8816104ef565b6024356001600160401b03811161099a576115c7903690600401610663565b91906115da610797602080606654161490565b6115e66107b383613294565b6115ee613339565b6001600160a01b038216915f5b84811061160c5761083f6001609755565b806116e161161d60019388876128a9565b6001600160a01b0385165f90815260ce602052604090205490604051602081019061164e8161089985878c87612b88565b5190208861165b83613462565b9361167d610910846109038c60018060a01b03165f5260d360205260405f2090565b61168681612bc0565b6001600160a01b038a165f90815260ce60205260409020557ffc8888bffd711da60bc5092b33f677d81896fe80ecc677b84cfab8184462b6e0604051806116cf87339583612fe7565b0390a43090610956602033920161266d565b016115fb565b34610549575f36600319011261054457602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461054957606036600319011261054457600435611744816104ef565b61174d366105f9565b9060018060a01b03165f5260d660205261177461176f60405f20923690612ffe565b613c78565b5f526020526109f961110660405f2063ffffffff604051916110e3836126f4565b346105495760203660031901126105445761083f6004356117b5816104ef565b33613cd7565b6024359061ffff8216820361050057565b6044359061ffff8216820361050057565b6084359061ffff8216820361050057565b6064359061ffff8216820361050057565b346105495760203660031901126105445760043561ffff811681036105005761083f9061182a6135e0565b613d2f565b346105495760403660031901126105445760043561184c816104ef565b6024359060018060a01b03165f5260d260205260405f20905f52602052602060ff60405f2054166040519015158152f35b346105495760403660031901126105445760043561189a816104ef565b6118a26117bb565b6118b3610797608080606654161490565b6118bf6107b383613294565b7fd1e028bd664486a46ad26040e999cd2d22e1e9a094ee6afe19fcf64678f16f746118fb63ffffffff60cb5460a01c1663ffffffff4216612edd565b9160018060a01b03841693845f5260d560205261194f848361194a61192f60405f2063ffffffff604051916110e3836126f4565b6001600160a01b039095165f90815260d56020526040902090565b613d8a565b6040805163ffffffff909516855261ffff9182166020860152911690830152339180606081015b0390a3005b3461054957602036600319011261054457600435611998816104ef565b60018060a01b03165f5260ce602052602060405f2054604051908152f35b34610549575f36600319011261054457602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461054957604036600319011261054457600435611a13816104ef565b6024359060018060a01b03165f5260d060205260405f20905f52602052602060ff60405f2054166040519015158152f35b34610549575f366003190112610544576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461054957606036600319011261054457600435611aa5816104ef565b602435611ab1816104ef565b611ab96117cc565b611aca610797604080606654161490565b611ad66107b384613294565b7f48e198b6ae357e529204ee53a8e514c470ff77d9cc8e4f7207f8b5d490ae6934611b1263ffffffff60cb5460a01c1663ffffffff4216612edd565b9160018060a01b03851693845f5260d4602052611b93848361194a84611b7e611b63611b518360405f209060018060a01b03165f5260205260405f2090565b63ffffffff604051916110e3836126f4565b6001600160a01b03909c165f90815260d46020526040902090565b9060018060a01b03165f5260205260405f2090565b6040805163ffffffff95909516855261ffff968716602086015291909516908301526001600160a01b039093169233918060608101610fb1565b34610549576020366003190112610544576109f96109ba611329600435611bf2612c1b565b50612c66565b604090600319011261054457600435611c10816104ef565b90602435611c1d816104ef565b90565b3461054957611c5d611b51611c3436611bf8565b9060018060a01b03165f5260d460205260405f209060018060a01b03165f5260205260405f2090565b60405161ffff9091168152602090f35b34610549576020366003190112610544576020611c8b6004356130b1565b63ffffffff60405191168152f35b34610549575f366003190112610544576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461054957604036600319011261054457600435611cfa816104ef565b6024359060018060a01b03165f5260d360205260405f20905f52602052602060ff60405f2054166040519015158152f35b3461054957611d3936611bf8565b611d456107b383613294565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610995576040516336b87bd760e11b81526001600160a01b038416600482015290602090829060249082905afa908115610990575f91611e74575b508015611dc7575b91611dc261083f93613116565b613cd7565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691823b156109955760405163ba1a84e560e01b81526001600160a01b038216600482015292602090849060249082905afa9283156109905761083f93611dc2915f91611e45575b50151591935050611db5565b611e67915060203d602011611e6d575b611e5f818361272f565b810190613107565b5f611e39565b503d611e55565b611e8d915060203d6020116109895761097b818361272f565b5f611dad565b3461054957604036600319011261054457600435611eb0816104ef565b6024359060018060a01b03165f5260d760205260405f20905f52602052602060ff60405f2054166040519015158152f35b3461054957602036600319011261054457600435611efe816104ef565b611f066135e0565b6001600160a01b03811615611f1e5761083f90613be9565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346105495760a036600319011261054457600435611f8f816104ef565b612002602435604435611fa1816104ef565b60643590611fae82610e69565b611fb66117dd565b925f5495611fe8611fd2611fce8960ff9060081c1690565b1590565b8098819961207c575b811561205c575b5061312c565b86611ff9600160ff195f5416175f55565b6120455761318f565b61200857005b61201661ff00195f54165f55565b604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1005b61205761010061ff00195f5416175f55565b61318f565b303b1591508161206e575b505f611fe2565b60ff1660011490505f612067565b600160ff8216109150611fdb565b34610549576080366003190112610544576004356120a7816104ef565b6120b0366105f9565b6120b86117ee565b6120ca61079761010080606654161490565b6120d66107b384613294565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561099557602060405180936304c1b8eb60e31b825281806121288860048301612795565b03915afa918215610990577f14918b3834ab6752eb2e1b489b6663a67810efb5f56f3944a97ede8ecf1fd9f192612165915f9161096157506127b0565b60cb546121819060a01c63ffffffff1663ffffffff4216612edd565b936119766121cb6121c66121c16121a88560018060a01b03165f5260d660205260405f2090565b6121b561176f368b612ffe565b5f5260205260405f2090565b612fa9565b613952565b926121fb878261194a6121ee8760018060a01b03165f5260d660205260405f2090565b6121b561176f368d612ffe565b60405193849360018060a01b0316973397856131ad565b34610549576040366003190112610544576020610bb0612231366105e3565b6131de565b346105495760203660031901126105445760043561225381610e69565b612264610797600880606654161490565b61227960018060a01b0360cb54163314612de8565b60ca549063ffffffff81169182101561230157612297600191612c66565b500163ffffffff81546122b060ff8260401c1615613225565b60201c164210156122f257805460ff60401b1916600160401b1790557fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e5f80a2005b630c36f66560e21b5f5260045ffd5b6394a8d38960e01b5f5260045ffd5b34610549576020366003190112610544576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600435813b156109955760206004926040519384809263755b36bd60e11b82525afa918215610990575f92612399575b5061083f91612394906001600160a01b0316331461323b565b613251565b91506020823d6020116123d4575b816123b46020938361272f565b810103126105445761239461083f92516123cd816104ef565b925061237b565b3d91506123a7565b34610549575f3660031901126105445760cb546040516001600160a01b039091168152602090f35b346105495761241236610bfb565b90612424610797600180606654161490565b61242c613339565b5f5b82811061243f5761083f6001609755565b806124ea6124506001938686612dfe565b335f90815260ce602052604090205460405160208101906124778161089986863387612e92565b519020906124848361369e565b335f90815260cf602052604090206124a190610910908490610903565b6124aa81612bc0565b335f90815260ce60205260409020556040517f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e6281339180610d278782612eb6565b0161242e565b34610549576124fe36610bfb565b90612510610797601080606654161490565b335f5260d160205261252860ff60405f205416612de8565b612530613339565b5f5b8281106125435761083f6001609755565b806125ee6125546001938686612dfe565b335f90815260ce6020526040902054604051602081019061257b8161089986863387612e92565b519020906125888361369e565b335f90815260d2602052604090206125a590610910908490610903565b6125ae81612bc0565b335f90815260ce60205260409020556040517f5251b6fdefcb5d81144e735f69ea4c695fd43b0289ca53dc075033f5fc80068b339180610d278782612eb6565b01612532565b60405162461bcd60e51b815260206004820152603560248201527f436f6e747261637420646f6573206e6f7420686176652066616c6c6261636b206044820152746e6f7220726563656976652066756e6374696f6e7360581b6064820152608490fd5b1561265e57565b63840a48d560e01b5f5260045ffd5b35611c1d816104ef565b1561267e57565b63932d94f760e01b5f5260045ffd5b60405162461bcd60e51b815260206004820152602560248201527f54617267657420636f6e747261637420646f6573206e6f7420636f6e7461696e60448201526420636f646560d81b6064820152608490fd5b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b0382111761270f57604052565b6126e0565b608081019081106001600160401b0382111761270f57604052565b90601f801991011681019081106001600160401b0382111761270f57604052565b908160209103126105445751611c1d816109fd565b63ffffffff602080928035612779816104ef565b6001600160a01b03168552013561278f81610e69565b16910152565b604081019291610e829190612765565b6040513d5f823e3d90fd5b156127b757565b631fb1705560e21b5f5260045ffd5b634e487b7160e01b5f52603260045260245ffd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206f6666736574000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063616c6c64617461207461696c206c656e677468000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527f43616c6c64617461207461696c20746f6f2073686f72740000000000000000006044820152606490fd5b91908110156128cb5760051b8101359060be1981360301821215611052570190565b6127c6565b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206c656e67746800006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c64617461206163636573732073747269646500006044820152606490fd5b60405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642063616c6c6461746120616363657373206f666673657400006044820152606490fd5b9035601e19823603018112156129dd5701602081359101916001600160401b0382116129d8578160061b360383136129d357565b612915565b6128d0565b61295a565b916020908281520191905f905b8082106129fc5750505090565b9091928335612a0a816104ef565b6001600160a01b0316815260208401356001600160601b0381169190829003610500576040816001936020839401520194019201906129ef565b9035601e19823603018112156129dd5701602081359101916001600160401b0382116129d85781360383136129d357565b908060209392818452848401375f828201840152601f01601f1916010190565b9190612ab2612aa4848061299f565b60c0845260c08401916129e2565b906020840135612ac1816104ef565b6001600160a01b0316602082810191909152612ae0604086018661299f565b838503604085015280855293909101925f5b818110612b5457505050612b4684612b20612b136060611c1d979801610e77565b63ffffffff166060850152565b612b3c612b2f60808301610e77565b63ffffffff166080850152565b60a0810190612a44565b9160a0818503910152612a75565b9091936040806001928735612b68816104ef565b848060a01b03168152602088013560208201520195019101919091612af2565b611c1d939260609260018060a01b0316825260208201528160408201520190612a95565b634e487b7160e01b5f52601160045260245ffd5b906001820180921161158657565b906020820180921161158657565b9190820180921161158657565b611c1d9392612bfa82608094612765565b60408201528160608201520190612a95565b60405190610e8260808361272f565b60405190612c2882612714565b5f6060838281528260208201528260408201520152565b8015611586575f190190565b5f1981019190821161158657565b9190820391821161158657565b60ca548110156128cb5760ca5f5260205f209060011b01905f90565b80548210156128cb575f5260205f209060011b01905f90565b90604051612ca881612714565b606060ff6001839580548552015463ffffffff8116602085015263ffffffff8160201c16604085015260401c161515910152565b612ce4612c1b565b5060ca54805b612d0f5750612cf7612c0c565b5f81525f60208201525f60408201525f606082015290565b612d1e61132961132483612c4b565b90612d2f611fce6060840151151590565b80612d4d575b612d4957612d439150612c3f565b80612cea565b5090565b50612d6b612d62604084015163ffffffff1690565b63ffffffff1690565b421015612d35565b15612d7a57565b631d77d47760e21b5f5260045ffd5b15612d9057565b63c61dca5d60e01b5f5260045ffd5b6020813591612dad836104ef565b01356040519060208201925f84526001600160601b03199060601b166021830152603582015260358152612de260558261272f565b51902090565b15612def57565b635c427cd960e01b5f5260045ffd5b91908110156128cb5760051b81013590609e1981360301821215611052570190565b90608063ffffffff81612e44612e36868061299f565b60a0875260a08701916129e2565b946020810135612e53816104ef565b6001600160a01b0316602086015260408181013590860152826060820135612e7a81610e69565b1660608601520135612e8b81610e69565b1691015290565b611c1d939260609260018060a01b0316825260208201528160408201520190612e20565b906020611c1d928181520190612e20565b15612ece57565b6306957c9160e11b5f5260045ffd5b9063ffffffff8091169116019063ffffffff821161158657565b60ca54600160401b81101561270f57806001612f18920160ca5560ca612c82565b919091612f965760606001610e829383518155019163ffffffff60208201511663ffffffff19845416178355612f7563ffffffff604083015116849067ffffffff0000000082549160201b169067ffffffff000000001916179055565b0151815460ff60401b191690151560401b68ff000000000000000016179055565b634e487b7160e01b5f525f60045260245ffd5b90604051612fb6816126f4565b604063ffffffff82945461ffff8116845261ffff8160101c16602085015260201c16910152565b35611c1d81610e69565b604090611c1d939281528160208201520190612a95565b919082604091031261304857604051604081018181106001600160401b0382111761270f5760405260208082948035613036816104ef565b845201359161304483610e69565b0152565b60405162461bcd60e51b815260206004820152602360248201527f414249206465636f64696e673a20737472756374206461746120746f6f2073686044820152621bdc9d60ea1b6064820152608490fd5b63ffffffff5f199116019063ffffffff821161158657565b63ffffffff60ca54165b63ffffffff81166130d55763504570e360e01b5f5260045ffd5b816130e261132483613099565b5054146130fd5763ffffffff168015611586575f19016130bb565b611c1d9150613099565b90816020910312610544575190565b1561311d57565b63fb494ea160e01b5f5260045ffd5b1561313357565b60405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608490fd5b61182a9261145261120e926131a8610e8298979561366c565b613be9565b929361ffff8092969563ffffffff6080956131cc8860a081019b612765565b16604087015216606085015216910152565b60208135916131ec836104ef565b0135604051906020820192600160f81b84526001600160601b03199060601b166021830152603582015260358152612de260558261272f565b1561322c57565b631b14174b60e01b5f5260045ffd5b1561324257565b63794821ff60e01b5f5260045ffd5b613262606654198219811614612d89565b806066556040519081527f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c60203392a2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b1561099557604051631beb2b9760e31b81526001600160a01b0390911660048201523360248201523060448201525f80356001600160e01b03191660648301529091602091839160849183915af1908115610990575f91613320575090565b611c1d915060203d6020116109895761097b818361272f565b60026097541461334a576002609755565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b903590601e198136030182121561105257018035906001600160401b0382116133c957602001918160061b360383136133c457565b612864565b61281f565b156133d557565b63796cc52560e01b5f5260045ffd5b156133eb57565b63150358a160e21b5f5260045ffd5b91908110156128cb5760061b0190565b1561341157565b630863a45360e11b5f5260045ffd5b1561342757565b6310fb47f160e31b5f5260045ffd5b1561343d57565b6310eb483f60e21b5f5260045ffd5b1561345357565b63070b5a6f60e21b5f5260045ffd5b906134cd916134db613474828061338f565b60608401959161349b9061348788612fdd565b608087019361349585612fdd565b92613f0c565b6134c76134c160408601976134bc6134b38a8961338f565b905015156133ce565b612fdd565b91612fdd565b90612edd565b63ffffffff429116106133e4565b5f928391825b6134eb838361338f565b90508410156135765761356d60019161354e6135118761350b888861338f565b906133fa565b9161353461352d6135218561266d565b6001600160a01b031690565b151561340a565b6135406135218461266d565b90858060a01b031610613420565b613567602082013591613562831515613436565b61266d565b97612bdc565b930192946134e1565b5050505090611c1d6f4b3b4ca85a86c47a098a223fffffffff82111561344c565b6040516323b872dd60e01b60208201526001600160a01b039283166024820152929091166044830152606480830193909352918152610e82916135db60848361272f565b614187565b6033546001600160a01b031633036135f457565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b5f196066556040515f1981527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2565b806066556040519081527fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d60203392a2565b6136fc6f4b3b4ca85a86c47a098a223fffffffff60406136e8936136c2818061338f565b9590606083013580976136d482610e69565b6080850135926136e384610e69565b613f0c565b01356136f5811515613436565b111561344c565b61370581610e69565b63ffffffff7f0000000000000000000000000000000000000000000000000000000000000000164201908142116115865763ffffffff161161374357565b637ee2b44360e01b5f5260045ffd5b903590601e198136030182121561105257018035906001600160401b0382116133c957602001918160051b360383136133c457565b1561378e57565b63aa385e8160e01b5f5260045ffd5b906137ad61132961132484612fdd565b906137b88284613ac4565b6137c46060840161266d565b936137ef6137e28660018060a01b03165f5260cc60205260405f2090565b546001600160a01b031690565b6001600160a01b0381161561394b575b90936001600160a01b0390911691613818338414612de8565b6001600160a01b038616915f5b61383260a0830183613752565b9050811015613941578061384f60019261350b60e086018661338f565b86867f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce318c6138ad6138908260018060a01b03165f5260cd60205260405f2090565b6138998761266d565b60018060a01b03165f5260205260405f2090565b546138f26138e96138ce6020890135936138c8818611613787565b84612c59565b6001600160a01b039094165f90815260cd6020526040902090565b6138998861266d565b55613906818a6139018861266d565b61423f565b6139118c519561266d565b604080519687526001600160a01b0391909116602087015285015260a086901b869003881693606090a401613825565b5050505050509050565b50846137ff565b604081015163ffffffff1680158015613999575b1561397a57505060cb5460e01c61ffff1690565b63ffffffff164210613991576020015161ffff1690565b5161ffff1690565b5061ffff806139aa845161ffff1690565b16148015613966575063ffffffff81164210613966565b6001600160401b03811161270f57601f01601f191660200190565b60cb54907faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b36040805163ffffffff8560a01c16815263ffffffff84166020820152a163ffffffff60a01b1990911660a09190911b63ffffffff60a01b161760cb55565b15613a4657565b631437a2bb60e31b5f5260045ffd5b15613a5c57565b6343714afd60e01b5f5260045ffd5b903590601e198136030182121561105257018035906001600160401b0382116133c9576020019181360383136133c457565b91908110156128cb5760051b0190565b908210156128cb57610c259160051b810190613a6b565b919091613adf613ada611fce6060860151151590565b613225565b613afe613af6612d62604086015163ffffffff1690565b421015613a3f565b60a0810190613b0d8282613752565b9050613b2a60c0830191613b218385613752565b91905014613a55565b613b71613b378284613752565b969050613b4c60e0850197613b21898761338f565b51613b5960208501612fdd565b613b666040860186613a6b565b91606087019361431b565b6080820135925f5b613b838285613752565b9050811015613be05780613bda8561350b8a613bd385613bca81613bc48c8f6134bc60019d8f613bb890613bbe94508d613752565b90613a9d565b98613752565b90613aad565b9490938c61338f565b928a614366565b01613b79565b50505050509050565b603380546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b60cb546001600160a01b0391821691829082167f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb5f80a36001600160a01b0319161760cb55565b602081519101516040519060208201926001600160601b03199060601b16835263ffffffff60a01b9060a01b16603482015260208152613cb960408261272f565b5190519060208110613cc9575090565b5f199060200360031b1b1690565b6001600160a01b039081165f81815260cc6020526040812080546001600160a01b03198116958516958617909155909216917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca3129080a4565b60cb54907fe6cd4edfdcc1f6d130ab35f73d72378f3a642944fb4ee5bd84b7807a81ea1c4e6040805161ffff8560e01c16815261ffff84166020820152a161ffff60e01b1990911660e09190911b61ffff60e01b161760cb55565b91909161271061ffff841611613e3757805463ffffffff8160201c16421115613e2857610e8293613ded91602081901c63ffffffff16613e0f5750825461ffff191661ffff1783555b825463ffff0000191660109190911b63ffff000016178255565b9067ffffffff0000000082549160201b169067ffffffff000000001916179055565b835461ffff191660109190911c61ffff16178355613dd3565b637b1e25c560e01b5f5260045ffd5b63891c63df60e01b5f5260045ffd5b15613e4d57565b630dd0b9f560e21b5f5260045ffd5b9063ffffffff16908115613e745763ffffffff160690565b634e487b7160e01b5f52601260045260245ffd5b15613e8f57565b63ee66470560e01b5f5260045ffd5b15613ea557565b63cb3f434d60e01b5f5260045ffd5b15613ebb57565b633c1a94f160e21b5f5260045ffd5b15613ed157565b63041aa75760e11b5f5260045ffd5b15613ee757565b632efd965160e11b5f5260045ffd5b15613efd57565b63dfad9ca160e01b5f5260045ffd5b9291613fb0613faa612d62613ff79495613f278715156133ce565b613fa463ffffffff8216613f6363ffffffff7f000000000000000000000000000000000000000000000000000000000000000016821115613e46565b613f9d63ffffffff613f967f00000000000000000000000000000000000000000000000000000000000000008096613e5c565b1615613e88565b1515613e9e565b84613e5c565b15613eb4565b63ffffffff613fe1817f00000000000000000000000000000000000000000000000000000000000000001642612c59565b91168091111590816140f7575b50929192613eca565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316915f90815b818310614034575050505050565b6140426135628484876133fa565b90853b156109955760405163198f077960e21b81526001600160a01b03831660048201526020816024818a5afa928315610990576001936140ab925f916140d9575b5080156140b3575b61409590613ee0565b838060a01b03168092848060a01b031610613ef6565b920191614026565b5060a084901b849003811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac01461408c565b6140f1915060203d81116109895761097b818361272f565b5f614084565b905063ffffffff7f00000000000000000000000000000000000000000000000000000000000000001611155f613fee565b1561412f57565b60405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b610e82916142099160018060a01b03165f80604051936141a860408661272f565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564602086015260208151910182855af13d15614237573d916141ed836139c1565b926141fb604051948561272f565b83523d5f602085013e614416565b805190811591821561421d575b5050614128565b6142309250602080918301019101612750565b5f80614216565b606091614416565b60405163a9059cbb60e01b60208201526001600160a01b039092166024830152604480830193909352918152610e82916135db60648361272f565b929192614286826139c1565b91614294604051938461272f565b8294818452818301116142b0578281602093845f960137010152565b60405162461bcd60e51b815260206004820152602760248201527f414249206465636f64696e673a20696e76616c69642062797465206172726179604482015266040d8cadccee8d60cb1b6064820152608490fd5b1561430c57565b6369ca16c960e01b5f5260045ffd5b91929063ffffffff169160018260051c1b8310156143585761434e61435394614346610e8297612d9f565b93369161427a565b6143a0565b614305565b62c6c39d60e71b5f5260045ffd5b91929063ffffffff169160018260051c1b8310156143915761434e61435394614346610e82976131de565b63054ff4df60e51b5f5260045ffd5b93909291601f8551166144075791906020925b855184116143fe57600183166143e4575f52828501516020526143dd60405f209260011c93612bce565b92916143b3565b838601515f526020526143dd60405f209260011c93612bce565b92509350501490565b6313717da960e21b5f5260045ffd5b91929015614478575081511561442a575090565b3b156144335790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b82519091501561448b5750805190602001fd5b60405162461bcd60e51b81529081906144a79060048301611141565b0390fdfea264697066735822122015d9847d6b18277ac3f2990e6431e5c53b08c56884c971148a4a2b902caf978a64736f6c634300081c0033"; + +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( + params: IRewardsCoordinatorTypes.RewardsCoordinatorConstructorParamsStruct, + overrides?: Overrides & { from?: string } + ): Promise { + return super.deploy(params, overrides || {}) as Promise; + } + override getDeployTransaction( + params: IRewardsCoordinatorTypes.RewardsCoordinatorConstructorParamsStruct, + overrides?: Overrides & { from?: string } + ): TransactionRequest { + return super.getDeployTransaction(params, 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/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 f45cbc5d..640b8d19 100644 --- a/src/avs/contracts/factories/index.ts +++ b/src/avs/contracts/factories/index.ts @@ -1,4 +1,13 @@ /* Autogenerated file. Do not edit manually. */ /* 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"; 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 b8866053..4043c142 100644 --- a/src/avs/contracts/index.ts +++ b/src/avs/contracts/index.ts @@ -1,6 +1,24 @@ /* Autogenerated file. Do not edit manually. */ /* 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"; 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 { 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"; +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 f1f5a11d..013b3706 100644 --- a/src/avs/tests/test.operator.ts +++ b/src/avs/tests/test.operator.ts @@ -9,22 +9,27 @@ * 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' 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 { 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' 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() +const defaultFee = 0x1000 + jest.setTimeout(60_000) describe('Operators', () => { @@ -62,8 +67,7 @@ describe('Operators', () => { } const userWallet = new Wallet(ownerPrivateKey, contracts.provider) - - const data = createSignDataForClaim({ + const data: CompleteClaimData = { provider: name, parameters: canonicalStringify(params), context: context @@ -72,12 +76,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 }) @@ -122,7 +129,8 @@ describe('Operators', () => { contract.updateTaskCreationMetadata({ minSignaturesPerTask: 2, maxTaskLifetimeS: 10, - maxTaskCreationDelayS: 0 + maxTaskCreationDelayS: 0, + minFee: defaultFee, }) ) ] @@ -132,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/) } } }) @@ -143,7 +151,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() => { @@ -164,20 +175,59 @@ 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) + 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 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) }) @@ -196,6 +246,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', @@ -228,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 @@ -235,7 +291,8 @@ describe('Operators', () => { await registerOperator({ wallet: operators[0].wallet, - reclaimRpcUrl: operators[0].url + reclaimRpcUrl: operators[0].url, + logger: logger.child({ op: operatorAddress }) }) assert.strictEqual( @@ -256,22 +313,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 @@ -292,12 +345,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 @@ -347,23 +402,27 @@ 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 taskCompletedEvent = events + ?.find(ev => (ev.event === 'TaskCompleted')) + ?.args as unknown as TaskCompletedEventObject + assert.ok(taskCompletedEvent.task) - assert.ok(arg.task) + return { taskCompletedEvent, events } } async function createClaimViaFn() { const tx = await contracts.contract.updateTaskCreationMetadata({ minSignaturesPerTask: 2, maxTaskLifetimeS: 0, - maxTaskCreationDelayS: 0 + maxTaskCreationDelayS: 0, + minFee: defaultFee }) 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, @@ -389,6 +448,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/tests/utils.ts b/src/avs/tests/utils.ts index d4c28d79..b7f718f8 100644 --- a/src/avs/tests/utils.ts +++ b/src/avs/tests/utils.ts @@ -1,11 +1,17 @@ import { spawn } from 'child_process' +import { BigNumberish } from 'ethers' 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() } }) @@ -26,25 +32,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/avs/types/index.ts b/src/avs/types/index.ts index 7853ae2c..47b669c6 100644 --- a/src/avs/types/index.ts +++ b/src/avs/types/index.ts @@ -1,5 +1,6 @@ -import type { NewTaskCreatedEventObject } from 'src/avs/contracts/ReclaimServiceManager' +import type { ethers } from 'ethers' +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' @@ -11,6 +12,8 @@ export type ChainConfig = { */ contractAddress: string delegationManagerAddress: string + rewardsCoordinatorAddress: string + slashingCoordinatorAddress: string stakeRegistryAddress: string avsDirectoryAddress: string } @@ -52,6 +55,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 5adf4482..d4050953 100644 --- a/src/avs/utils/contracts.ts +++ b/src/avs/utils/contracts.ts @@ -1,12 +1,9 @@ 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 { 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' -type Contracts = ReturnType +export type Contracts = ReturnType const configs: { [key: string]: Contracts } = {} @@ -30,6 +27,8 @@ export function initialiseContracts( avsDirectoryAddress, contractAddress, delegationManagerAddress, + rewardsCoordinatorAddress, + slashingCoordinatorAddress, }: ChainConfig, privateKey: string | undefined = PRIVATE_KEY ) { @@ -37,29 +36,65 @@ 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 + ) + + console.log('wallet ', wallet?.address) return { provider, wallet, - delegationManager: new ethers.Contract( + // eslint-disable-next-line camelcase + delegationManager: DelegationManager__factory.connect( delegationManagerAddress, - delegationABI, wallet || provider ), + contract, // eslint-disable-next-line camelcase - contract: ReclaimServiceManager__factory.connect( - contractAddress, - wallet || provider - ), - registryContract: new ethers.Contract( + 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 ), + // eslint-disable-next-line camelcase + rewardsCoordinator: RewardsCoordinator__factory.connect( + rewardsCoordinatorAddress, + wallet || provider + ), + // eslint-disable-next-line camelcase + slashingCoordinator: ReclaimSlashingRegistryCoordinator__factory.connect( + slashingCoordinatorAddress, + wallet || provider + ), + // eslint-disable-next-line camelcase + allocationManager: AllocationManager__factory.connect( + slashingCoordinatorAddress, + 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 +} + +// 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 diff --git a/src/avs/utils/register.ts b/src/avs/utils/register.ts index 9c8f36af..fd482d57 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 { AllocationManager__factory, SocketRegistry__factory } from 'src/avs/contracts' import { getContracts } from 'src/avs/utils/contracts' import { logger as LOGGER } from 'src/utils' @@ -23,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 @@ -42,83 +45,93 @@ export async function registerOperator({ .connect(wallet) const registryContract = contracts.registryContract .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 + try { - const tx1 = await delegationManager - .registerAsOperator({ - 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) { - 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 } 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: expiry, - salt: salt, - signature: '' - } + const tx = await allocationManager.registerForOperatorSets(addr, { + operatorSetIds: [OP_SET_ID], + avs: contract.address, + data: new Uint8Array(0) + }) + await tx.wait() - // Calculate the digest hash using the avsDirectory's method - const digestHash = await avsDirectory - .calculateOperatorAVSRegistrationDigestHash( - addr, - contract.address, - salt, - expiry - ) + logger.info('operator registered on AM successfully') - // Sign the digest hash with the operator's private key - const signingKey = new ethers.utils.SigningKey( - wallet.privateKey - ) - const signature = signingKey.signDigest(digestHash) + // 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 + // ) - // Encode the signature in the required format - operatorSignature.signature = ethers.utils.joinSignature(signature) + // // Sign the digest hash with the operator's private key + // const signingKey = new ethers.utils.SigningKey( + // wallet.privateKey + // ) + // const signature = signingKey.signDigest(digestHash) - logger.info('operator signature generated successfully') + // // Encode the signature in the required format + // operatorSignature.signature = ethers.utils.joinSignature(signature) - if(!(await registryContract.operatorRegistered(addr))) { - const tx2 = await registryContract - .registerOperatorWithSignature(addr, operatorSignature) - await tx2.wait() - logger.info('operator registered on AVS successfully') - } else { - logger.info('Operator already registered on AVS') - } + // logger.info('operator signature generated successfully') - const existingMetadata = await contract.getMetadataForOperator(addr) - .catch(err => { - if(err.message.includes('Operator not found')) { - return undefined - } + // 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') + // } - 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 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 } 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 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() 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