ETH Price: $3,426.71 (-1.59%)
Gas: 4 Gwei

Token

Orsetto Gang (OG)
 

Overview

Max Total Supply

0 OG

Holders

2,053

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
genxd.eth
Balance
3 OG
0x832CCDcEBA445094236E1Fe6086E3cEB2B3Fd9A1
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
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.

Contract Source Code Verified (Exact Match)

Contract Name:
arteQCollectionV2

Compiler Version
v0.8.1+commit.df193b15

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion
File 1 of 18 : arteQCollectionV2.sol
/*
 * This file is part of the contracts written for artèQ Investment Fund (https://github.com/arteq-io/contracts).
 * Copyright (c) 2022 artèQ (https://arteq.io)
 *
 * 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/token/ERC721/IERC721.sol";
import "../../arteq-tech/contracts/vaults/VaultsConfig.sol";
import "../../arteq-tech/contracts/diamond/DiamondV1.sol";
import "./arteQCollectionV2Config.sol";

/// @author Kam Amini <[email protected]> <[email protected]>
///
/// @notice Use at your own risk

/* solhint-disable contract-name-camelcase */
contract arteQCollectionV2 is DiamondV1 {

    string private _detailsURI;

    modifier onlyAdmin {
        RoleManagerLib._checkRole(arteQCollectionV2Config.ROLE_ADMIN);
        _;
    }

    constructor(
        address taskManager,
        string memory detailsURI,
        address[] memory admins,
        address[] memory tokenManagers,
        address[] memory vaultAdmins,
        address[] memory diamondAdmins
    ) DiamondV1(taskManager, diamondAdmins) {

        // Admin role
        for (uint i = 0; i < admins.length; i++) {
            RoleManagerLib._grantRole(admins[i], arteQCollectionV2Config.ROLE_ADMIN);
        }
        // Token Manager role
        for (uint i = 0; i < tokenManagers.length; i++) {
            RoleManagerLib._grantRole(tokenManagers[i],arteQCollectionV2Config.ROLE_TOKEN_MANAGER);
        }
        // Vault Admin role
        for (uint i = 0; i < vaultAdmins.length; i++) {
            RoleManagerLib._grantRole(vaultAdmins[i], VaultsConfig.ROLE_VAULT_ADMIN);
        }

        _detailsURI = detailsURI;
    }

    function supportsInterface(bytes4 interfaceId)
      public view override returns (bool) {
        // We have to return true for OpenSea contract detection and caching mechanism
        if (interfaceId == type(IERC721).interfaceId) {
            return true;
        }
        return super.supportsInterface(interfaceId);
    }

    function getDetailsURI() external view returns (string memory) {
        return _detailsURI;
    }

    function setDetailsURI(string memory newValue) external onlyAdmin {
        _detailsURI = newValue;
    }

    /* solhint-disable no-complex-fallback */
    fallback() external payable {
        address facet = _findFacet(msg.sig);
        /* 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 {
    }
}

File 2 of 18 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

File 3 of 18 : VaultsConfig.sol
/*
 * This file is part of the artèQ Technologies contracts (https://github.com/arteq-tech/contracts).
 * Copyright (c) 2022 artèQ Technologies (https://arteq.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
library VaultsConfig {

    uint256 public constant ROLE_VAULT_ADMIN = uint256(keccak256(bytes("ROLE_VAULT_ADMIN")));
}

File 4 of 18 : DiamondV1.sol
/*
 * This file is part of the artèQ Technologies contracts (https://github.com/arteq-tech/contracts).
 * Copyright (c) 2022 artèQ Technologies (https://arteq.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 "../security/task-executor/TaskExecutorFacet.sol";
import "../security/task-executor/TaskExecutorLib.sol";
import "../security/role-manager/RoleManagerFacet.sol";
import "../security/role-manager/RoleManagerLib.sol";
import "./IDiamondFacet.sol";
import "./DiamondV1Config.sol";

/// @author Kam Amini <[email protected]>
///
/// @notice Use at your own risk
abstract contract DiamondV1 is
  IERC165,
  TaskExecutorFacet,
  RoleManagerFacet
{
    address[] private _facets;
    mapping(address => uint256) private _facetArrayIndex;
    mapping(bytes4 => address) private _selectorToFacetMap;
    mapping(address => string[]) private _facetToFuncSigsMap;
    mapping(address => mapping(bytes4 => bool)) private _removedFuncs;
    mapping(bytes4 => bool) private _suppressedInterfaceIds;

    modifier onlyDiamondAdmin() {
        RoleManagerLib._checkRole(DiamondV1Config.ROLE_DIAMOND_ADMIN);
        _;
    }

    constructor(
        address taskManager,
        address[] memory diamondAdmins
    ) {
        TaskExecutorLib._setTaskManager(taskManager);
        for(uint i = 0; i < diamondAdmins.length; i++) {
            RoleManagerLib._grantRole(diamondAdmins[i], DiamondV1Config.ROLE_DIAMOND_ADMIN);
        }
    }

    function supportsInterface(bytes4 interfaceId)
      public view override virtual returns (bool) {
        // Querying for IDiamondFacet must always return false
        if (interfaceId == type(IDiamondFacet).interfaceId) {
            return false;
        }
        if (_suppressedInterfaceIds[interfaceId]) {
            return false;
        }
        // Always return true
        if (interfaceId == type(IERC165).interfaceId) {
            return true;
        }
        for (uint256 i = 0; i < _facets.length; i++) {
            address facet = _facets[i];
            if (IDiamondFacet(facet).supportsInterface(interfaceId)) {
                return true;
            }
        }
        return false;
    }

    function isInterfaceIdSuppressed(bytes4 interfaceId)
      external view onlyDiamondAdmin returns (bool) {
        return _suppressedInterfaceIds[interfaceId];
    }

    function suppressInterfaceId(bytes4 interfaceId, bool suppress)
      external onlyDiamondAdmin {
        _suppressedInterfaceIds[interfaceId] = suppress;
    }

    function getFuncs()
      external view onlyDiamondAdmin returns (string[] memory, address[] memory) {
        return _getFuncs();
    }

    function getFacetFuncs(address facet)
      external view onlyDiamondAdmin returns (string[] memory) {
        return _getFacetFuncs(facet);
    }

    function addFuncs(
        string[] memory funcSigs,
        address[] memory facets
    ) external onlyDiamondAdmin {
        require(funcSigs.length > 0, "DV1:ZL");
        require(funcSigs.length == facets.length, "DV1:NEQL");
        for (uint256 i = 0; i < funcSigs.length; i++) {
            string memory funcSig = funcSigs[i];
            address facet = facets[i];
            _addFunc(funcSig, facet);
        }
    }

    function removeFuncs(
        string[] memory funcSigs
    ) external onlyDiamondAdmin {
        require(funcSigs.length > 0, "DV1:ZL");
        for (uint256 i = 0; i < funcSigs.length; i++) {
            string memory funcSig = funcSigs[i];
            _removeFunc(funcSig);
        }
    }

    function _getFuncs() internal view returns (string[] memory, address[] memory) {
        uint256 length = 0;
        for (uint256 i = 0; i < _facets.length; i++) {
            address facet = _facets[i];
            string[] memory facetFuncs = _getFacetFuncs(facet);
            for (uint256 j = 0; j < facetFuncs.length; j++) {
                length += 1;
            }
        }
        string[] memory funcSigs = new string[](length);
        address[] memory facets = new address[](length);
        uint256 index = 0;
        for (uint256 i = 0; i < _facets.length; i++) {
            address facet = _facets[i];
            string[] memory facetFuncs = _getFacetFuncs(facet);
            for (uint256 j = 0; j < facetFuncs.length; j++) {
                funcSigs[index] = facetFuncs[j];
                facets[index] = facet;
                index += 1;
            }
        }
        return (funcSigs, facets);
    }

    function _getFacetFuncs(address facet) internal view returns (string[] memory) {
        uint256 length = 0;
        for (uint256 j = 0; j < _facetToFuncSigsMap[facet].length; j++) {
            string memory funcSig = _facetToFuncSigsMap[facet][j];
            bytes4 selector = __getSelector(funcSig);
            if (!_removedFuncs[facet][selector]) {
                length += 1;
            }
        }
        string[] memory funcSigs = new string[](length);
        uint256 index = 0;
        for (uint256 j = 0; j < _facetToFuncSigsMap[facet].length; j++) {
            string memory funcSig = _facetToFuncSigsMap[facet][j];
            bytes4 selector = __getSelector(funcSig);
            if (!_removedFuncs[facet][selector]) {
                funcSigs[index] = funcSig;
                index += 1;
            }
        }
        return funcSigs;
    }

    function _addFunc(
        string memory funcSig,
        address facet
    ) internal {
        require(facet != address(0), "DV1:ZF");
        require(
            IDiamondFacet(facet).supportsInterface(type(IDiamondFacet).interfaceId),
            "DV1:IF"
        );
        bytes4 selector = __getSelector(funcSig);
        address oldFacet = _selectorToFacetMap[selector];

         // overrides the previously set selector
        _selectorToFacetMap[selector] = facet;

        bool found = false;
        for (uint256 i = 0; i < _facetToFuncSigsMap[facet].length; i++) {
            bytes32 s = __getSelector(_facetToFuncSigsMap[facet][i]);
            if (s == selector) {
                found = true;
                break;
            }
        }
        if (!found) {
            _facetToFuncSigsMap[facet].push(funcSig); // add the func-sig to facet's map
        }

        _removedFuncs[facet][selector] = false; // revive the selector if already removed
        if (oldFacet != address(0) && oldFacet != facet) {
            _removedFuncs[oldFacet][selector] = true; // remove from the old facet
        }

        // update facets array
        if (_facetArrayIndex[facet] == 0) {
            _facets.push(facet);
            _facetArrayIndex[facet] = _facets.length;
        }
    }

    function _removeFunc(
        string memory funcSig
    ) internal {
        bytes4 selector = __getSelector(funcSig);
        address facet = _selectorToFacetMap[selector];
        if (facet != address(0)) {
            _removedFuncs[facet][selector] = true;
        }
    }

    function _findFacet(bytes4 selector) internal view returns (address) {
        address facet = _selectorToFacetMap[selector];
        require(facet != address(0), "DV1:FNF");
        require(!_removedFuncs[facet][selector], "DV1:FR");
        return facet;
    }

    function __getSelector(string memory funcSig) private 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("DV1:IFS");
            }
        }
        return bytes4(keccak256(bytes(funcSig)));
    }
}

File 5 of 18 : arteQCollectionV2Config.sol
/*
 * This file is part of the contracts written for artèQ Investment Fund (https://github.com/arteq-io/contracts).
 * Copyright (c) 2022 artèQ (https://arteq.io)
 *
 * 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

/* solhint-disable contract-name-camelcase */
library arteQCollectionV2Config {

    uint256 constant public ROLE_ADMIN = uint256(keccak256(bytes("ROLE_ADMIN")));

    uint256 constant public ROLE_TOKEN_MANAGER = uint256(keccak256(bytes("ROLE_TOKEN_MANAGER")));
}

File 6 of 18 : IERC165.sol
// 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);
}

File 7 of 18 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)

