Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
0 TINTIN-BLUE-LOTUS
Holders
52
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 TINTIN-BLUE-LOTUSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0xEAEaC5B1...cfD1D1BFB The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
Diamond
Compiler Version
v0.8.1+commit.df193b15
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
/* * This file is part of the Qomet Technologies contracts (https://github.com/qomet-tech/contracts). * Copyright (c) 2022 Qomet Technologies (https://qomet.tech) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ // SPDX-License-Identifier: GNU General Public License v3.0 pragma solidity 0.8.1; import "../facets/task-executor/TaskExecutorLib.sol"; import "./IAppRegistry.sol"; import "./IAuthz.sol"; import "./IDiamond.sol"; import "./IDiamondInitializer.sol"; import "./IDiamondFacet.sol"; import "./FacetManager.sol"; /// @author Kam Amini <[email protected]> /// /// @notice Use at your own risk library DiamondInfo { string public constant VERSION = "3.1.0"; } contract Diamond is IDiamond, IDiamondInitializer { string private _name; string private _detailsURI; event FreezeAuthz(); event AppInstall(address appRegistry, string name, string version); event AppRegistrySet(address appRegistry); struct Authz { bool frozen; address source; string domain; uint256[] acceptedResults; string hashSalt; } Authz private _authz; bytes4[] private _defaultSupportingInterfceIds; address private _appRegistry; address private _initializer; bool private _initialized; modifier mustBeInitialized { require(_initialized, "DMND:NI"); _; } modifier notFrozenAuthz { require(!_authz.frozen, "DMND:AFRZN"); _; } modifier mutatorAuthz { _authorizeCall(msg.sender, address(this), msg.sig, true); _; } modifier getterAuthz { _authorizeCall(msg.sender, address(this), msg.sig, false); _; } constructor( bytes4[] memory defaultSupportingInterfceIds, address initializer ) { _initialized = false; _authz.hashSalt = "Dwt2wb1d976h"; _authz.acceptedResults.push(AuthzLib.ACCEPT_ACTION); _defaultSupportingInterfceIds = defaultSupportingInterfceIds; _initializer = initializer; } function initialize( string memory name, address taskManager, address appRegistry, address authzSource, string memory authzDomain, string[][2] memory defaultApps, // [0] > names, [1] > versions address[] memory defaultFacets, string[][2] memory defaultFuncSigsToProtectOrUnprotect, // [0] > protect, [1] > unprotect address[] memory defaultFacetsToFreeze, bool[3] memory instantLockAndFreezes // [0] > lock, [1] > freeze-authz, [2] > freeze-diamond ) external override { require(!_initialized, "DMND:AI"); require(msg.sender == _initializer, "DMND:WI"); _name = name; TaskExecutorLib._initialize(taskManager); __setAppRegistry(appRegistry); __setAuthzSource(authzSource); _authz.domain = authzDomain; require(defaultApps[0].length == defaultApps[1].length, "DMND:WL"); for (uint256 i = 0; i < defaultApps[0].length; i++) { __installApp( defaultApps[0][i], // name defaultApps[1][i], // version false // don't delete current facets ); } // install default facets for (uint256 i = 0; i < defaultFacets.length; i++) { FacetManagerLib._addFacet(defaultFacets[i]); } // protect default functions for (uint256 i = 0; i < defaultFuncSigsToProtectOrUnprotect[0].length; i++) { FacetManagerLib._protectFuncSig( defaultFuncSigsToProtectOrUnprotect[0][i], true // protect ); } // unprotect default functions for (uint256 i = 0; i < defaultFuncSigsToProtectOrUnprotect[1].length; i++) { FacetManagerLib._protectFuncSig( defaultFuncSigsToProtectOrUnprotect[1][i], false // unprotect ); } // lock the diamond if asked for if (instantLockAndFreezes[0]) { FacetManagerLib._setLocked(true); } // freeze facets for (uint256 i = 0; i < defaultFacetsToFreeze.length; i++) { FacetManagerLib._freezeFacet(defaultFacetsToFreeze[i]); } // freeze the authz settings if asked for if (instantLockAndFreezes[1]) { _authz.frozen = true; } // freeze the diamond if asked for if (instantLockAndFreezes[2]) { FacetManagerLib._freezeDiamond(); } _initialized = true; } function supportsInterface(bytes4 interfaceId) public view override getterAuthz virtual returns (bool) { // Querying for IDiamond must always return true if ( interfaceId == 0xd4bbd4bb || interfaceId == type(IDiamond).interfaceId ) { return true; } // Querying for IDiamondFacet must always return false if (interfaceId == type(IDiamondFacet).interfaceId) { return false; } // Always return true if (interfaceId == type(IERC165).interfaceId) { return true; } address[] memory facets = FacetManagerLib._getFacets(); for (uint256 i = 0; i < facets.length; i++) { address facet = facets[i]; if (!FacetManagerLib._isFacetDeleted(facet) && IDiamondFacet(facet).supportsInterface(interfaceId)) { return true; } } for (uint256 i = 0; i < _defaultSupportingInterfceIds.length; i++) { if (interfaceId == _defaultSupportingInterfceIds[i]) { return true; } } return false; } function isInitialized() external view returns (bool) { return _initialized; } function getDiamondName() external view virtual override mustBeInitialized getterAuthz returns (string memory) { return _name; } function getDiamondVersion() external view virtual override mustBeInitialized getterAuthz returns (string memory) { return DiamondInfo.VERSION; } function setDiamondName(string memory name) external mustBeInitialized mutatorAuthz { _name = name; } function getDetailsURI() external view mustBeInitialized getterAuthz returns (string memory) { return _detailsURI; } function setDetailsURI(string memory detailsURI) external mustBeInitialized mutatorAuthz { _detailsURI = detailsURI; } function getTaskManager() external view mustBeInitialized getterAuthz returns (address) { return TaskExecutorLib._getTaskManager("DEFAULT"); } function getAuthzSource() external view mustBeInitialized getterAuthz returns (address) { return _authz.source; } function setAuthzSource( address authzSource ) external mustBeInitialized notFrozenAuthz mutatorAuthz { __setAuthzSource(authzSource); } function getAuthzDomain() external view mustBeInitialized getterAuthz returns (string memory) { return _authz.domain; } function setAuthzDomain( string memory authzDomain ) external mustBeInitialized notFrozenAuthz mutatorAuthz { require(bytes(authzDomain).length > 0, "DMND:ED"); _authz.domain = authzDomain; } function getAcceptedAuthzResults() external view mustBeInitialized getterAuthz returns (uint256[] memory) { return _authz.acceptedResults; } function setAcceptedAuthzResults( uint256[] memory acceptedAuthzResults ) external mustBeInitialized notFrozenAuthz mutatorAuthz { require(acceptedAuthzResults.length > 0, "DMND:EA"); _authz.acceptedResults = acceptedAuthzResults; } function getAppRegistry() external view mustBeInitialized getterAuthz returns (address) { return _appRegistry; } function setAppRegistry(address appRegistry) external mustBeInitialized mutatorAuthz { __setAppRegistry(appRegistry); } function isDiamondFrozen() external view mustBeInitialized getterAuthz returns (bool) { return FacetManagerLib._isDiamondFrozen(); } function freezeDiamond( string memory taskManagerKey, uint256 adminTaskId ) external mustBeInitialized mutatorAuthz { FacetManagerLib._freezeDiamond(); TaskExecutorLib._executeAdminTask(taskManagerKey, adminTaskId); } function isFacetFrozen(address facet) external view mustBeInitialized getterAuthz returns (bool) { return FacetManagerLib._isFacetFrozen(facet); } function freezeFacet( string memory taskManagerKey, uint256 adminTaskId, address facet ) external mustBeInitialized mutatorAuthz { FacetManagerLib._freezeFacet(facet); TaskExecutorLib._executeAdminTask(taskManagerKey, adminTaskId); } function isAuthzFrozen() external view mustBeInitialized getterAuthz returns (bool) { return _authz.frozen; } function freezeAuthz( string memory taskManagerKey, uint256 adminTaskId ) external mustBeInitialized notFrozenAuthz mutatorAuthz { _authz.frozen = true; emit FreezeAuthz(); TaskExecutorLib._executeAdminTask(taskManagerKey, adminTaskId); } function isDiamondLocked() external view mustBeInitialized getterAuthz returns (bool) { return FacetManagerLib._isDiamondLocked(); } function setLocked( string memory taskManagerKey, uint256 taskId, bool locked ) external mustBeInitialized mutatorAuthz { FacetManagerLib._setLocked(locked); TaskExecutorLib._executeTask(taskManagerKey, taskId); } function getFacets() external view override mustBeInitialized getterAuthz returns (address[] memory) { return FacetManagerLib._getFacets(); } function resolve(string[] memory funcSigs) external view mustBeInitialized getterAuthz returns (address[] memory) { return FacetManagerLib._resolve(funcSigs); } function areFuncSigsProtected( string[] memory funcSigs ) external view mustBeInitialized getterAuthz returns (bool[] memory) { return FacetManagerLib._areFuncSigsProtected(funcSigs); } function protectFuncSig(string memory funcSig, bool protect) external mustBeInitialized notFrozenAuthz mutatorAuthz { FacetManagerLib._protectFuncSig(funcSig, protect); } function addFacets(address[] memory facets) external mustBeInitialized mutatorAuthz { FacetManagerLib._addFacets(facets); } function deleteFacets(address[] memory facets) external mustBeInitialized mutatorAuthz { FacetManagerLib._deleteFacets(facets); } function replaceFacets( address[] memory toBeDeletedFacets, address[] memory toBeAddedFacets ) external mustBeInitialized mutatorAuthz { FacetManagerLib._replaceFacets(toBeDeletedFacets, toBeAddedFacets); } function deleteAllFacets() external mustBeInitialized mutatorAuthz { FacetManagerLib._deleteAllFacets(); } function installApp( string memory appName, string memory appVersion, bool deleteCurrentFacets ) external mustBeInitialized mutatorAuthz { __installApp(appName, appVersion, deleteCurrentFacets); } function overrideFuncSigs( string[] memory funcSigs, address[] memory facets ) external mustBeInitialized mutatorAuthz { FacetManagerLib._overrideFuncSigs(funcSigs, facets); } function getOverridenFuncSigs() external view mustBeInitialized getterAuthz returns (string[] memory) { return FacetManagerLib._getOverridenFuncSigs(); } function tryAuthorizeCall( address caller, string memory funcSig ) external view mustBeInitialized getterAuthz { address facet = FacetManagerLib._findFacet(msg.sig); bytes4 funcSelector = FacetManagerLib._getSelector(funcSig); _authorizeCall(caller, facet, funcSelector, false); } function _authorizeCall( address caller, address facet, bytes4 funcSelector, bool treatAsProtected ) internal view { if (!treatAsProtected && !FacetManagerLib._isSelectorProtected(funcSelector)) { return; } require(_authz.source != address(0), "DMND:ZA"); bytes32 domainHash = keccak256(abi.encodePacked(_authz.hashSalt, _authz.domain)); bytes32 callerHash = keccak256(abi.encodePacked(_authz.hashSalt, caller)); bytes32[] memory targets = new bytes32[](3); targets[0] = keccak256(abi.encodePacked(_authz.hashSalt, address(this))); targets[1] = keccak256(abi.encodePacked(_authz.hashSalt, facet)); targets[2] = keccak256(abi.encodePacked(_authz.hashSalt, funcSelector)); uint256[] memory ops = new uint256[](1); ops[0] = AuthzLib.CALL_OP; uint256[] memory results = IAuthz(_authz.source) .authorize( domainHash, callerHash, targets, ops ); for (uint256 i = 0; i < _authz.acceptedResults.length; i++) { for (uint256 j = 0; j < results.length; j++) { if (_authz.acceptedResults[i] == results[j]) { return; } } } revert("DMND:NAUTH"); } function __setAuthzSource(address authzSource) private { require(authzSource != address(0), "DMND:ZA"); require( IERC165(authzSource).supportsInterface(type(IAuthz).interfaceId), "DMND:IAS" ); _authz.source = authzSource; } function __setAppRegistry(address appRegistry) private { if (appRegistry != address(0)) { require( IERC165(appRegistry).supportsInterface(type(IAppRegistry).interfaceId), "DMND:IAR" ); } _appRegistry = appRegistry; emit AppRegistrySet(_appRegistry); } function __installApp( string memory appName, string memory appVersion, bool deleteCurrentFacets ) private { require(_appRegistry != address(0), "DMND:ZAR"); if (deleteCurrentFacets) { FacetManagerLib._deleteAllFacets(); } address[] memory appFacets = IAppRegistry(_appRegistry).getAppFacets(appName, appVersion); for (uint256 i = 0; i < appFacets.length; i++) { FacetManagerLib._addFacet(appFacets[i]); } if (appFacets.length > 0) { emit AppInstall(_appRegistry, appName, appVersion); } } /* solhint-disable no-complex-fallback */ fallback() external payable { require(_initialized, "DMND:NI"); address facet = FacetManagerLib._findFacet(msg.sig); _authorizeCall(msg.sender, facet, msg.sig, false); /* solhint-disable no-inline-assembly */ assembly { calldatacopy(0, 0, calldatasize()) let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0) returndatacopy(0, 0, returndatasize()) switch result case 0 { revert(0, returndatasize()) } default { return(0, returndatasize()) } } /* solhint-enable no-inline-assembly */ } /* solhint-disable no-empty-blocks */ receive() external payable {} /* solhint-enable no-empty-blocks */ }
/* * This file is part of the Qomet Technologies contracts (https://github.com/qomet-tech/contracts). * Copyright (c) 2022 Qomet Technologies (https://qomet.tech) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ // SPDX-License-Identifier: GNU General Public License v3.0 pragma solidity 0.8.1; import "./TaskExecutorInternal.sol"; library TaskExecutorLib { function _initialize( address newTaskManager ) internal { TaskExecutorInternal._initialize(newTaskManager); } function _getTaskManager( string memory taskManagerKey ) internal view returns (address) { return TaskExecutorInternal._getTaskManager(taskManagerKey); } function _executeTask( string memory key, uint256 taskId ) internal { TaskExecutorInternal._executeTask(key, taskId); } function _executeAdminTask( string memory key, uint256 adminTaskId ) internal { TaskExecutorInternal._executeAdminTask(key, adminTaskId); } }
/* * This file is part of the Qomet Technologies contracts (https://github.com/qomet-tech/contracts). * Copyright (c) 2022 Qomet Technologies (https://qomet.tech) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ // SPDX-License-Identifier: GNU General Public License v3.0 pragma solidity 0.8.1; /// @author Kam Amini <[email protected]> /// /// @notice Use at your own risk interface IAppRegistry { function getAppFacets( string memory appName, string memory appVersion ) external view returns (address[] memory); }
/* * This file is part of the Qomet Technologies contracts (https://github.com/qomet-tech/contracts). * Copyright (c) 2022 Qomet Technologies (https://qomet.tech) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ // SPDX-License-Identifier: GNU General Public License v3.0 pragma solidity 0.8.1; library AuthzLib { uint256 public constant ROLE_AUTHZ_DIAMOND_ADMIN = uint256(keccak256(bytes("ROLE_AUTHZ_DIAMOND_ADMIN"))); uint256 public constant ROLE_AUTHZ_ADMIN = uint256(keccak256(bytes("ROLE_AUTHZ_ADMIN"))); bytes32 constant public GLOBAL_DOMAIN_ID = keccak256(abi.encodePacked("global")); bytes32 constant public MATCH_ALL_WILDCARD_HASH = keccak256(abi.encodePacked("*")); // operations uint256 constant public CALL_OP = 5000; uint256 constant public MATCH_ALL_WILDCARD_OP = 9999; // actions uint256 constant public ACCEPT_ACTION = 1; uint256 constant public REJECT_ACTION = 100; } /// @author Kam Amini <[email protected]> /// /// @notice Use at your own risk interface IAuthz { function authorize( bytes32 domainHash, bytes32 identityHash, bytes32[] memory targets, uint256[] memory ops ) external view returns (uint256[] memory); }
/* * This file is part of the Qomet Technologies contracts (https://github.com/qomet-tech/contracts). * Copyright (c) 2022 Qomet Technologies (https://qomet.tech) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ // SPDX-License-Identifier: GNU General Public License v3.0 pragma solidity 0.8.1; import "@openzeppelin/contracts/interfaces/IERC165.sol"; library DiamondLib { uint256 public constant ROLE_DIAMOND_ADMIN = uint256(keccak256(bytes("ROLE_DIAMOND_ADMIN"))); } /// @author Kam Amini <[email protected]> /// /// @notice Use at your own risk interface IDiamond is IERC165 { function getDiamondName() external view returns (string memory); function getDiamondVersion() external view returns (string memory); function getFacets() external view returns (address[] memory); }
/* * This file is part of the Qomet Technologies contracts (https://github.com/qomet-tech/contracts). * Copyright (c) 2022 Qomet Technologies (https://qomet.tech) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ // SPDX-License-Identifier: GNU General Public License v3.0 pragma solidity 0.8.1; /// @author Kam Amini <[email protected]> /// /// @notice Use at your own risk interface IDiamondInitializer { function initialize( string memory name, address taskManager, address appRegistry, address authzSource, string memory authzDomain, string[][2] memory defaultApps, // [0] > names, [1] > versions address[] memory defaultFacets, string[][2] memory defaultFuncSigsToProtectOrUnprotect, // [0] > protect, [1] > unprotect address[] memory defaultFacetsToFreeze, bool[3] memory instantLockAndFreezes // [0] > lock, [1] > freeze-authz, [2] > freeze-diamond ) external; }
/* * This file is part of the Qomet Technologies contracts (https://github.com/qomet-tech/contracts). * Copyright (c) 2022 Qomet Technologies (https://qomet.tech) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ // SPDX-License-Identifier: GNU General Public License v3.0 pragma solidity 0.8.1; import "@openzeppelin/contracts/interfaces/IERC165.sol"; /// @author Kam Amini <[email protected]> /// /// @notice Use at your own risk interface IDiamondFacet is IERC165 { // NOTE: The override MUST remain 'pure'. function getFacetName() external pure returns (string memory); // NOTE: The override MUST remain 'pure'. function getFacetVersion() external pure returns (string memory); // NOTE: The override MUST remain 'pure'. function getFacetPI() external pure returns (string[] memory); // NOTE: The override MUST remain 'pure'. function getFacetProtectedPI() external pure returns (string[] memory); }
/* * This file is part of the Qomet Technologies contracts (https://github.com/qomet-tech/contracts). * Copyright (c) 2022 Qomet Technologies (https://qomet.tech) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ // SPDX-License-Identifier: GNU General Public License v3.0 pragma solidity 0.8.1; import "./IDiamondFacet.sol"; /// @author Kam Amini <[email protected]> /// /// @notice Use at your own risk. Just got the basic /// idea from: https://github.com/solidstate-network/solidstate-solidity library FacetManagerStorage { struct Layout { // true if diamond is frozen meaning it cannot be changed anymore. // ATTENTION! once frozen, one WILL NEVER be able to undo that. bool diamondFrozen; // true if diamond is locked, meaning it cannot be changed anymore. // diamonds can be unlocked. bool diamondLocked; // list of facet addersses address[] facets; mapping(address => uint256) facetsIndex; // facet address > true if marked as deleted mapping(address => bool) deletedFacets; // function selector > facet address mapping(bytes4 => address) selectorToFacetMap; // list of overriden function signatures string[] overridenFuncSigs; mapping(string => uint256) overridenFuncSigsIndex; // facet address > true if frozen mapping(address => bool) frozenFacets; // function signature > true if protected mapping(bytes4 => bool) protectedSelectorMap; // Extra fields (reserved for future) mapping(bytes32 => bytes) extra; } bytes32 internal constant STORAGE_SLOT = keccak256("qomet-tech.contracts.diamond.facet-manager.storage"); function layout() internal pure returns (Layout storage s) { bytes32 slot = STORAGE_SLOT; /* solhint-disable no-inline-assembly */ assembly { s.slot := slot } /* solhint-enable no-inline-assembly */ } } library FacetManagerLib { event FacetAdd(address facet); event FacetDelete(address facet); event FreezeDiamond(); event SetLocked(bool locked); event FuncSigOverride(string funcSig, address facet); event ProtectFuncSig(string funcSig, bool protect); function _isDiamondFrozen() internal view returns (bool) { return __s().diamondFrozen; } function _freezeDiamond() internal { require(!__s().diamondFrozen, "FMLIB:DFRZN"); __s().diamondFrozen = true; emit FreezeDiamond(); } function _isFacetFrozen(address facet) internal view returns (bool) { return __s().frozenFacets[facet]; } function _freezeFacet(address facet) internal { require(!__s().diamondFrozen, "FMLIB:DFRZN"); require(facet != address(0), "FMLIB:ZF"); require(!__s().frozenFacets[facet], "FMLIB:FAF"); __s().frozenFacets[facet] = true; } function _isDiamondLocked() internal view returns (bool) { return __s().diamondLocked; } function _setLocked(bool locked) internal { require(!__s().diamondFrozen, "FMLIB:DFRZN"); __s().diamondLocked = locked; emit SetLocked(locked); } function _getFacets() internal view returns (address[] memory) { uint256 count = 0; for (uint256 i = 0; i < __s().facets.length; i++) { if (!__s().deletedFacets[__s().facets[i]]) { count += 1; } } address[] memory facets = new address[](count); uint256 index = 0; for (uint256 i = 0; i < __s().facets.length; i++) { if (!__s().deletedFacets[__s().facets[i]]) { facets[index] = __s().facets[i]; index += 1; } } return facets; } function _resolve(string[] memory funcSigs) internal view returns (address[] memory) { address[] memory facets = new address[](funcSigs.length); for (uint256 i = 0; i < funcSigs.length; i++) { string memory funcSig = funcSigs[i]; bytes4 selector = _getSelector(funcSig); facets[i] = __s().selectorToFacetMap[selector]; if (__s().deletedFacets[facets[i]]) { facets[i] = address(0); } } return facets; } function _areFuncSigsProtected( string[] memory funcSigs ) internal view returns (bool[] memory) { bool[] memory results = new bool[](funcSigs.length); for (uint256 i = 0; i < funcSigs.length; i++) { string memory funcSig = funcSigs[i]; bytes4 selector = _getSelector(funcSig); results[i] = __s().protectedSelectorMap[selector]; } return results; } function _protectFuncSig( string memory funcSig, bool protect ) internal { require(!__s().diamondLocked, "FMLIB:LCKD"); __protectFuncSig(funcSig, protect); } function _isSelectorProtected(bytes4 funcSelector) internal view returns (bool) { return __s().protectedSelectorMap[funcSelector]; } function _addFacets(address[] memory facets) internal { require(!__s().diamondFrozen, "FMLIB:DFRZN"); require(!__s().diamondLocked, "FMLIB:LCKD"); require(facets.length > 0, "FMLIB:ZL"); for (uint256 i = 0; i < facets.length; i++) { _addFacet(facets[i]); } } function _deleteFacets(address[] memory facets) internal { require(!__s().diamondFrozen, "FMLIB:DFRZN"); require(!__s().diamondLocked, "FMLIB:LCKD"); require(facets.length > 0, "FMLIB:ZL"); for (uint256 i = 0; i < facets.length; i++) { __deleteFacet(facets[i]); } } function _replaceFacets( address[] memory toBeDeletedFacets, address[] memory toBeAddedFacets ) internal { _deleteFacets(toBeDeletedFacets); _addFacets(toBeAddedFacets); } function _isFacetDeleted(address facet) internal view returns (bool) { return __s().deletedFacets[facet]; } function _deleteAllFacets() internal { require(!__s().diamondFrozen, "FMLIB:DFRZN"); require(!__s().diamondLocked, "FMLIB:LCKD"); for (uint256 i = 0; i < __s().facets.length; i++) { __deleteFacet(__s().facets[i]); } } function _overrideFuncSigs( string[] memory funcSigs, address[] memory facets ) internal { require(!__s().diamondFrozen, "FMLIB:DFRZN"); require(!__s().diamondLocked, "FMLIB:LCKD"); __overrideFuncSigs(funcSigs, facets); } function _getOverridenFuncSigs() internal view returns (string[] memory) { return __s().overridenFuncSigs; } function _findFacet(bytes4 selector) internal view returns (address) { address facet = __s().selectorToFacetMap[selector]; require(facet != address(0), "FMLIB:FNF"); require(!__s().deletedFacets[facet], "FMLIB:FREM"); return facet; } function _addFacet(address facet) internal { require(!__s().diamondFrozen, "FMLIB:DFRZN"); require(!__s().diamondLocked, "FMLIB:LCKD"); require(facet != address(0), "FMLIB:ZF"); require( IDiamondFacet(facet).supportsInterface(type(IDiamondFacet).interfaceId), "FMLIB:IF" ); string[] memory funcSigs = IDiamondFacet(facet).getFacetPI(); for (uint256 i = 0; i < funcSigs.length; i++) { string memory funcSig = funcSigs[i]; bytes4 selector = _getSelector(funcSig); address currentFacet = __s().selectorToFacetMap[selector]; if (currentFacet != address(0)) { // current facet must not be frozen require(!__s().frozenFacets[currentFacet], "FMLIB:FF"); } __s().selectorToFacetMap[selector] = facet; __protectFuncSig(funcSig, false); } string[] memory protectedFuncSigs = IDiamondFacet(facet).getFacetProtectedPI(); for (uint256 i = 0; i < protectedFuncSigs.length; i++) { string memory protectedFuncSig = protectedFuncSigs[i]; __protectFuncSig(protectedFuncSig, true); } __s().deletedFacets[facet] = false; // update facets array if (__s().facetsIndex[facet] == 0) { __s().facets.push(facet); __s().facetsIndex[facet] = __s().facets.length; } emit FacetAdd(facet); } function _getSelector(string memory funcSig) internal pure returns (bytes4) { bytes memory funcSigBytes = bytes(funcSig); for (uint256 i = 0; i < funcSigBytes.length; i++) { bytes1 b = funcSigBytes[i]; if ( !(b >= 0x30 && b <= 0x39) && // [0-9] !(b >= 0x41 && b <= 0x5a) && // [A-Z] !(b >= 0x61 && b <= 0x7a) && // [a-z] b != 0x24 && // $ b != 0x5f && // _ b != 0x2c && // , b != 0x28 && // ( b != 0x29 && // ) b != 0x5b && // [ b != 0x5d // ] ) { revert("FMLIB:IFS"); } } return bytes4(keccak256(bytes(funcSig))); } function __deleteFacet(address facet) private { require(facet != address(0), "FMLIB:ZF"); require(!__s().frozenFacets[facet], "FMLIB:FF"); __s().deletedFacets[facet] = true; emit FacetDelete(facet); } function __overrideFuncSigs( string[] memory funcSigs, address[] memory facets ) private { require(funcSigs.length > 0, "FMLIB:ZL"); require(funcSigs.length == facets.length, "FMLIB:IL"); for (uint i = 0; i < funcSigs.length; i++) { string memory funcSig = funcSigs[i]; address facet = facets[i]; bytes4 selector = _getSelector(funcSig); address currentFacet = __s().selectorToFacetMap[selector]; if (currentFacet != address(0)) { // current facet must not be frozen require(!__s().frozenFacets[currentFacet], "FMLIB:FF"); } __s().selectorToFacetMap[selector] = facet; __s().deletedFacets[facet] = false; if (__s().overridenFuncSigsIndex[funcSig] == 0) { __s().overridenFuncSigs.push(funcSig); __s().overridenFuncSigsIndex[funcSig] = __s().overridenFuncSigs.length; } emit FuncSigOverride(funcSig, facet); } } function __protectFuncSig(string memory funcSig, bool protect) private { bytes4 selector = _getSelector(funcSig); bool oldValue = __s().protectedSelectorMap[selector]; __s().protectedSelectorMap[selector] = protect; if (oldValue != protect) { emit ProtectFuncSig(funcSig, protect); } } function __s() private pure returns (FacetManagerStorage.Layout storage) { return FacetManagerStorage.layout(); } }
/* * This file is part of the Qomet Technologies contracts (https://github.com/qomet-tech/contracts). * Copyright (c) 2022 Qomet Technologies (https://qomet.tech) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ // SPDX-License-Identifier: GNU General Public License v3.0 pragma solidity 0.8.1; import "@openzeppelin/contracts/interfaces/IERC165.sol"; import "../hasher/HasherLib.sol"; import "./ITaskExecutor.sol"; import "./TaskExecutorStorage.sol"; library TaskExecutorInternal { event TaskManagerSet ( string key, address taskManager ); function _initialize( address newTaskManager ) internal { require(!__s().initialized, "TFI:AI"); __setTaskManager("DEFAULT", newTaskManager); __s().initialized = true; } function _getTaskManagerKeys() internal view returns (string[] memory) { return __s().keys; } function _getTaskManager(string memory key) internal view returns (address) { bytes32 keyHash = HasherLib._hashStr(key); require(__s().keysIndex[keyHash] > 0, "TFI:KNF"); return __s().taskManagers[keyHash]; } function _setTaskManager( uint256 adminTaskId, string memory key, address newTaskManager ) internal { require(__s().initialized, "TFI:NI"); bytes32 keyHash = HasherLib._hashStr(key); address oldTaskManager = __s().taskManagers[keyHash]; __setTaskManager(key, newTaskManager); if (oldTaskManager != address(0)) { ITaskExecutor(oldTaskManager).executeAdminTask(msg.sender, adminTaskId); } else { address defaultTaskManager = _getTaskManager("DEFAULT"); require(defaultTaskManager != address(0), "TFI:ZDTM"); ITaskExecutor(defaultTaskManager).executeAdminTask(msg.sender, adminTaskId); } } function _executeTask( string memory key, uint256 taskId ) internal { require(__s().initialized, "TFI:NI"); address taskManager = _getTaskManager(key); require(taskManager != address(0), "TFI:ZTM"); ITaskExecutor(taskManager).executeTask(msg.sender, taskId); } function _executeAdminTask( string memory key, uint256 adminTaskId ) internal { require(__s().initialized, "TFI:NI"); address taskManager = _getTaskManager(key); require(taskManager != address(0), "TFI:ZTM"); ITaskExecutor(taskManager).executeAdminTask(msg.sender, adminTaskId); } function __setTaskManager( string memory key, address newTaskManager ) internal { require(newTaskManager != address(0), "TFI:ZA"); require(IERC165(newTaskManager).supportsInterface(type(ITaskExecutor).interfaceId), "TFI:IC"); bytes32 keyHash = HasherLib._hashStr(key); if (__s().keysIndex[keyHash] == 0) { __s().keys.push(key); __s().keysIndex[keyHash] = __s().keys.length; } __s().taskManagers[keyHash] = newTaskManager; emit TaskManagerSet(key, newTaskManager); } function __s() private pure returns (TaskExecutorStorage.Layout storage) { return TaskExecutorStorage.layout(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) pragma solidity ^0.8.0; import "../utils/introspection/IERC165.sol";
/* * This file is part of the Qomet Technologies contracts (https://github.com/qomet-tech/contracts). * Copyright (c) 2022 Qomet Technologies (https://qomet.tech) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ // SPDX-License-Identifier: GNU General Public License v3.0 pragma solidity 0.8.1; library HasherLib { function _hashAddress(address addr) internal pure returns (bytes32) { return keccak256(abi.encodePacked(addr)); } function _hashStr(string memory str) internal pure returns (bytes32) { return keccak256(bytes(str)); } function _hashInt(uint256 num) internal pure returns (bytes32) { return keccak256(abi.encodePacked("INT", num)); } function _hashAccount(address account) internal pure returns (bytes32) { return keccak256(abi.encodePacked("ACCOUNT", account)); } function _hashVault(address vault) internal pure returns (bytes32) { return keccak256(abi.encodePacked("VAULT", vault)); } function _hashReserveId(uint256 reserveId) internal pure returns (bytes32) { return keccak256(abi.encodePacked("RESERVEID", reserveId)); } function _hashContract(address contractAddr) internal pure returns (bytes32) { return keccak256(abi.encodePacked("CONTRACT", contractAddr)); } function _hashTokenId(uint256 tokenId) internal pure returns (bytes32) { return keccak256(abi.encodePacked("TOKENID", tokenId)); } function _hashRole(string memory roleName) internal pure returns (bytes32) { return keccak256(abi.encodePacked("ROLE", roleName)); } function _hashLedgerId(uint256 ledgerId) internal pure returns (bytes32) { return keccak256(abi.encodePacked("LEDGERID", ledgerId)); } function _mixHash2( bytes32 d1, bytes32 d2 ) internal pure returns (bytes32) { return keccak256(abi.encodePacked("MIX2_", d1, d2)); } function _mixHash3( bytes32 d1, bytes32 d2, bytes32 d3 ) internal pure returns (bytes32) { return keccak256(abi.encodePacked("MIX3_", d1, d2, d3)); } function _mixHash4( bytes32 d1, bytes32 d2, bytes32 d3, bytes32 d4 ) internal pure returns (bytes32) { return keccak256(abi.encodePacked("MIX4_", d1, d2, d3, d4)); } }
/* * This file is part of the Qomet Technologies contracts (https://github.com/qomet-tech/contracts). * Copyright (c) 2022 Qomet Technologies (https://qomet.tech) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ // SPDX-License-Identifier: GNU General Public License v3.0 pragma solidity 0.8.1; /// @author Kam Amini <[email protected]> /// /// @notice Use at your own risk interface ITaskExecutor { event TaskExecuted(address finalizer, address executor, uint256 taskId); function executeTask(address executor, uint256 taskId) external; function executeAdminTask(address executor, uint256 taskId) external; }
/* * This file is part of the Qomet Technologies contracts (https://github.com/qomet-tech/contracts). * Copyright (c) 2022 Qomet Technologies (https://qomet.tech) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ // SPDX-License-Identifier: GNU General Public License v3.0 pragma solidity 0.8.1; /// @author Kam Amini <[email protected]> /// /// @notice Use at your own risk. Just got the basic /// idea from: https://github.com/solidstate-network/solidstate-solidity library TaskExecutorStorage { struct Layout { // list of the keys string[] keys; mapping(bytes32 => uint256) keysIndex; // keccak256(key) > task manager address mapping(bytes32 => address) taskManagers; // true if default task manager has been set bool initialized; mapping(bytes32 => bytes) extra; } bytes32 internal constant STORAGE_SLOT = keccak256("qomet-tech.contracts.facets.task-finalizer.storage"); function layout() internal pure returns (Layout storage s) { bytes32 slot = STORAGE_SLOT; /* solhint-disable no-inline-assembly */ assembly { s.slot := slot } /* solhint-enable no-inline-assembly */ } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"bytes4[]","name":"defaultSupportingInterfceIds","type":"bytes4[]"},{"internalType":"address","name":"initializer","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"appRegistry","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"version","type":"string"}],"name":"AppInstall","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"appRegistry","type":"address"}],"name":"AppRegistrySet","type":"event"},{"anonymous":false,"inputs":[],"name":"FreezeAuthz","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address[]","name":"facets","type":"address[]"}],"name":"addFacets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"funcSigs","type":"string[]"}],"name":"areFuncSigsProtected","outputs":[{"internalType":"bool[]","name":"","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deleteAllFacets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"facets","type":"address[]"}],"name":"deleteFacets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taskManagerKey","type":"string"},{"internalType":"uint256","name":"adminTaskId","type":"uint256"}],"name":"freezeAuthz","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taskManagerKey","type":"string"},{"internalType":"uint256","name":"adminTaskId","type":"uint256"}],"name":"freezeDiamond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taskManagerKey","type":"string"},{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"address","name":"facet","type":"address"}],"name":"freezeFacet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAcceptedAuthzResults","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAppRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAuthzDomain","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAuthzSource","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDetailsURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDiamondName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDiamondVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFacets","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOverridenFuncSigs","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaskManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"taskManager","type":"address"},{"internalType":"address","name":"appRegistry","type":"address"},{"internalType":"address","name":"authzSource","type":"address"},{"internalType":"string","name":"authzDomain","type":"string"},{"internalType":"string[][2]","name":"defaultApps","type":"string[][2]"},{"internalType":"address[]","name":"defaultFacets","type":"address[]"},{"internalType":"string[][2]","name":"defaultFuncSigsToProtectOrUnprotect","type":"string[][2]"},{"internalType":"address[]","name":"defaultFacetsToFreeze","type":"address[]"},{"internalType":"bool[3]","name":"instantLockAndFreezes","type":"bool[3]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"appName","type":"string"},{"internalType":"string","name":"appVersion","type":"string"},{"internalType":"bool","name":"deleteCurrentFacets","type":"bool"}],"name":"installApp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isAuthzFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isDiamondFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isDiamondLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"facet","type":"address"}],"name":"isFacetFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"funcSigs","type":"string[]"},{"internalType":"address[]","name":"facets","type":"address[]"}],"name":"overrideFuncSigs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"funcSig","type":"string"},{"internalType":"bool","name":"protect","type":"bool"}],"name":"protectFuncSig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"toBeDeletedFacets","type":"address[]"},{"internalType":"address[]","name":"toBeAddedFacets","type":"address[]"}],"name":"replaceFacets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"funcSigs","type":"string[]"}],"name":"resolve","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"acceptedAuthzResults","type":"uint256[]"}],"name":"setAcceptedAuthzResults","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"appRegistry","type":"address"}],"name":"setAppRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"authzDomain","type":"string"}],"name":"setAuthzDomain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"authzSource","type":"address"}],"name":"setAuthzSource","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"detailsURI","type":"string"}],"name":"setDetailsURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"setDiamondName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taskManagerKey","type":"string"},{"internalType":"uint256","name":"taskId","type":"uint256"},{"internalType":"bool","name":"locked","type":"bool"}],"name":"setLocked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"string","name":"funcSig","type":"string"}],"name":"tryAuthorizeCall","outputs":[],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620051883803806200518883398101604081905262000034916200026d565b6008805460ff60a01b1916905560408051808201909152600c8082526b088eee864eec462c8726e6cd60a31b60209092019182526200007691600591620000e8565b5060048054600181810183556000929092527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01558151620000c090600690602085019062000177565b50600880546001600160a01b0319166001600160a01b039290921691909117905550620003a7565b828054620000f69062000354565b90600052602060002090601f0160209004810192826200011a576000855562000165565b82601f106200013557805160ff191683800117855562000165565b8280016001018555821562000165579182015b828111156200016557825182559160200191906001019062000148565b506200017392915062000220565b5090565b82805482825590600052602060002090600701600890048101928215620001655791602002820160005b83821115620001e457835183826101000a81548163ffffffff021916908360e01c02179055509260200192600401602081600301049283019260010302620001a1565b8015620002165782816101000a81549063ffffffff0219169055600401602081600301049283019260010302620001e4565b5050620001739291505b5b8082111562000173576000815560010162000221565b80516001600160a01b03811681146200024f57600080fd5b919050565b80516001600160e01b0319811681146200024f57600080fd5b6000806040838503121562000280578182fd5b82516001600160401b038082111562000297578384fd5b818501915085601f830112620002ab578384fd5b8151602082821115620002c257620002c262000391565b808202604051601f19603f83011681018181108682111715620002e957620002e962000391565b604052838152828101945085830182870184018b101562000308578889fd5b8896505b848710156200033557620003208162000254565b8652600196909601959483019483016200030c565b50965062000347905087820162000237565b9450505050509250929050565b6002810460018216806200036957607f821691505b602082108114156200038b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b614dd180620003b76000396000f3fe60806040526004361061021e5760003560e01c8063866c535a11610123578063b7886c69116100ab578063da591dd21161006f578063da591dd214610682578063e1adb54114610697578063eac4d57e146106b9578063f63b653d146106d9578063f7cf890d146106f957610225565b8063b7886c69146105e2578063b85ba3b714610602578063ba262ec314610622578063c101446214610642578063d9ad72551461066257610225565b8063a48929d1116100f2578063a48929d114610558578063a4f400de14610578578063a60a20c514610598578063b4ff8ff1146105ad578063b57368db146105c257610225565b8063866c535a146104e1578063884a8f00146105015780638f001106146105165780639e0d9df71461054357610225565b806358b54dc5116101a65780637476cf52116101755780637476cf521461044857806374e3d9491461045d5780637dc8ac8c1461047f578063802bfd1b146104a1578063823d7303146104c157610225565b806358b54dc5146103c457806358eebefa146103e4578063662ea47d146104045780636e1c5ac21461042657610225565b806315fe9226116101ed57806315fe92261461033a578063341f50371461035a57806334936af41461037a578063392e53cd1461039a578063575fefb3146103af57610225565b806301ffc9a7146102ad5780631096553d146102e357806310f6f7c514610305578063111106d21461031a57610225565b3661022557005b600854600160a01b900460ff166102575760405162461bcd60e51b815260040161024e90614855565b60405180910390fd5b600061026e6000356001600160e01b03191661070e565b905061028933826000356001600160e01b03191660006107ac565b3660008037600080366000845af43d6000803e8080156102a8573d6000f35b3d6000fd5b3480156102b957600080fd5b506102cd6102c836600461412a565b610b29565b6040516102da919061473f565b60405180910390f35b3480156102ef57600080fd5b506103036102fe366004614008565b610d4b565b005b34801561031157600080fd5b506102cd610de8565b34801561032657600080fd5b5061030361033536600461437b565b610e37565b34801561034657600080fd5b50610303610355366004613d48565b610e8b565b34801561036657600080fd5b50610303610375366004614152565b610efc565b34801561038657600080fd5b50610303610395366004614184565b610f95565b3480156103a657600080fd5b506102cd61129f565b3480156103bb57600080fd5b506103036112af565b3480156103d057600080fd5b506102cd6103df366004613d48565b6112fb565b3480156103f057600080fd5b506103036103ff366004613e8a565b611349565b34801561041057600080fd5b50610419611395565b6040516102da9190614645565b34801561043257600080fd5b5061043b6113e7565b6040516102da91906146cc565b34801561045457600080fd5b506102cd611434565b34801561046957600080fd5b50610472611481565b6040516102da91906145d8565b34801561048b57600080fd5b506104946114ee565b6040516102da91906147c6565b3480156104ad57600080fd5b506103036104bc366004613d48565b6115c3565b3480156104cd57600080fd5b506103036104dc366004613db8565b61160e565b3480156104ed57600080fd5b506103036104fc36600461440a565b611659565b34801561050d57600080fd5b506104946116b3565b34801561052257600080fd5b50610536610531366004613ee0565b611705565b6040516102da9190614692565b34801561054f57600080fd5b50610472611753565b34801561056457600080fd5b50610303610573366004614152565b6117ad565b34801561058457600080fd5b5061030361059336600461437b565b611802565b3480156105a457600080fd5b506102cd6118a7565b3480156105b957600080fd5b506104726118f4565b3480156105ce57600080fd5b506103036105dd366004613db8565b611949565b3480156105ee57600080fd5b506103036105fd366004614307565b611994565b34801561060e57600080fd5b5061030361061d3660046143bd565b6119e1565b34801561062e57600080fd5b5061030361063d366004614152565b611a36565b34801561064e57600080fd5b5061041961065d366004613ee0565b611a8b565b34801561066e57600080fd5b5061030361067d3660046142b8565b611ad9565b34801561068e57600080fd5b50610494611b48565b3480156106a357600080fd5b506106ac611b9a565b6040516102da919061472c565b3480156106c557600080fd5b506103036106d4366004613fd4565b611c31565b3480156106e557600080fd5b506103036106f4366004613d6b565b611c7d565b34801561070557600080fd5b50610494611cf2565b600080610719611d57565b6001600160e01b03198416600090815260049190910160205260409020546001600160a01b031690508061075f5760405162461bcd60e51b815260040161024e90614a0c565b610767611d57565b6001600160a01b0382166000908152600391909101602052604090205460ff16156107a45760405162461bcd60e51b815260040161024e90614b5b565b90505b919050565b801580156107c057506107be82611d61565b155b156107ca57610b23565b60025461010090046001600160a01b03166107f75760405162461bcd60e51b815260040161024e90614876565b60405160009061080f906005906003906020016145c3565b60408051601f19818403018152908290528051602091820120925060009161083c91600591899101614571565b60408051601f198184030181528282528051602091820120600380855260808501909352935060009291908201606080368337505060405191925061088991600591503090602001614571565b60405160208183030381529060405280519060200120816000815181106108c057634e487b7160e01b600052603260045260246000fd5b6020026020010181815250506002600301866040516020016108e3929190614571565b604051602081830303815290604052805190602001208160018151811061091a57634e487b7160e01b600052603260045260246000fd5b60200260200101818152505060026003018560405160200161093d92919061459e565b604051602081830303815290604052805190602001208160028151811061097457634e487b7160e01b600052603260045260246000fd5b6020908102919091010152604080516001808252818301909252600091816020016020820280368337019050509050611388816000815181106109c757634e487b7160e01b600052603260045260246000fd5b6020908102919091010152600254604051631c0d022d60e21b815260009161010090046001600160a01b03169063703408b490610a0e90889088908890889060040161474a565b60006040518083038186803b158015610a2657600080fd5b505afa158015610a3a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a62919081019061408b565b905060005b600454811015610b0a5760005b8251811015610af757828181518110610a9d57634e487b7160e01b600052603260045260246000fd5b6020026020010151600280018381548110610ac857634e487b7160e01b600052603260045260246000fd5b90600052602060002001541415610ae55750505050505050610b23565b80610aef81614d31565b915050610a74565b5080610b0281614d31565b915050610a67565b5060405162461bcd60e51b815260040161024e90614bc3565b50505050565b6000610b4433306000356001600160e01b03191660006107ac565b63d4bbd4bb60e01b6001600160e01b031983161480610b7357506001600160e01b031982166325dc185160e11b145b15610b80575060016107a7565b6001600160e01b0319821663b2fe033560e01b1415610ba1575060006107a7565b6001600160e01b031982166301ffc9a760e01b1415610bc2575060016107a7565b6000610bcc611d91565b905060005b8151811015610cb7576000828281518110610bfc57634e487b7160e01b600052603260045260246000fd5b60200260200101519050610c0f81611fa5565b158015610c9357506040516301ffc9a760e01b81526001600160a01b038216906301ffc9a790610c439088906004016147b1565b60206040518083038186803b158015610c5b57600080fd5b505afa158015610c6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c93919061410e565b15610ca457600193505050506107a7565b5080610caf81614d31565b915050610bd1565b5060005b600654811015610d415760068181548110610ce657634e487b7160e01b600052603260045260246000fd5b90600052602060002090600891828204019190066004029054906101000a900460e01b6001600160e01b031916846001600160e01b0319161415610d2f576001925050506107a7565b80610d3981614d31565b915050610cbb565b5060009392505050565b600854600160a01b900460ff16610d745760405162461bcd60e51b815260040161024e90614855565b60025460ff1615610d975760405162461bcd60e51b815260040161024e906148fe565b610db033306000356001600160e01b03191660016107ac565b6000815111610dd15760405162461bcd60e51b815260040161024e90614a2f565b8051610de4906004906020840190613aaa565b5050565b600854600090600160a01b900460ff16610e145760405162461bcd60e51b815260040161024e90614855565b610e2d33306000356001600160e01b03191660006107ac565b5060025460ff1690565b600854600160a01b900460ff16610e605760405162461bcd60e51b815260040161024e90614855565b610e7933306000356001600160e01b03191660016107ac565b610e81611fd4565b610de48282612041565b600854600160a01b900460ff16610eb45760405162461bcd60e51b815260040161024e90614855565b60025460ff1615610ed75760405162461bcd60e51b815260040161024e906148fe565b610ef033306000356001600160e01b03191660016107ac565b610ef98161204b565b50565b600854600160a01b900460ff16610f255760405162461bcd60e51b815260040161024e90614855565b60025460ff1615610f485760405162461bcd60e51b815260040161024e906148fe565b610f6133306000356001600160e01b03191660016107ac565b6000815111610f825760405162461bcd60e51b815260040161024e906149eb565b8051610de4906003906020840190613af5565b600854600160a01b900460ff1615610fbf5760405162461bcd60e51b815260040161024e906149ca565b6008546001600160a01b03163314610fe95760405162461bcd60e51b815260040161024e90614922565b8951610ffc9060009060208d0190613af5565b5061100689612138565b61100f88612141565b6110188761204b565b855161102b906003906020890190613af5565b50602085015151855151146110525760405162461bcd60e51b815260040161024e906148dd565b60005b8551518110156110f457855180516110e291908390811061108657634e487b7160e01b600052603260045260246000fd5b6020026020010151876001600281106110af57634e487b7160e01b600052603260045260246000fd5b602002015183815181106110d357634e487b7160e01b600052603260045260246000fd5b6020026020010151600061224b565b806110ec81614d31565b915050611055565b5060005b84518110156111435761113185828151811061112457634e487b7160e01b600052603260045260246000fd5b60200260200101516123a2565b8061113b81614d31565b9150506110f8565b5060005b835151811015611199578351805161118791908390811061117857634e487b7160e01b600052603260045260246000fd5b60200260200101516001612834565b8061119181614d31565b915050611147565b5060005b6020840151518110156111f5576111e3846001602002015182815181106111d457634e487b7160e01b600052603260045260246000fd5b60200260200101516000612834565b806111ed81614d31565b91505061119d565b5080511561120757611207600161286c565b60005b82518110156112555761124383828151811061123657634e487b7160e01b600052603260045260246000fd5b60200260200101516128e4565b8061124d81614d31565b91505061120a565b5060208101511561126e576002805460ff191660011790555b60408101511561128057611280611fd4565b50506008805460ff60a01b1916600160a01b1790555050505050505050565b600854600160a01b900460ff1690565b600854600160a01b900460ff166112d85760405162461bcd60e51b815260040161024e90614855565b6112f133306000356001600160e01b03191660016107ac565b6112f96129b1565b565b600854600090600160a01b900460ff166113275760405162461bcd60e51b815260040161024e90614855565b61134033306000356001600160e01b03191660006107ac565b6107a482612a77565b600854600160a01b900460ff166113725760405162461bcd60e51b815260040161024e90614855565b61138b33306000356001600160e01b03191660016107ac565b610de48282612aa6565b600854606090600160a01b900460ff166113c15760405162461bcd60e51b815260040161024e90614855565b6113da33306000356001600160e01b03191660006107ac565b6113e2611d91565b905090565b600854606090600160a01b900460ff166114135760405162461bcd60e51b815260040161024e90614855565b61142c33306000356001600160e01b03191660006107ac565b6113e2612ab8565b600854600090600160a01b900460ff166114605760405162461bcd60e51b815260040161024e90614855565b61147933306000356001600160e01b03191660006107ac565b6113e2612b9a565b600854600090600160a01b900460ff166114ad5760405162461bcd60e51b815260040161024e90614855565b6114c633306000356001600160e01b03191660006107ac565b6113e2604051806040016040528060078152602001661111519055531560ca1b815250612bad565b600854606090600160a01b900460ff1661151a5760405162461bcd60e51b815260040161024e90614855565b61153333306000356001600160e01b03191660006107ac565b6003805461154090614cf6565b80601f016020809104026020016040519081016040528092919081815260200182805461156c90614cf6565b80156115b95780601f1061158e576101008083540402835291602001916115b9565b820191906000526020600020905b81548152906001019060200180831161159c57829003601f168201915b5050505050905090565b600854600160a01b900460ff166115ec5760405162461bcd60e51b815260040161024e90614855565b61160533306000356001600160e01b03191660016107ac565b610ef981612141565b600854600160a01b900460ff166116375760405162461bcd60e51b815260040161024e90614855565b61165033306000356001600160e01b03191660016107ac565b610ef981612bb8565b600854600160a01b900460ff166116825760405162461bcd60e51b815260040161024e90614855565b61169b33306000356001600160e01b03191660016107ac565b6116a48161286c565b6116ae8383612c71565b505050565b600854606090600160a01b900460ff166116df5760405162461bcd60e51b815260040161024e90614855565b6116f833306000356001600160e01b03191660006107ac565b6001805461154090614cf6565b600854606090600160a01b900460ff166117315760405162461bcd60e51b815260040161024e90614855565b61174a33306000356001600160e01b03191660006107ac565b6107a482612c7b565b600854600090600160a01b900460ff1661177f5760405162461bcd60e51b815260040161024e90614855565b61179833306000356001600160e01b03191660006107ac565b5060025461010090046001600160a01b031690565b600854600160a01b900460ff166117d65760405162461bcd60e51b815260040161024e90614855565b6117ef33306000356001600160e01b03191660016107ac565b8051610de4906001906020840190613af5565b600854600160a01b900460ff1661182b5760405162461bcd60e51b815260040161024e90614855565b60025460ff161561184e5760405162461bcd60e51b815260040161024e906148fe565b61186733306000356001600160e01b03191660016107ac565b6002805460ff191660011790556040517f0e3932f7da01145f763331680b780b1352f2d7243e48c082aa38cb0750c2316090600090a1610de48282612041565b600854600090600160a01b900460ff166118d35760405162461bcd60e51b815260040161024e90614855565b6118ec33306000356001600160e01b03191660006107ac565b6113e2612d91565b600854600090600160a01b900460ff166119205760405162461bcd60e51b815260040161024e90614855565b61193933306000356001600160e01b03191660006107ac565b506007546001600160a01b031690565b600854600160a01b900460ff166119725760405162461bcd60e51b815260040161024e90614855565b61198b33306000356001600160e01b03191660016107ac565b610ef981612da9565b600854600160a01b900460ff166119bd5760405162461bcd60e51b815260040161024e90614855565b6119d633306000356001600160e01b03191660016107ac565b6116ae83838361224b565b600854600160a01b900460ff16611a0a5760405162461bcd60e51b815260040161024e90614855565b611a2333306000356001600160e01b03191660016107ac565b611a2c816128e4565b6116ae8383612041565b600854600160a01b900460ff16611a5f5760405162461bcd60e51b815260040161024e90614855565b611a7833306000356001600160e01b03191660016107ac565b8051610de4906000906020840190613af5565b600854606090600160a01b900460ff16611ab75760405162461bcd60e51b815260040161024e90614855565b611ad033306000356001600160e01b03191660006107ac565b6107a482612e6f565b600854600160a01b900460ff16611b025760405162461bcd60e51b815260040161024e90614855565b60025460ff1615611b255760405162461bcd60e51b815260040161024e906148fe565b611b3e33306000356001600160e01b03191660016107ac565b610de48282612834565b600854606090600160a01b900460ff16611b745760405162461bcd60e51b815260040161024e90614855565b611b8d33306000356001600160e01b03191660006107ac565b6000805461154090614cf6565b600854606090600160a01b900460ff16611bc65760405162461bcd60e51b815260040161024e90614855565b611bdf33306000356001600160e01b03191660006107ac565b60048054604080516020808402820181019092528281529291908301828280156115b957602002820191906000526020600020905b815481526020019060010190808311611c14575050505050905090565b600854600160a01b900460ff16611c5a5760405162461bcd60e51b815260040161024e90614855565b611c7333306000356001600160e01b03191660016107ac565b610de48282613030565b600854600160a01b900460ff16611ca65760405162461bcd60e51b815260040161024e90614855565b611cbf33306000356001600160e01b03191660006107ac565b6000611cd66000356001600160e01b03191661070e565b90506000611ce383613091565b9050610b2384838360006107ac565b600854606090600160a01b900460ff16611d1e5760405162461bcd60e51b815260040161024e90614855565b611d3733306000356001600160e01b03191660006107ac565b506040805180820190915260058152640332e312e360dc1b602082015290565b60006113e2613255565b6000611d6b611d57565b6001600160e01b0319929092166000908152600890920160205250604090205460ff1690565b60606000805b611d9f611d57565b60010154811015611e2d57611db2611d57565b6003016000611dbf611d57565b6001018381548110611de157634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff16611e1b57611e18600183614cb2565b91505b80611e2581614d31565b915050611d97565b506000816001600160401b03811115611e5657634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611e7f578160200160208202803683370190505b5090506000805b611e8e611d57565b60010154811015611f9c57611ea1611d57565b6003016000611eae611d57565b6001018381548110611ed057634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff16611f8a57611f04611d57565b6001018181548110611f2657634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b0316838381518110611f6457634e487b7160e01b600052603260045260246000fd5b6001600160a01b0390921660209283029190910190910152611f87600183614cb2565b91505b80611f9481614d31565b915050611e86565b50909250505090565b6000611faf611d57565b6001600160a01b03929092166000908152600390920160205250604090205460ff1690565b611fdc611d57565b5460ff1615611ffd5760405162461bcd60e51b815260040161024e90614be7565b6001612007611d57565b805460ff19169115159190911790556040517f2eb10865de63732f26f9b8475ebe6fb377a5c8eb3b49e8139b8d8d9135cd240490600090a1565b610de48282613279565b6001600160a01b0381166120715760405162461bcd60e51b815260040161024e90614876565b6040516301ffc9a760e01b81526001600160a01b038216906301ffc9a7906120a490631c0d022d60e21b906004016147b1565b60206040518083038186803b1580156120bc57600080fd5b505afa1580156120d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f4919061410e565b6121105760405162461bcd60e51b815260040161024e906148bb565b600280546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b610ef98161333c565b6001600160a01b038116156121ef576040516301ffc9a760e01b81526001600160a01b038216906301ffc9a79061218390637cb27a4560e11b906004016147b1565b60206040518083038186803b15801561219b57600080fd5b505afa1580156121af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d3919061410e565b6121ef5760405162461bcd60e51b815260040161024e90614ad6565b600780546001600160a01b0319166001600160a01b0383811691909117918290556040517fcf495d505c54debf2cfce37abde02663348726740343e67e0461e3c5900bee35926122409216906145d8565b60405180910390a150565b6007546001600160a01b03166122735760405162461bcd60e51b815260040161024e90614a91565b8015612281576122816129b1565b600754604051637cb27a4560e11b81526000916001600160a01b03169063f964f48a906122b49087908790600401614827565b60006040518083038186803b1580156122cc57600080fd5b505afa1580156122e0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526123089190810190613df2565b905060005b815181101561234b5761233982828151811061112457634e487b7160e01b600052603260045260246000fd5b8061234381614d31565b91505061230d565b50805115610b23576007546040517f7cc2a985f8db0a56f86b96b09468939ad35546d78a751f8655660e5e0910cf6d91612394916001600160a01b0390911690879087906145ec565b60405180910390a150505050565b6123aa611d57565b5460ff16156123cb5760405162461bcd60e51b815260040161024e90614be7565b6123d3611d57565b54610100900460ff16156123f95760405162461bcd60e51b815260040161024e90614897565b6001600160a01b03811661241f5760405162461bcd60e51b815260040161024e90614b19565b6040516301ffc9a760e01b81526001600160a01b038216906301ffc9a7906124529063b2fe033560e01b906004016147b1565b60206040518083038186803b15801561246a57600080fd5b505afa15801561247e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a2919061410e565b6124be5760405162461bcd60e51b815260040161024e90614963565b6000816001600160a01b0316631078fade6040518163ffffffff1660e01b815260040160006040518083038186803b1580156124f957600080fd5b505afa15801561250d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526125359190810190613f12565b905060005b815181101561266057600082828151811061256557634e487b7160e01b600052603260045260246000fd5b60200260200101519050600061257a82613091565b90506000612586611d57565b6001600160e01b03198316600090815260049190910160205260409020546001600160a01b0316905080156125fa576125bd611d57565b6001600160a01b0382166000908152600791909101602052604090205460ff16156125fa5760405162461bcd60e51b815260040161024e90614b7f565b85612603611d57565b6001600160e01b0319841660009081526004919091016020526040812080546001600160a01b0319166001600160a01b03939093169290921790915561264a9084906133b0565b505050808061265890614d31565b91505061253a565b506000826001600160a01b03166368498a336040518163ffffffff1660e01b815260040160006040518083038186803b15801561269c57600080fd5b505afa1580156126b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526126d89190810190613f12565b905060005b815181101561273057600082828151811061270857634e487b7160e01b600052603260045260246000fd5b6020026020010151905061271d8160016133b0565b508061272881614d31565b9150506126dd565b50600061273b611d57565b6001600160a01b038516600090815260039190910160205260409020805460ff191691151591909117905561276e611d57565b6001600160a01b038416600090815260029190910160205260409020546127f857612797611d57565b6001908101805491820181556000908152602090200180546001600160a01b0319166001600160a01b0385161790556127ce611d57565b600101546127da611d57565b6001600160a01b038516600090815260029190910160205260409020555b7f43908041a0d1c29893f2c5ad648ccb6799faecac83f7fcc80ef1a5e297d95f4b8360405161282791906145d8565b60405180910390a1505050565b61283c611d57565b54610100900460ff16156128625760405162461bcd60e51b815260040161024e90614897565b610de482826133b0565b612874611d57565b5460ff16156128955760405162461bcd60e51b815260040161024e90614be7565b8061289e611d57565b80549115156101000261ff00199092169190911790556040517f9514871d395e6e24ef28f340cbcdcaa89f790cdf4a4fa6c25cf83a81fb27a86d9061224090839061473f565b6128ec611d57565b5460ff161561290d5760405162461bcd60e51b815260040161024e90614be7565b6001600160a01b0381166129335760405162461bcd60e51b815260040161024e90614b19565b61293b611d57565b6001600160a01b0382166000908152600791909101602052604090205460ff16156129785760405162461bcd60e51b815260040161024e90614985565b6001612982611d57565b6001600160a01b0392909216600090815260079092016020526040909120805460ff1916911515919091179055565b6129b9611d57565b5460ff16156129da5760405162461bcd60e51b815260040161024e90614be7565b6129e2611d57565b54610100900460ff1615612a085760405162461bcd60e51b815260040161024e90614897565b60005b612a13611d57565b60010154811015610ef957612a65612a29611d57565b6001018281548110612a4b57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031661345b565b80612a6f81614d31565b915050612a0b565b6000612a81611d57565b6001600160a01b03929092166000908152600790920160205250604090205460ff1690565b612aaf82612da9565b610de481612bb8565b6060612ac2611d57565b600501805480602002602001604051908101604052809291908181526020016000905b82821015612b91578382906000526020600020018054612b0490614cf6565b80601f0160208091040260200160405190810160405280929190818152602001828054612b3090614cf6565b8015612b7d5780601f10612b5257610100808354040283529160200191612b7d565b820191906000526020600020905b815481529060010190602001808311612b6057829003601f168201915b505050505081526020019060010190612ae5565b50505050905090565b6000612ba4611d57565b5460ff16905090565b60006107a48261352c565b612bc0611d57565b5460ff1615612be15760405162461bcd60e51b815260040161024e90614be7565b612be9611d57565b54610100900460ff1615612c0f5760405162461bcd60e51b815260040161024e90614897565b6000815111612c305760405162461bcd60e51b815260040161024e90614ba1565b60005b8151811015610de457612c5f82828151811061112457634e487b7160e01b600052603260045260246000fd5b80612c6981614d31565b915050612c33565b610de4828261359b565b6060600082516001600160401b03811115612ca657634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612ccf578160200160208202803683370190505b50905060005b8351811015612d8a576000848281518110612d0057634e487b7160e01b600052603260045260246000fd5b602002602001015190506000612d1582613091565b9050612d1f611d57565b6001600160e01b0319821660009081526008919091016020526040902054845160ff90911690859085908110612d6557634e487b7160e01b600052603260045260246000fd5b9115156020928302919091019091015250819050612d8281614d31565b915050612cd5565b5092915050565b6000612d9b611d57565b54610100900460ff16919050565b612db1611d57565b5460ff1615612dd25760405162461bcd60e51b815260040161024e90614be7565b612dda611d57565b54610100900460ff1615612e005760405162461bcd60e51b815260040161024e90614897565b6000815111612e215760405162461bcd60e51b815260040161024e90614ba1565b60005b8151811015610de457612e5d828281518110612e5057634e487b7160e01b600052603260045260246000fd5b602002602001015161345b565b80612e6781614d31565b915050612e24565b6060600082516001600160401b03811115612e9a57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612ec3578160200160208202803683370190505b50905060005b8351811015612d8a576000848281518110612ef457634e487b7160e01b600052603260045260246000fd5b602002602001015190506000612f0982613091565b9050612f13611d57565b6001600160e01b031982166000908152600491909101602052604090205484516001600160a01b0390911690859085908110612f5f57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050612f87611d57565b6003016000858581518110612fac57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff161561301b576000848481518110612ffa57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250505b5050808061302890614d31565b915050612ec9565b613038611d57565b5460ff16156130595760405162461bcd60e51b815260040161024e90614be7565b613061611d57565b54610100900460ff16156130875760405162461bcd60e51b815260040161024e90614897565b610de48282613627565b600081815b81518110156132455760008282815181106130c157634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b0319169050600360fc1b81108015906130f45750603960f81b6001600160f81b0319821611155b15801561312a5750604160f81b6001600160f81b03198216108015906131285750602d60f91b6001600160f81b0319821611155b155b801561315f5750606160f81b6001600160f81b031982161080159061315d5750603d60f91b6001600160f81b0319821611155b155b80156131795750600960fa1b6001600160f81b0319821614155b80156131935750605f60f81b6001600160f81b0319821614155b80156131ad5750600b60fa1b6001600160f81b0319821614155b80156131c75750600560fb1b6001600160f81b0319821614155b80156131e15750602960f81b6001600160f81b0319821614155b80156131fb5750605b60f81b6001600160f81b0319821614155b80156132155750605d60f81b6001600160f81b0319821614155b156132325760405162461bcd60e51b815260040161024e90614ab3565b508061323d81614d31565b915050613096565b5050815160208301209050919050565b7f307d6040706ae53dd496db78a4c0567d8e6a1fdef8784623a8cb324068ce686190565b6132816138b9565b6003015460ff166132a45760405162461bcd60e51b815260040161024e90614a50565b60006132af8361352c565b90506001600160a01b0381166132d75760405162461bcd60e51b815260040161024e90614a70565b604051636a83f10960e01b81526001600160a01b03821690636a83f10990613305903390869060040161462c565b600060405180830381600087803b15801561331f57600080fd5b505af1158015613333573d6000803e3d6000fd5b50505050505050565b6133446138b9565b6003015460ff16156133685760405162461bcd60e51b815260040161024e90614c0c565b613391604051806040016040528060078152602001661111519055531560ca1b815250826138c3565b600161339b6138b9565b600301805460ff191691151591909117905550565b60006133bb83613091565b905060006133c7611d57565b6001600160e01b031983166000908152600891909101602052604090205460ff169050826133f3611d57565b6001600160e01b03198416600090815260089190910160205260409020805460ff191691151591909117905582151581151514610b23577f74bd591bbbcef5b2a9c754f27dbfadb17a6d770c35303964627f6b30974903bc8484604051612394929190614803565b6001600160a01b0381166134815760405162461bcd60e51b815260040161024e90614b19565b613489611d57565b6001600160a01b0382166000908152600791909101602052604090205460ff16156134c65760405162461bcd60e51b815260040161024e90614b7f565b60016134d0611d57565b6001600160a01b0383166000908152600391909101602052604090819020805460ff191692151592909217909155517f98db00c919ca1c9c4e97e5837fb8ed4e4d21380a68ab359ae18c4accd2734401906122409083906145d8565b60008061353883613a7b565b905060006135446138b9565b60008381526001919091016020526040902054116135745760405162461bcd60e51b815260040161024e90614af8565b61357c6138b9565b600091825260020160205260409020546001600160a01b031692915050565b6135a36138b9565b6003015460ff166135c65760405162461bcd60e51b815260040161024e90614a50565b60006135d18361352c565b90506001600160a01b0381166135f95760405162461bcd60e51b815260040161024e90614a70565b60405163f049076960e01b81526001600160a01b0382169063f049076990613305903390869060040161462c565b60008251116136485760405162461bcd60e51b815260040161024e90614ba1565b80518251146136695760405162461bcd60e51b815260040161024e906149a8565b60005b82518110156116ae57600083828151811061369757634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008383815181106136c357634e487b7160e01b600052603260045260246000fd5b6020026020010151905060006136d883613091565b905060006136e4611d57565b6001600160e01b03198316600090815260049190910160205260409020546001600160a01b0316905080156137585761371b611d57565b6001600160a01b0382166000908152600791909101602052604090205460ff16156137585760405162461bcd60e51b815260040161024e90614b7f565b82613761611d57565b6001600160e01b0319841660009081526004919091016020526040812080546001600160a01b0319166001600160a01b0393909316929092179091556137a5611d57565b6001600160a01b038516600090815260039190910160205260409020805460ff19169115159190911790556137d8611d57565b600601846040516137e99190614555565b9081526020016040518091039020546000141561386957613808611d57565b60050180546001810182556000918252602091829020865161383293919092019190870190613af5565b5061383b611d57565b60050154613847611d57565b600601856040516138589190614555565b908152604051908190036020019020555b7f0732f745f0cddd4e67da27633e46e460ea6e59a43cbad685cc5789251277d53c848460405161389a9291906147d9565b60405180910390a15050505080806138b190614d31565b91505061366c565b60006113e2613a86565b6001600160a01b0381166138e95760405162461bcd60e51b815260040161024e90614b3b565b6040516301ffc9a760e01b81526001600160a01b038216906301ffc9a79061391c906304d657b360e51b906004016147b1565b60206040518083038186803b15801561393457600080fd5b505afa158015613948573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061396c919061410e565b6139885760405162461bcd60e51b815260040161024e90614943565b600061399383613a7b565b905061399d6138b9565b60008281526001919091016020526040902054613a09576139bc6138b9565b8054600181018255600091825260209182902085516139e393919092019190860190613af5565b506139ec6138b9565b546139f56138b9565b600083815260019190910160205260409020555b81613a126138b9565b600201600083815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f5a9ace53f01417a984781aac733a7042cc4be9f5a01542fb8e56afa951b0f14c83836040516128279291906147d9565b805160209091012090565b7ffe121c8064cb925856f0b37ec28345f4b16529a3d97f47304c118a97700cd73690565b828054828255906000526020600020908101928215613ae5579160200282015b82811115613ae5578251825591602001919060010190613aca565b50613af1929150613b68565b5090565b828054613b0190614cf6565b90600052602060002090601f016020900481019282613b235760008555613ae5565b82601f10613b3c57805160ff1916838001178555613ae5565b82800160010185558215613ae55791820182811115613ae5578251825591602001919060010190613aca565b5b80821115613af15760008155600101613b69565b80356107a781614d78565b600082601f830112613b98578081fd5b81356020613bad613ba883614c5c565b614c2c565b8281528181019085830183850287018401881015613bc9578586fd5b855b85811015613bf0578135613bde81614d78565b84529284019290840190600101613bcb565b5090979650505050505050565b600082601f830112613c0d578081fd5b613c176040614c2c565b8083835b6002811015613c4657613c318783358801613ca7565b84526020938401939190910190600101613c1b565b509095945050505050565b600082601f830112613c61578081fd5b613c6b6060614c2c565b808385606086011115613c7c578384fd5b835b6003811015613c46578135613c9281614d8d565b84526020938401939190910190600101613c7e565b600082601f830112613cb7578081fd5b81356020613cc7613ba883614c5c565b82815281810190858301855b85811015613bf057613cea898684358b0101613cfc565b84529284019290840190600101613cd3565b600082601f830112613d0c578081fd5b8135613d1a613ba882614c7f565b818152846020838601011115613d2e578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215613d59578081fd5b8135613d6481614d78565b9392505050565b60008060408385031215613d7d578081fd5b8235613d8881614d78565b915060208301356001600160401b03811115613da2578182fd5b613dae85828601613cfc565b9150509250929050565b600060208284031215613dc9578081fd5b81356001600160401b03811115613dde578182fd5b613dea84828501613b88565b949350505050565b60006020808385031215613e04578182fd5b82516001600160401b03811115613e19578283fd5b8301601f81018513613e29578283fd5b8051613e37613ba882614c5c565b8181528381019083850185840285018601891015613e53578687fd5b8694505b83851015613e7e578051613e6a81614d78565b835260019490940193918501918501613e57565b50979650505050505050565b60008060408385031215613e9c578182fd5b82356001600160401b0380821115613eb2578384fd5b613ebe86838701613b88565b93506020850135915080821115613ed3578283fd5b50613dae85828601613b88565b600060208284031215613ef1578081fd5b81356001600160401b03811115613f06578182fd5b613dea84828501613ca7565b60006020808385031215613f24578182fd5b82516001600160401b03811115613f39578283fd5b8301601f81018513613f49578283fd5b8051613f57613ba882614c5c565b81815283810190838501865b84811015613fc657815186018a603f820112613f7d578889fd5b878101516040613f8f613ba883614c7f565b8281528d82848601011115613fa2578b8cfd5b613fb1838c8301848701614cca565b87525050509286019290860190600101613f63565b509098975050505050505050565b60008060408385031215613fe6578182fd5b82356001600160401b0380821115613ffc578384fd5b613ebe86838701613ca7565b6000602080838503121561401a578182fd5b82356001600160401b0381111561402f578283fd5b8301601f8101851361403f578283fd5b803561404d613ba882614c5c565b8181528381019083850185840285018601891015614069578687fd5b8694505b83851015613e7e57803583526001949094019391850191850161406d565b6000602080838503121561409d578182fd5b82516001600160401b038111156140b2578283fd5b8301601f810185136140c2578283fd5b80516140d0613ba882614c5c565b81815283810190838501858402850186018910156140ec578687fd5b8694505b83851015613e7e5780518352600194909401939185019185016140f0565b60006020828403121561411f578081fd5b8151613d6481614d8d565b60006020828403121561413b578081fd5b81356001600160e01b031981168114613d64578182fd5b600060208284031215614163578081fd5b81356001600160401b03811115614178578182fd5b613dea84828501613cfc565b6000806000806000806000806000806101808b8d0312156141a3578586fd5b8a356001600160401b03808211156141b9578788fd5b6141c58e838f01613cfc565b9b506141d360208e01613b7d565b9a506141e160408e01613b7d565b99506141ef60608e01613b7d565b985060808d0135915080821115614204578788fd5b6142108e838f01613cfc565b975060a08d0135915080821115614225578687fd5b6142318e838f01613bfd565b965060c08d0135915080821115614246578586fd5b6142528e838f01613b88565b955060e08d0135915080821115614267578485fd5b6142738e838f01613bfd565b94506101008d0135915080821115614289578384fd5b506142968d828e01613b88565b9250506142a78c6101208d01613c51565b90509295989b9194979a5092959850565b600080604083850312156142ca578182fd5b82356001600160401b038111156142df578283fd5b6142eb85828601613cfc565b92505060208301356142fc81614d8d565b809150509250929050565b60008060006060848603121561431b578081fd5b83356001600160401b0380821115614331578283fd5b61433d87838801613cfc565b94506020860135915080821115614352578283fd5b5061435f86828701613cfc565b925050604084013561437081614d8d565b809150509250925092565b6000806040838503121561438d578182fd5b82356001600160401b038111156143a2578283fd5b6143ae85828601613cfc565b95602094909401359450505050565b6000806000606084860312156143d1578081fd5b83356001600160401b038111156143e6578182fd5b6143f286828701613cfc565b93505060208401359150604084013561437081614d78565b60008060006060848603121561441e578081fd5b83356001600160401b03811115614433578182fd5b61443f86828701613cfc565b93505060208401359150604084013561437081614d8d565b6000815180845260208085019450808401835b838110156144865781518752958201959082019060010161446a565b509495945050505050565b600081518084526144a9816020860160208601614cca565b601f01601f19169290920160200192915050565b8054600090600281046001808316806144d757607f831692505b60208084108214156144f757634e487b7160e01b86526022600452602486fd5b81801561450b576001811461451c57614549565b60ff19861689528489019650614549565b61452588614ca6565b60005b868110156145415781548b820152908501908301614528565b505084890196505b50505050505092915050565b60008251614567818460208701614cca565b9190910192915050565b600061457d82856144bd565b60609390931b6bffffffffffffffffffffffff191683525050601401919050565b60006145aa82856144bd565b6001600160e01b03199390931683525050600401919050565b6000613dea6145d283866144bd565b846144bd565b6001600160a01b0391909116815260200190565b6001600160a01b038416815260606020820181905260009061461090830185614491565b82810360408401526146228185614491565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156146865783516001600160a01b031683529284019291840191600101614661565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156146865783511515835292840192918401916001016146ae565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561471f57603f1988860301845261470d858351614491565b945092850192908501906001016146f1565b5092979650505050505050565b600060208252613d646020830184614457565b901515815260200190565b600060808201868352602086818501526080604085015281865180845260a0860191508288019350845b8181101561479057845183529383019391830191600101614774565b505084810360608601526147a48187614457565b9998505050505050505050565b6001600160e01b031991909116815260200190565b600060208252613d646020830184614491565b6000604082526147ec6040830185614491565b905060018060a01b03831660208301529392505050565b6000604082526148166040830185614491565b905082151560208301529392505050565b60006040825261483a6040830185614491565b828103602084015261484c8185614491565b95945050505050565b602080825260079082015266444d4e443a4e4960c81b604082015260600190565b602080825260079082015266444d4e443a5a4160c81b604082015260600190565b6020808252600a908201526911935312508e9310d2d160b21b604082015260600190565b602080825260089082015267444d4e443a49415360c01b604082015260600190565b602080825260079082015266111353910e95d360ca1b604082015260600190565b6020808252600a90820152692226a7221d20a3292d2760b11b604082015260600190565b602080825260079082015266444d4e443a574960c81b604082015260600190565b6020808252600690820152655446493a494360d01b604082015260600190565b6020808252600890820152672326a624a11d24a360c11b604082015260600190565b6020808252600990820152682326a624a11d2320a360b91b604082015260600190565b60208082526008908201526711935312508e925360c21b604082015260600190565b602080825260079082015266444d4e443a414960c81b604082015260600190565b602080825260079082015266111353910e915160ca1b604082015260600190565b6020808252600990820152682326a624a11d23272360b91b604082015260600190565b602080825260079082015266444d4e443a454160c81b604082015260600190565b6020808252600690820152655446493a4e4960d01b604082015260600190565b6020808252600790820152665446493a5a544d60c81b604082015260600190565b6020808252600890820152672226a7221d2d20a960c11b604082015260600190565b602080825260099082015268464d4c49423a49465360b81b604082015260600190565b6020808252600890820152672226a7221d24a0a960c11b604082015260600190565b6020808252600790820152662a23249d25a72360c91b604082015260600190565b6020808252600890820152672326a624a11d2d2360c11b604082015260600190565b6020808252600690820152655446493a5a4160d01b604082015260600190565b6020808252600a9082015269464d4c49423a4652454d60b01b604082015260600190565b6020808252600890820152672326a624a11d232360c11b604082015260600190565b60208082526008908201526711935312508e969360c21b604082015260600190565b6020808252600a90820152690889a9c88749c82aaa8960b31b604082015260600190565b6020808252600b908201526a2326a624a11d2223292d2760a91b604082015260600190565b6020808252600690820152655446493a414960d01b604082015260600190565b604051601f8201601f191681016001600160401b0381118282101715614c5457614c54614d62565b604052919050565b60006001600160401b03821115614c7557614c75614d62565b5060209081020190565b60006001600160401b03821115614c9857614c98614d62565b50601f01601f191660200190565b60009081526020902090565b60008219821115614cc557614cc5614d4c565b500190565b60005b83811015614ce5578181015183820152602001614ccd565b83811115610b235750506000910152565b600281046001821680614d0a57607f821691505b60208210811415614d2b57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614d4557614d45614d4c565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610ef957600080fd5b8015158114610ef957600080fdfea2646970667358221220c8f0aefd3736a14d94c7f5ad71f2a670f25b031ad5cc3aed22162704d600356564736f6c634300080100330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000393f7974f9a1c63e1d9d5d98c124a0914302faac0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061021e5760003560e01c8063866c535a11610123578063b7886c69116100ab578063da591dd21161006f578063da591dd214610682578063e1adb54114610697578063eac4d57e146106b9578063f63b653d146106d9578063f7cf890d146106f957610225565b8063b7886c69146105e2578063b85ba3b714610602578063ba262ec314610622578063c101446214610642578063d9ad72551461066257610225565b8063a48929d1116100f2578063a48929d114610558578063a4f400de14610578578063a60a20c514610598578063b4ff8ff1146105ad578063b57368db146105c257610225565b8063866c535a146104e1578063884a8f00146105015780638f001106146105165780639e0d9df71461054357610225565b806358b54dc5116101a65780637476cf52116101755780637476cf521461044857806374e3d9491461045d5780637dc8ac8c1461047f578063802bfd1b146104a1578063823d7303146104c157610225565b806358b54dc5146103c457806358eebefa146103e4578063662ea47d146104045780636e1c5ac21461042657610225565b806315fe9226116101ed57806315fe92261461033a578063341f50371461035a57806334936af41461037a578063392e53cd1461039a578063575fefb3146103af57610225565b806301ffc9a7146102ad5780631096553d146102e357806310f6f7c514610305578063111106d21461031a57610225565b3661022557005b600854600160a01b900460ff166102575760405162461bcd60e51b815260040161024e90614855565b60405180910390fd5b600061026e6000356001600160e01b03191661070e565b905061028933826000356001600160e01b03191660006107ac565b3660008037600080366000845af43d6000803e8080156102a8573d6000f35b3d6000fd5b3480156102b957600080fd5b506102cd6102c836600461412a565b610b29565b6040516102da919061473f565b60405180910390f35b3480156102ef57600080fd5b506103036102fe366004614008565b610d4b565b005b34801561031157600080fd5b506102cd610de8565b34801561032657600080fd5b5061030361033536600461437b565b610e37565b34801561034657600080fd5b50610303610355366004613d48565b610e8b565b34801561036657600080fd5b50610303610375366004614152565b610efc565b34801561038657600080fd5b50610303610395366004614184565b610f95565b3480156103a657600080fd5b506102cd61129f565b3480156103bb57600080fd5b506103036112af565b3480156103d057600080fd5b506102cd6103df366004613d48565b6112fb565b3480156103f057600080fd5b506103036103ff366004613e8a565b611349565b34801561041057600080fd5b50610419611395565b6040516102da9190614645565b34801561043257600080fd5b5061043b6113e7565b6040516102da91906146cc565b34801561045457600080fd5b506102cd611434565b34801561046957600080fd5b50610472611481565b6040516102da91906145d8565b34801561048b57600080fd5b506104946114ee565b6040516102da91906147c6565b3480156104ad57600080fd5b506103036104bc366004613d48565b6115c3565b3480156104cd57600080fd5b506103036104dc366004613db8565b61160e565b3480156104ed57600080fd5b506103036104fc36600461440a565b611659565b34801561050d57600080fd5b506104946116b3565b34801561052257600080fd5b50610536610531366004613ee0565b611705565b6040516102da9190614692565b34801561054f57600080fd5b50610472611753565b34801561056457600080fd5b50610303610573366004614152565b6117ad565b34801561058457600080fd5b5061030361059336600461437b565b611802565b3480156105a457600080fd5b506102cd6118a7565b3480156105b957600080fd5b506104726118f4565b3480156105ce57600080fd5b506103036105dd366004613db8565b611949565b3480156105ee57600080fd5b506103036105fd366004614307565b611994565b34801561060e57600080fd5b5061030361061d3660046143bd565b6119e1565b34801561062e57600080fd5b5061030361063d366004614152565b611a36565b34801561064e57600080fd5b5061041961065d366004613ee0565b611a8b565b34801561066e57600080fd5b5061030361067d3660046142b8565b611ad9565b34801561068e57600080fd5b50610494611b48565b3480156106a357600080fd5b506106ac611b9a565b6040516102da919061472c565b3480156106c557600080fd5b506103036106d4366004613fd4565b611c31565b3480156106e557600080fd5b506103036106f4366004613d6b565b611c7d565b34801561070557600080fd5b50610494611cf2565b600080610719611d57565b6001600160e01b03198416600090815260049190910160205260409020546001600160a01b031690508061075f5760405162461bcd60e51b815260040161024e90614a0c565b610767611d57565b6001600160a01b0382166000908152600391909101602052604090205460ff16156107a45760405162461bcd60e51b815260040161024e90614b5b565b90505b919050565b801580156107c057506107be82611d61565b155b156107ca57610b23565b60025461010090046001600160a01b03166107f75760405162461bcd60e51b815260040161024e90614876565b60405160009061080f906005906003906020016145c3565b60408051601f19818403018152908290528051602091820120925060009161083c91600591899101614571565b60408051601f198184030181528282528051602091820120600380855260808501909352935060009291908201606080368337505060405191925061088991600591503090602001614571565b60405160208183030381529060405280519060200120816000815181106108c057634e487b7160e01b600052603260045260246000fd5b6020026020010181815250506002600301866040516020016108e3929190614571565b604051602081830303815290604052805190602001208160018151811061091a57634e487b7160e01b600052603260045260246000fd5b60200260200101818152505060026003018560405160200161093d92919061459e565b604051602081830303815290604052805190602001208160028151811061097457634e487b7160e01b600052603260045260246000fd5b6020908102919091010152604080516001808252818301909252600091816020016020820280368337019050509050611388816000815181106109c757634e487b7160e01b600052603260045260246000fd5b6020908102919091010152600254604051631c0d022d60e21b815260009161010090046001600160a01b03169063703408b490610a0e90889088908890889060040161474a565b60006040518083038186803b158015610a2657600080fd5b505afa158015610a3a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a62919081019061408b565b905060005b600454811015610b0a5760005b8251811015610af757828181518110610a9d57634e487b7160e01b600052603260045260246000fd5b6020026020010151600280018381548110610ac857634e487b7160e01b600052603260045260246000fd5b90600052602060002001541415610ae55750505050505050610b23565b80610aef81614d31565b915050610a74565b5080610b0281614d31565b915050610a67565b5060405162461bcd60e51b815260040161024e90614bc3565b50505050565b6000610b4433306000356001600160e01b03191660006107ac565b63d4bbd4bb60e01b6001600160e01b031983161480610b7357506001600160e01b031982166325dc185160e11b145b15610b80575060016107a7565b6001600160e01b0319821663b2fe033560e01b1415610ba1575060006107a7565b6001600160e01b031982166301ffc9a760e01b1415610bc2575060016107a7565b6000610bcc611d91565b905060005b8151811015610cb7576000828281518110610bfc57634e487b7160e01b600052603260045260246000fd5b60200260200101519050610c0f81611fa5565b158015610c9357506040516301ffc9a760e01b81526001600160a01b038216906301ffc9a790610c439088906004016147b1565b60206040518083038186803b158015610c5b57600080fd5b505afa158015610c6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c93919061410e565b15610ca457600193505050506107a7565b5080610caf81614d31565b915050610bd1565b5060005b600654811015610d415760068181548110610ce657634e487b7160e01b600052603260045260246000fd5b90600052602060002090600891828204019190066004029054906101000a900460e01b6001600160e01b031916846001600160e01b0319161415610d2f576001925050506107a7565b80610d3981614d31565b915050610cbb565b5060009392505050565b600854600160a01b900460ff16610d745760405162461bcd60e51b815260040161024e90614855565b60025460ff1615610d975760405162461bcd60e51b815260040161024e906148fe565b610db033306000356001600160e01b03191660016107ac565b6000815111610dd15760405162461bcd60e51b815260040161024e90614a2f565b8051610de4906004906020840190613aaa565b5050565b600854600090600160a01b900460ff16610e145760405162461bcd60e51b815260040161024e90614855565b610e2d33306000356001600160e01b03191660006107ac565b5060025460ff1690565b600854600160a01b900460ff16610e605760405162461bcd60e51b815260040161024e90614855565b610e7933306000356001600160e01b03191660016107ac565b610e81611fd4565b610de48282612041565b600854600160a01b900460ff16610eb45760405162461bcd60e51b815260040161024e90614855565b60025460ff1615610ed75760405162461bcd60e51b815260040161024e906148fe565b610ef033306000356001600160e01b03191660016107ac565b610ef98161204b565b50565b600854600160a01b900460ff16610f255760405162461bcd60e51b815260040161024e90614855565b60025460ff1615610f485760405162461bcd60e51b815260040161024e906148fe565b610f6133306000356001600160e01b03191660016107ac565b6000815111610f825760405162461bcd60e51b815260040161024e906149eb565b8051610de4906003906020840190613af5565b600854600160a01b900460ff1615610fbf5760405162461bcd60e51b815260040161024e906149ca565b6008546001600160a01b03163314610fe95760405162461bcd60e51b815260040161024e90614922565b8951610ffc9060009060208d0190613af5565b5061100689612138565b61100f88612141565b6110188761204b565b855161102b906003906020890190613af5565b50602085015151855151146110525760405162461bcd60e51b815260040161024e906148dd565b60005b8551518110156110f457855180516110e291908390811061108657634e487b7160e01b600052603260045260246000fd5b6020026020010151876001600281106110af57634e487b7160e01b600052603260045260246000fd5b602002015183815181106110d357634e487b7160e01b600052603260045260246000fd5b6020026020010151600061224b565b806110ec81614d31565b915050611055565b5060005b84518110156111435761113185828151811061112457634e487b7160e01b600052603260045260246000fd5b60200260200101516123a2565b8061113b81614d31565b9150506110f8565b5060005b835151811015611199578351805161118791908390811061117857634e487b7160e01b600052603260045260246000fd5b60200260200101516001612834565b8061119181614d31565b915050611147565b5060005b6020840151518110156111f5576111e3846001602002015182815181106111d457634e487b7160e01b600052603260045260246000fd5b60200260200101516000612834565b806111ed81614d31565b91505061119d565b5080511561120757611207600161286c565b60005b82518110156112555761124383828151811061123657634e487b7160e01b600052603260045260246000fd5b60200260200101516128e4565b8061124d81614d31565b91505061120a565b5060208101511561126e576002805460ff191660011790555b60408101511561128057611280611fd4565b50506008805460ff60a01b1916600160a01b1790555050505050505050565b600854600160a01b900460ff1690565b600854600160a01b900460ff166112d85760405162461bcd60e51b815260040161024e90614855565b6112f133306000356001600160e01b03191660016107ac565b6112f96129b1565b565b600854600090600160a01b900460ff166113275760405162461bcd60e51b815260040161024e90614855565b61134033306000356001600160e01b03191660006107ac565b6107a482612a77565b600854600160a01b900460ff166113725760405162461bcd60e51b815260040161024e90614855565b61138b33306000356001600160e01b03191660016107ac565b610de48282612aa6565b600854606090600160a01b900460ff166113c15760405162461bcd60e51b815260040161024e90614855565b6113da33306000356001600160e01b03191660006107ac565b6113e2611d91565b905090565b600854606090600160a01b900460ff166114135760405162461bcd60e51b815260040161024e90614855565b61142c33306000356001600160e01b03191660006107ac565b6113e2612ab8565b600854600090600160a01b900460ff166114605760405162461bcd60e51b815260040161024e90614855565b61147933306000356001600160e01b03191660006107ac565b6113e2612b9a565b600854600090600160a01b900460ff166114ad5760405162461bcd60e51b815260040161024e90614855565b6114c633306000356001600160e01b03191660006107ac565b6113e2604051806040016040528060078152602001661111519055531560ca1b815250612bad565b600854606090600160a01b900460ff1661151a5760405162461bcd60e51b815260040161024e90614855565b61153333306000356001600160e01b03191660006107ac565b6003805461154090614cf6565b80601f016020809104026020016040519081016040528092919081815260200182805461156c90614cf6565b80156115b95780601f1061158e576101008083540402835291602001916115b9565b820191906000526020600020905b81548152906001019060200180831161159c57829003601f168201915b5050505050905090565b600854600160a01b900460ff166115ec5760405162461bcd60e51b815260040161024e90614855565b61160533306000356001600160e01b03191660016107ac565b610ef981612141565b600854600160a01b900460ff166116375760405162461bcd60e51b815260040161024e90614855565b61165033306000356001600160e01b03191660016107ac565b610ef981612bb8565b600854600160a01b900460ff166116825760405162461bcd60e51b815260040161024e90614855565b61169b33306000356001600160e01b03191660016107ac565b6116a48161286c565b6116ae8383612c71565b505050565b600854606090600160a01b900460ff166116df5760405162461bcd60e51b815260040161024e90614855565b6116f833306000356001600160e01b03191660006107ac565b6001805461154090614cf6565b600854606090600160a01b900460ff166117315760405162461bcd60e51b815260040161024e90614855565b61174a33306000356001600160e01b03191660006107ac565b6107a482612c7b565b600854600090600160a01b900460ff1661177f5760405162461bcd60e51b815260040161024e90614855565b61179833306000356001600160e01b03191660006107ac565b5060025461010090046001600160a01b031690565b600854600160a01b900460ff166117d65760405162461bcd60e51b815260040161024e90614855565b6117ef33306000356001600160e01b03191660016107ac565b8051610de4906001906020840190613af5565b600854600160a01b900460ff1661182b5760405162461bcd60e51b815260040161024e90614855565b60025460ff161561184e5760405162461bcd60e51b815260040161024e906148fe565b61186733306000356001600160e01b03191660016107ac565b6002805460ff191660011790556040517f0e3932f7da01145f763331680b780b1352f2d7243e48c082aa38cb0750c2316090600090a1610de48282612041565b600854600090600160a01b900460ff166118d35760405162461bcd60e51b815260040161024e90614855565b6118ec33306000356001600160e01b03191660006107ac565b6113e2612d91565b600854600090600160a01b900460ff166119205760405162461bcd60e51b815260040161024e90614855565b61193933306000356001600160e01b03191660006107ac565b506007546001600160a01b031690565b600854600160a01b900460ff166119725760405162461bcd60e51b815260040161024e90614855565b61198b33306000356001600160e01b03191660016107ac565b610ef981612da9565b600854600160a01b900460ff166119bd5760405162461bcd60e51b815260040161024e90614855565b6119d633306000356001600160e01b03191660016107ac565b6116ae83838361224b565b600854600160a01b900460ff16611a0a5760405162461bcd60e51b815260040161024e90614855565b611a2333306000356001600160e01b03191660016107ac565b611a2c816128e4565b6116ae8383612041565b600854600160a01b900460ff16611a5f5760405162461bcd60e51b815260040161024e90614855565b611a7833306000356001600160e01b03191660016107ac565b8051610de4906000906020840190613af5565b600854606090600160a01b900460ff16611ab75760405162461bcd60e51b815260040161024e90614855565b611ad033306000356001600160e01b03191660006107ac565b6107a482612e6f565b600854600160a01b900460ff16611b025760405162461bcd60e51b815260040161024e90614855565b60025460ff1615611b255760405162461bcd60e51b815260040161024e906148fe565b611b3e33306000356001600160e01b03191660016107ac565b610de48282612834565b600854606090600160a01b900460ff16611b745760405162461bcd60e51b815260040161024e90614855565b611b8d33306000356001600160e01b03191660006107ac565b6000805461154090614cf6565b600854606090600160a01b900460ff16611bc65760405162461bcd60e51b815260040161024e90614855565b611bdf33306000356001600160e01b03191660006107ac565b60048054604080516020808402820181019092528281529291908301828280156115b957602002820191906000526020600020905b815481526020019060010190808311611c14575050505050905090565b600854600160a01b900460ff16611c5a5760405162461bcd60e51b815260040161024e90614855565b611c7333306000356001600160e01b03191660016107ac565b610de48282613030565b600854600160a01b900460ff16611ca65760405162461bcd60e51b815260040161024e90614855565b611cbf33306000356001600160e01b03191660006107ac565b6000611cd66000356001600160e01b03191661070e565b90506000611ce383613091565b9050610b2384838360006107ac565b600854606090600160a01b900460ff16611d1e5760405162461bcd60e51b815260040161024e90614855565b611d3733306000356001600160e01b03191660006107ac565b506040805180820190915260058152640332e312e360dc1b602082015290565b60006113e2613255565b6000611d6b611d57565b6001600160e01b0319929092166000908152600890920160205250604090205460ff1690565b60606000805b611d9f611d57565b60010154811015611e2d57611db2611d57565b6003016000611dbf611d57565b6001018381548110611de157634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff16611e1b57611e18600183614cb2565b91505b80611e2581614d31565b915050611d97565b506000816001600160401b03811115611e5657634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611e7f578160200160208202803683370190505b5090506000805b611e8e611d57565b60010154811015611f9c57611ea1611d57565b6003016000611eae611d57565b6001018381548110611ed057634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff16611f8a57611f04611d57565b6001018181548110611f2657634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b0316838381518110611f6457634e487b7160e01b600052603260045260246000fd5b6001600160a01b0390921660209283029190910190910152611f87600183614cb2565b91505b80611f9481614d31565b915050611e86565b50909250505090565b6000611faf611d57565b6001600160a01b03929092166000908152600390920160205250604090205460ff1690565b611fdc611d57565b5460ff1615611ffd5760405162461bcd60e51b815260040161024e90614be7565b6001612007611d57565b805460ff19169115159190911790556040517f2eb10865de63732f26f9b8475ebe6fb377a5c8eb3b49e8139b8d8d9135cd240490600090a1565b610de48282613279565b6001600160a01b0381166120715760405162461bcd60e51b815260040161024e90614876565b6040516301ffc9a760e01b81526001600160a01b038216906301ffc9a7906120a490631c0d022d60e21b906004016147b1565b60206040518083038186803b1580156120bc57600080fd5b505afa1580156120d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f4919061410e565b6121105760405162461bcd60e51b815260040161024e906148bb565b600280546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b610ef98161333c565b6001600160a01b038116156121ef576040516301ffc9a760e01b81526001600160a01b038216906301ffc9a79061218390637cb27a4560e11b906004016147b1565b60206040518083038186803b15801561219b57600080fd5b505afa1580156121af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d3919061410e565b6121ef5760405162461bcd60e51b815260040161024e90614ad6565b600780546001600160a01b0319166001600160a01b0383811691909117918290556040517fcf495d505c54debf2cfce37abde02663348726740343e67e0461e3c5900bee35926122409216906145d8565b60405180910390a150565b6007546001600160a01b03166122735760405162461bcd60e51b815260040161024e90614a91565b8015612281576122816129b1565b600754604051637cb27a4560e11b81526000916001600160a01b03169063f964f48a906122b49087908790600401614827565b60006040518083038186803b1580156122cc57600080fd5b505afa1580156122e0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526123089190810190613df2565b905060005b815181101561234b5761233982828151811061112457634e487b7160e01b600052603260045260246000fd5b8061234381614d31565b91505061230d565b50805115610b23576007546040517f7cc2a985f8db0a56f86b96b09468939ad35546d78a751f8655660e5e0910cf6d91612394916001600160a01b0390911690879087906145ec565b60405180910390a150505050565b6123aa611d57565b5460ff16156123cb5760405162461bcd60e51b815260040161024e90614be7565b6123d3611d57565b54610100900460ff16156123f95760405162461bcd60e51b815260040161024e90614897565b6001600160a01b03811661241f5760405162461bcd60e51b815260040161024e90614b19565b6040516301ffc9a760e01b81526001600160a01b038216906301ffc9a7906124529063b2fe033560e01b906004016147b1565b60206040518083038186803b15801561246a57600080fd5b505afa15801561247e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a2919061410e565b6124be5760405162461bcd60e51b815260040161024e90614963565b6000816001600160a01b0316631078fade6040518163ffffffff1660e01b815260040160006040518083038186803b1580156124f957600080fd5b505afa15801561250d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526125359190810190613f12565b905060005b815181101561266057600082828151811061256557634e487b7160e01b600052603260045260246000fd5b60200260200101519050600061257a82613091565b90506000612586611d57565b6001600160e01b03198316600090815260049190910160205260409020546001600160a01b0316905080156125fa576125bd611d57565b6001600160a01b0382166000908152600791909101602052604090205460ff16156125fa5760405162461bcd60e51b815260040161024e90614b7f565b85612603611d57565b6001600160e01b0319841660009081526004919091016020526040812080546001600160a01b0319166001600160a01b03939093169290921790915561264a9084906133b0565b505050808061265890614d31565b91505061253a565b506000826001600160a01b03166368498a336040518163ffffffff1660e01b815260040160006040518083038186803b15801561269c57600080fd5b505afa1580156126b0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526126d89190810190613f12565b905060005b815181101561273057600082828151811061270857634e487b7160e01b600052603260045260246000fd5b6020026020010151905061271d8160016133b0565b508061272881614d31565b9150506126dd565b50600061273b611d57565b6001600160a01b038516600090815260039190910160205260409020805460ff191691151591909117905561276e611d57565b6001600160a01b038416600090815260029190910160205260409020546127f857612797611d57565b6001908101805491820181556000908152602090200180546001600160a01b0319166001600160a01b0385161790556127ce611d57565b600101546127da611d57565b6001600160a01b038516600090815260029190910160205260409020555b7f43908041a0d1c29893f2c5ad648ccb6799faecac83f7fcc80ef1a5e297d95f4b8360405161282791906145d8565b60405180910390a1505050565b61283c611d57565b54610100900460ff16156128625760405162461bcd60e51b815260040161024e90614897565b610de482826133b0565b612874611d57565b5460ff16156128955760405162461bcd60e51b815260040161024e90614be7565b8061289e611d57565b80549115156101000261ff00199092169190911790556040517f9514871d395e6e24ef28f340cbcdcaa89f790cdf4a4fa6c25cf83a81fb27a86d9061224090839061473f565b6128ec611d57565b5460ff161561290d5760405162461bcd60e51b815260040161024e90614be7565b6001600160a01b0381166129335760405162461bcd60e51b815260040161024e90614b19565b61293b611d57565b6001600160a01b0382166000908152600791909101602052604090205460ff16156129785760405162461bcd60e51b815260040161024e90614985565b6001612982611d57565b6001600160a01b0392909216600090815260079092016020526040909120805460ff1916911515919091179055565b6129b9611d57565b5460ff16156129da5760405162461bcd60e51b815260040161024e90614be7565b6129e2611d57565b54610100900460ff1615612a085760405162461bcd60e51b815260040161024e90614897565b60005b612a13611d57565b60010154811015610ef957612a65612a29611d57565b6001018281548110612a4b57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031661345b565b80612a6f81614d31565b915050612a0b565b6000612a81611d57565b6001600160a01b03929092166000908152600790920160205250604090205460ff1690565b612aaf82612da9565b610de481612bb8565b6060612ac2611d57565b600501805480602002602001604051908101604052809291908181526020016000905b82821015612b91578382906000526020600020018054612b0490614cf6565b80601f0160208091040260200160405190810160405280929190818152602001828054612b3090614cf6565b8015612b7d5780601f10612b5257610100808354040283529160200191612b7d565b820191906000526020600020905b815481529060010190602001808311612b6057829003601f168201915b505050505081526020019060010190612ae5565b50505050905090565b6000612ba4611d57565b5460ff16905090565b60006107a48261352c565b612bc0611d57565b5460ff1615612be15760405162461bcd60e51b815260040161024e90614be7565b612be9611d57565b54610100900460ff1615612c0f5760405162461bcd60e51b815260040161024e90614897565b6000815111612c305760405162461bcd60e51b815260040161024e90614ba1565b60005b8151811015610de457612c5f82828151811061112457634e487b7160e01b600052603260045260246000fd5b80612c6981614d31565b915050612c33565b610de4828261359b565b6060600082516001600160401b03811115612ca657634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612ccf578160200160208202803683370190505b50905060005b8351811015612d8a576000848281518110612d0057634e487b7160e01b600052603260045260246000fd5b602002602001015190506000612d1582613091565b9050612d1f611d57565b6001600160e01b0319821660009081526008919091016020526040902054845160ff90911690859085908110612d6557634e487b7160e01b600052603260045260246000fd5b9115156020928302919091019091015250819050612d8281614d31565b915050612cd5565b5092915050565b6000612d9b611d57565b54610100900460ff16919050565b612db1611d57565b5460ff1615612dd25760405162461bcd60e51b815260040161024e90614be7565b612dda611d57565b54610100900460ff1615612e005760405162461bcd60e51b815260040161024e90614897565b6000815111612e215760405162461bcd60e51b815260040161024e90614ba1565b60005b8151811015610de457612e5d828281518110612e5057634e487b7160e01b600052603260045260246000fd5b602002602001015161345b565b80612e6781614d31565b915050612e24565b6060600082516001600160401b03811115612e9a57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612ec3578160200160208202803683370190505b50905060005b8351811015612d8a576000848281518110612ef457634e487b7160e01b600052603260045260246000fd5b602002602001015190506000612f0982613091565b9050612f13611d57565b6001600160e01b031982166000908152600491909101602052604090205484516001600160a01b0390911690859085908110612f5f57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050612f87611d57565b6003016000858581518110612fac57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff161561301b576000848481518110612ffa57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250505b5050808061302890614d31565b915050612ec9565b613038611d57565b5460ff16156130595760405162461bcd60e51b815260040161024e90614be7565b613061611d57565b54610100900460ff16156130875760405162461bcd60e51b815260040161024e90614897565b610de48282613627565b600081815b81518110156132455760008282815181106130c157634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b0319169050600360fc1b81108015906130f45750603960f81b6001600160f81b0319821611155b15801561312a5750604160f81b6001600160f81b03198216108015906131285750602d60f91b6001600160f81b0319821611155b155b801561315f5750606160f81b6001600160f81b031982161080159061315d5750603d60f91b6001600160f81b0319821611155b155b80156131795750600960fa1b6001600160f81b0319821614155b80156131935750605f60f81b6001600160f81b0319821614155b80156131ad5750600b60fa1b6001600160f81b0319821614155b80156131c75750600560fb1b6001600160f81b0319821614155b80156131e15750602960f81b6001600160f81b0319821614155b80156131fb5750605b60f81b6001600160f81b0319821614155b80156132155750605d60f81b6001600160f81b0319821614155b156132325760405162461bcd60e51b815260040161024e90614ab3565b508061323d81614d31565b915050613096565b5050815160208301209050919050565b7f307d6040706ae53dd496db78a4c0567d8e6a1fdef8784623a8cb324068ce686190565b6132816138b9565b6003015460ff166132a45760405162461bcd60e51b815260040161024e90614a50565b60006132af8361352c565b90506001600160a01b0381166132d75760405162461bcd60e51b815260040161024e90614a70565b604051636a83f10960e01b81526001600160a01b03821690636a83f10990613305903390869060040161462c565b600060405180830381600087803b15801561331f57600080fd5b505af1158015613333573d6000803e3d6000fd5b50505050505050565b6133446138b9565b6003015460ff16156133685760405162461bcd60e51b815260040161024e90614c0c565b613391604051806040016040528060078152602001661111519055531560ca1b815250826138c3565b600161339b6138b9565b600301805460ff191691151591909117905550565b60006133bb83613091565b905060006133c7611d57565b6001600160e01b031983166000908152600891909101602052604090205460ff169050826133f3611d57565b6001600160e01b03198416600090815260089190910160205260409020805460ff191691151591909117905582151581151514610b23577f74bd591bbbcef5b2a9c754f27dbfadb17a6d770c35303964627f6b30974903bc8484604051612394929190614803565b6001600160a01b0381166134815760405162461bcd60e51b815260040161024e90614b19565b613489611d57565b6001600160a01b0382166000908152600791909101602052604090205460ff16156134c65760405162461bcd60e51b815260040161024e90614b7f565b60016134d0611d57565b6001600160a01b0383166000908152600391909101602052604090819020805460ff191692151592909217909155517f98db00c919ca1c9c4e97e5837fb8ed4e4d21380a68ab359ae18c4accd2734401906122409083906145d8565b60008061353883613a7b565b905060006135446138b9565b60008381526001919091016020526040902054116135745760405162461bcd60e51b815260040161024e90614af8565b61357c6138b9565b600091825260020160205260409020546001600160a01b031692915050565b6135a36138b9565b6003015460ff166135c65760405162461bcd60e51b815260040161024e90614a50565b60006135d18361352c565b90506001600160a01b0381166135f95760405162461bcd60e51b815260040161024e90614a70565b60405163f049076960e01b81526001600160a01b0382169063f049076990613305903390869060040161462c565b60008251116136485760405162461bcd60e51b815260040161024e90614ba1565b80518251146136695760405162461bcd60e51b815260040161024e906149a8565b60005b82518110156116ae57600083828151811061369757634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008383815181106136c357634e487b7160e01b600052603260045260246000fd5b6020026020010151905060006136d883613091565b905060006136e4611d57565b6001600160e01b03198316600090815260049190910160205260409020546001600160a01b0316905080156137585761371b611d57565b6001600160a01b0382166000908152600791909101602052604090205460ff16156137585760405162461bcd60e51b815260040161024e90614b7f565b82613761611d57565b6001600160e01b0319841660009081526004919091016020526040812080546001600160a01b0319166001600160a01b0393909316929092179091556137a5611d57565b6001600160a01b038516600090815260039190910160205260409020805460ff19169115159190911790556137d8611d57565b600601846040516137e99190614555565b9081526020016040518091039020546000141561386957613808611d57565b60050180546001810182556000918252602091829020865161383293919092019190870190613af5565b5061383b611d57565b60050154613847611d57565b600601856040516138589190614555565b908152604051908190036020019020555b7f0732f745f0cddd4e67da27633e46e460ea6e59a43cbad685cc5789251277d53c848460405161389a9291906147d9565b60405180910390a15050505080806138b190614d31565b91505061366c565b60006113e2613a86565b6001600160a01b0381166138e95760405162461bcd60e51b815260040161024e90614b3b565b6040516301ffc9a760e01b81526001600160a01b038216906301ffc9a79061391c906304d657b360e51b906004016147b1565b60206040518083038186803b15801561393457600080fd5b505afa158015613948573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061396c919061410e565b6139885760405162461bcd60e51b815260040161024e90614943565b600061399383613a7b565b905061399d6138b9565b60008281526001919091016020526040902054613a09576139bc6138b9565b8054600181018255600091825260209182902085516139e393919092019190860190613af5565b506139ec6138b9565b546139f56138b9565b600083815260019190910160205260409020555b81613a126138b9565b600201600083815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507f5a9ace53f01417a984781aac733a7042cc4be9f5a01542fb8e56afa951b0f14c83836040516128279291906147d9565b805160209091012090565b7ffe121c8064cb925856f0b37ec28345f4b16529a3d97f47304c118a97700cd73690565b828054828255906000526020600020908101928215613ae5579160200282015b82811115613ae5578251825591602001919060010190613aca565b50613af1929150613b68565b5090565b828054613b0190614cf6565b90600052602060002090601f016020900481019282613b235760008555613ae5565b82601f10613b3c57805160ff1916838001178555613ae5565b82800160010185558215613ae55791820182811115613ae5578251825591602001919060010190613aca565b5b80821115613af15760008155600101613b69565b80356107a781614d78565b600082601f830112613b98578081fd5b81356020613bad613ba883614c5c565b614c2c565b8281528181019085830183850287018401881015613bc9578586fd5b855b85811015613bf0578135613bde81614d78565b84529284019290840190600101613bcb565b5090979650505050505050565b600082601f830112613c0d578081fd5b613c176040614c2c565b8083835b6002811015613c4657613c318783358801613ca7565b84526020938401939190910190600101613c1b565b509095945050505050565b600082601f830112613c61578081fd5b613c6b6060614c2c565b808385606086011115613c7c578384fd5b835b6003811015613c46578135613c9281614d8d565b84526020938401939190910190600101613c7e565b600082601f830112613cb7578081fd5b81356020613cc7613ba883614c5c565b82815281810190858301855b85811015613bf057613cea898684358b0101613cfc565b84529284019290840190600101613cd3565b600082601f830112613d0c578081fd5b8135613d1a613ba882614c7f565b818152846020838601011115613d2e578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215613d59578081fd5b8135613d6481614d78565b9392505050565b60008060408385031215613d7d578081fd5b8235613d8881614d78565b915060208301356001600160401b03811115613da2578182fd5b613dae85828601613cfc565b9150509250929050565b600060208284031215613dc9578081fd5b81356001600160401b03811115613dde578182fd5b613dea84828501613b88565b949350505050565b60006020808385031215613e04578182fd5b82516001600160401b03811115613e19578283fd5b8301601f81018513613e29578283fd5b8051613e37613ba882614c5c565b8181528381019083850185840285018601891015613e53578687fd5b8694505b83851015613e7e578051613e6a81614d78565b835260019490940193918501918501613e57565b50979650505050505050565b60008060408385031215613e9c578182fd5b82356001600160401b0380821115613eb2578384fd5b613ebe86838701613b88565b93506020850135915080821115613ed3578283fd5b50613dae85828601613b88565b600060208284031215613ef1578081fd5b81356001600160401b03811115613f06578182fd5b613dea84828501613ca7565b60006020808385031215613f24578182fd5b82516001600160401b03811115613f39578283fd5b8301601f81018513613f49578283fd5b8051613f57613ba882614c5c565b81815283810190838501865b84811015613fc657815186018a603f820112613f7d578889fd5b878101516040613f8f613ba883614c7f565b8281528d82848601011115613fa2578b8cfd5b613fb1838c8301848701614cca565b87525050509286019290860190600101613f63565b509098975050505050505050565b60008060408385031215613fe6578182fd5b82356001600160401b0380821115613ffc578384fd5b613ebe86838701613ca7565b6000602080838503121561401a578182fd5b82356001600160401b0381111561402f578283fd5b8301601f8101851361403f578283fd5b803561404d613ba882614c5c565b8181528381019083850185840285018601891015614069578687fd5b8694505b83851015613e7e57803583526001949094019391850191850161406d565b6000602080838503121561409d578182fd5b82516001600160401b038111156140b2578283fd5b8301601f810185136140c2578283fd5b80516140d0613ba882614c5c565b81815283810190838501858402850186018910156140ec578687fd5b8694505b83851015613e7e5780518352600194909401939185019185016140f0565b60006020828403121561411f578081fd5b8151613d6481614d8d565b60006020828403121561413b578081fd5b81356001600160e01b031981168114613d64578182fd5b600060208284031215614163578081fd5b81356001600160401b03811115614178578182fd5b613dea84828501613cfc565b6000806000806000806000806000806101808b8d0312156141a3578586fd5b8a356001600160401b03808211156141b9578788fd5b6141c58e838f01613cfc565b9b506141d360208e01613b7d565b9a506141e160408e01613b7d565b99506141ef60608e01613b7d565b985060808d0135915080821115614204578788fd5b6142108e838f01613cfc565b975060a08d0135915080821115614225578687fd5b6142318e838f01613bfd565b965060c08d0135915080821115614246578586fd5b6142528e838f01613b88565b955060e08d0135915080821115614267578485fd5b6142738e838f01613bfd565b94506101008d0135915080821115614289578384fd5b506142968d828e01613b88565b9250506142a78c6101208d01613c51565b90509295989b9194979a5092959850565b600080604083850312156142ca578182fd5b82356001600160401b038111156142df578283fd5b6142eb85828601613cfc565b92505060208301356142fc81614d8d565b809150509250929050565b60008060006060848603121561431b578081fd5b83356001600160401b0380821115614331578283fd5b61433d87838801613cfc565b94506020860135915080821115614352578283fd5b5061435f86828701613cfc565b925050604084013561437081614d8d565b809150509250925092565b6000806040838503121561438d578182fd5b82356001600160401b038111156143a2578283fd5b6143ae85828601613cfc565b95602094909401359450505050565b6000806000606084860312156143d1578081fd5b83356001600160401b038111156143e6578182fd5b6143f286828701613cfc565b93505060208401359150604084013561437081614d78565b60008060006060848603121561441e578081fd5b83356001600160401b03811115614433578182fd5b61443f86828701613cfc565b93505060208401359150604084013561437081614d8d565b6000815180845260208085019450808401835b838110156144865781518752958201959082019060010161446a565b509495945050505050565b600081518084526144a9816020860160208601614cca565b601f01601f19169290920160200192915050565b8054600090600281046001808316806144d757607f831692505b60208084108214156144f757634e487b7160e01b86526022600452602486fd5b81801561450b576001811461451c57614549565b60ff19861689528489019650614549565b61452588614ca6565b60005b868110156145415781548b820152908501908301614528565b505084890196505b50505050505092915050565b60008251614567818460208701614cca565b9190910192915050565b600061457d82856144bd565b60609390931b6bffffffffffffffffffffffff191683525050601401919050565b60006145aa82856144bd565b6001600160e01b03199390931683525050600401919050565b6000613dea6145d283866144bd565b846144bd565b6001600160a01b0391909116815260200190565b6001600160a01b038416815260606020820181905260009061461090830185614491565b82810360408401526146228185614491565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156146865783516001600160a01b031683529284019291840191600101614661565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156146865783511515835292840192918401916001016146ae565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561471f57603f1988860301845261470d858351614491565b945092850192908501906001016146f1565b5092979650505050505050565b600060208252613d646020830184614457565b901515815260200190565b600060808201868352602086818501526080604085015281865180845260a0860191508288019350845b8181101561479057845183529383019391830191600101614774565b505084810360608601526147a48187614457565b9998505050505050505050565b6001600160e01b031991909116815260200190565b600060208252613d646020830184614491565b6000604082526147ec6040830185614491565b905060018060a01b03831660208301529392505050565b6000604082526148166040830185614491565b905082151560208301529392505050565b60006040825261483a6040830185614491565b828103602084015261484c8185614491565b95945050505050565b602080825260079082015266444d4e443a4e4960c81b604082015260600190565b602080825260079082015266444d4e443a5a4160c81b604082015260600190565b6020808252600a908201526911935312508e9310d2d160b21b604082015260600190565b602080825260089082015267444d4e443a49415360c01b604082015260600190565b602080825260079082015266111353910e95d360ca1b604082015260600190565b6020808252600a90820152692226a7221d20a3292d2760b11b604082015260600190565b602080825260079082015266444d4e443a574960c81b604082015260600190565b6020808252600690820152655446493a494360d01b604082015260600190565b6020808252600890820152672326a624a11d24a360c11b604082015260600190565b6020808252600990820152682326a624a11d2320a360b91b604082015260600190565b60208082526008908201526711935312508e925360c21b604082015260600190565b602080825260079082015266444d4e443a414960c81b604082015260600190565b602080825260079082015266111353910e915160ca1b604082015260600190565b6020808252600990820152682326a624a11d23272360b91b604082015260600190565b602080825260079082015266444d4e443a454160c81b604082015260600190565b6020808252600690820152655446493a4e4960d01b604082015260600190565b6020808252600790820152665446493a5a544d60c81b604082015260600190565b6020808252600890820152672226a7221d2d20a960c11b604082015260600190565b602080825260099082015268464d4c49423a49465360b81b604082015260600190565b6020808252600890820152672226a7221d24a0a960c11b604082015260600190565b6020808252600790820152662a23249d25a72360c91b604082015260600190565b6020808252600890820152672326a624a11d2d2360c11b604082015260600190565b6020808252600690820152655446493a5a4160d01b604082015260600190565b6020808252600a9082015269464d4c49423a4652454d60b01b604082015260600190565b6020808252600890820152672326a624a11d232360c11b604082015260600190565b60208082526008908201526711935312508e969360c21b604082015260600190565b6020808252600a90820152690889a9c88749c82aaa8960b31b604082015260600190565b6020808252600b908201526a2326a624a11d2223292d2760a91b604082015260600190565b6020808252600690820152655446493a414960d01b604082015260600190565b604051601f8201601f191681016001600160401b0381118282101715614c5457614c54614d62565b604052919050565b60006001600160401b03821115614c7557614c75614d62565b5060209081020190565b60006001600160401b03821115614c9857614c98614d62565b50601f01601f191660200190565b60009081526020902090565b60008219821115614cc557614cc5614d4c565b500190565b60005b83811015614ce5578181015183820152602001614ccd565b83811115610b235750506000910152565b600281046001821680614d0a57607f821691505b60208210811415614d2b57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614d4557614d45614d4c565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610ef957600080fd5b8015158114610ef957600080fdfea2646970667358221220c8f0aefd3736a14d94c7f5ad71f2a670f25b031ad5cc3aed22162704d600356564736f6c63430008010033
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.