Polygon Sponsored slots available. Book your slot here!
Contract Overview
[ Download CSV Export ]
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xf951e0d3736bc3e045aff7b526113ce2f6b2d356
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
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.