pragma solidity ^0.8.0;

import "../utils/introspection/IERC165.sol";

File 8 of 18 : TaskExecutorFacet.sol
/*
 * This file is part of the artèQ Technologies contracts (https://github.com/arteq-tech/contracts).
 * Copyright (c) 2022 artèQ Technologies (https://arteq.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";

/// @author Kam Amini <[email protected]>
///
/// @notice Use at your own risk
contract TaskExecutorFacet {

    function getTaskManager() external view returns (address) {
        return TaskExecutorInternal._getTaskManager();
    }

    function setTaskManager(
        uint256 adminTaskId,
        address newTaskManager
    ) external {
        address oldTaskManager = TaskExecutorInternal._getTaskManager();
        TaskExecutorInternal._setTaskManager(newTaskManager);
        if (oldTaskManager != address(0)) {
            ITaskExecutor(oldTaskManager).executeAdminTask(msg.sender, adminTaskId);
        }
    }
}

File 9 of 18 : TaskExecutorLib.sol
/*
 * This file is part of the artèQ Technologies contracts (https://github.com/arteq-tech/contracts).
 * Copyright (c) 2022 artèQ Technologies (https://arteq.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";

/// @author Kam Amini <[email protected]>
///
/// @notice Use at your own risk
library TaskExecutorLib {

    function _setTaskManager(address newTaskManager) internal {
        TaskExecutorInternal._setTaskManager(newTaskManager);
    }

    function _executeTask(uint256 taskId) internal {
        TaskExecutorInternal._executeTask(taskId);
    }
}

File 10 of 18 : RoleManagerFacet.sol
/*
 * This file is part of the artèQ Technologies contracts (https://github.com/arteq-tech/contracts).
 * Copyright (c) 2022 artèQ Technologies (https://arteq.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 "../task-executor/TaskExecutorLib.sol";
import "./RoleManagerInternal.sol";

/// @author Kam Amini <[email protected]>
///
/// @notice Use at your own risk
contract RoleManagerFacet {

    function hasRole(
        address account,
        uint256 role
    ) external view returns (bool) {
        return RoleManagerInternal._hasRole2(account, role);
    }

    function grantRole(
        uint256 taskId,
        address account,
        uint256 role
    ) external {
        RoleManagerInternal._grantRole(account, role);
        TaskExecutorLib._executeTask(taskId);
    }

    function revokeRole(
        uint256 taskId,
        address account,
        uint256 role
    ) external {
        RoleManagerInternal._revokeRole(account, role);
        TaskExecutorLib._executeTask(taskId);
    }
}

File 11 of 18 : RoleManagerLib.sol
/*
 * This file is part of the artèQ Technologies contracts (https://github.com/arteq-tech/contracts).
 * Copyright (c) 2022 artèQ Technologies (https://arteq.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 "./RoleManagerInternal.sol";

/// @author Kam Amini <[email protected]>
///
/// @notice Use at your own risk
library RoleManagerLib {

    function _checkRole(uint256 role) internal view {
        RoleManagerInternal._checkRole(role);
    }

    function _hasRole(uint256 role) internal view returns (bool) {
        return RoleManagerInternal._hasRole(role);
    }

    function _grantRole(
        address account,
        uint256 role
    ) internal {
        RoleManagerInternal._grantRole(account, role);
    }
}

File 12 of 18 : IDiamondFacet.sol
/*
 * This file is part of the artèQ Technologies contracts (https://github.com/arteq-tech/contracts).
 * Copyright (c) 2022 artèQ Technologies (https://arteq.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 IDiamondFacet {

    function getVersion() external view returns (string memory);

    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 13 of 18 : DiamondV1Config.sol
/*
 * This file is part of the artèQ Technologies contracts (https://github.com/arteq-tech/contracts).
 * Copyright (c) 2022 artèQ Technologies (https://arteq.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
library DiamondV1Config {

    uint256 public constant ROLE_DIAMOND_ADMIN = uint256(keccak256(bytes("ROLE_DIAMOND_ADMIN")));
}

File 14 of 18 : TaskExecutorInternal.sol
/*
 * This file is part of the artèQ Technologies contracts (https://github.com/arteq-tech/contracts).
 * Copyright (c) 2022 artèQ Technologies (https://arteq.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 "../../interfaces/ITaskExecutor.sol";
import "./TaskExecutorStorage.sol";

/// @author Kam Amini <[email protected]>
///
/// @notice Use at your own risk
library TaskExecutorInternal {

    event TaskManagerChanged(address newTaskManager);

    function _getTaskManager() internal view returns (address) {
        return __s().taskManager;
    }

    function _setTaskManager(address newTaskManager) internal {
        require(newTaskManager != address(0), "TE:ZA");
        require(IERC165(newTaskManager).supportsInterface(type(ITaskExecutor).interfaceId),
            "TE:IC");
        __s().taskManager = newTaskManager;
        emit TaskManagerChanged(__s().taskManager);
    }

    function _executeTask(uint256 taskId) internal {
        require(__s().taskManager != address(0), "TE:NTM");
        ITaskExecutor(__s().taskManager).executeTask(msg.sender, taskId);
    }

    function __s() private pure returns (TaskExecutorStorage.Layout storage) {
        return TaskExecutorStorage.layout();
    }
}

File 15 of 18 : ITaskExecutor.sol
/*
 * This file is part of the artèQ Technologies contracts (https://github.com/arteq-tech/contracts).
 * Copyright (c) 2022 artèQ Technologies (https://arteq.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;
}

File 16 of 18 : TaskExecutorStorage.sol
/*
 * This file is part of the artèQ Technologies contracts (https://github.com/arteq-tech/contracts).
 * Copyright (c) 2022 artèQ Technologies (https://arteq.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 {
        address taskManager;
        mapping(uint256 => uint256) extra;
    }

    // Storage Slot: de1b6f91cd9572e4381a8b8d203bdc268664230f56599f11d2ca9df8d397fb6f
    bytes32 internal constant STORAGE_SLOT =
        keccak256("arteq-tech.contracts.security.task-executor.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 */
    }
}

File 17 of 18 : RoleManagerInternal.sol
/*
 * This file is part of the artèQ Technologies contracts (https://github.com/arteq-tech/contracts).
 * Copyright (c) 2022 artèQ Technologies (https://arteq.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 "./RoleManagerStorage.sol";

/// @author Kam Amini <[email protected]>
///
/// @notice Use at your own risk
library RoleManagerInternal {

    event RoleGrant(uint256 role, address account);
    event RoleRevoke(uint256 role, address account);

    function _checkRole(uint256 role) internal view {
        require(__s().roles[role][msg.sender], "RM:MR");
    }

    function _hasRole(uint256 role) internal view returns (bool) {
        return __s().roles[role][msg.sender];
    }

    function _hasRole2(
        address account,
        uint256 role
    ) internal view returns (bool) {
        return __s().roles[role][account];
    }

    function _grantRole(
        address account,
        uint256 role
    ) internal {
        require(!__s().roles[role][account], "RM:AHR");
        __s().roles[role][account] = true;
        emit RoleGrant(role, account);
    }

    function _revokeRole(
        address account,
        uint256 role
    ) internal {
        require(__s().roles[role][account], "RM:DNHR");
        __s().roles[role][account] = false;
        emit RoleRevoke(role, account);
    }

    function __s() private pure returns (RoleManagerStorage.Layout storage) {
        return RoleManagerStorage.layout();
    }
}

File 18 of 18 : RoleManagerStorage.sol
/*
 * This file is part of the artèQ Technologies contracts (https://github.com/arteq-tech/contracts).
 * Copyright (c) 2022 artèQ Technologies (https://arteq.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 RoleManagerStorage {

    struct Layout {
        mapping (uint256 => mapping(address => bool)) roles;
        mapping(uint256 => uint256) extra;
    }

    // Storage Slot: d6cfccebecf684bbc10a5019ad1aed91fbc4f7461f5cd03e8c71240be4ca6bea
    bytes32 internal constant STORAGE_SLOT =
        keccak256("arteq-tech.contracts.security.role-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 */
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 2000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"taskManager","type":"address"},{"internalType":"string","name":"detailsURI","type":"string"},{"internalType":"address[]","name":"admins","type":"address[]"},{"internalType":"address[]","name":"tokenManagers","type":"address[]"},{"internalType":"address[]","name":"vaultAdmins","type":"address[]"},{"internalType":"address[]","name":"diamondAdmins","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"string[]","name":"funcSigs","type":"string[]"},{"internalType":"address[]","name":"facets","type":"address[]"}],"name":"addFuncs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getDetailsURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"facet","type":"address"}],"name":"getFacetFuncs","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFuncs","outputs":[{"internalType":"string[]","name":"","type":"string[]"},{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaskManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"taskId","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"role","type":"uint256"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"role","type":"uint256"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"isInterfaceIdSuppressed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"funcSigs","type":"string[]"}],"name":"removeFuncs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taskId","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"role","type":"uint256"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newValue","type":"string"}],"name":"setDetailsURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"address","name":"newTaskManager","type":"address"}],"name":"setTaskManager","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":"bytes4","name":"interfaceId","type":"bytes4"},{"internalType":"bool","name":"suppress","type":"bool"}],"name":"suppressInterfaceId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b5060405162002fe438038062002fe483398101604081905262000034916200076e565b85816200004c82620002be60201b6200097a1760201c565b60005b8151811015620000e157620000cc8282815181106200007e57634e487b7160e01b600052603260045260246000fd5b6020026020010151604051806040016040528060128152602001712927a622afa224a0a6a7a7222fa0a226a4a760711b8152508051906020012060001c620002d760201b620009861760201c565b80620000d88162000992565b9150506200004f565b50505060005b845181101562000171576200015c8582815181106200011657634e487b7160e01b600052603260045260246000fd5b60200260200101516040518060400160405280600a8152602001692927a622afa0a226a4a760b11b8152508051906020012060001c620002d760201b620009861760201c565b80620001688162000992565b915050620000e7565b5060005b83518110156200020757620001f2848281518110620001a457634e487b7160e01b600052603260045260246000fd5b6020026020010151604051806040016040528060128152602001712927a622afaa27a5a2a72fa6a0a720a3a2a960711b8152508051906020012060001c620002d760201b620009861760201c565b80620001fe8162000992565b91505062000175565b5060005b82518110156200029b57620002868382815181106200023a57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518060400160405280601081526020016f2927a622afab20aaa62a2fa0a226a4a760811b8152508051906020012060001c620002d760201b620009861760201c565b80620002928162000992565b9150506200020b565b508451620002b190600690602088019062000587565b50505050505050620009d0565b620002d481620002f260201b620009901760201c565b50565b620002ee82826200044460201b62000aed1760201c565b5050565b6001600160a01b038116620003245760405162461bcd60e51b81526004016200031b90620008ec565b60405180910390fd5b6040516301ffc9a760e01b81526001600160a01b038216906301ffc9a79062000359906304d657b360e51b9060040162000898565b60206040518083038186803b1580156200037257600080fd5b505afa15801562000387573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003ad91906200085b565b620003cc5760405162461bcd60e51b81526004016200031b90620008ad565b80620003d76200050c565b80546001600160a01b0319166001600160a01b03929092169190911790557fd9944277d62f69cc63c9bc5bd2158fef907119ed7f90fd406f1cdfada1097d50620004206200050c565b5460405162000439916001600160a01b03169062000884565b60405180910390a150565b6200044e62000528565b6000828152602091825260408082206001600160a01b0386168352909252205460ff1615620004915760405162461bcd60e51b81526004016200031b90620008cc565b60016200049d62000528565b6000838152602091825260408082206001600160a01b0387168352909252819020805460ff191692151592909217909155517ffcb6b45ef5424ef7d19598014fef2f5f5af10c504287d60504ca515e17a472dc906200050090839085906200090b565b60405180910390a15050565b6000620005236200053f60201b62000bac1760201c565b905090565b6000620005236200056360201b62000bd01760201c565b7fde1b6f91cd9572e4381a8b8d203bdc268664230f56599f11d2ca9df8d397fb6f90565b7fd6cfccebecf684bbc10a5019ad1aed91fbc4f7461f5cd03e8c71240be4ca6bea90565b828054620005959062000955565b90600052602060002090601f016020900481019282620005b9576000855562000604565b82601f10620005d457805160ff191683800117855562000604565b8280016001018555821562000604579182015b8281111562000604578251825591602001919060010190620005e7565b506200061292915062000616565b5090565b5b8082111562000612576000815560010162000617565b80516001600160a01b03811681146200064557600080fd5b919050565b600082601f8301126200065b578081fd5b815160206001600160401b03821115620006795762000679620009ba565b8082026200068982820162000922565b838152828101908684018388018501891015620006a4578687fd5b8693505b85841015620006d157620006bc816200062d565b835260019390930192918401918401620006a8565b50979650505050505050565b600082601f830112620006ee578081fd5b81516001600160401b038111156200070a576200070a620009ba565b602062000720601f8301601f1916820162000922565b828152858284870101111562000734578384fd5b835b838110156200075357858101830151828201840152820162000736565b838111156200076457848385840101525b5095945050505050565b60008060008060008060c0878903121562000787578182fd5b62000792876200062d565b60208801519096506001600160401b0380821115620007af578384fd5b620007bd8a838b01620006dd565b96506040890151915080821115620007d3578384fd5b620007e18a838b016200064a565b95506060890151915080821115620007f7578384fd5b620008058a838b016200064a565b945060808901519150808211156200081b578384fd5b620008298a838b016200064a565b935060a08901519150808211156200083f578283fd5b506200084e89828a016200064a565b9150509295509295509295565b6000602082840312156200086d578081fd5b815180151581146200087d578182fd5b9392505050565b6001600160a01b0391909116815260200190565b6001600160e01b031991909116815260200190565b60208082526005908201526454453a494360d81b604082015260600190565b60208082526006908201526529269d20a42960d11b604082015260600190565b60208082526005908201526454453a5a4160d81b604082015260600190565b9182526001600160a01b0316602082015260400190565b604051601f8201601f191681016001600160401b03811182821017156200094d576200094d620009ba565b604052919050565b6002810460018216806200096a57607f821691505b602082108114156200098c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415620009b357634e487b7160e01b81526011600452602481fd5b5060010190565b634e487b7160e01b600052604160045260246000fd5b61260480620009e06000396000f3fe6080604052600436106100e15760003560e01c8063884a8f001161007f578063abc2876211610059578063abc2876214610284578063efc5f532146102a4578063fb2153c2146102d1578063fdf7c916146102f1576100e8565b8063884a8f00146102225780639553f75c14610244578063a48929d114610264576100e8565b80633c47b163116100bb5780633c47b1631461019d5780635c97f4a2146101bd57806367788084146101dd57806374e3d94914610200576100e8565b806301ffc9a7146101255780632856481c1461015b578063378b4b001461017d576100e8565b366100e857005b60006100ff6000356001600160e01b031916610311565b90503660008037600080366000845af43d6000803e808015610120573d6000f35b3d6000fd5b34801561013157600080fd5b50610145610140366004611f8c565b6103b0565b604051610152919061219e565b60405180910390f35b34801561016757600080fd5b5061017b61017636600461203a565b6103f5565b005b34801561018957600080fd5b5061017b610198366004611eb0565b61040d565b3480156101a957600080fd5b5061017b6101b836600461200f565b610525565b3480156101c957600080fd5b506101456101d8366004611e4c565b6105c7565b3480156101e957600080fd5b506101f26105da565b60405161015292919061214c565b34801561020c57600080fd5b50610215610640565b604051610152919061210c565b34801561022e57600080fd5b5061023761064f565b60405161015291906121be565b34801561025057600080fd5b5061014561025f366004611f8c565b6106e1565b34801561027057600080fd5b5061017b61027f366004611fdc565b610756565b34801561029057600080fd5b5061017b61029f366004611e75565b6107cb565b3480156102b057600080fd5b506102c46102bf366004611e32565b610893565b6040516101529190612139565b3480156102dd57600080fd5b5061017b6102ec366004611fa6565b6108f1565b3480156102fd57600080fd5b5061017b61030c36600461203a565b610970565b6001600160e01b031981166000908152600260205260408120546001600160a01b03168061035a5760405162461bcd60e51b8152600401610351906122e4565b60405180910390fd5b6001600160a01b03811660009081526004602090815260408083206001600160e01b03198716845290915290205460ff16156103a85760405162461bcd60e51b815260040161035190612389565b90505b919050565b60006001600160e01b031982167f80ac58cd0000000000000000000000000000000000000000000000000000000014156103ec575060016103ab565b6103a882610bf4565b6103ff8282610d62565b61040883610e14565b505050565b6040805180820190915260128152712927a622afa224a0a6a7a7222fa0a226a4a760711b6020909101526104607f7d41cc998da5115908d5f060569efddde4c3bacf9b9002b4a70c2c7764f673f5610e1d565b60008251116104815760405162461bcd60e51b81526004016103519061242e565b80518251146104a25760405162461bcd60e51b81526004016103519061231b565b60005b82518110156104085760008382815181106104d057634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008383815181106104fc57634e487b7160e01b600052603260045260246000fd5b602002602001015190506105108282610e26565b5050808061051d9061255b565b9150506104a5565b600061052f6111eb565b905061053a82610990565b6001600160a01b03811615610408576040517f6a83f1090000000000000000000000000000000000000000000000000000000081526001600160a01b03821690636a83f109906105909033908790600401612120565b600060405180830381600087803b1580156105aa57600080fd5b505af11580156105be573d6000803e3d6000fd5b50505050505050565b60006105d38383611204565b9392505050565b6040805180820190915260128152712927a622afa224a0a6a7a7222fa0a226a4a760711b6020909101526060806106307f7d41cc998da5115908d5f060569efddde4c3bacf9b9002b4a70c2c7764f673f5610e1d565b610638611237565b915091509091565b600061064a6111eb565b905090565b60606006805461065e90612520565b80601f016020809104026020016040519081016040528092919081815260200182805461068a90612520565b80156106d75780601f106106ac576101008083540402835291602001916106d7565b820191906000526020600020905b8154815290600101906020018083116106ba57829003601f168201915b5050505050905090565b6040805180820190915260128152712927a622afa224a0a6a7a7222fa0a226a4a760711b60209091015260006107367f7d41cc998da5115908d5f060569efddde4c3bacf9b9002b4a70c2c7764f673f5610e1d565b506001600160e01b03191660009081526005602052604090205460ff1690565b60408051808201909152600a81527f524f4c455f41444d494e000000000000000000000000000000000000000000006020909101526107b47f2172861495e7b85edac73e3cd5fbb42dd675baadf627720e687bcfdaca025096610e1d565b80516107c7906006906020840190611c98565b5050565b6040805180820190915260128152712927a622afa224a0a6a7a7222fa0a226a4a760711b60209091015261081e7f7d41cc998da5115908d5f060569efddde4c3bacf9b9002b4a70c2c7764f673f5610e1d565b600081511161083f5760405162461bcd60e51b81526004016103519061242e565b60005b81518110156107c757600082828151811061086d57634e487b7160e01b600052603260045260246000fd5b60200260200101519050610880816114ab565b508061088b8161255b565b915050610842565b6040805180820190915260128152712927a622afa224a0a6a7a7222fa0a226a4a760711b60209091015260606108e87f7d41cc998da5115908d5f060569efddde4c3bacf9b9002b4a70c2c7764f673f5610e1d565b6103a88261151f565b6040805180820190915260128152712927a622afa224a0a6a7a7222fa0a226a4a760711b6020909101526109447f7d41cc998da5115908d5f060569efddde4c3bacf9b9002b4a70c2c7764f673f5610e1d565b6001600160e01b0319919091166000908152600560205260409020805460ff1916911515919091179055565b6103ff8282610aed565b61098381610990565b50565b6107c78282610aed565b6001600160a01b0381166109b65760405162461bcd60e51b815260040161035190612465565b6040516301ffc9a760e01b81526001600160a01b038216906301ffc9a790610a02907f9acaf66000000000000000000000000000000000000000000000000000000000906004016121a9565b60206040518083038186803b158015610a1a57600080fd5b505afa158015610a2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a529190611f70565b610a6e5760405162461bcd60e51b815260040161035190612208565b80610a77611865565b805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790557fd9944277d62f69cc63c9bc5bd2158fef907119ed7f90fd406f1cdfada1097d50610acb611865565b54604051610ae2916001600160a01b03169061210c565b60405180910390a150565b610af561186f565b6000828152602091825260408082206001600160a01b0386168352909252205460ff1615610b355760405162461bcd60e51b8152600401610351906123f7565b6001610b3f61186f565b6000838152602091825260408082206001600160a01b0387168352909252819020805460ff191692151592909217909155517ffcb6b45ef5424ef7d19598014fef2f5f5af10c504287d60504ca515e17a472dc90610ba0908390859061249c565b60405180910390a15050565b7fde1b6f91cd9572e4381a8b8d203bdc268664230f56599f11d2ca9df8d397fb6f90565b7fd6cfccebecf684bbc10a5019ad1aed91fbc4f7461f5cd03e8c71240be4ca6bea90565b60006001600160e01b031982167f0c71a78b000000000000000000000000000000000000000000000000000000001415610c30575060006103ab565b6001600160e01b0319821660009081526005602052604090205460ff1615610c5a575060006103ab565b6001600160e01b031982166301ffc9a760e01b1415610c7b575060016103ab565b60005b600054811015610d59576000808281548110610caa57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546040516301ffc9a760e01b81526001600160a01b03909116915081906301ffc9a790610ce69087906004016121a9565b60206040518083038186803b158015610cfe57600080fd5b505afa158015610d12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d369190611f70565b15610d46576001925050506103ab565b5080610d518161255b565b915050610c7e565b50600092915050565b610d6a61186f565b6000828152602091825260408082206001600160a01b0386168352909252205460ff16610da95760405162461bcd60e51b815260040161035190612352565b6000610db361186f565b6000838152602091825260408082206001600160a01b0387168352909252819020805460ff191692151592909217909155517f3992d8cf6249af1b2bb6e542550b9bf348992deec040c06d2ed5c46de50eef7f90610ba0908390859061249c565b61098381611879565b6109838161192a565b6001600160a01b038116610e4c5760405162461bcd60e51b8152600401610351906123c0565b6040516301ffc9a760e01b81526001600160a01b038216906301ffc9a790610e98907f0c71a78b00000000000000000000000000000000000000000000000000000000906004016121a9565b60206040518083038186803b158015610eb057600080fd5b505afa158015610ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee89190611f70565b610f045760405162461bcd60e51b815260040161035190612276565b6000610f0f83611968565b6001600160e01b03198116600090815260026020526040812080546001600160a01b0386811673ffffffffffffffffffffffffffffffffffffffff1983161790925592935090911690805b6001600160a01b038516600090815260036020526040902054811015611083576001600160a01b0385166000908152600360205260408120805461104f919084908110610fb757634e487b7160e01b600052603260045260246000fd5b906000526020600020018054610fcc90612520565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff890612520565b80156110455780601f1061101a57610100808354040283529160200191611045565b820191906000526020600020905b81548152906001019060200180831161102857829003601f168201915b5050505050611968565b6001600160e01b031990811691508516811415611070576001925050611083565b508061107b8161255b565b915050610f5a565b50806110c7576001600160a01b0384166000908152600360209081526040822080546001810182559083529181902087516110c5939190910191880190611c98565b505b6001600160a01b0380851660009081526004602090815260408083206001600160e01b0319881684529091529020805460ff1916905582161580159061111f5750836001600160a01b0316826001600160a01b031614155b1561115d576001600160a01b03821660009081526004602090815260408083206001600160e01b0319871684529091529020805460ff191660011790555b6001600160a01b0384166000908152600160205260409020546111e45760008054600180820183557f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563909101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03881690811790915582549083526020919091526040909120555b5050505050565b60006111f5611865565b546001600160a01b0316905090565b600061120e61186f565b6000928352602090815260408084206001600160a01b0395909516845293905250205460ff1690565b6060806000805b6000548110156112cc57600080828154811061126a57634e487b7160e01b600052603260045260246000fd5b60009182526020822001546001600160a01b031691506112898261151f565b905060005b81518110156112b6576112a2600186612508565b9450806112ae8161255b565b91505061128e565b50505080806112c49061255b565b91505061123e565b5060008167ffffffffffffffff8111156112f657634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561132957816020015b60608152602001906001900390816113145790505b50905060008267ffffffffffffffff81111561135557634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561137e578160200160208202803683370190505b5090506000805b60005481101561149f5760008082815481106113b157634e487b7160e01b600052603260045260246000fd5b60009182526020822001546001600160a01b031691506113d08261151f565b905060005b8151811015611489578181815181106113fe57634e487b7160e01b600052603260045260246000fd5b602002602001015187868151811061142657634e487b7160e01b600052603260045260246000fd5b60200260200101819052508286868151811061145257634e487b7160e01b600052603260045260246000fd5b6001600160a01b0390921660209283029190910190910152611475600186612508565b9450806114818161255b565b9150506113d5565b50505080806114979061255b565b915050611385565b50919450925050509091565b60006114b682611968565b6001600160e01b031981166000908152600260205260409020549091506001600160a01b03168015610408576001600160a01b03811660009081526004602090815260408083206001600160e01b0319861684529091529020805460ff19166001179055505050565b60606000805b6001600160a01b038416600090815260036020526040902054811015611678576001600160a01b038416600090815260036020526040812080548390811061157d57634e487b7160e01b600052603260045260246000fd5b90600052602060002001805461159290612520565b80601f01602080910402602001604051908101604052809291908181526020018280546115be90612520565b801561160b5780601f106115e05761010080835404028352916020019161160b565b820191906000526020600020905b8154815290600101906020018083116115ee57829003601f168201915b50505050509050600061161d82611968565b6001600160a01b03871660009081526004602090815260408083206001600160e01b03198516845290915290205490915060ff1661166357611660600185612508565b93505b505080806116709061255b565b915050611525565b5060008167ffffffffffffffff8111156116a257634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156116d557816020015b60608152602001906001900390816116c05790505b5090506000805b6001600160a01b03861660009081526003602052604090205481101561185b576001600160a01b038616600090815260036020526040812080548390811061173457634e487b7160e01b600052603260045260246000fd5b90600052602060002001805461174990612520565b80601f016020809104026020016040519081016040528092919081815260200182805461177590612520565b80156117c25780601f10611797576101008083540402835291602001916117c2565b820191906000526020600020905b8154815290600101906020018083116117a557829003601f168201915b5050505050905060006117d482611968565b6001600160a01b03891660009081526004602090815260408083206001600160e01b03198516845290915290205490915060ff16611846578185858151811061182d57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152611843600185612508565b93505b505080806118539061255b565b9150506116dc565b5090949350505050565b600061064a610bac565b600061064a610bd0565b6000611883611865565b546001600160a01b031614156118ab5760405162461bcd60e51b8152600401610351906121d1565b6118b3611865565b546040517ff04907690000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063f0490769906118fc9033908590600401612120565b600060405180830381600087803b15801561191657600080fd5b505af11580156111e4573d6000803e3d6000fd5b61193261186f565b600082815260209182526040808220338352909252205460ff166109835760405162461bcd60e51b81526004016103519061223f565b600081815b8151811015611c8857600082828151811061199857634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191690507f30000000000000000000000000000000000000000000000000000000000000008110801590611a0357507f39000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821611155b158015611a7157507f41000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821610801590611a6f57507f5a000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821611155b155b8015611ade57507f61000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821610801590611adc57507f7a000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821611155b155b8015611b1457507f24000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821614155b8015611b4a57507f5f000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821614155b8015611b8057507f2c000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821614155b8015611bb657507f28000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821614155b8015611bec57507f29000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821614155b8015611c2257507f5b000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821614155b8015611c5857507f5d000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821614155b15611c755760405162461bcd60e51b8152600401610351906122ad565b5080611c808161255b565b91505061196d565b5050815160208301209050919050565b828054611ca490612520565b90600052602060002090601f016020900481019282611cc65760008555611d0c565b82601f10611cdf57805160ff1916838001178555611d0c565b82800160010185558215611d0c579182015b82811115611d0c578251825591602001919060010190611cf1565b50611d18929150611d1c565b5090565b5b80821115611d185760008155600101611d1d565b80356001600160a01b03811681146103ab57600080fd5b600082601f830112611d58578081fd5b81356020611d6d611d68836124e4565b6124b3565b82815281810190858301855b85811015611da257611d90898684358b0101611dc7565b84529284019290840190600101611d79565b5090979650505050505050565b80356001600160e01b0319811681146103ab57600080fd5b600082601f830112611dd7578081fd5b813567ffffffffffffffff811115611df157611df16125aa565b611e046020601f19601f840116016124b3565b818152846020838601011115611e18578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215611e43578081fd5b6105d382611d31565b60008060408385031215611e5e578081fd5b611e6783611d31565b946020939093013593505050565b600060208284031215611e86578081fd5b813567ffffffffffffffff811115611e9c578182fd5b611ea884828501611d48565b949350505050565b60008060408385031215611ec2578182fd5b823567ffffffffffffffff80821115611ed9578384fd5b611ee586838701611d48565b9350602091508185013581811115611efb578384fd5b85019050601f81018613611f0d578283fd5b8035611f1b611d68826124e4565b81815283810190838501858402850186018a1015611f37578687fd5b8694505b83851015611f6057611f4c81611d31565b835260019490940193918501918501611f3b565b5080955050505050509250929050565b600060208284031215611f81578081fd5b81516105d3816125c0565b600060208284031215611f9d578081fd5b6105d382611daf565b60008060408385031215611fb8578182fd5b611fc183611daf565b91506020830135611fd1816125c0565b809150509250929050565b600060208284031215611fed578081fd5b813567ffffffffffffffff811115612003578182fd5b611ea884828501611dc7565b60008060408385031215612021578182fd5b8235915061203160208401611d31565b90509250929050565b60008060006060848603121561204e578081fd5b8335925061205e60208501611d31565b9150604084013590509250925092565b6000815180845260208085018081965082840281019150828601855b858110156120b45782840389526120a28483516120c1565b9885019893509084019060010161208a565b5091979650505050505050565b60008151808452815b818110156120e6576020818501810151868301820152016120ca565b818111156120f75782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6000602082526105d3602083018461206e565b60006040825261215f604083018561206e565b828103602084810191909152845180835285820192820190845b81811015611da25784516001600160a01b031683529383019391830191600101612179565b901515815260200190565b6001600160e01b031991909116815260200190565b6000602082526105d360208301846120c1565b60208082526006908201527f54453a4e544d0000000000000000000000000000000000000000000000000000604082015260600190565b60208082526005908201527f54453a4943000000000000000000000000000000000000000000000000000000604082015260600190565b60208082526005908201527f524d3a4d52000000000000000000000000000000000000000000000000000000604082015260600190565b60208082526006908201527f4456313a49460000000000000000000000000000000000000000000000000000604082015260600190565b60208082526007908201527f4456313a49465300000000000000000000000000000000000000000000000000604082015260600190565b60208082526007908201527f4456313a464e4600000000000000000000000000000000000000000000000000604082015260600190565b60208082526008908201527f4456313a4e45514c000000000000000000000000000000000000000000000000604082015260600190565b60208082526007908201527f524d3a444e485200000000000000000000000000000000000000000000000000604082015260600190565b60208082526006908201527f4456313a46520000000000000000000000000000000000000000000000000000604082015260600190565b60208082526006908201527f4456313a5a460000000000000000000000000000000000000000000000000000604082015260600190565b60208082526006908201527f524d3a4148520000000000000000000000000000000000000000000000000000604082015260600190565b60208082526006908201527f4456313a5a4c0000000000000000000000000000000000000000000000000000604082015260600190565b60208082526005908201527f54453a5a41000000000000000000000000000000000000000000000000000000604082015260600190565b9182526001600160a01b0316602082015260400190565b604051601f8201601f1916810167ffffffffffffffff811182821017156124dc576124dc6125aa565b604052919050565b600067ffffffffffffffff8211156124fe576124fe6125aa565b5060209081020190565b6000821982111561251b5761251b612594565b500190565b60028104600182168061253457607f821691505b6020821081141561255557634e487b7160e01b600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561258d5761258d612594565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461098357600080fdfea2646970667358221220ccd78fb4769ff687bb1f1e8bd628e9a4cbad29b985d00f643c03643020d9cc7f64736f6c634300080100330000000000000000000000006790cb9f31901a2af8de860918b684c245efabf000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000001768747470733a2f2f6f72736574746f67616e672e636f6d0000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000442f94efbddcfb4d7df4d8e3b03b2bd4ec42a0d0000000000000000000000000ed337a1599e63ea9c0a042a674a021fe90c4791a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000442f94efbddcfb4d7df4d8e3b03b2bd4ec42a0d0000000000000000000000000ed337a1599e63ea9c0a042a674a021fe90c4791a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000442f94efbddcfb4d7df4d8e3b03b2bd4ec42a0d0000000000000000000000000ed337a1599e63ea9c0a042a674a021fe90c4791a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000442f94efbddcfb4d7df4d8e3b03b2bd4ec42a0d0000000000000000000000000ed337a1599e63ea9c0a042a674a021fe90c4791a

Deployed Bytecode

0x6080604052600436106100e15760003560e01c8063884a8f001161007f578063abc2876211610059578063abc2876214610284578063efc5f532146102a4578063fb2153c2146102d1578063fdf7c916146102f1576100e8565b8063884a8f00146102225780639553f75c14610244578063a48929d114610264576100e8565b80633c47b163116100bb5780633c47b1631461019d5780635c97f4a2146101bd57806367788084146101dd57806374e3d94914610200576100e8565b806301ffc9a7146101255780632856481c1461015b578063378b4b001461017d576100e8565b366100e857005b60006100ff6000356001600160e01b031916610311565b90503660008037600080366000845af43d6000803e808015610120573d6000f35b3d6000fd5b34801561013157600080fd5b50610145610140366004611f8c565b6103b0565b604051610152919061219e565b60405180910390f35b34801561016757600080fd5b5061017b61017636600461203a565b6103f5565b005b34801561018957600080fd5b5061017b610198366004611eb0565b61040d565b3480156101a957600080fd5b5061017b6101b836600461200f565b610525565b3480156101c957600080fd5b506101456101d8366004611e4c565b6105c7565b3480156101e957600080fd5b506101f26105da565b60405161015292919061214c565b34801561020c57600080fd5b50610215610640565b604051610152919061210c565b34801561022e57600080fd5b5061023761064f565b60405161015291906121be565b34801561025057600080fd5b5061014561025f366004611f8c565b6106e1565b34801561027057600080fd5b5061017b61027f366004611fdc565b610756565b34801561029057600080fd5b5061017b61029f366004611e75565b6107cb565b3480156102b057600080fd5b506102c46102bf366004611e32565b610893565b6040516101529190612139565b3480156102dd57600080fd5b5061017b6102ec366004611fa6565b6108f1565b3480156102fd57600080fd5b5061017b61030c36600461203a565b610970565b6001600160e01b031981166000908152600260205260408120546001600160a01b03168061035a5760405162461bcd60e51b8152600401610351906122e4565b60405180910390fd5b6001600160a01b03811660009081526004602090815260408083206001600160e01b03198716845290915290205460ff16156103a85760405162461bcd60e51b815260040161035190612389565b90505b919050565b60006001600160e01b031982167f80ac58cd0000000000000000000000000000000000000000000000000000000014156103ec575060016103ab565b6103a882610bf4565b6103ff8282610d62565b61040883610e14565b505050565b6040805180820190915260128152712927a622afa224a0a6a7a7222fa0a226a4a760711b6020909101526104607f7d41cc998da5115908d5f060569efddde4c3bacf9b9002b4a70c2c7764f673f5610e1d565b60008251116104815760405162461bcd60e51b81526004016103519061242e565b80518251146104a25760405162461bcd60e51b81526004016103519061231b565b60005b82518110156104085760008382815181106104d057634e487b7160e01b600052603260045260246000fd5b6020026020010151905060008383815181106104fc57634e487b7160e01b600052603260045260246000fd5b602002602001015190506105108282610e26565b5050808061051d9061255b565b9150506104a5565b600061052f6111eb565b905061053a82610990565b6001600160a01b03811615610408576040517f6a83f1090000000000000000000000000000000000000000000000000000000081526001600160a01b03821690636a83f109906105909033908790600401612120565b600060405180830381600087803b1580156105aa57600080fd5b505af11580156105be573d6000803e3d6000fd5b50505050505050565b60006105d38383611204565b9392505050565b6040805180820190915260128152712927a622afa224a0a6a7a7222fa0a226a4a760711b6020909101526060806106307f7d41cc998da5115908d5f060569efddde4c3bacf9b9002b4a70c2c7764f673f5610e1d565b610638611237565b915091509091565b600061064a6111eb565b905090565b60606006805461065e90612520565b80601f016020809104026020016040519081016040528092919081815260200182805461068a90612520565b80156106d75780601f106106ac576101008083540402835291602001916106d7565b820191906000526020600020905b8154815290600101906020018083116106ba57829003601f168201915b5050505050905090565b6040805180820190915260128152712927a622afa224a0a6a7a7222fa0a226a4a760711b60209091015260006107367f7d41cc998da5115908d5f060569efddde4c3bacf9b9002b4a70c2c7764f673f5610e1d565b506001600160e01b03191660009081526005602052604090205460ff1690565b60408051808201909152600a81527f524f4c455f41444d494e000000000000000000000000000000000000000000006020909101526107b47f2172861495e7b85edac73e3cd5fbb42dd675baadf627720e687bcfdaca025096610e1d565b80516107c7906006906020840190611c98565b5050565b6040805180820190915260128152712927a622afa224a0a6a7a7222fa0a226a4a760711b60209091015261081e7f7d41cc998da5115908d5f060569efddde4c3bacf9b9002b4a70c2c7764f673f5610e1d565b600081511161083f5760405162461bcd60e51b81526004016103519061242e565b60005b81518110156107c757600082828151811061086d57634e487b7160e01b600052603260045260246000fd5b60200260200101519050610880816114ab565b508061088b8161255b565b915050610842565b6040805180820190915260128152712927a622afa224a0a6a7a7222fa0a226a4a760711b60209091015260606108e87f7d41cc998da5115908d5f060569efddde4c3bacf9b9002b4a70c2c7764f673f5610e1d565b6103a88261151f565b6040805180820190915260128152712927a622afa224a0a6a7a7222fa0a226a4a760711b6020909101526109447f7d41cc998da5115908d5f060569efddde4c3bacf9b9002b4a70c2c7764f673f5610e1d565b6001600160e01b0319919091166000908152600560205260409020805460ff1916911515919091179055565b6103ff8282610aed565b61098381610990565b50565b6107c78282610aed565b6001600160a01b0381166109b65760405162461bcd60e51b815260040161035190612465565b6040516301ffc9a760e01b81526001600160a01b038216906301ffc9a790610a02907f9acaf66000000000000000000000000000000000000000000000000000000000906004016121a9565b60206040518083038186803b158015610a1a57600080fd5b505afa158015610a2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a529190611f70565b610a6e5760405162461bcd60e51b815260040161035190612208565b80610a77611865565b805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790557fd9944277d62f69cc63c9bc5bd2158fef907119ed7f90fd406f1cdfada1097d50610acb611865565b54604051610ae2916001600160a01b03169061210c565b60405180910390a150565b610af561186f565b6000828152602091825260408082206001600160a01b0386168352909252205460ff1615610b355760405162461bcd60e51b8152600401610351906123f7565b6001610b3f61186f565b6000838152602091825260408082206001600160a01b0387168352909252819020805460ff191692151592909217909155517ffcb6b45ef5424ef7d19598014fef2f5f5af10c504287d60504ca515e17a472dc90610ba0908390859061249c565b60405180910390a15050565b7fde1b6f91cd9572e4381a8b8d203bdc268664230f56599f11d2ca9df8d397fb6f90565b7fd6cfccebecf684bbc10a5019ad1aed91fbc4f7461f5cd03e8c71240be4ca6bea90565b60006001600160e01b031982167f0c71a78b000000000000000000000000000000000000000000000000000000001415610c30575060006103ab565b6001600160e01b0319821660009081526005602052604090205460ff1615610c5a575060006103ab565b6001600160e01b031982166301ffc9a760e01b1415610c7b575060016103ab565b60005b600054811015610d59576000808281548110610caa57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546040516301ffc9a760e01b81526001600160a01b03909116915081906301ffc9a790610ce69087906004016121a9565b60206040518083038186803b158015610cfe57600080fd5b505afa158015610d12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d369190611f70565b15610d46576001925050506103ab565b5080610d518161255b565b915050610c7e565b50600092915050565b610d6a61186f565b6000828152602091825260408082206001600160a01b0386168352909252205460ff16610da95760405162461bcd60e51b815260040161035190612352565b6000610db361186f565b6000838152602091825260408082206001600160a01b0387168352909252819020805460ff191692151592909217909155517f3992d8cf6249af1b2bb6e542550b9bf348992deec040c06d2ed5c46de50eef7f90610ba0908390859061249c565b61098381611879565b6109838161192a565b6001600160a01b038116610e4c5760405162461bcd60e51b8152600401610351906123c0565b6040516301ffc9a760e01b81526001600160a01b038216906301ffc9a790610e98907f0c71a78b00000000000000000000000000000000000000000000000000000000906004016121a9565b60206040518083038186803b158015610eb057600080fd5b505afa158015610ec4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee89190611f70565b610f045760405162461bcd60e51b815260040161035190612276565b6000610f0f83611968565b6001600160e01b03198116600090815260026020526040812080546001600160a01b0386811673ffffffffffffffffffffffffffffffffffffffff1983161790925592935090911690805b6001600160a01b038516600090815260036020526040902054811015611083576001600160a01b0385166000908152600360205260408120805461104f919084908110610fb757634e487b7160e01b600052603260045260246000fd5b906000526020600020018054610fcc90612520565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff890612520565b80156110455780601f1061101a57610100808354040283529160200191611045565b820191906000526020600020905b81548152906001019060200180831161102857829003601f168201915b5050505050611968565b6001600160e01b031990811691508516811415611070576001925050611083565b508061107b8161255b565b915050610f5a565b50806110c7576001600160a01b0384166000908152600360209081526040822080546001810182559083529181902087516110c5939190910191880190611c98565b505b6001600160a01b0380851660009081526004602090815260408083206001600160e01b0319881684529091529020805460ff1916905582161580159061111f5750836001600160a01b0316826001600160a01b031614155b1561115d576001600160a01b03821660009081526004602090815260408083206001600160e01b0319871684529091529020805460ff191660011790555b6001600160a01b0384166000908152600160205260409020546111e45760008054600180820183557f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563909101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03881690811790915582549083526020919091526040909120555b5050505050565b60006111f5611865565b546001600160a01b0316905090565b600061120e61186f565b6000928352602090815260408084206001600160a01b0395909516845293905250205460ff1690565b6060806000805b6000548110156112cc57600080828154811061126a57634e487b7160e01b600052603260045260246000fd5b60009182526020822001546001600160a01b031691506112898261151f565b905060005b81518110156112b6576112a2600186612508565b9450806112ae8161255b565b91505061128e565b50505080806112c49061255b565b91505061123e565b5060008167ffffffffffffffff8111156112f657634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561132957816020015b60608152602001906001900390816113145790505b50905060008267ffffffffffffffff81111561135557634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561137e578160200160208202803683370190505b5090506000805b60005481101561149f5760008082815481106113b157634e487b7160e01b600052603260045260246000fd5b60009182526020822001546001600160a01b031691506113d08261151f565b905060005b8151811015611489578181815181106113fe57634e487b7160e01b600052603260045260246000fd5b602002602001015187868151811061142657634e487b7160e01b600052603260045260246000fd5b60200260200101819052508286868151811061145257634e487b7160e01b600052603260045260246000fd5b6001600160a01b0390921660209283029190910190910152611475600186612508565b9450806114818161255b565b9150506113d5565b50505080806114979061255b565b915050611385565b50919450925050509091565b60006114b682611968565b6001600160e01b031981166000908152600260205260409020549091506001600160a01b03168015610408576001600160a01b03811660009081526004602090815260408083206001600160e01b0319861684529091529020805460ff19166001179055505050565b60606000805b6001600160a01b038416600090815260036020526040902054811015611678576001600160a01b038416600090815260036020526040812080548390811061157d57634e487b7160e01b600052603260045260246000fd5b90600052602060002001805461159290612520565b80601f01602080910402602001604051908101604052809291908181526020018280546115be90612520565b801561160b5780601f106115e05761010080835404028352916020019161160b565b820191906000526020600020905b8154815290600101906020018083116115ee57829003601f168201915b50505050509050600061161d82611968565b6001600160a01b03871660009081526004602090815260408083206001600160e01b03198516845290915290205490915060ff1661166357611660600185612508565b93505b505080806116709061255b565b915050611525565b5060008167ffffffffffffffff8111156116a257634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156116d557816020015b60608152602001906001900390816116c05790505b5090506000805b6001600160a01b03861660009081526003602052604090205481101561185b576001600160a01b038616600090815260036020526040812080548390811061173457634e487b7160e01b600052603260045260246000fd5b90600052602060002001805461174990612520565b80601f016020809104026020016040519081016040528092919081815260200182805461177590612520565b80156117c25780601f10611797576101008083540402835291602001916117c2565b820191906000526020600020905b8154815290600101906020018083116117a557829003601f168201915b5050505050905060006117d482611968565b6001600160a01b03891660009081526004602090815260408083206001600160e01b03198516845290915290205490915060ff16611846578185858151811061182d57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152611843600185612508565b93505b505080806118539061255b565b9150506116dc565b5090949350505050565b600061064a610bac565b600061064a610bd0565b6000611883611865565b546001600160a01b031614156118ab5760405162461bcd60e51b8152600401610351906121d1565b6118b3611865565b546040517ff04907690000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063f0490769906118fc9033908590600401612120565b600060405180830381600087803b15801561191657600080fd5b505af11580156111e4573d6000803e3d6000fd5b61193261186f565b600082815260209182526040808220338352909252205460ff166109835760405162461bcd60e51b81526004016103519061223f565b600081815b8151811015611c8857600082828151811061199857634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191690507f30000000000000000000000000000000000000000000000000000000000000008110801590611a0357507f39000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821611155b158015611a7157507f41000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821610801590611a6f57507f5a000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821611155b155b8015611ade57507f61000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821610801590611adc57507f7a000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821611155b155b8015611b1457507f24000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821614155b8015611b4a57507f5f000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821614155b8015611b8057507f2c000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821614155b8015611bb657507f28000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821614155b8015611bec57507f29000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821614155b8015611c2257507f5b000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821614155b8015611c5857507f5d000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821614155b15611c755760405162461bcd60e51b8152600401610351906122ad565b5080611c808161255b565b91505061196d565b5050815160208301209050919050565b828054611ca490612520565b90600052602060002090601f016020900481019282611cc65760008555611d0c565b82601f10611cdf57805160ff1916838001178555611d0c565b82800160010185558215611d0c579182015b82811115611d0c578251825591602001919060010190611cf1565b50611d18929150611d1c565b5090565b5b80821115611d185760008155600101611d1d565b80356001600160a01b03811681146103ab57600080fd5b600082601f830112611d58578081fd5b81356020611d6d611d68836124e4565b6124b3565b82815281810190858301855b85811015611da257611d90898684358b0101611dc7565b84529284019290840190600101611d79565b5090979650505050505050565b80356001600160e01b0319811681146103ab57600080fd5b600082601f830112611dd7578081fd5b813567ffffffffffffffff811115611df157611df16125aa565b611e046020601f19601f840116016124b3565b818152846020838601011115611e18578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215611e43578081fd5b6105d382611d31565b60008060408385031215611e5e578081fd5b611e6783611d31565b946020939093013593505050565b600060208284031215611e86578081fd5b813567ffffffffffffffff811115611e9c578182fd5b611ea884828501611d48565b949350505050565b60008060408385031215611ec2578182fd5b823567ffffffffffffffff80821115611ed9578384fd5b611ee586838701611d48565b9350602091508185013581811115611efb578384fd5b85019050601f81018613611f0d578283fd5b8035611f1b611d68826124e4565b81815283810190838501858402850186018a1015611f37578687fd5b8694505b83851015611f6057611f4c81611d31565b835260019490940193918501918501611f3b565b5080955050505050509250929050565b600060208284031215611f81578081fd5b81516105d3816125c0565b600060208284031215611f9d578081fd5b6105d382611daf565b60008060408385031215611fb8578182fd5b611fc183611daf565b91506020830135611fd1816125c0565b809150509250929050565b600060208284031215611fed578081fd5b813567ffffffffffffffff811115612003578182fd5b611ea884828501611dc7565b60008060408385031215612021578182fd5b8235915061203160208401611d31565b90509250929050565b60008060006060848603121561204e578081fd5b8335925061205e60208501611d31565b9150604084013590509250925092565b6000815180845260208085018081965082840281019150828601855b858110156120b45782840389526120a28483516120c1565b9885019893509084019060010161208a565b5091979650505050505050565b60008151808452815b818110156120e6576020818501810151868301820152016120ca565b818111156120f75782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6000602082526105d3602083018461206e565b60006040825261215f604083018561206e565b828103602084810191909152845180835285820192820190845b81811015611da25784516001600160a01b031683529383019391830191600101612179565b901515815260200190565b6001600160e01b031991909116815260200190565b6000602082526105d360208301846120c1565b60208082526006908201527f54453a4e544d0000000000000000000000000000000000000000000000000000604082015260600190565b60208082526005908201527f54453a4943000000000000000000000000000000000000000000000000000000604082015260600190565b60208082526005908201527f524d3a4d52000000000000000000000000000000000000000000000000000000604082015260600190565b60208082526006908201527f4456313a49460000000000000000000000000000000000000000000000000000604082015260600190565b60208082526007908201527f4456313a49465300000000000000000000000000000000000000000000000000604082015260600190565b60208082526007908201527f4456313a464e4600000000000000000000000000000000000000000000000000604082015260600190565b60208082526008908201527f4456313a4e45514c000000000000000000000000000000000000000000000000604082015260600190565b60208082526007908201527f524d3a444e485200000000000000000000000000000000000000000000000000604082015260600190565b60208082526006908201527f4456313a46520000000000000000000000000000000000000000000000000000604082015260600190565b60208082526006908201527f4456313a5a460000000000000000000000000000000000000000000000000000604082015260600190565b60208082526006908201527f524d3a4148520000000000000000000000000000000000000000000000000000604082015260600190565b60208082526006908201527f4456313a5a4c0000000000000000000000000000000000000000000000000000604082015260600190565b60208082526005908201527f54453a5a41000000000000000000000000000000000000000000000000000000604082015260600190565b9182526001600160a01b0316602082015260400190565b604051601f8201601f1916810167ffffffffffffffff811182821017156124dc576124dc6125aa565b604052919050565b600067ffffffffffffffff8211156124fe576124fe6125aa565b5060209081020190565b6000821982111561251b5761251b612594565b500190565b60028104600182168061253457607f821691505b6020821081141561255557634e487b7160e01b600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561258d5761258d612594565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461098357600080fdfea2646970667358221220ccd78fb4769ff687bb1f1e8bd628e9a4cbad29b985d00f643c03643020d9cc7f64736f6c63430008010033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000006790cb9f31901a2af8de860918b684c245efabf000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000001768747470733a2f2f6f72736574746f67616e672e636f6d0000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000442f94efbddcfb4d7df4d8e3b03b2bd4ec42a0d0000000000000000000000000ed337a1599e63ea9c0a042a674a021fe90c4791a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000442f94efbddcfb4d7df4d8e3b03b2bd4ec42a0d0000000000000000000000000ed337a1599e63ea9c0a042a674a021fe90c4791a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000442f94efbddcfb4d7df4d8e3b03b2bd4ec42a0d0000000000000000000000000ed337a1599e63ea9c0a042a674a021fe90c4791a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000442f94efbddcfb4d7df4d8e3b03b2bd4ec42a0d0000000000000000000000000ed337a1599e63ea9c0a042a674a021fe90c4791a

-----Decoded View---------------
Arg [0] : taskManager (address): 0x6790cb9f31901a2Af8de860918b684c245EfAbf0
Arg [1] : detailsURI (string): https://orsettogang.com
Arg [2] : admins (address[]): 0x442F94EfBDDcFb4d7dF4d8E3B03B2bD4eC42A0d0,0xEd337A1599E63eA9C0A042A674a021fE90c4791a
Arg [3] : tokenManagers (address[]): 0x442F94EfBDDcFb4d7dF4d8E3B03B2bD4eC42A0d0,0xEd337A1599E63eA9C0A042A674a021fE90c4791a
Arg [4] : vaultAdmins (address[]): 0x442F94EfBDDcFb4d7dF4d8E3B03B2bD4eC42A0d0,0xEd337A1599E63eA9C0A042A674a021fE90c4791a
Arg [5] : diamondAdmins (address[]): 0x442F94EfBDDcFb4d7dF4d8E3B03B2bD4eC42A0d0,0xEd337A1599E63eA9C0A042A674a021fE90c4791a

-----Encoded View---------------
20 Constructor Arguments found :
Arg [0] : 0000000000000000000000006790cb9f31901a2af8de860918b684c245efabf0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000220
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [7] : 68747470733a2f2f6f72736574746f67616e672e636f6d000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [9] : 000000000000000000000000442f94efbddcfb4d7df4d8e3b03b2bd4ec42a0d0
Arg [10] : 000000000000000000000000ed337a1599e63ea9c0a042a674a021fe90c4791a
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [12] : 000000000000000000000000442f94efbddcfb4d7df4d8e3b03b2bd4ec42a0d0
Arg [13] : 000000000000000000000000ed337a1599e63ea9c0a042a674a021fe90c4791a
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [15] : 000000000000000000000000442f94efbddcfb4d7df4d8e3b03b2bd4ec42a0d0
Arg [16] : 000000000000000000000000ed337a1599e63ea9c0a042a674a021fe90c4791a
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [18] : 000000000000000000000000442f94efbddcfb4d7df4d8e3b03b2bd4ec42a0d0
Arg [19] : 000000000000000000000000ed337a1599e63ea9c0a042a674a021fe90c4791a


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.