More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,505 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Create Task | 21445839 | 7 days ago | IN | 0 ETH | 0.00161491 | ||||
Approve Task | 21421467 | 10 days ago | IN | 0 ETH | 0.00069716 | ||||
Approve Task | 21421274 | 10 days ago | IN | 0 ETH | 0.00071877 | ||||
Create Task | 21421270 | 10 days ago | IN | 0 ETH | 0.00084037 | ||||
Approve Task | 21393090 | 14 days ago | IN | 0 ETH | 0.00106078 | ||||
Approve Task | 21393065 | 14 days ago | IN | 0 ETH | 0.00095791 | ||||
Create Task | 21393057 | 14 days ago | IN | 0 ETH | 0.00105878 | ||||
Approve Task | 21374654 | 17 days ago | IN | 0 ETH | 0.00118168 | ||||
Approve Task | 21374651 | 17 days ago | IN | 0 ETH | 0.00167206 | ||||
Create Task | 21374644 | 17 days ago | IN | 0 ETH | 0.00164148 | ||||
Approve Task | 21293450 | 28 days ago | IN | 0 ETH | 0.00055342 | ||||
Approve Task | 21293447 | 28 days ago | IN | 0 ETH | 0.00068056 | ||||
Create Task | 21293438 | 28 days ago | IN | 0 ETH | 0.00075874 | ||||
Approve Task | 21272325 | 31 days ago | IN | 0 ETH | 0.00097234 | ||||
Approve Task | 21272313 | 31 days ago | IN | 0 ETH | 0.0013064 | ||||
Create Task | 21272279 | 31 days ago | IN | 0 ETH | 0.00133382 | ||||
Approve Task | 21264623 | 32 days ago | IN | 0 ETH | 0.00074671 | ||||
Approve Task | 21264620 | 32 days ago | IN | 0 ETH | 0.00098843 | ||||
Create Task | 21264265 | 32 days ago | IN | 0 ETH | 0.00123135 | ||||
Approve Task | 21242778 | 35 days ago | IN | 0 ETH | 0.00069361 | ||||
Approve Task | 21242768 | 35 days ago | IN | 0 ETH | 0.00090061 | ||||
Create Task | 21242732 | 35 days ago | IN | 0 ETH | 0.00098036 | ||||
Approve Task | 21230123 | 37 days ago | IN | 0 ETH | 0.00126433 | ||||
Approve Task | 21230048 | 37 days ago | IN | 0 ETH | 0.00149785 | ||||
Create Task | 21230025 | 37 days ago | IN | 0 ETH | 0.00170657 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
QlindoTaskManager
Compiler Version
v0.8.1+commit.df193b15
Optimization Enabled:
Yes with 2000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
/* * 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 "./arteq-tech/contracts/TaskManager.sol"; /// @notice Use at your own risk contract QlindoTaskManager is TaskManager { constructor( address[] memory initialAdmins, address[] memory initialCreators, address[] memory initialApprovers, address[] memory initialExecutors, bool enableDeposit ) TaskManager( initialAdmins, initialCreators, initialApprovers, initialExecutors, enableDeposit ) {} }
/* * 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/IERC20.sol"; import "@openzeppelin/contracts/interfaces/IERC721.sol"; import "@openzeppelin/contracts/interfaces/IERC1155.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import "./interfaces/ITaskExecutor.sol"; import "./abstract/task-manager/AdminTaskManaged.sol"; import "./abstract/task-manager/CreatorRoleEnabled.sol"; import "./abstract/task-manager/ApproverRoleEnabled.sol"; import "./abstract/task-manager/ExecutorRoleEnabled.sol"; import "./abstract/task-manager/FinalizerRoleEnabled.sol"; import "./abstract/task-manager/ETHVaultEnabled.sol"; import "./abstract/task-manager/ERC20VaultEnabled.sol"; import "./abstract/task-manager/ERC721VaultEnabled.sol"; import "./abstract/task-manager/ERC1155VaultEnabled.sol"; /// @author Kam Amini <[email protected]> /// /// @notice Use at your own risk contract TaskManager is ITaskExecutor, AdminTaskManaged, CreatorRoleEnabled, ApproverRoleEnabled, ExecutorRoleEnabled, FinalizerRoleEnabled, ETHVaultEnabled, ERC20VaultEnabled, ERC721VaultEnabled, ERC1155VaultEnabled, ERC165 { modifier onlyPrivileged() { require( _isAdmin(msg.sender) || _isCreator(msg.sender) || _isApprover(msg.sender) || _isExecutor(msg.sender), "TaskManager: not a privileged account" ); _; } constructor( address[] memory initialAdmins, address[] memory initialCreators, address[] memory initialApprovers, address[] memory initialExecutors, bool enableDeposit ) { require(initialAdmins.length >= MIN_NR_OF_ADMINS, "TaskManager: not enough initial admins"); for (uint i = 0; i < initialAdmins.length; i++) { _addAdmin(initialAdmins[i]); } require(initialCreators.length >= 1, "TaskManager: not enough initial creators"); for (uint i = 0; i < initialCreators.length; i++) { _addCreator(initialCreators[i]); } require(initialApprovers.length >= 3, "TaskManager: not enough initial approvers"); for (uint i = 0; i < initialApprovers.length; i++) { _addApprover(initialApprovers[i]); } require(initialExecutors.length >= 1, "TaskManager: not enough initial executors"); for (uint i = 0; i < initialExecutors.length; i++) { _addExecutor(initialExecutors[i]); } _setEnableDeposit(enableDeposit); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155Vault, ERC165) returns (bool) { return interfaceId == type(ITaskExecutor).interfaceId || interfaceId == type(IERC1155Receiver).interfaceId || interfaceId == type(IERC721Receiver).interfaceId; } function stats() external view onlyAdmin returns (uint, uint, uint, uint, uint) { return (_nrOfAdmins, _nrOfCreators, _nrOfApprovers, _nrOfExecutors, _nrOfFinalizers); } function isFinalized(uint256 taskId) external view onlyPrivileged taskMustExist(taskId) returns (bool) { if (_isTaskAdministrative(taskId)) { require(_isAdmin(msg.sender), "TaskManager: not an admin account"); } return _isTaskFinalized(taskId); } function getTaskURI(uint256 taskId) external view onlyPrivileged taskMustExist(taskId) returns (string memory) { if (_isTaskAdministrative(taskId)) { require(_isAdmin(msg.sender), "TaskManager: not an admin account"); } return _getTaskURI(taskId); } function getNrOfApprovals(uint256 taskId) external view onlyPrivileged taskMustExist(taskId) returns (uint) { if (_isTaskAdministrative(taskId)) { require(_isAdmin(msg.sender), "TaskManager: not an admin account"); } return _getTaskNrApprovals(taskId); } function createTask(string memory taskURI) external onlyCreator { _createTask(taskURI, false); } function finalizeTask(uint256 taskId, string memory reason) external onlyCreatorOrAdmin taskMustExist(taskId) taskMustNotBeAdministrative(taskId) taskMustNotBeFinalized(taskId) { _finalizeTask(taskId, reason); } function approveTask(uint256 taskId) external onlyApprover taskMustExist(taskId) taskMustNotBeAdministrative(taskId) taskMustNotBeFinalized(taskId) { _approveTask(msg.sender, taskId); } function withdrawTaskApproval(uint256 taskId) external onlyApprover taskMustExist(taskId) taskMustNotBeAdministrative(taskId) taskMustNotBeFinalized(taskId) { _withdrawTaskApproval(msg.sender, taskId); } function executeTask(address origin, uint256 taskId) external virtual override onlyFinalizer mustBeExecutor(origin) taskMustExist(taskId) taskMustNotBeAdministrative(taskId) taskMustBeApproved(taskId) taskMustNotBeFinalized(taskId) { _finalizeTask(taskId, ""); emit TaskExecuted(msg.sender, origin, taskId); } function executeAdminTask(address origin, uint256 taskId) external virtual override onlyFinalizer mustBeExecutor(origin) taskMustExist(taskId) taskMustBeAdministrative(taskId) taskMustBeApproved(taskId) taskMustNotBeFinalized(taskId) { _finalizeTask(taskId, ""); emit TaskExecuted(msg.sender, origin, taskId); } function _getRequiredNrApprovals(uint256 taskId) internal view virtual override(AdminTaskManaged, TaskManaged) returns (uint) { require(_taskExists(taskId), "TaskManager: task does not exist"); if (_isTaskAdministrative(taskId)) { return (1 + _nrOfAdmins / 2); } else { return (1 + _nrOfApprovers / 2); } } receive() external payable { require(_isDepositEnabled(), "TaskManager: cannot accept ether"); } fallback() external payable { revert("TaskManager: fallback always fails"); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol) pragma solidity ^0.8.0; import "../token/ERC20/IERC20.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol) pragma solidity ^0.8.0; import "../token/ERC721/IERC721.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC1155.sol) pragma solidity ^0.8.0; import "../token/ERC1155/IERC1155.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
/* * 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; }
/* * 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 "./AdminRoleEnabled.sol"; /// @author Kam Amini <[email protected]> /// /// @notice Use at your own risk abstract contract AdminTaskManaged is AdminRoleEnabled { function createAdminTask(string memory taskURI) external onlyAdmin { _createTask(taskURI, true); } function approveAdminTask(uint256 adminTaskId) external onlyAdmin taskMustExist(adminTaskId) taskMustBeAdministrative(adminTaskId) taskMustNotBeFinalized(adminTaskId) { _approveTask(msg.sender, adminTaskId); } function withdrawAdminTaskApproval(uint256 adminTaskId) external onlyAdmin taskMustExist(adminTaskId) taskMustBeAdministrative(adminTaskId) taskMustNotBeFinalized(adminTaskId) { _withdrawTaskApproval(msg.sender, adminTaskId); } function finalizeAdminTask(uint256 adminTaskId, string memory reason) external onlyAdmin taskMustExist(adminTaskId) taskMustBeAdministrative(adminTaskId) taskMustNotBeFinalized(adminTaskId) { _finalizeTask(adminTaskId, reason); } function _getRequiredNrApprovals(uint256 taskId) internal view virtual override (TaskManaged) returns (uint) { require(_taskExists(taskId), "AdminTaskManaged: task does not exist"); return (1 + _nrOfAdmins / 2); } }
/* * 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 "./AdminRoleEnabled.sol"; /// @author Kam Amini <[email protected]> /// /// @notice Use at your own risk abstract contract CreatorRoleEnabled is AdminRoleEnabled { mapping (address => bool) private _creators; uint internal _nrOfCreators; event CreatorAdded(address account); event CreatorRemoved(address account); modifier onlyCreator() { require(_isCreator(msg.sender), "CreatorRoleEnabled: not a creator account"); _; } modifier onlyCreatorOrAdmin() { require(_isCreator(msg.sender) || _isAdmin(msg.sender), "CreatorRoleEnabled: not a creator or admin account"); _; } constructor() { _nrOfCreators = 0; } function isCreator(address account) external view onlyAdmin returns (bool) { return _isCreator(account); } function addCreator(uint256 adminTaskId, address account) external onlyAdmin taskMustExist(adminTaskId) taskMustBeAdministrative(adminTaskId) taskMustNotBeFinalized(adminTaskId) taskMustBeApproved(adminTaskId) { _addCreator(account); _finalizeTask(adminTaskId, ""); } function removeCreator(uint256 adminTaskId, address account) external onlyAdmin taskMustExist(adminTaskId) taskMustBeAdministrative(adminTaskId) taskMustNotBeFinalized(adminTaskId) taskMustBeApproved(adminTaskId) { _removeCreator(account); _finalizeTask(adminTaskId, ""); } function _isCreator(address account) internal view returns (bool) { return _creators[account]; } function _addCreator(address account) internal { require(account != address(0), "CreatorRoleEnabled: zero account cannot be used"); require(!_creators[account], "CreatorRoleEnabled: already a creator account"); _creators[account] = true; _nrOfCreators += 1; emit CreatorAdded(account); } function _removeCreator(address account) internal { require(account != address(0), "CreatorRoleEnabled: zero account cannot be used"); require(_creators[account], "CreatorRoleEnabled: not a creator account"); _creators[account] = false; _nrOfCreators -= 1; emit CreatorRemoved(account); } }
/* * 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 "./AdminRoleEnabled.sol"; /// @author Kam Amini <[email protected]> /// /// @notice Use at your own risk abstract contract ApproverRoleEnabled is AdminRoleEnabled { mapping (address => bool) private _approvers; uint internal _nrOfApprovers; event ApproverAdded(address account); event ApproverRemoved(address account); modifier onlyApprover() { require(_isApprover(msg.sender), "ApproverRoleEnabled: not an approver account"); _; } constructor() { _nrOfApprovers = 0; } function isApprover(address account) external view onlyAdmin returns (bool) { return _isApprover(account); } function addApprover(uint256 adminTaskId, address account) external onlyAdmin taskMustExist(adminTaskId) taskMustBeAdministrative(adminTaskId) taskMustNotBeFinalized(adminTaskId) taskMustBeApproved(adminTaskId) { _addApprover(account); _finalizeTask(adminTaskId, ""); } function removeApprover(uint256 adminTaskId, address account) external onlyAdmin taskMustExist(adminTaskId) taskMustBeAdministrative(adminTaskId) taskMustNotBeFinalized(adminTaskId) taskMustBeApproved(adminTaskId) { _removeApprover(account); _finalizeTask(adminTaskId, ""); } function _isApprover(address account) internal view returns (bool) { return _approvers[account]; } function _addApprover(address account) internal { require(account != address(0), "ApproverRoleEnabled: zero account cannot be used"); require(!_approvers[account], "ApproverRoleEnabled: already an approver account"); _approvers[account] = true; _nrOfApprovers += 1; emit ApproverAdded(account); } function _removeApprover(address account) internal { require(account != address(0), "ApproverRoleEnabled: zero account cannot be used"); require(_approvers[account], "ApproverRoleEnabled: not an approver account"); _approvers[account] = false; _nrOfApprovers -= 1; emit ApproverRemoved(account); } }
/* * 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 "./AdminRoleEnabled.sol"; /// @author Kam Amini <[email protected]> /// /// @notice Use at your own risk abstract contract ExecutorRoleEnabled is AdminRoleEnabled { mapping (address => bool) private _executors; uint internal _nrOfExecutors; event ExecutorAdded(address account); event ExecutorRemoved(address account); modifier mustBeExecutor(address account) { require(_isExecutor(account), "ExecutorRoleEnabled: not an executor account"); _; } constructor() { _nrOfExecutors = 0; } function isExecutor(address account) external view onlyAdmin returns (bool) { return _isExecutor(account); } function addExecutor(uint256 adminTaskId, address account) external onlyAdmin taskMustExist(adminTaskId) taskMustBeAdministrative(adminTaskId) taskMustNotBeFinalized(adminTaskId) taskMustBeApproved(adminTaskId) { _addExecutor(account); _finalizeTask(adminTaskId, ""); } function removeExecutor(uint256 adminTaskId, address account) external onlyAdmin taskMustExist(adminTaskId) taskMustBeAdministrative(adminTaskId) taskMustNotBeFinalized(adminTaskId) taskMustBeApproved(adminTaskId) { _removeExecutor(account); _finalizeTask(adminTaskId, ""); } function _isExecutor(address account) internal view returns (bool) { return _executors[account]; } function _addExecutor(address account) internal { require(account != address(0), "ExecutorRoleEnabled: zero account cannot be used"); require(!_executors[account], "ExecutorRoleEnabled: already an executor account"); _executors[account] = true; _nrOfExecutors += 1; emit ExecutorAdded(account); } function _removeExecutor(address account) internal { require(account != address(0), "ExecutorRoleEnabled: zero account cannot be used"); require(_executors[account], "ExecutorRoleEnabled: not an executor account"); _executors[account] = false; _nrOfExecutors -= 1; emit ExecutorRemoved(account); } }
/* * 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 "./AdminRoleEnabled.sol"; /// @author Kam Amini <[email protected]> /// /// @notice Use at your own risk abstract contract FinalizerRoleEnabled is AdminRoleEnabled { mapping (address => bool) private _finalizers; uint internal _nrOfFinalizers; event FinalizerAdded(address account); event FinalizerRemoved(address account); modifier onlyFinalizer() { require(_isFinalizer(msg.sender), "FinalizerRoleEnabled: not a finalizer account"); _; } constructor() { _nrOfFinalizers = 0; } function isFinalizer(address account) external view onlyAdmin returns (bool) { return _isFinalizer(account); } function addFinalizer(uint256 adminTaskId, address account) external onlyAdmin taskMustExist(adminTaskId) taskMustBeAdministrative(adminTaskId) taskMustNotBeFinalized(adminTaskId) taskMustBeApproved(adminTaskId) { _addFinalizer(account); _finalizeTask(adminTaskId, ""); } function removeFinalizer(uint256 adminTaskId, address account) external onlyAdmin taskMustExist(adminTaskId) taskMustBeAdministrative(adminTaskId) taskMustNotBeFinalized(adminTaskId) taskMustBeApproved(adminTaskId) { _removeFinalizer(account); _finalizeTask(adminTaskId, ""); } function _isFinalizer(address account) internal view returns (bool) { return _finalizers[account]; } function _addFinalizer(address account) internal { require(account != address(0), "FinalizerRoleEnabled: zero account cannot be used"); require(!_finalizers[account], "FinalizerRoleEnabled: already a finalizer account"); _finalizers[account] = true; _nrOfFinalizers += 1; emit FinalizerAdded(account); } function _removeFinalizer(address account) internal { require(account != address(0), "FinalizerRoleEnabled: zero account cannot be used"); require(_finalizers[account], "FinalizerRoleEnabled: not a finalizer account"); _finalizers[account] = false; _nrOfFinalizers -= 1; emit FinalizerRemoved(account); } }
/* * 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 "../ETHVault.sol"; import "./AdminRoleEnabled.sol"; /// @author Kam Amini <[email protected]> /// /// @notice Use at your own risk abstract contract ETHVaultEnabled is AdminRoleEnabled, ETHVault { function isDepositEnabled() external view onlyAdmin returns (bool) { return _isDepositEnabled(); } function setEnableDeposit( uint256 adminTaskId, bool enableDeposit ) external onlyAdmin taskMustExist(adminTaskId) taskMustBeAdministrative(adminTaskId) taskMustNotBeFinalized(adminTaskId) taskMustBeApproved(adminTaskId) { require(_isDepositEnabled() != enableDeposit, "ETHVaultEnabled: cannot set the same value"); _setEnableDeposit(enableDeposit); _finalizeTask(adminTaskId, ""); } function ETHTransfer( uint256 adminTaskId, address to, uint256 amount ) external onlyAdmin taskMustExist(adminTaskId) taskMustBeAdministrative(adminTaskId) taskMustNotBeFinalized(adminTaskId) taskMustBeApproved(adminTaskId) { _ETHTransfer(to, amount); _finalizeTask(adminTaskId, ""); } }
/* * 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 "../ERC20Vault.sol"; import "./AdminRoleEnabled.sol"; /// @author Kam Amini <[email protected]> /// /// @notice Use at your own risk abstract contract ERC20VaultEnabled is AdminRoleEnabled, ERC20Vault { function ERC20Transfer( uint256 adminTaskId, address tokenContract, address to, uint256 amount ) external onlyAdmin taskMustExist(adminTaskId) taskMustBeAdministrative(adminTaskId) taskMustNotBeFinalized(adminTaskId) taskMustBeApproved(adminTaskId) { _ERC20Transfer(tokenContract, to, amount); _finalizeTask(adminTaskId, ""); } function ERC20Approve( uint256 adminTaskId, address tokenContract, address spender, uint256 amount ) external onlyAdmin taskMustExist(adminTaskId) taskMustBeAdministrative(adminTaskId) taskMustNotBeFinalized(adminTaskId) taskMustBeApproved(adminTaskId) { _ERC20Approve(tokenContract, spender, amount); _finalizeTask(adminTaskId, ""); } }
/* * 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 "../ERC721Vault.sol"; import "./AdminRoleEnabled.sol"; /// @author Kam Amini <[email protected]> /// /// @notice Use at your own risk abstract contract ERC721VaultEnabled is AdminRoleEnabled, ERC721Vault { function ERC721Transfer( uint256 adminTaskId, address tokenContract, address to, uint256 tokenId ) external onlyAdmin taskMustExist(adminTaskId) taskMustBeAdministrative(adminTaskId) taskMustNotBeFinalized(adminTaskId) taskMustBeApproved(adminTaskId) { _ERC721Transfer(tokenContract, to, tokenId); _finalizeTask(adminTaskId, ""); } function ERC721Approve( uint256 adminTaskId, address tokenContract, address operator, uint256 tokenId ) external onlyAdmin taskMustExist(adminTaskId) taskMustBeAdministrative(adminTaskId) taskMustNotBeFinalized(adminTaskId) taskMustBeApproved(adminTaskId) { _ERC721Approve(tokenContract, operator, tokenId); _finalizeTask(adminTaskId, ""); } function ERC721SetApprovalForAll( uint256 adminTaskId, address tokenContract, address operator, bool approved ) external onlyAdmin taskMustExist(adminTaskId) taskMustBeAdministrative(adminTaskId) taskMustNotBeFinalized(adminTaskId) taskMustBeApproved(adminTaskId) { _ERC721SetApprovalForAll(tokenContract, operator, approved); _finalizeTask(adminTaskId, ""); } }
/* * 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 "../ERC1155Vault.sol"; import "./AdminRoleEnabled.sol"; /// @author Kam Amini <[email protected]> /// /// @notice Use at your own risk abstract contract ERC1155VaultEnabled is AdminRoleEnabled, ERC1155Vault { function ERC1155Transfer( uint256 adminTaskId, address tokenContract, address to, uint256 tokenId, uint256 amount ) external onlyAdmin taskMustExist(adminTaskId) taskMustBeAdministrative(adminTaskId) taskMustNotBeFinalized(adminTaskId) taskMustBeApproved(adminTaskId) { _ERC1155Transfer(tokenContract, to, tokenId, amount); _finalizeTask(adminTaskId, ""); } function ERC1155SetApprovalForAll( uint256 adminTaskId, address tokenContract, address operator, bool approved ) external onlyAdmin taskMustExist(adminTaskId) taskMustBeAdministrative(adminTaskId) taskMustNotBeFinalized(adminTaskId) taskMustBeApproved(adminTaskId) { _ERC1155SetApprovalForAll(tokenContract, operator, approved); _finalizeTask(adminTaskId, ""); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// 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; }
// 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
/* * 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 "./TaskManaged.sol"; /// @author Kam Amini <[email protected]> /// /// @notice Use at your own risk abstract contract AdminRoleEnabled is TaskManaged { uint public constant MAX_NR_OF_ADMINS = 10; uint public constant MIN_NR_OF_ADMINS = 4; mapping (address => bool) private _admins; uint internal _nrOfAdmins; event AdminAdded(address account); event AdminRemoved(address account); modifier onlyAdmin() { require(_isAdmin(msg.sender), "AdminRoleEnabled: not an admin account"); _; } constructor() { _nrOfAdmins = 0; } function isAdmin(address account) external view onlyAdmin returns (bool) { return _isAdmin(account); } function getNrAdmins() external view onlyAdmin returns (uint) { return _nrOfAdmins; } function addAdmin(uint256 adminTaskId, address toBeAdded) external onlyAdmin taskMustExist(adminTaskId) taskMustBeAdministrative(adminTaskId) taskMustNotBeFinalized(adminTaskId) taskMustBeApproved(adminTaskId) { _addAdmin(toBeAdded); _finalizeTask(adminTaskId, ""); } function replaceAdmin(uint256 adminTaskId, address toBeRemoved, address toBeReplaced) external onlyAdmin taskMustExist(adminTaskId) taskMustBeAdministrative(adminTaskId) taskMustNotBeFinalized(adminTaskId) taskMustBeApproved(adminTaskId) { if (_nrOfAdmins == MAX_NR_OF_ADMINS) { _removeAdmin(toBeRemoved); _addAdmin(toBeReplaced); } else { _addAdmin(toBeReplaced); _removeAdmin(toBeRemoved); } _finalizeTask(adminTaskId, ""); } function removeAdmin(uint256 adminTaskId, address toBeRemoved) external onlyAdmin taskMustExist(adminTaskId) taskMustBeAdministrative(adminTaskId) taskMustNotBeFinalized(adminTaskId) taskMustBeApproved(adminTaskId) { _removeAdmin(toBeRemoved); _finalizeTask(adminTaskId, ""); } function _isAdmin(address account) internal view returns (bool) { return _admins[account]; } function _addAdmin(address account) internal { require(account != address(0), "AdminRoleEnabled: zero account cannot be used"); require(!_admins[account], "AdminRoleEnabled: already an admin account"); require((_nrOfAdmins + 1) <= MAX_NR_OF_ADMINS, "AdminRoleEnabled: exceeds maximum number of admin accounts"); _admins[account] = true; _nrOfAdmins += 1; emit AdminAdded(account); } function _removeAdmin(address account) internal { require(account != address(0), "AdminRoleEnabled: zero account cannot be used"); require(_admins[account], "AdminRoleEnabled: not an admin account"); require((_nrOfAdmins - 1) >= MIN_NR_OF_ADMINS, "AdminRoleEnabled: goes below minimum number of admin accounts"); _admins[account] = false; _nrOfAdmins -= 1; emit AdminRemoved(account); } }
/* * 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/IERC20.sol"; /// @author Kam Amini <[email protected]> /// /// @notice Use at your own risk abstract contract TaskManaged { struct Task { uint256 id; string uri; bool administrative; uint nrApprovals; bool finalized; } mapping (uint256 => Task) private _tasks; mapping (uint256 => mapping(address => bool)) private _taskApprovals; uint256 private _taskIdCounter; event TaskCreated(uint256 indexed taskId, string uri, bool administrative); event TaskApproved(uint256 taskId); event TaskApprovalWithdrawn(uint256 taskId); event TaskFinalized(uint256 taskId, string reason); modifier taskMustExist(uint256 taskId) { require(_taskExists(taskId), "TaskManaged: task does not exist"); _; } modifier taskMustBeAdministrative(uint256 taskId) { require(_isTaskAdministrative(taskId), "TaskManaged: invalid task type"); _; } modifier taskMustNotBeAdministrative(uint256 taskId) { require(!_isTaskAdministrative(taskId), "TaskManaged: invalid task type"); _; } modifier taskMustBeApproved(uint256 taskId) { require(_isTaskApproved(taskId), "TaskManaged: task is not approved"); _; } modifier taskMustNotBeFinalized(uint256 taskId) { require(!_isTaskFinalized(taskId), "TaskManaged: task is finalized"); _; } constructor() { _taskIdCounter = 1; } function _getRequiredNrApprovals(uint256 taskId) internal view virtual returns (uint); function _taskExists(uint256 taskId) internal view virtual returns (bool) { return _tasks[taskId].id > 0; } function _isTaskAdministrative(uint256 taskId) internal view virtual returns (bool) { require(_taskExists(taskId), "TaskManaged: task does not exist"); return _tasks[taskId].administrative; } function _isTaskApproved(uint256 taskId) internal view virtual returns (bool) { require(_taskExists(taskId), "TaskManaged: task does not exist"); return _tasks[taskId].nrApprovals >= _getRequiredNrApprovals(taskId); } function _isTaskFinalized(uint256 taskId) internal view virtual returns (bool) { require(_taskExists(taskId), "TaskManaged: task does not exist"); return _tasks[taskId].finalized; } function _getTaskURI(uint256 taskId) internal view virtual returns (string memory) { require(_taskExists(taskId), "TaskManaged: task does not exist"); return _tasks[taskId].uri; } function _getTaskNrApprovals(uint256 taskId) internal view virtual returns (uint) { require(_taskExists(taskId), "TaskManaged: task does not exist"); return _tasks[taskId].nrApprovals; } function _createTask( string memory taskURI, bool isAdministrative ) internal virtual returns (uint256) { uint256 taskId = _taskIdCounter; _taskIdCounter++; Task memory task = Task(taskId, taskURI, isAdministrative, 0, false); _tasks[taskId] = task; emit TaskCreated(taskId, taskURI, isAdministrative); return taskId; } function _approveTask(address doer, uint256 taskId) internal virtual { require(_taskExists(taskId), "TaskManaged: task does not exist"); require(!_taskApprovals[taskId][doer], "TaskManaged: task is already approved"); _taskApprovals[taskId][doer] = true; _tasks[taskId].nrApprovals += 1; emit TaskApproved(taskId); } function _withdrawTaskApproval(address doer, uint256 taskId) internal virtual { require(_taskExists(taskId), "TaskManaged: task does not exist"); require(_taskApprovals[taskId][doer], "TaskManaged: task is not approved"); _taskApprovals[taskId][doer] = false; _tasks[taskId].nrApprovals -= 1; emit TaskApprovalWithdrawn(taskId); } function _finalizeTask(uint256 taskId, string memory reason) internal virtual { require(_taskExists(taskId), "TaskManaged: task does not exist"); _tasks[taskId].finalized = true; emit TaskFinalized(taskId, reason); } }
/* * 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 abstract contract ETHVault { bool private _enableDeposit; event DepositEnabled(); event DepositDisabled(); event ETHTransferred(address to, uint256 amount); constructor() { _enableDeposit = false; } function _isDepositEnabled() internal view returns (bool) { return _enableDeposit; } function _setEnableDeposit(bool enableDeposit) internal { _enableDeposit = enableDeposit; if (_enableDeposit) { emit DepositEnabled(); } else { emit DepositDisabled(); } } function _ETHTransfer( address to, uint256 amount ) internal { require(to != address(0), "ETHVault: cannot transfer to zero"); require(amount > 0, "ETHVault: amount is zero"); require(amount <= address(this).balance, "ETHVault: transfer more than balance"); (bool success, ) = to.call{value: amount}(new bytes(0)); require(success, "ETHVault: failed to transfer"); emit ETHTransferred(to, amount); } }
/* * 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/IERC20.sol"; /// @author Kam Amini <[email protected]> /// /// @notice Use at your own risk abstract contract ERC20Vault { event ERC20Transferred(address tokenContract, address to, uint256 amount); event ERC20Approved(address tokenContract, address spender, uint256 amount); function _ERC20Transfer( address tokenContract, address to, uint256 amount ) internal { require(tokenContract != address(0), "ERC20Vault: zero token address"); require(to != address(0), "ERC20Vault: cannot transfer to zero"); require(amount > 0, "ERC20Vault: amount is zero"); require(amount <= IERC20(tokenContract).balanceOf(address(this)), "ERC20Vault: transfer more than balance"); IERC20(tokenContract).transfer(to, amount); emit ERC20Transferred(tokenContract, to, amount); } function _ERC20Approve( address tokenContract, address spender, uint256 amount ) internal { require(tokenContract != address(0), "ERC20Vault: zero token address"); require(spender != address(0), "ERC20Vault: zero address for spender"); IERC20(tokenContract).approve(spender, amount); emit ERC20Approved(tokenContract, spender, amount); } }
/* * 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/IERC721.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; /// @author Kam Amini <[email protected]> /// /// @notice Use at your own risk abstract contract ERC721Vault is IERC721Receiver { event ERC721Transferred(address tokenContract, address to, uint256 tokenId); event ERC721Approved(address tokenContract, address to, uint256 tokenId); event ERC721ApprovedForAll(address tokenContract, address operator, bool approved); function onERC721Received( address /* operator */, address /* from */, uint256 /* tokenId */, bytes calldata /* data */ ) external pure override returns (bytes4) { return bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")); } function _ERC721Transfer( address tokenContract, address to, uint256 tokenId ) internal { require(tokenContract != address(0), "ERC721Vault: zero token address"); require(to != address(0), "ERC721Vault: cannot transfer to zero"); IERC721(tokenContract).safeTransferFrom(address(this), to, tokenId, ""); emit ERC721Transferred(tokenContract, to, tokenId); } // operator can be the zero address. function _ERC721Approve( address tokenContract, address operator, uint256 tokenId ) internal { require(tokenContract != address(0), "ERC721Vault: zero token address"); IERC721(tokenContract).approve(operator, tokenId); emit ERC721Approved(tokenContract, operator, tokenId); } function _ERC721SetApprovalForAll( address tokenContract, address operator, bool approved ) internal { require(tokenContract != address(0), "ERC721Vault: zero token address"); require(operator != address(0), "ERC721Vault: zero address for operator"); IERC721(tokenContract).setApprovalForAll(operator, approved); emit ERC721ApprovedForAll(tokenContract, operator, approved); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
/* * 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/IERC1155.sol"; import "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol"; /// @author Kam Amini <[email protected]> /// /// @notice Use at your own risk abstract contract ERC1155Vault is IERC1155Receiver { event ERC1155Transferred(address tokenContract, address to, uint256 tokenId, uint256 amount); event ERC1155ApprovedForAll(address tokenContract, address operator, bool approved); function supportsInterface(bytes4 interfaceId) external view virtual override returns (bool) { return interfaceId == type(IERC1155Receiver).interfaceId; } function onERC1155Received( address /* operator */, address /* from */, uint256 /* id */, uint256 /* value */, bytes calldata /* data */ ) external pure override returns (bytes4) { return bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)")); } function onERC1155BatchReceived( address /* operator */, address /* from */, uint256[] calldata /* ids */, uint256[] calldata /* values */, bytes calldata /* data */ ) external pure override returns (bytes4) { return bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)")); } function _ERC1155Transfer( address tokenContract, address to, uint256 tokenId, uint256 amount ) internal { require(tokenContract != address(0), "ERC1155Vault: zero token address"); require(to != address(0), "ERC1155Vault: cannot transfer to zero"); IERC1155(tokenContract).safeTransferFrom(address(this), to, tokenId, amount, ""); emit ERC1155Transferred(tokenContract, to, tokenId, amount); } function _ERC1155SetApprovalForAll( address tokenContract, address operator, bool approved ) internal { require(tokenContract != address(0), "ERC1155Vault: zero token address"); require(operator != address(0), "ERC1155Vault: zero address for operator"); IERC1155(tokenContract).setApprovalForAll(operator, approved); emit ERC1155ApprovedForAll(tokenContract, operator, approved); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
{ "optimizer": { "enabled": true, "runs": 2000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address[]","name":"initialAdmins","type":"address[]"},{"internalType":"address[]","name":"initialCreators","type":"address[]"},{"internalType":"address[]","name":"initialApprovers","type":"address[]"},{"internalType":"address[]","name":"initialExecutors","type":"address[]"},{"internalType":"bool","name":"enableDeposit","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"AdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"AdminRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"ApproverAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"ApproverRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"CreatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"CreatorRemoved","type":"event"},{"anonymous":false,"inputs":[],"name":"DepositDisabled","type":"event"},{"anonymous":false,"inputs":[],"name":"DepositEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ERC1155ApprovedForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC1155Transferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20Approved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20Transferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721Approved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ERC721ApprovedForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721Transferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ETHTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"ExecutorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"ExecutorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"FinalizerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"FinalizerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"taskId","type":"uint256"}],"name":"TaskApprovalWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"taskId","type":"uint256"}],"name":"TaskApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"taskId","type":"uint256"},{"indexed":false,"internalType":"string","name":"uri","type":"string"},{"indexed":false,"internalType":"bool","name":"administrative","type":"bool"}],"name":"TaskCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"finalizer","type":"address"},{"indexed":false,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"uint256","name":"taskId","type":"uint256"}],"name":"TaskExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"taskId","type":"uint256"},{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"TaskFinalized","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"ERC1155SetApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC1155Transfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20Approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20Transfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721Approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"ERC721SetApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721Transfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ETHTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MAX_NR_OF_ADMINS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_NR_OF_ADMINS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"address","name":"toBeAdded","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"addApprover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"addCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"addExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"addFinalizer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"}],"name":"approveAdminTask","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taskId","type":"uint256"}],"name":"approveTask","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taskURI","type":"string"}],"name":"createAdminTask","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taskURI","type":"string"}],"name":"createTask","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"origin","type":"address"},{"internalType":"uint256","name":"taskId","type":"uint256"}],"name":"executeAdminTask","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"origin","type":"address"},{"internalType":"uint256","name":"taskId","type":"uint256"}],"name":"executeTask","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"string","name":"reason","type":"string"}],"name":"finalizeAdminTask","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taskId","type":"uint256"},{"internalType":"string","name":"reason","type":"string"}],"name":"finalizeTask","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getNrAdmins","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"taskId","type":"uint256"}],"name":"getNrOfApprovals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"taskId","type":"uint256"}],"name":"getTaskURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isApprover","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isCreator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isDepositEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExecutor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"taskId","type":"uint256"}],"name":"isFinalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isFinalizer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"address","name":"toBeRemoved","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"removeApprover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"removeCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"removeExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"removeFinalizer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"address","name":"toBeRemoved","type":"address"},{"internalType":"address","name":"toBeReplaced","type":"address"}],"name":"replaceAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"},{"internalType":"bool","name":"enableDeposit","type":"bool"}],"name":"setEnableDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stats","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"adminTaskId","type":"uint256"}],"name":"withdrawAdminTaskApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taskId","type":"uint256"}],"name":"withdrawTaskApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620061213803806200612183398101604081905262000034916200076b565b60016002556000600481815560068290556008829055600a829055600c91909155600d805460ff191690558551869186918691869186911115620000955760405162461bcd60e51b81526004016200008c906200084d565b60405180910390fd5b60005b8551811015620000f057620000db868281518110620000c757634e487b7160e01b600052603260045260246000fd5b60200260200101516200028f60201b60201c565b80620000e78162000c14565b91505062000098565b50600184511015620001165760405162461bcd60e51b81526004016200008c9062000a96565b60005b845181101562000171576200015c8582815181106200014857634e487b7160e01b600052603260045260246000fd5b6020026020010151620003a560201b60201c565b80620001688162000c14565b91505062000119565b50600383511015620001975760405162461bcd60e51b81526004016200008c90620009be565b60005b8351811015620001f257620001dd848281518110620001c957634e487b7160e01b600052603260045260246000fd5b60200260200101516200047c60201b60201c565b80620001e98162000c14565b9150506200019a565b50600182511015620002185760405162461bcd60e51b81526004016200008c9062000bc1565b60005b825181101562000273576200025e8382815181106200024a57634e487b7160e01b600052603260045260246000fd5b60200260200101516200055360201b60201c565b806200026a8162000c14565b9150506200021b565b506200027f816200062a565b5050505050505050505062000c5e565b6001600160a01b038116620002b85760405162461bcd60e51b81526004016200008c9062000acd565b6001600160a01b03811660009081526003602052604090205460ff1615620002f45760405162461bcd60e51b81526004016200008c9062000b77565b600a600454600162000307919062000bf9565b1115620003285760405162461bcd60e51b81526004016200008c9062000b1a565b6001600160a01b0381166000908152600360205260408120805460ff1916600190811790915560048054919290916200036390849062000bf9565b90915550506040517f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e339906200039a90839062000839565b60405180910390a150565b6001600160a01b038116620003ce5760405162461bcd60e51b81526004016200008c906200091f565b6001600160a01b03811660009081526005602052604090205460ff16156200040a5760405162461bcd60e51b81526004016200008c90620008d2565b6001600160a01b0381166000908152600560205260408120805460ff1916600190811790915560068054919290916200044590849062000bf9565b90915550506040517f021a687fbe334e9e815cee8b399c0bc42e82356eb7f63a09ddb558a25d3dcdbd906200039a90839062000839565b6001600160a01b038116620004a55760405162461bcd60e51b81526004016200008c9062000882565b6001600160a01b03811660009081526007602052604090205460ff1615620004e15760405162461bcd60e51b81526004016200008c90620009f6565b6001600160a01b0381166000908152600760205260408120805460ff1916600190811790915560088054919290916200051c90849062000bf9565b90915550506040517f835bddf1ceee4956e4329af9edf018523c1191238187a597453f6020bcadb042906200039a90839062000839565b6001600160a01b0381166200057c5760405162461bcd60e51b81526004016200008c906200096e565b6001600160a01b03811660009081526009602052604090205460ff1615620005b85760405162461bcd60e51b81526004016200008c9062000a46565b6001600160a01b0381166000908152600960205260408120805460ff19166001908117909155600a805491929091620005f390849062000bf9565b90915550506040517fae5b7c3b000f575c241001dc9bcb3d8778376889353b07121115574eceff78c5906200039a90839062000839565b600d805460ff1916821515179081905560ff161562000672576040517fc900358025f09a872d1a6e53c30e64a77566eada5220d1044c2636f83a0c8bcf90600090a16200069c565b6040517ffb2915041896c6af47e9321d19194f79106105a83cf67d0262283fb48cebf14890600090a15b50565b80516001600160a01b0381168114620006b757600080fd5b919050565b600082601f830112620006cd578081fd5b815160206001600160401b0380831115620006ec57620006ec62000c48565b818302604051601f19603f8301168101818110848211171562000713576200071362000c48565b6040528481528381019250868401828801850189101562000732578687fd5b8692505b858310156200075f576200074a816200069f565b84529284019260019290920191840162000736565b50979650505050505050565b600080600080600060a0868803121562000783578081fd5b85516001600160401b03808211156200079a578283fd5b620007a889838a01620006bc565b96506020880151915080821115620007be578283fd5b620007cc89838a01620006bc565b95506040880151915080821115620007e2578283fd5b620007f089838a01620006bc565b9450606088015191508082111562000806578283fd5b506200081588828901620006bc565b925050608086015180151581146200082b578182fd5b809150509295509295909350565b6001600160a01b0391909116815260200190565b60208082526026908201526000805160206200610183398151915260408201526561646d696e7360d01b606082015260800190565b60208082526030908201527f417070726f766572526f6c65456e61626c65643a207a65726f206163636f756e60408201526f1d0818d85b9b9bdd081899481d5cd95960821b606082015260800190565b6020808252602d908201527f43726561746f72526f6c65456e61626c65643a20616c7265616479206120637260408201526c19585d1bdc881858d8dbdd5b9d609a1b606082015260800190565b6020808252602f908201527f43726561746f72526f6c65456e61626c65643a207a65726f206163636f756e7460408201526e0818d85b9b9bdd081899481d5cd959608a1b606082015260800190565b60208082526030908201527f4578656375746f72526f6c65456e61626c65643a207a65726f206163636f756e60408201526f1d0818d85b9b9bdd081899481d5cd95960821b606082015260800190565b602080825260299082015260008051602062006101833981519152604082015268617070726f7665727360b81b606082015260800190565b60208082526030908201527f417070726f766572526f6c65456e61626c65643a20616c726561647920616e2060408201526f185c1c1c9bdd995c881858d8dbdd5b9d60821b606082015260800190565b60208082526030908201527f4578656375746f72526f6c65456e61626c65643a20616c726561647920616e2060408201526f195e1958dd5d1bdc881858d8dbdd5b9d60821b606082015260800190565b60208082526028908201526000805160206200610183398151915260408201526763726561746f727360c01b606082015260800190565b6020808252602d908201527f41646d696e526f6c65456e61626c65643a207a65726f206163636f756e74206360408201526c185b9b9bdd081899481d5cd959609a1b606082015260800190565b6020808252603a908201527f41646d696e526f6c65456e61626c65643a2065786365656473206d6178696d7560408201527f6d206e756d626572206f662061646d696e206163636f756e7473000000000000606082015260800190565b6020808252602a908201527f41646d696e526f6c65456e61626c65643a20616c726561647920616e2061646d6040820152691a5b881858d8dbdd5b9d60b21b606082015260800190565b6020808252602990820152600080516020620061018339815191526040820152686578656375746f727360b81b606082015260800190565b6000821982111562000c0f5762000c0f62000c32565b500190565b600060001982141562000c2b5762000c2b62000c32565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6154938062000c6e6000396000f3fe60806040526004361061030c5760003560e01c80637ec9152f1161019a578063bb6c352c116100e1578063dbdc814b1161008a578063f049076911610064578063f0490769146108ef578063f23a6e611461090f578063f9a7640b1461092f57610340565b8063dbdc814b1461088f578063debfda30146108af578063efd46065146108cf57610340565b8063cbe4c6ef116100bb578063cbe4c6ef14610834578063d06dcc5114610854578063d80528ae1461086957610340565b8063bb6c352c146107d4578063bc197c81146107f4578063c9d14c141461081457610340565b8063976d577011610143578063a37ef8f81161011d578063a37ef8f814610774578063b42aebd114610794578063b544414e146107b457610340565b8063976d57701461071f5780639d6aacb01461073f578063a36b626f1461075457610340565b806389d936371161017457806389d93637146106bf5780638d134ad0146106df5780638f4ac625146106ff57610340565b80637ec9152f1461066a5780637fcd7e0f1461068a57806382a224561461069f57610340565b8063304549971161025e5780635f13c947116102075780636d633a5c116101e15780636d633a5c146105fd57806370fbe9ff1461062a5780637eb0bdc91461064a57610340565b80635f13c9471461059d5780636a83f109146105bd5780636d218e48146105dd57610340565b80634895cdb5116102385780634895cdb5146105485780635317234e146105685780635656fc781461058857610340565b806330454997146104e857806333727c4d14610508578063374fea911461052857610340565b806315d54406116102c057806324d7806c1161029a57806324d7806c14610488578063292fd8f0146104a85780632d31479b146104c857610340565b806315d544061461041b57806318d07e7c1461043b578063248bec701461045b57610340565b8063111002aa116102f1578063111002aa146103ae57806314779cda146103ce578063150b7a02146103ee57610340565b806301ffc9a7146103585780630a07fae61461038e57610340565b366103405761031961094f565b61033e5760405162461bcd60e51b815260040161033590615115565b60405180910390fd5b005b60405162461bcd60e51b815260040161033590614626565b34801561036457600080fd5b50610378610373366004614031565b610958565b6040516103859190614434565b60405180910390f35b34801561039a57600080fd5b5061033e6103a93660046140ac565b610a3f565b3480156103ba57600080fd5b5061033e6103c9366004614071565b610ae8565b3480156103da57600080fd5b5061033e6103e9366004614190565b610b1c565b3480156103fa57600080fd5b5061040e610409366004613f09565b610c08565b604051610385919061443f565b34801561042757600080fd5b5061033e6104363660046140ac565b610c32565b34801561044757600080fd5b5061033e610456366004614071565b610ca3565b34801561046757600080fd5b5061047b6104763660046140ac565b610cd3565b604051610385919061446c565b34801561049457600080fd5b506103786104a3366004613e31565b610d92565b3480156104b457600080fd5b5061033e6104c33660046140ac565b610dc2565b3480156104d457600080fd5b5061033e6104e33660046141d3565b610e64565b3480156104f457600080fd5b5061033e6105033660046140ac565b610f52565b34801561051457600080fd5b506103786105233660046140ac565b610fc4565b34801561053457600080fd5b5061033e6105433660046140dc565b61107a565b34801561055457600080fd5b5061033e6105633660046140dc565b611162565b34801561057457600080fd5b5061033e6105833660046140dc565b611229565b34801561059457600080fd5b506103786112f0565b3480156105a957600080fd5b5061033e6105b83660046140dc565b611324565b3480156105c957600080fd5b5061033e6105d8366004613fec565b6113eb565b3480156105e957600080fd5b506103786105f8366004613e31565b61152c565b34801561060957600080fd5b5061061d6106183660046140ac565b61155c565b60405161038591906152f5565b34801561063657600080fd5b50610378610645366004613e31565b611612565b34801561065657600080fd5b5061033e6106653660046140dc565b611642565b34801561067657600080fd5b5061033e610685366004614220565b611709565b34801561069657600080fd5b5061061d6117f3565b3480156106ab57600080fd5b5061033e6106ba366004614190565b6117f8565b3480156106cb57600080fd5b5061033e6106da3660046140dc565b6118c1565b3480156106eb57600080fd5b5061033e6106fa366004614107565b611988565b34801561070b57600080fd5b5061033e61071a366004614190565b611a7a565b34801561072b57600080fd5b5061033e61073a3660046140dc565b611b43565b34801561074b57600080fd5b5061061d611c0a565b34801561076057600080fd5b5061033e61076f366004614283565b611c38565b34801561078057600080fd5b5061033e61078f366004614190565b611cf1565b3480156107a057600080fd5b5061033e6107af366004614142565b611dba565b3480156107c057600080fd5b5061033e6107cf366004614254565b611e83565b3480156107e057600080fd5b5061033e6107ef3660046140dc565b611f75565b34801561080057600080fd5b5061040e61080f366004613e52565b61203c565b34801561082057600080fd5b5061033e61082f366004614283565b612069565b34801561084057600080fd5b5061033e61084f366004614142565b6120da565b34801561086057600080fd5b5061061d6121a3565b34801561087557600080fd5b5061087e6121a8565b604051610385959493929190615317565b34801561089b57600080fd5b5061033e6108aa3660046140dc565b6121f2565b3480156108bb57600080fd5b506103786108ca366004613e31565b6122b9565b3480156108db57600080fd5b506103786108ea366004613e31565b6122e9565b3480156108fb57600080fd5b5061033e61090a366004613fec565b612319565b34801561091b57600080fd5b5061040e61092a366004613f76565b6123b1565b34801561093b57600080fd5b5061033e61094a3660046140dc565b6123dc565b600d5460ff1690565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f9acaf6600000000000000000000000000000000000000000000000000000000014806109eb57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b80610a3757507fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000145b90505b919050565b610a48336124a3565b610a645760405162461bcd60e51b81526004016103359061523b565b80610a6e816124c1565b610a8a5760405162461bcd60e51b815260040161033590614500565b81610a94816124d5565b15610ab15760405162461bcd60e51b8152600401610335906151a7565b82610abb81612515565b15610ad85760405162461bcd60e51b815260040161033590614fc7565b610ae23385612555565b50505050565b610af133612647565b610b0d5760405162461bcd60e51b815260040161033590614bb9565b610b18816000612665565b5050565b610b2533612752565b610b415760405162461bcd60e51b815260040161033590614d99565b83610b4b816124c1565b610b675760405162461bcd60e51b815260040161033590614500565b84610b71816124d5565b610b8d5760405162461bcd60e51b8152600401610335906151a7565b85610b9781612515565b15610bb45760405162461bcd60e51b815260040161033590614fc7565b86610bbe81612770565b610bda5760405162461bcd60e51b815260040161033590614ca8565b610be58787876127bb565b610bfe88604051806020016040528060008152506128c2565b5050505050505050565b7f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f95945050505050565b610c3b33612752565b610c575760405162461bcd60e51b815260040161033590614d99565b80610c61816124c1565b610c7d5760405162461bcd60e51b815260040161033590614500565b81610c87816124d5565b610ab15760405162461bcd60e51b8152600401610335906151a7565b610cac33612752565b610cc85760405162461bcd60e51b815260040161033590614d99565b610b18816001612665565b6060610cde33612752565b80610ced5750610ced33612647565b80610cfc5750610cfc336124a3565b80610d0b5750610d0b33612935565b610d275760405162461bcd60e51b81526004016103359061505b565b81610d31816124c1565b610d4d5760405162461bcd60e51b815260040161033590614500565b610d56836124d5565b15610d8057610d6433612752565b610d805760405162461bcd60e51b8152600401610335906146e0565b610d8983612953565b91505b50919050565b6000610d9d33612752565b610db95760405162461bcd60e51b815260040161033590614d99565b610a3782612752565b610dcb33612752565b610de75760405162461bcd60e51b815260040161033590614d99565b80610df1816124c1565b610e0d5760405162461bcd60e51b815260040161033590614500565b81610e17816124d5565b610e335760405162461bcd60e51b8152600401610335906151a7565b82610e3d81612515565b15610e5a5760405162461bcd60e51b815260040161033590614fc7565b610ae23385612a1b565b610e6d33612752565b610e895760405162461bcd60e51b815260040161033590614d99565b84610e93816124c1565b610eaf5760405162461bcd60e51b815260040161033590614500565b85610eb9816124d5565b610ed55760405162461bcd60e51b8152600401610335906151a7565b86610edf81612515565b15610efc5760405162461bcd60e51b815260040161033590614fc7565b87610f0681612770565b610f225760405162461bcd60e51b815260040161033590614ca8565b610f2e88888888612afe565b610f4789604051806020016040528060008152506128c2565b505050505050505050565b610f5b336124a3565b610f775760405162461bcd60e51b81526004016103359061523b565b80610f81816124c1565b610f9d5760405162461bcd60e51b815260040161033590614500565b81610fa7816124d5565b15610e335760405162461bcd60e51b8152600401610335906151a7565b6000610fcf33612752565b80610fde5750610fde33612647565b80610fed5750610fed336124a3565b80610ffc5750610ffc33612935565b6110185760405162461bcd60e51b81526004016103359061505b565b81611022816124c1565b61103e5760405162461bcd60e51b815260040161033590614500565b611047836124d5565b156110715761105533612752565b6110715760405162461bcd60e51b8152600401610335906146e0565b610d8983612515565b61108333612752565b61109f5760405162461bcd60e51b815260040161033590614d99565b816110a9816124c1565b6110c55760405162461bcd60e51b815260040161033590614500565b826110cf816124d5565b6110eb5760405162461bcd60e51b8152600401610335906151a7565b836110f581612515565b156111125760405162461bcd60e51b815260040161033590614fc7565b8461111c81612770565b6111385760405162461bcd60e51b815260040161033590614ca8565b61114185612c0a565b61115a86604051806020016040528060008152506128c2565b505050505050565b61116b33612752565b6111875760405162461bcd60e51b815260040161033590614d99565b81611191816124c1565b6111ad5760405162461bcd60e51b815260040161033590614500565b826111b7816124d5565b6111d35760405162461bcd60e51b8152600401610335906151a7565b836111dd81612515565b156111fa5760405162461bcd60e51b815260040161033590614fc7565b8461120481612770565b6112205760405162461bcd60e51b815260040161033590614ca8565b61114185612cdb565b61123233612752565b61124e5760405162461bcd60e51b815260040161033590614d99565b81611258816124c1565b6112745760405162461bcd60e51b815260040161033590614500565b8261127e816124d5565b61129a5760405162461bcd60e51b8152600401610335906151a7565b836112a481612515565b156112c15760405162461bcd60e51b815260040161033590614fc7565b846112cb81612770565b6112e75760405162461bcd60e51b815260040161033590614ca8565b61114185612da1565b60006112fb33612752565b6113175760405162461bcd60e51b815260040161033590614d99565b61131f61094f565b905090565b61132d33612752565b6113495760405162461bcd60e51b815260040161033590614d99565b81611353816124c1565b61136f5760405162461bcd60e51b815260040161033590614500565b82611379816124d5565b6113955760405162461bcd60e51b8152600401610335906151a7565b8361139f81612515565b156113bc5760405162461bcd60e51b815260040161033590614fc7565b846113c681612770565b6113e25760405162461bcd60e51b815260040161033590614ca8565b61114185612e6e565b6113f433612f3b565b6114105760405162461bcd60e51b8152600401610335906144a3565b8161141a81612935565b6114365760405162461bcd60e51b815260040161033590614683565b81611440816124c1565b61145c5760405162461bcd60e51b815260040161033590614500565b82611466816124d5565b6114825760405162461bcd60e51b8152600401610335906151a7565b8361148c81612770565b6114a85760405162461bcd60e51b815260040161033590614ca8565b846114b281612515565b156114cf5760405162461bcd60e51b815260040161033590614fc7565b6114e886604051806020016040528060008152506128c2565b7fb4b8589d8015ad1f83a922f4fd0d6498f557018656541ce92b6c18db2b70466133888860405161151b93929190614348565b60405180910390a150505050505050565b600061153733612752565b6115535760405162461bcd60e51b815260040161033590614d99565b610a37826124a3565b600061156733612752565b80611576575061157633612647565b806115855750611585336124a3565b80611594575061159433612935565b6115b05760405162461bcd60e51b81526004016103359061505b565b816115ba816124c1565b6115d65760405162461bcd60e51b815260040161033590614500565b6115df836124d5565b15611609576115ed33612752565b6116095760405162461bcd60e51b8152600401610335906146e0565b610d8983612f59565b600061161d33612752565b6116395760405162461bcd60e51b815260040161033590614d99565b610a3782612f3b565b61164b33612752565b6116675760405162461bcd60e51b815260040161033590614d99565b81611671816124c1565b61168d5760405162461bcd60e51b815260040161033590614500565b82611697816124d5565b6116b35760405162461bcd60e51b8152600401610335906151a7565b836116bd81612515565b156116da5760405162461bcd60e51b815260040161033590614fc7565b846116e481612770565b6117005760405162461bcd60e51b815260040161033590614ca8565b61114185612f96565b61171233612752565b61172e5760405162461bcd60e51b815260040161033590614d99565b82611738816124c1565b6117545760405162461bcd60e51b815260040161033590614500565b8361175e816124d5565b61177a5760405162461bcd60e51b8152600401610335906151a7565b8461178481612515565b156117a15760405162461bcd60e51b815260040161033590614fc7565b856117ab81612770565b6117c75760405162461bcd60e51b815260040161033590614ca8565b6117d1868661308b565b6117ea87604051806020016040528060008152506128c2565b50505050505050565b600481565b61180133612752565b61181d5760405162461bcd60e51b815260040161033590614d99565b83611827816124c1565b6118435760405162461bcd60e51b815260040161033590614500565b8461184d816124d5565b6118695760405162461bcd60e51b8152600401610335906151a7565b8561187381612515565b156118905760405162461bcd60e51b815260040161033590614fc7565b8661189a81612770565b6118b65760405162461bcd60e51b815260040161033590614ca8565b610be58787876131af565b6118ca33612752565b6118e65760405162461bcd60e51b815260040161033590614d99565b816118f0816124c1565b61190c5760405162461bcd60e51b815260040161033590614500565b82611916816124d5565b6119325760405162461bcd60e51b8152600401610335906151a7565b8361193c81612515565b156119595760405162461bcd60e51b815260040161033590614fc7565b8461196381612770565b61197f5760405162461bcd60e51b815260040161033590614ca8565b611141856132c8565b61199133612752565b6119ad5760405162461bcd60e51b815260040161033590614d99565b826119b7816124c1565b6119d35760405162461bcd60e51b815260040161033590614500565b836119dd816124d5565b6119f95760405162461bcd60e51b8152600401610335906151a7565b84611a0381612515565b15611a205760405162461bcd60e51b815260040161033590614fc7565b85611a2a81612770565b611a465760405162461bcd60e51b815260040161033590614ca8565b600a6004541415611a6857611a5a86612f96565b611a638561338e565b6117d1565b611a718561338e565b6117d186612f96565b611a8333612752565b611a9f5760405162461bcd60e51b815260040161033590614d99565b83611aa9816124c1565b611ac55760405162461bcd60e51b815260040161033590614500565b84611acf816124d5565b611aeb5760405162461bcd60e51b8152600401610335906151a7565b85611af581612515565b15611b125760405162461bcd60e51b815260040161033590614fc7565b86611b1c81612770565b611b385760405162461bcd60e51b815260040161033590614ca8565b610be587878761348a565b611b4c33612752565b611b685760405162461bcd60e51b815260040161033590614d99565b81611b72816124c1565b611b8e5760405162461bcd60e51b815260040161033590614500565b82611b98816124d5565b611bb45760405162461bcd60e51b8152600401610335906151a7565b83611bbe81612515565b15611bdb5760405162461bcd60e51b815260040161033590614fc7565b84611be581612770565b611c015760405162461bcd60e51b815260040161033590614ca8565b61114185613677565b6000611c1533612752565b611c315760405162461bcd60e51b815260040161033590614d99565b5060045490565b611c4133612647565b80611c505750611c5033612752565b611c6c5760405162461bcd60e51b815260040161033590614e53565b81611c76816124c1565b611c925760405162461bcd60e51b815260040161033590614500565b82611c9c816124d5565b15611cb95760405162461bcd60e51b8152600401610335906151a7565b83611cc381612515565b15611ce05760405162461bcd60e51b815260040161033590614fc7565b611cea85856128c2565b5050505050565b611cfa33612752565b611d165760405162461bcd60e51b815260040161033590614d99565b83611d20816124c1565b611d3c5760405162461bcd60e51b815260040161033590614500565b84611d46816124d5565b611d625760405162461bcd60e51b8152600401610335906151a7565b85611d6c81612515565b15611d895760405162461bcd60e51b815260040161033590614fc7565b86611d9381612770565b611daf5760405162461bcd60e51b815260040161033590614ca8565b610be5878787613744565b611dc333612752565b611ddf5760405162461bcd60e51b815260040161033590614d99565b83611de9816124c1565b611e055760405162461bcd60e51b815260040161033590614500565b84611e0f816124d5565b611e2b5760405162461bcd60e51b8152600401610335906151a7565b85611e3581612515565b15611e525760405162461bcd60e51b815260040161033590614fc7565b86611e5c81612770565b611e785760405162461bcd60e51b815260040161033590614ca8565b610be5878787613816565b611e8c33612752565b611ea85760405162461bcd60e51b815260040161033590614d99565b81611eb2816124c1565b611ece5760405162461bcd60e51b815260040161033590614500565b82611ed8816124d5565b611ef45760405162461bcd60e51b8152600401610335906151a7565b83611efe81612515565b15611f1b5760405162461bcd60e51b815260040161033590614fc7565b84611f2581612770565b611f415760405162461bcd60e51b815260040161033590614ca8565b841515611f4c61094f565b15151415611f6c5760405162461bcd60e51b81526004016103359061497c565b6111418561390e565b611f7e33612752565b611f9a5760405162461bcd60e51b815260040161033590614d99565b81611fa4816124c1565b611fc05760405162461bcd60e51b815260040161033590614500565b82611fca816124d5565b611fe65760405162461bcd60e51b8152600401610335906151a7565b83611ff081612515565b1561200d5760405162461bcd60e51b815260040161033590614fc7565b8461201781612770565b6120335760405162461bcd60e51b815260040161033590614ca8565b61114185613981565b7fbc197c819b3e337a6f9652dd10becd7eef83032af3b9d958d3d42f669414662198975050505050505050565b61207233612752565b61208e5760405162461bcd60e51b815260040161033590614d99565b81612098816124c1565b6120b45760405162461bcd60e51b815260040161033590614500565b826120be816124d5565b611cb95760405162461bcd60e51b8152600401610335906151a7565b6120e333612752565b6120ff5760405162461bcd60e51b815260040161033590614d99565b83612109816124c1565b6121255760405162461bcd60e51b815260040161033590614500565b8461212f816124d5565b61214b5760405162461bcd60e51b8152600401610335906151a7565b8561215581612515565b156121725760405162461bcd60e51b815260040161033590614fc7565b8661217c81612770565b6121985760405162461bcd60e51b815260040161033590614ca8565b610be5878787613a47565b600a81565b60008060008060006121b933612752565b6121d55760405162461bcd60e51b815260040161033590614d99565b5050600454600654600854600a54600c5493979296509094509250565b6121fb33612752565b6122175760405162461bcd60e51b815260040161033590614d99565b81612221816124c1565b61223d5760405162461bcd60e51b815260040161033590614500565b82612247816124d5565b6122635760405162461bcd60e51b8152600401610335906151a7565b8361226d81612515565b1561228a5760405162461bcd60e51b815260040161033590614fc7565b8461229481612770565b6122b05760405162461bcd60e51b815260040161033590614ca8565b6111418561338e565b60006122c433612752565b6122e05760405162461bcd60e51b815260040161033590614d99565b610a3782612935565b60006122f433612752565b6123105760405162461bcd60e51b815260040161033590614d99565b610a3782612647565b61232233612f3b565b61233e5760405162461bcd60e51b8152600401610335906144a3565b8161234881612935565b6123645760405162461bcd60e51b815260040161033590614683565b8161236e816124c1565b61238a5760405162461bcd60e51b815260040161033590614500565b82612394816124d5565b156114825760405162461bcd60e51b8152600401610335906151a7565b7ff23a6e612e1ff4830e658fe43f4e3cb4a5f8170bd5d9e69fb5d7a7fa9e4fdf979695505050505050565b6123e533612752565b6124015760405162461bcd60e51b815260040161033590614d99565b8161240b816124c1565b6124275760405162461bcd60e51b815260040161033590614500565b82612431816124d5565b61244d5760405162461bcd60e51b8152600401610335906151a7565b8361245781612515565b156124745760405162461bcd60e51b815260040161033590614fc7565b8461247e81612770565b61249a5760405162461bcd60e51b815260040161033590614ca8565b61114185613b3f565b6001600160a01b031660009081526007602052604090205460ff1690565b600090815260208190526040902054151590565b60006124e0826124c1565b6124fc5760405162461bcd60e51b815260040161033590614500565b5060009081526020819052604090206002015460ff1690565b6000612520826124c1565b61253c5760405162461bcd60e51b815260040161033590614500565b5060009081526020819052604090206004015460ff1690565b61255e816124c1565b61257a5760405162461bcd60e51b815260040161033590614500565b60008181526001602090815260408083206001600160a01b038616845290915290205460ff16156125bd5760405162461bcd60e51b81526004016103359061473d565b60008181526001602081815260408084206001600160a01b03871685528252808420805460ff19168417905584845290839052822060030180549192909161260690849061533a565b90915550506040517f3e9d27a1c2a828db29e4b2a17fbd1bc70201ef21aec4f74b9fa051b02e38e3f09061263b9083906152f5565b60405180910390a15050565b6001600160a01b031660009081526005602052604090205460ff1690565b60028054600091819083612678836153ea565b90915550506040805160a081018252828152602080820187815286151583850152600060608401819052608084018190528581528083529390932082518155925180519293849390926126d2926001850192910190613c71565b5060408281015160028301805491151560ff19928316179055606084015160038401556080909301516004909201805492151592909316919091179091555182907f05d0fb833127fc08168556d0e7ca9554fc3f6bc843b3b7d2bf1c35aea6bab66090612742908890889061447f565b60405180910390a2509392505050565b6001600160a01b031660009081526003602052604090205460ff1690565b600061277b826124c1565b6127975760405162461bcd60e51b815260040161033590614500565b6127a082613c0c565b60008381526020819052604090206003015410159050919050565b6001600160a01b0383166127e15760405162461bcd60e51b815260040161033590614592565b6001600160a01b0382166128075760405162461bcd60e51b81526004016103359061514a565b6040517fb88d4fde0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063b88d4fde906128509030908690869060040161436c565b600060405180830381600087803b15801561286a57600080fd5b505af115801561287e573d6000803e3d6000fd5b505050507fcd68d836931d28b26c81fd06a68b603542d9b3a2fd1ba1c1bd30c9e2e5f4e6eb8383836040516128b593929190614348565b60405180910390a1505050565b6128cb826124c1565b6128e75760405162461bcd60e51b815260040161033590614500565b60008281526020819052604090819020600401805460ff19166001179055517fe5516cdd051314d9e1a70e80776a58d2064a5468c26b2f1a7e13cd96ab2d65079061263b90849084906152fe565b6001600160a01b031660009081526009602052604090205460ff1690565b606061295e826124c1565b61297a5760405162461bcd60e51b815260040161033590614500565b60008281526020819052604090206001018054612996906153b5565b80601f01602080910402602001604051908101604052809291908181526020018280546129c2906153b5565b8015612a0f5780601f106129e457610100808354040283529160200191612a0f565b820191906000526020600020905b8154815290600101906020018083116129f257829003601f168201915b50505050509050919050565b612a24816124c1565b612a405760405162461bcd60e51b815260040161033590614500565b60008181526001602090815260408083206001600160a01b038616845290915290205460ff16612a825760405162461bcd60e51b815260040161033590614ca8565b60008181526001602081815260408084206001600160a01b03871685528252808420805460ff19169055848452908390528220600301805491929091612ac9908490615372565b90915550506040517fb2d3b7ccb3dd8e3420904dd2c5cf01ddbe69777044e015eb3c56294506067bab9061263b9083906152f5565b6001600160a01b038416612b245760405162461bcd60e51b815260040161033590614c16565b6001600160a01b038316612b4a5760405162461bcd60e51b815260040161033590614d3c565b6040517ff242432a0000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063f242432a90612b959030908790879087906004016143c8565b600060405180830381600087803b158015612baf57600080fd5b505af1158015612bc3573d6000803e3d6000fd5b505050507f33627cfa024b2c6aba9bb8060d9b3112240af2250621855495464379de6ab1b584848484604051612bfc949392919061439f565b60405180910390a150505050565b6001600160a01b038116612c305760405162461bcd60e51b815260040161033590614854565b6001600160a01b03811660009081526005602052604090205460ff16612c685760405162461bcd60e51b815260040161033590614bb9565b6001600160a01b0381166000908152600560205260408120805460ff191690556006805460019290612c9b908490615372565b90915550506040517f94a409f50d78dc8628b7499ba5af0848a134b9a935a59c0a45313b67f66920f890612cd0908390614310565b60405180910390a150565b6001600160a01b038116612d015760405162461bcd60e51b8152600401610335906150b8565b6001600160a01b0381166000908152600b602052604090205460ff16612d395760405162461bcd60e51b8152600401610335906144a3565b6001600160a01b0381166000908152600b60205260408120805460ff19169055600c805460019290612d6c908490615372565b90915550506040517f69876ed6762df72762082100c5690190c4b64d6226f20712d3d8deb06053893890612cd0908390614310565b6001600160a01b038116612dc75760405162461bcd60e51b815260040161033590614535565b6001600160a01b03811660009081526007602052604090205460ff1615612e005760405162461bcd60e51b815260040161033590614a36565b6001600160a01b0381166000908152600760205260408120805460ff191660019081179091556008805491929091612e3990849061533a565b90915550506040517f835bddf1ceee4956e4329af9edf018523c1191238187a597453f6020bcadb04290612cd0908390614310565b6001600160a01b038116612e945760405162461bcd60e51b81526004016103359061491f565b6001600160a01b03811660009081526009602052604090205460ff1615612ecd5760405162461bcd60e51b815260040161033590614aca565b6001600160a01b0381166000908152600960205260408120805460ff19166001908117909155600a805491929091612f0690849061533a565b90915550506040517fae5b7c3b000f575c241001dc9bcb3d8778376889353b07121115574eceff78c590612cd0908390614310565b6001600160a01b03166000908152600b602052604090205460ff1690565b6000612f64826124c1565b612f805760405162461bcd60e51b815260040161033590614500565b5060009081526020819052604090206003015490565b6001600160a01b038116612fbc5760405162461bcd60e51b815260040161033590614df6565b6001600160a01b03811660009081526003602052604090205460ff16612ff45760405162461bcd60e51b815260040161033590614d99565b600460016004546130059190615372565b10156130235760405162461bcd60e51b815260040161033590614c4b565b6001600160a01b0381166000908152600360205260408120805460ff191690556004805460019290613056908490615372565b90915550506040517fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f90612cd0908390614310565b6001600160a01b0382166130b15760405162461bcd60e51b815260040161033590615298565b600081116130d15760405162461bcd60e51b815260040161033590614a93565b478111156130f15760405162461bcd60e51b81526004016103359061479a565b604080516000808252602082019092526001600160a01b03841690839060405161311b91906142f4565b60006040518083038185875af1925050503d8060008114613158576040519150601f19603f3d011682016040523d82523d6000602084013e61315d565b606091505b505090508061317e5760405162461bcd60e51b8152600401610335906148e8565b7f1445764fe3fdfc2a9812ff42e9b65c2e7896d5162851f78f7d4a5578f7346ff183836040516128b592919061441b565b6001600160a01b0383166131d55760405162461bcd60e51b815260040161033590614d05565b6001600160a01b0382166131fb5760405162461bcd60e51b815260040161033590614b5c565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063095ea7b390613242908590859060040161441b565b602060405180830381600087803b15801561325c57600080fd5b505af1158015613270573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132949190614015565b507fe285444a44723385de85da4844cbb9105030b82a9300a3ffca99054d624c5e308383836040516128b593929190614348565b6001600160a01b0381166132ee5760405162461bcd60e51b81526004016103359061491f565b6001600160a01b03811660009081526009602052604090205460ff166133265760405162461bcd60e51b815260040161033590614683565b6001600160a01b0381166000908152600960205260408120805460ff19169055600a805460019290613359908490615372565b90915550506040517f4a2cf608bfb427f53279ec7f0eadf48913b9346ccefc3af138dbdec14ea0907d90612cd0908390614310565b6001600160a01b0381166133b45760405162461bcd60e51b815260040161033590614df6565b6001600160a01b03811660009081526003602052604090205460ff16156133ed5760405162461bcd60e51b8152600401610335906151de565b600a60045460016133fe919061533a565b111561341c5760405162461bcd60e51b815260040161033590614eb0565b6001600160a01b0381166000908152600360205260408120805460ff19166001908117909155600480549192909161345590849061533a565b90915550506040517f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e33990612cd0908390614310565b6001600160a01b0383166134b05760405162461bcd60e51b815260040161033590614d05565b6001600160a01b0382166134d65760405162461bcd60e51b815260040161033590614f0d565b600081116134f65760405162461bcd60e51b8152600401610335906148b1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038416906370a082319061353b903090600401614310565b60206040518083038186803b15801561355357600080fd5b505afa158015613567573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061358b91906140c4565b8111156135aa5760405162461bcd60e51b815260040161033590614f6a565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063a9059cbb906135f1908590859060040161441b565b602060405180830381600087803b15801561360b57600080fd5b505af115801561361f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136439190614015565b507fe8de91d538b06154a2c48315768c5046f47e127d7fd3f726fd85cc723f29b0528383836040516128b593929190614348565b6001600160a01b03811661369d5760405162461bcd60e51b815260040161033590614854565b6001600160a01b03811660009081526005602052604090205460ff16156136d65760405162461bcd60e51b8152600401610335906145c9565b6001600160a01b0381166000908152600560205260408120805460ff19166001908117909155600680549192909161370f90849061533a565b90915550506040517f021a687fbe334e9e815cee8b399c0bc42e82356eb7f63a09ddb558a25d3dcdbd90612cd0908390614310565b6001600160a01b03831661376a5760405162461bcd60e51b815260040161033590614592565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063095ea7b3906137b1908590859060040161441b565b600060405180830381600087803b1580156137cb57600080fd5b505af11580156137df573d6000803e3d6000fd5b505050507fd28f69cf4df1f60ab7617e7a45ff83d9ea9c984c0839ca7c7bbea0654520b1758383836040516128b593929190614348565b6001600160a01b03831661383c5760405162461bcd60e51b815260040161033590614c16565b6001600160a01b0382166138625760405162461bcd60e51b815260040161033590614ffe565b6040517fa22cb4650000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063a22cb465906138a99085908590600401614400565b600060405180830381600087803b1580156138c357600080fd5b505af11580156138d7573d6000803e3d6000fd5b505050507fdd7643f09c4969b2b902e40fb0b08a3c9cbf7f60975628ed6c175e85c851e2228383836040516128b593929190614324565b600d805460ff1916821515179081905560ff1615613954576040517fc900358025f09a872d1a6e53c30e64a77566eada5220d1044c2636f83a0c8bcf90600090a161397e565b6040517ffb2915041896c6af47e9321d19194f79106105a83cf67d0262283fb48cebf14890600090a15b50565b6001600160a01b0381166139a75760405162461bcd60e51b815260040161033590614535565b6001600160a01b03811660009081526007602052604090205460ff166139df5760405162461bcd60e51b81526004016103359061523b565b6001600160a01b0381166000908152600760205260408120805460ff191690556008805460019290613a12908490615372565b90915550506040517fc6e35658c76ecdde40a54f31a91fb7c8615e9893cc0885584b27bb3433270d4690612cd0908390614310565b6001600160a01b038316613a6d5760405162461bcd60e51b815260040161033590614592565b6001600160a01b038216613a935760405162461bcd60e51b8152600401610335906147f7565b6040517fa22cb4650000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063a22cb46590613ada9085908590600401614400565b600060405180830381600087803b158015613af457600080fd5b505af1158015613b08573d6000803e3d6000fd5b505050507fa7bccb6e0f084533659b39f9e36504532604da7f98afa2c4763a0ab3224a4c2b8383836040516128b593929190614324565b6001600160a01b038116613b655760405162461bcd60e51b8152600401610335906150b8565b6001600160a01b0381166000908152600b602052604090205460ff1615613b9e5760405162461bcd60e51b8152600401610335906149d9565b6001600160a01b0381166000908152600b60205260408120805460ff19166001908117909155600c805491929091613bd790849061533a565b90915550506040517f71e5b5f10a15e7289cadf7a68cf7be4dd27de56f07efc169e0de27e0a3114f8a90612cd0908390614310565b6000613c17826124c1565b613c335760405162461bcd60e51b815260040161033590614b27565b613c3c826124d5565b15613c62576002600454613c509190615352565b613c5b90600161533a565b9050610a3a565b6002600854613c509190615352565b828054613c7d906153b5565b90600052602060002090601f016020900481019282613c9f5760008555613ce5565b82601f10613cb857805160ff1916838001178555613ce5565b82800160010185558215613ce5579182015b82811115613ce5578251825591602001919060010190613cca565b50613cf1929150613cf5565b5090565b5b80821115613cf15760008155600101613cf6565b80356001600160a01b0381168114610a3a57600080fd5b60008083601f840112613d32578081fd5b50813567ffffffffffffffff811115613d49578182fd5b6020830191508360208083028501011115613d6357600080fd5b9250929050565b60008083601f840112613d7b578182fd5b50813567ffffffffffffffff811115613d92578182fd5b602083019150836020828501011115613d6357600080fd5b600082601f830112613dba578081fd5b813567ffffffffffffffff80821115613dd557613dd5615439565b604051601f8301601f19908116603f01168101908282118183101715613dfd57613dfd615439565b81604052838152866020858801011115613e15578485fd5b8360208701602083013792830160200193909352509392505050565b600060208284031215613e42578081fd5b613e4b82613d0a565b9392505050565b60008060008060008060008060a0898b031215613e6d578384fd5b613e7689613d0a565b9750613e8460208a01613d0a565b9650604089013567ffffffffffffffff80821115613ea0578586fd5b613eac8c838d01613d21565b909850965060608b0135915080821115613ec4578586fd5b613ed08c838d01613d21565b909650945060808b0135915080821115613ee8578384fd5b50613ef58b828c01613d6a565b999c989b5096995094979396929594505050565b600080600080600060808688031215613f20578081fd5b613f2986613d0a565b9450613f3760208701613d0a565b935060408601359250606086013567ffffffffffffffff811115613f59578182fd5b613f6588828901613d6a565b969995985093965092949392505050565b60008060008060008060a08789031215613f8e578182fd5b613f9787613d0a565b9550613fa560208801613d0a565b94506040870135935060608701359250608087013567ffffffffffffffff811115613fce578283fd5b613fda89828a01613d6a565b979a9699509497509295939492505050565b60008060408385031215613ffe578182fd5b61400783613d0a565b946020939093013593505050565b600060208284031215614026578081fd5b8151613e4b8161544f565b600060208284031215614042578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114613e4b578182fd5b600060208284031215614082578081fd5b813567ffffffffffffffff811115614098578182fd5b6140a484828501613daa565b949350505050565b6000602082840312156140bd578081fd5b5035919050565b6000602082840312156140d5578081fd5b5051919050565b600080604083850312156140ee578182fd5b823591506140fe60208401613d0a565b90509250929050565b60008060006060848603121561411b578283fd5b8335925061412b60208501613d0a565b915061413960408501613d0a565b90509250925092565b60008060008060808587031215614157578182fd5b8435935061416760208601613d0a565b925061417560408601613d0a565b915060608501356141858161544f565b939692955090935050565b600080600080608085870312156141a5578182fd5b843593506141b560208601613d0a565b92506141c360408601613d0a565b9396929550929360600135925050565b600080600080600060a086880312156141ea578283fd5b853594506141fa60208701613d0a565b935061420860408701613d0a565b94979396509394606081013594506080013592915050565b600080600060608486031215614234578081fd5b8335925061424460208501613d0a565b9150604084013590509250925092565b60008060408385031215614266578182fd5b8235915060208301356142788161544f565b809150509250929050565b60008060408385031215614295578182fd5b82359150602083013567ffffffffffffffff8111156142b2578182fd5b6142be85828601613daa565b9150509250929050565b600081518084526142e0816020860160208601615389565b601f01601f19169290920160200192915050565b60008251614306818460208701615389565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039384168152919092166020820152604081019190915260806060820181905260009082015260a00190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b600060208252613e4b60208301846142c8565b60006040825261449260408301856142c8565b905082151560208301529392505050565b6020808252602d908201527f46696e616c697a6572526f6c65456e61626c65643a206e6f7420612066696e6160408201527f6c697a6572206163636f756e7400000000000000000000000000000000000000606082015260800190565b6020808252818101527f5461736b4d616e616765643a207461736b20646f6573206e6f74206578697374604082015260600190565b60208082526030908201527f417070726f766572526f6c65456e61626c65643a207a65726f206163636f756e60408201527f742063616e6e6f74206265207573656400000000000000000000000000000000606082015260800190565b6020808252601f908201527f4552433732315661756c743a207a65726f20746f6b656e206164647265737300604082015260600190565b6020808252602d908201527f43726561746f72526f6c65456e61626c65643a20616c7265616479206120637260408201527f6561746f72206163636f756e7400000000000000000000000000000000000000606082015260800190565b60208082526022908201527f5461736b4d616e616765723a2066616c6c6261636b20616c776179732066616960408201527f6c73000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602c908201527f4578656375746f72526f6c65456e61626c65643a206e6f7420616e206578656360408201527f75746f72206163636f756e740000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f5461736b4d616e616765723a206e6f7420616e2061646d696e206163636f756e60408201527f7400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f5461736b4d616e616765643a207461736b20697320616c72656164792061707060408201527f726f766564000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f4554485661756c743a207472616e73666572206d6f7265207468616e2062616c60408201527f616e636500000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f4552433732315661756c743a207a65726f206164647265737320666f72206f7060408201527f657261746f720000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602f908201527f43726561746f72526f6c65456e61626c65643a207a65726f206163636f756e7460408201527f2063616e6e6f7420626520757365640000000000000000000000000000000000606082015260800190565b6020808252601a908201527f45524332305661756c743a20616d6f756e74206973207a65726f000000000000604082015260600190565b6020808252601c908201527f4554485661756c743a206661696c656420746f207472616e7366657200000000604082015260600190565b60208082526030908201527f4578656375746f72526f6c65456e61626c65643a207a65726f206163636f756e60408201527f742063616e6e6f74206265207573656400000000000000000000000000000000606082015260800190565b6020808252602a908201527f4554485661756c74456e61626c65643a2063616e6e6f7420736574207468652060408201527f73616d652076616c756500000000000000000000000000000000000000000000606082015260800190565b60208082526031908201527f46696e616c697a6572526f6c65456e61626c65643a20616c726561647920612060408201527f66696e616c697a6572206163636f756e74000000000000000000000000000000606082015260800190565b60208082526030908201527f417070726f766572526f6c65456e61626c65643a20616c726561647920616e2060408201527f617070726f766572206163636f756e7400000000000000000000000000000000606082015260800190565b60208082526018908201527f4554485661756c743a20616d6f756e74206973207a65726f0000000000000000604082015260600190565b60208082526030908201527f4578656375746f72526f6c65456e61626c65643a20616c726561647920616e2060408201527f6578656375746f72206163636f756e7400000000000000000000000000000000606082015260800190565b6020808252818101527f5461736b4d616e616765723a207461736b20646f6573206e6f74206578697374604082015260600190565b60208082526024908201527f45524332305661756c743a207a65726f206164647265737320666f722073706560408201527f6e64657200000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526029908201527f43726561746f72526f6c65456e61626c65643a206e6f7420612063726561746f60408201527f72206163636f756e740000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f455243313135355661756c743a207a65726f20746f6b656e2061646472657373604082015260600190565b6020808252603d908201527f41646d696e526f6c65456e61626c65643a20676f65732062656c6f77206d696e60408201527f696d756d206e756d626572206f662061646d696e206163636f756e7473000000606082015260800190565b60208082526021908201527f5461736b4d616e616765643a207461736b206973206e6f7420617070726f766560408201527f6400000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f45524332305661756c743a207a65726f20746f6b656e20616464726573730000604082015260600190565b60208082526025908201527f455243313135355661756c743a2063616e6e6f74207472616e7366657220746f60408201527f207a65726f000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f41646d696e526f6c65456e61626c65643a206e6f7420616e2061646d696e206160408201527f63636f756e740000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602d908201527f41646d696e526f6c65456e61626c65643a207a65726f206163636f756e74206360408201527f616e6e6f74206265207573656400000000000000000000000000000000000000606082015260800190565b60208082526032908201527f43726561746f72526f6c65456e61626c65643a206e6f7420612063726561746f60408201527f72206f722061646d696e206163636f756e740000000000000000000000000000606082015260800190565b6020808252603a908201527f41646d696e526f6c65456e61626c65643a2065786365656473206d6178696d7560408201527f6d206e756d626572206f662061646d696e206163636f756e7473000000000000606082015260800190565b60208082526023908201527f45524332305661756c743a2063616e6e6f74207472616e7366657220746f207a60408201527f65726f0000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f45524332305661756c743a207472616e73666572206d6f7265207468616e206260408201527f616c616e63650000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f5461736b4d616e616765643a207461736b2069732066696e616c697a65640000604082015260600190565b60208082526027908201527f455243313135355661756c743a207a65726f206164647265737320666f72206f60408201527f70657261746f7200000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f5461736b4d616e616765723a206e6f7420612070726976696c6567656420616360408201527f636f756e74000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526031908201527f46696e616c697a6572526f6c65456e61626c65643a207a65726f206163636f7560408201527f6e742063616e6e6f742062652075736564000000000000000000000000000000606082015260800190565b6020808252818101527f5461736b4d616e616765723a2063616e6e6f7420616363657074206574686572604082015260600190565b60208082526024908201527f4552433732315661756c743a2063616e6e6f74207472616e7366657220746f2060408201527f7a65726f00000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f5461736b4d616e616765643a20696e76616c6964207461736b20747970650000604082015260600190565b6020808252602a908201527f41646d696e526f6c65456e61626c65643a20616c726561647920616e2061646d60408201527f696e206163636f756e7400000000000000000000000000000000000000000000606082015260800190565b6020808252602c908201527f417070726f766572526f6c65456e61626c65643a206e6f7420616e206170707260408201527f6f766572206163636f756e740000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f4554485661756c743a2063616e6e6f74207472616e7366657220746f207a657260408201527f6f00000000000000000000000000000000000000000000000000000000000000606082015260800190565b90815260200190565b6000838252604060208301526140a460408301846142c8565b948552602085019390935260408401919091526060830152608082015260a00190565b6000821982111561534d5761534d615423565b500190565b60008261536d57634e487b7160e01b81526012600452602481fd5b500490565b60008282101561538457615384615423565b500390565b60005b838110156153a457818101518382015260200161538c565b83811115610ae25750506000910152565b6002810460018216806153c957607f821691505b60208210811415610d8c57634e487b7160e01b600052602260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561541c5761541c615423565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461397e57600080fdfea26469706673582212205a7413348f098222aacf539bc64fe7236d3090108a527471fb18b8969d78c1fc64736f6c634300080100335461736b4d616e616765723a206e6f7420656e6f75676820696e697469616c2000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004000000000000000000000000c615db34d128a4ee002006d76897934f0b13b62d00000000000000000000000055c84dd2f587885129d448315499fa92b5d06f81000000000000000000000000548730ef6c35ccac1caa7772c2f24d153ef3b1d90000000000000000000000006443fd423ff590d40ec784e3fb17b753684f3e990000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c615db34d128a4ee002006d76897934f0b13b62d0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000c615db34d128a4ee002006d76897934f0b13b62d0000000000000000000000006443fd423ff590d40ec784e3fb17b753684f3e9900000000000000000000000055c84dd2f587885129d448315499fa92b5d06f810000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c615db34d128a4ee002006d76897934f0b13b62d
Deployed Bytecode
0x60806040526004361061030c5760003560e01c80637ec9152f1161019a578063bb6c352c116100e1578063dbdc814b1161008a578063f049076911610064578063f0490769146108ef578063f23a6e611461090f578063f9a7640b1461092f57610340565b8063dbdc814b1461088f578063debfda30146108af578063efd46065146108cf57610340565b8063cbe4c6ef116100bb578063cbe4c6ef14610834578063d06dcc5114610854578063d80528ae1461086957610340565b8063bb6c352c146107d4578063bc197c81146107f4578063c9d14c141461081457610340565b8063976d577011610143578063a37ef8f81161011d578063a37ef8f814610774578063b42aebd114610794578063b544414e146107b457610340565b8063976d57701461071f5780639d6aacb01461073f578063a36b626f1461075457610340565b806389d936371161017457806389d93637146106bf5780638d134ad0146106df5780638f4ac625146106ff57610340565b80637ec9152f1461066a5780637fcd7e0f1461068a57806382a224561461069f57610340565b8063304549971161025e5780635f13c947116102075780636d633a5c116101e15780636d633a5c146105fd57806370fbe9ff1461062a5780637eb0bdc91461064a57610340565b80635f13c9471461059d5780636a83f109146105bd5780636d218e48146105dd57610340565b80634895cdb5116102385780634895cdb5146105485780635317234e146105685780635656fc781461058857610340565b806330454997146104e857806333727c4d14610508578063374fea911461052857610340565b806315d54406116102c057806324d7806c1161029a57806324d7806c14610488578063292fd8f0146104a85780632d31479b146104c857610340565b806315d544061461041b57806318d07e7c1461043b578063248bec701461045b57610340565b8063111002aa116102f1578063111002aa146103ae57806314779cda146103ce578063150b7a02146103ee57610340565b806301ffc9a7146103585780630a07fae61461038e57610340565b366103405761031961094f565b61033e5760405162461bcd60e51b815260040161033590615115565b60405180910390fd5b005b60405162461bcd60e51b815260040161033590614626565b34801561036457600080fd5b50610378610373366004614031565b610958565b6040516103859190614434565b60405180910390f35b34801561039a57600080fd5b5061033e6103a93660046140ac565b610a3f565b3480156103ba57600080fd5b5061033e6103c9366004614071565b610ae8565b3480156103da57600080fd5b5061033e6103e9366004614190565b610b1c565b3480156103fa57600080fd5b5061040e610409366004613f09565b610c08565b604051610385919061443f565b34801561042757600080fd5b5061033e6104363660046140ac565b610c32565b34801561044757600080fd5b5061033e610456366004614071565b610ca3565b34801561046757600080fd5b5061047b6104763660046140ac565b610cd3565b604051610385919061446c565b34801561049457600080fd5b506103786104a3366004613e31565b610d92565b3480156104b457600080fd5b5061033e6104c33660046140ac565b610dc2565b3480156104d457600080fd5b5061033e6104e33660046141d3565b610e64565b3480156104f457600080fd5b5061033e6105033660046140ac565b610f52565b34801561051457600080fd5b506103786105233660046140ac565b610fc4565b34801561053457600080fd5b5061033e6105433660046140dc565b61107a565b34801561055457600080fd5b5061033e6105633660046140dc565b611162565b34801561057457600080fd5b5061033e6105833660046140dc565b611229565b34801561059457600080fd5b506103786112f0565b3480156105a957600080fd5b5061033e6105b83660046140dc565b611324565b3480156105c957600080fd5b5061033e6105d8366004613fec565b6113eb565b3480156105e957600080fd5b506103786105f8366004613e31565b61152c565b34801561060957600080fd5b5061061d6106183660046140ac565b61155c565b60405161038591906152f5565b34801561063657600080fd5b50610378610645366004613e31565b611612565b34801561065657600080fd5b5061033e6106653660046140dc565b611642565b34801561067657600080fd5b5061033e610685366004614220565b611709565b34801561069657600080fd5b5061061d6117f3565b3480156106ab57600080fd5b5061033e6106ba366004614190565b6117f8565b3480156106cb57600080fd5b5061033e6106da3660046140dc565b6118c1565b3480156106eb57600080fd5b5061033e6106fa366004614107565b611988565b34801561070b57600080fd5b5061033e61071a366004614190565b611a7a565b34801561072b57600080fd5b5061033e61073a3660046140dc565b611b43565b34801561074b57600080fd5b5061061d611c0a565b34801561076057600080fd5b5061033e61076f366004614283565b611c38565b34801561078057600080fd5b5061033e61078f366004614190565b611cf1565b3480156107a057600080fd5b5061033e6107af366004614142565b611dba565b3480156107c057600080fd5b5061033e6107cf366004614254565b611e83565b3480156107e057600080fd5b5061033e6107ef3660046140dc565b611f75565b34801561080057600080fd5b5061040e61080f366004613e52565b61203c565b34801561082057600080fd5b5061033e61082f366004614283565b612069565b34801561084057600080fd5b5061033e61084f366004614142565b6120da565b34801561086057600080fd5b5061061d6121a3565b34801561087557600080fd5b5061087e6121a8565b604051610385959493929190615317565b34801561089b57600080fd5b5061033e6108aa3660046140dc565b6121f2565b3480156108bb57600080fd5b506103786108ca366004613e31565b6122b9565b3480156108db57600080fd5b506103786108ea366004613e31565b6122e9565b3480156108fb57600080fd5b5061033e61090a366004613fec565b612319565b34801561091b57600080fd5b5061040e61092a366004613f76565b6123b1565b34801561093b57600080fd5b5061033e61094a3660046140dc565b6123dc565b600d5460ff1690565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f9acaf6600000000000000000000000000000000000000000000000000000000014806109eb57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b80610a3757507fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000145b90505b919050565b610a48336124a3565b610a645760405162461bcd60e51b81526004016103359061523b565b80610a6e816124c1565b610a8a5760405162461bcd60e51b815260040161033590614500565b81610a94816124d5565b15610ab15760405162461bcd60e51b8152600401610335906151a7565b82610abb81612515565b15610ad85760405162461bcd60e51b815260040161033590614fc7565b610ae23385612555565b50505050565b610af133612647565b610b0d5760405162461bcd60e51b815260040161033590614bb9565b610b18816000612665565b5050565b610b2533612752565b610b415760405162461bcd60e51b815260040161033590614d99565b83610b4b816124c1565b610b675760405162461bcd60e51b815260040161033590614500565b84610b71816124d5565b610b8d5760405162461bcd60e51b8152600401610335906151a7565b85610b9781612515565b15610bb45760405162461bcd60e51b815260040161033590614fc7565b86610bbe81612770565b610bda5760405162461bcd60e51b815260040161033590614ca8565b610be58787876127bb565b610bfe88604051806020016040528060008152506128c2565b5050505050505050565b7f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f95945050505050565b610c3b33612752565b610c575760405162461bcd60e51b815260040161033590614d99565b80610c61816124c1565b610c7d5760405162461bcd60e51b815260040161033590614500565b81610c87816124d5565b610ab15760405162461bcd60e51b8152600401610335906151a7565b610cac33612752565b610cc85760405162461bcd60e51b815260040161033590614d99565b610b18816001612665565b6060610cde33612752565b80610ced5750610ced33612647565b80610cfc5750610cfc336124a3565b80610d0b5750610d0b33612935565b610d275760405162461bcd60e51b81526004016103359061505b565b81610d31816124c1565b610d4d5760405162461bcd60e51b815260040161033590614500565b610d56836124d5565b15610d8057610d6433612752565b610d805760405162461bcd60e51b8152600401610335906146e0565b610d8983612953565b91505b50919050565b6000610d9d33612752565b610db95760405162461bcd60e51b815260040161033590614d99565b610a3782612752565b610dcb33612752565b610de75760405162461bcd60e51b815260040161033590614d99565b80610df1816124c1565b610e0d5760405162461bcd60e51b815260040161033590614500565b81610e17816124d5565b610e335760405162461bcd60e51b8152600401610335906151a7565b82610e3d81612515565b15610e5a5760405162461bcd60e51b815260040161033590614fc7565b610ae23385612a1b565b610e6d33612752565b610e895760405162461bcd60e51b815260040161033590614d99565b84610e93816124c1565b610eaf5760405162461bcd60e51b815260040161033590614500565b85610eb9816124d5565b610ed55760405162461bcd60e51b8152600401610335906151a7565b86610edf81612515565b15610efc5760405162461bcd60e51b815260040161033590614fc7565b87610f0681612770565b610f225760405162461bcd60e51b815260040161033590614ca8565b610f2e88888888612afe565b610f4789604051806020016040528060008152506128c2565b505050505050505050565b610f5b336124a3565b610f775760405162461bcd60e51b81526004016103359061523b565b80610f81816124c1565b610f9d5760405162461bcd60e51b815260040161033590614500565b81610fa7816124d5565b15610e335760405162461bcd60e51b8152600401610335906151a7565b6000610fcf33612752565b80610fde5750610fde33612647565b80610fed5750610fed336124a3565b80610ffc5750610ffc33612935565b6110185760405162461bcd60e51b81526004016103359061505b565b81611022816124c1565b61103e5760405162461bcd60e51b815260040161033590614500565b611047836124d5565b156110715761105533612752565b6110715760405162461bcd60e51b8152600401610335906146e0565b610d8983612515565b61108333612752565b61109f5760405162461bcd60e51b815260040161033590614d99565b816110a9816124c1565b6110c55760405162461bcd60e51b815260040161033590614500565b826110cf816124d5565b6110eb5760405162461bcd60e51b8152600401610335906151a7565b836110f581612515565b156111125760405162461bcd60e51b815260040161033590614fc7565b8461111c81612770565b6111385760405162461bcd60e51b815260040161033590614ca8565b61114185612c0a565b61115a86604051806020016040528060008152506128c2565b505050505050565b61116b33612752565b6111875760405162461bcd60e51b815260040161033590614d99565b81611191816124c1565b6111ad5760405162461bcd60e51b815260040161033590614500565b826111b7816124d5565b6111d35760405162461bcd60e51b8152600401610335906151a7565b836111dd81612515565b156111fa5760405162461bcd60e51b815260040161033590614fc7565b8461120481612770565b6112205760405162461bcd60e51b815260040161033590614ca8565b61114185612cdb565b61123233612752565b61124e5760405162461bcd60e51b815260040161033590614d99565b81611258816124c1565b6112745760405162461bcd60e51b815260040161033590614500565b8261127e816124d5565b61129a5760405162461bcd60e51b8152600401610335906151a7565b836112a481612515565b156112c15760405162461bcd60e51b815260040161033590614fc7565b846112cb81612770565b6112e75760405162461bcd60e51b815260040161033590614ca8565b61114185612da1565b60006112fb33612752565b6113175760405162461bcd60e51b815260040161033590614d99565b61131f61094f565b905090565b61132d33612752565b6113495760405162461bcd60e51b815260040161033590614d99565b81611353816124c1565b61136f5760405162461bcd60e51b815260040161033590614500565b82611379816124d5565b6113955760405162461bcd60e51b8152600401610335906151a7565b8361139f81612515565b156113bc5760405162461bcd60e51b815260040161033590614fc7565b846113c681612770565b6113e25760405162461bcd60e51b815260040161033590614ca8565b61114185612e6e565b6113f433612f3b565b6114105760405162461bcd60e51b8152600401610335906144a3565b8161141a81612935565b6114365760405162461bcd60e51b815260040161033590614683565b81611440816124c1565b61145c5760405162461bcd60e51b815260040161033590614500565b82611466816124d5565b6114825760405162461bcd60e51b8152600401610335906151a7565b8361148c81612770565b6114a85760405162461bcd60e51b815260040161033590614ca8565b846114b281612515565b156114cf5760405162461bcd60e51b815260040161033590614fc7565b6114e886604051806020016040528060008152506128c2565b7fb4b8589d8015ad1f83a922f4fd0d6498f557018656541ce92b6c18db2b70466133888860405161151b93929190614348565b60405180910390a150505050505050565b600061153733612752565b6115535760405162461bcd60e51b815260040161033590614d99565b610a37826124a3565b600061156733612752565b80611576575061157633612647565b806115855750611585336124a3565b80611594575061159433612935565b6115b05760405162461bcd60e51b81526004016103359061505b565b816115ba816124c1565b6115d65760405162461bcd60e51b815260040161033590614500565b6115df836124d5565b15611609576115ed33612752565b6116095760405162461bcd60e51b8152600401610335906146e0565b610d8983612f59565b600061161d33612752565b6116395760405162461bcd60e51b815260040161033590614d99565b610a3782612f3b565b61164b33612752565b6116675760405162461bcd60e51b815260040161033590614d99565b81611671816124c1565b61168d5760405162461bcd60e51b815260040161033590614500565b82611697816124d5565b6116b35760405162461bcd60e51b8152600401610335906151a7565b836116bd81612515565b156116da5760405162461bcd60e51b815260040161033590614fc7565b846116e481612770565b6117005760405162461bcd60e51b815260040161033590614ca8565b61114185612f96565b61171233612752565b61172e5760405162461bcd60e51b815260040161033590614d99565b82611738816124c1565b6117545760405162461bcd60e51b815260040161033590614500565b8361175e816124d5565b61177a5760405162461bcd60e51b8152600401610335906151a7565b8461178481612515565b156117a15760405162461bcd60e51b815260040161033590614fc7565b856117ab81612770565b6117c75760405162461bcd60e51b815260040161033590614ca8565b6117d1868661308b565b6117ea87604051806020016040528060008152506128c2565b50505050505050565b600481565b61180133612752565b61181d5760405162461bcd60e51b815260040161033590614d99565b83611827816124c1565b6118435760405162461bcd60e51b815260040161033590614500565b8461184d816124d5565b6118695760405162461bcd60e51b8152600401610335906151a7565b8561187381612515565b156118905760405162461bcd60e51b815260040161033590614fc7565b8661189a81612770565b6118b65760405162461bcd60e51b815260040161033590614ca8565b610be58787876131af565b6118ca33612752565b6118e65760405162461bcd60e51b815260040161033590614d99565b816118f0816124c1565b61190c5760405162461bcd60e51b815260040161033590614500565b82611916816124d5565b6119325760405162461bcd60e51b8152600401610335906151a7565b8361193c81612515565b156119595760405162461bcd60e51b815260040161033590614fc7565b8461196381612770565b61197f5760405162461bcd60e51b815260040161033590614ca8565b611141856132c8565b61199133612752565b6119ad5760405162461bcd60e51b815260040161033590614d99565b826119b7816124c1565b6119d35760405162461bcd60e51b815260040161033590614500565b836119dd816124d5565b6119f95760405162461bcd60e51b8152600401610335906151a7565b84611a0381612515565b15611a205760405162461bcd60e51b815260040161033590614fc7565b85611a2a81612770565b611a465760405162461bcd60e51b815260040161033590614ca8565b600a6004541415611a6857611a5a86612f96565b611a638561338e565b6117d1565b611a718561338e565b6117d186612f96565b611a8333612752565b611a9f5760405162461bcd60e51b815260040161033590614d99565b83611aa9816124c1565b611ac55760405162461bcd60e51b815260040161033590614500565b84611acf816124d5565b611aeb5760405162461bcd60e51b8152600401610335906151a7565b85611af581612515565b15611b125760405162461bcd60e51b815260040161033590614fc7565b86611b1c81612770565b611b385760405162461bcd60e51b815260040161033590614ca8565b610be587878761348a565b611b4c33612752565b611b685760405162461bcd60e51b815260040161033590614d99565b81611b72816124c1565b611b8e5760405162461bcd60e51b815260040161033590614500565b82611b98816124d5565b611bb45760405162461bcd60e51b8152600401610335906151a7565b83611bbe81612515565b15611bdb5760405162461bcd60e51b815260040161033590614fc7565b84611be581612770565b611c015760405162461bcd60e51b815260040161033590614ca8565b61114185613677565b6000611c1533612752565b611c315760405162461bcd60e51b815260040161033590614d99565b5060045490565b611c4133612647565b80611c505750611c5033612752565b611c6c5760405162461bcd60e51b815260040161033590614e53565b81611c76816124c1565b611c925760405162461bcd60e51b815260040161033590614500565b82611c9c816124d5565b15611cb95760405162461bcd60e51b8152600401610335906151a7565b83611cc381612515565b15611ce05760405162461bcd60e51b815260040161033590614fc7565b611cea85856128c2565b5050505050565b611cfa33612752565b611d165760405162461bcd60e51b815260040161033590614d99565b83611d20816124c1565b611d3c5760405162461bcd60e51b815260040161033590614500565b84611d46816124d5565b611d625760405162461bcd60e51b8152600401610335906151a7565b85611d6c81612515565b15611d895760405162461bcd60e51b815260040161033590614fc7565b86611d9381612770565b611daf5760405162461bcd60e51b815260040161033590614ca8565b610be5878787613744565b611dc333612752565b611ddf5760405162461bcd60e51b815260040161033590614d99565b83611de9816124c1565b611e055760405162461bcd60e51b815260040161033590614500565b84611e0f816124d5565b611e2b5760405162461bcd60e51b8152600401610335906151a7565b85611e3581612515565b15611e525760405162461bcd60e51b815260040161033590614fc7565b86611e5c81612770565b611e785760405162461bcd60e51b815260040161033590614ca8565b610be5878787613816565b611e8c33612752565b611ea85760405162461bcd60e51b815260040161033590614d99565b81611eb2816124c1565b611ece5760405162461bcd60e51b815260040161033590614500565b82611ed8816124d5565b611ef45760405162461bcd60e51b8152600401610335906151a7565b83611efe81612515565b15611f1b5760405162461bcd60e51b815260040161033590614fc7565b84611f2581612770565b611f415760405162461bcd60e51b815260040161033590614ca8565b841515611f4c61094f565b15151415611f6c5760405162461bcd60e51b81526004016103359061497c565b6111418561390e565b611f7e33612752565b611f9a5760405162461bcd60e51b815260040161033590614d99565b81611fa4816124c1565b611fc05760405162461bcd60e51b815260040161033590614500565b82611fca816124d5565b611fe65760405162461bcd60e51b8152600401610335906151a7565b83611ff081612515565b1561200d5760405162461bcd60e51b815260040161033590614fc7565b8461201781612770565b6120335760405162461bcd60e51b815260040161033590614ca8565b61114185613981565b7fbc197c819b3e337a6f9652dd10becd7eef83032af3b9d958d3d42f669414662198975050505050505050565b61207233612752565b61208e5760405162461bcd60e51b815260040161033590614d99565b81612098816124c1565b6120b45760405162461bcd60e51b815260040161033590614500565b826120be816124d5565b611cb95760405162461bcd60e51b8152600401610335906151a7565b6120e333612752565b6120ff5760405162461bcd60e51b815260040161033590614d99565b83612109816124c1565b6121255760405162461bcd60e51b815260040161033590614500565b8461212f816124d5565b61214b5760405162461bcd60e51b8152600401610335906151a7565b8561215581612515565b156121725760405162461bcd60e51b815260040161033590614fc7565b8661217c81612770565b6121985760405162461bcd60e51b815260040161033590614ca8565b610be5878787613a47565b600a81565b60008060008060006121b933612752565b6121d55760405162461bcd60e51b815260040161033590614d99565b5050600454600654600854600a54600c5493979296509094509250565b6121fb33612752565b6122175760405162461bcd60e51b815260040161033590614d99565b81612221816124c1565b61223d5760405162461bcd60e51b815260040161033590614500565b82612247816124d5565b6122635760405162461bcd60e51b8152600401610335906151a7565b8361226d81612515565b1561228a5760405162461bcd60e51b815260040161033590614fc7565b8461229481612770565b6122b05760405162461bcd60e51b815260040161033590614ca8565b6111418561338e565b60006122c433612752565b6122e05760405162461bcd60e51b815260040161033590614d99565b610a3782612935565b60006122f433612752565b6123105760405162461bcd60e51b815260040161033590614d99565b610a3782612647565b61232233612f3b565b61233e5760405162461bcd60e51b8152600401610335906144a3565b8161234881612935565b6123645760405162461bcd60e51b815260040161033590614683565b8161236e816124c1565b61238a5760405162461bcd60e51b815260040161033590614500565b82612394816124d5565b156114825760405162461bcd60e51b8152600401610335906151a7565b7ff23a6e612e1ff4830e658fe43f4e3cb4a5f8170bd5d9e69fb5d7a7fa9e4fdf979695505050505050565b6123e533612752565b6124015760405162461bcd60e51b815260040161033590614d99565b8161240b816124c1565b6124275760405162461bcd60e51b815260040161033590614500565b82612431816124d5565b61244d5760405162461bcd60e51b8152600401610335906151a7565b8361245781612515565b156124745760405162461bcd60e51b815260040161033590614fc7565b8461247e81612770565b61249a5760405162461bcd60e51b815260040161033590614ca8565b61114185613b3f565b6001600160a01b031660009081526007602052604090205460ff1690565b600090815260208190526040902054151590565b60006124e0826124c1565b6124fc5760405162461bcd60e51b815260040161033590614500565b5060009081526020819052604090206002015460ff1690565b6000612520826124c1565b61253c5760405162461bcd60e51b815260040161033590614500565b5060009081526020819052604090206004015460ff1690565b61255e816124c1565b61257a5760405162461bcd60e51b815260040161033590614500565b60008181526001602090815260408083206001600160a01b038616845290915290205460ff16156125bd5760405162461bcd60e51b81526004016103359061473d565b60008181526001602081815260408084206001600160a01b03871685528252808420805460ff19168417905584845290839052822060030180549192909161260690849061533a565b90915550506040517f3e9d27a1c2a828db29e4b2a17fbd1bc70201ef21aec4f74b9fa051b02e38e3f09061263b9083906152f5565b60405180910390a15050565b6001600160a01b031660009081526005602052604090205460ff1690565b60028054600091819083612678836153ea565b90915550506040805160a081018252828152602080820187815286151583850152600060608401819052608084018190528581528083529390932082518155925180519293849390926126d2926001850192910190613c71565b5060408281015160028301805491151560ff19928316179055606084015160038401556080909301516004909201805492151592909316919091179091555182907f05d0fb833127fc08168556d0e7ca9554fc3f6bc843b3b7d2bf1c35aea6bab66090612742908890889061447f565b60405180910390a2509392505050565b6001600160a01b031660009081526003602052604090205460ff1690565b600061277b826124c1565b6127975760405162461bcd60e51b815260040161033590614500565b6127a082613c0c565b60008381526020819052604090206003015410159050919050565b6001600160a01b0383166127e15760405162461bcd60e51b815260040161033590614592565b6001600160a01b0382166128075760405162461bcd60e51b81526004016103359061514a565b6040517fb88d4fde0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063b88d4fde906128509030908690869060040161436c565b600060405180830381600087803b15801561286a57600080fd5b505af115801561287e573d6000803e3d6000fd5b505050507fcd68d836931d28b26c81fd06a68b603542d9b3a2fd1ba1c1bd30c9e2e5f4e6eb8383836040516128b593929190614348565b60405180910390a1505050565b6128cb826124c1565b6128e75760405162461bcd60e51b815260040161033590614500565b60008281526020819052604090819020600401805460ff19166001179055517fe5516cdd051314d9e1a70e80776a58d2064a5468c26b2f1a7e13cd96ab2d65079061263b90849084906152fe565b6001600160a01b031660009081526009602052604090205460ff1690565b606061295e826124c1565b61297a5760405162461bcd60e51b815260040161033590614500565b60008281526020819052604090206001018054612996906153b5565b80601f01602080910402602001604051908101604052809291908181526020018280546129c2906153b5565b8015612a0f5780601f106129e457610100808354040283529160200191612a0f565b820191906000526020600020905b8154815290600101906020018083116129f257829003601f168201915b50505050509050919050565b612a24816124c1565b612a405760405162461bcd60e51b815260040161033590614500565b60008181526001602090815260408083206001600160a01b038616845290915290205460ff16612a825760405162461bcd60e51b815260040161033590614ca8565b60008181526001602081815260408084206001600160a01b03871685528252808420805460ff19169055848452908390528220600301805491929091612ac9908490615372565b90915550506040517fb2d3b7ccb3dd8e3420904dd2c5cf01ddbe69777044e015eb3c56294506067bab9061263b9083906152f5565b6001600160a01b038416612b245760405162461bcd60e51b815260040161033590614c16565b6001600160a01b038316612b4a5760405162461bcd60e51b815260040161033590614d3c565b6040517ff242432a0000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063f242432a90612b959030908790879087906004016143c8565b600060405180830381600087803b158015612baf57600080fd5b505af1158015612bc3573d6000803e3d6000fd5b505050507f33627cfa024b2c6aba9bb8060d9b3112240af2250621855495464379de6ab1b584848484604051612bfc949392919061439f565b60405180910390a150505050565b6001600160a01b038116612c305760405162461bcd60e51b815260040161033590614854565b6001600160a01b03811660009081526005602052604090205460ff16612c685760405162461bcd60e51b815260040161033590614bb9565b6001600160a01b0381166000908152600560205260408120805460ff191690556006805460019290612c9b908490615372565b90915550506040517f94a409f50d78dc8628b7499ba5af0848a134b9a935a59c0a45313b67f66920f890612cd0908390614310565b60405180910390a150565b6001600160a01b038116612d015760405162461bcd60e51b8152600401610335906150b8565b6001600160a01b0381166000908152600b602052604090205460ff16612d395760405162461bcd60e51b8152600401610335906144a3565b6001600160a01b0381166000908152600b60205260408120805460ff19169055600c805460019290612d6c908490615372565b90915550506040517f69876ed6762df72762082100c5690190c4b64d6226f20712d3d8deb06053893890612cd0908390614310565b6001600160a01b038116612dc75760405162461bcd60e51b815260040161033590614535565b6001600160a01b03811660009081526007602052604090205460ff1615612e005760405162461bcd60e51b815260040161033590614a36565b6001600160a01b0381166000908152600760205260408120805460ff191660019081179091556008805491929091612e3990849061533a565b90915550506040517f835bddf1ceee4956e4329af9edf018523c1191238187a597453f6020bcadb04290612cd0908390614310565b6001600160a01b038116612e945760405162461bcd60e51b81526004016103359061491f565b6001600160a01b03811660009081526009602052604090205460ff1615612ecd5760405162461bcd60e51b815260040161033590614aca565b6001600160a01b0381166000908152600960205260408120805460ff19166001908117909155600a805491929091612f0690849061533a565b90915550506040517fae5b7c3b000f575c241001dc9bcb3d8778376889353b07121115574eceff78c590612cd0908390614310565b6001600160a01b03166000908152600b602052604090205460ff1690565b6000612f64826124c1565b612f805760405162461bcd60e51b815260040161033590614500565b5060009081526020819052604090206003015490565b6001600160a01b038116612fbc5760405162461bcd60e51b815260040161033590614df6565b6001600160a01b03811660009081526003602052604090205460ff16612ff45760405162461bcd60e51b815260040161033590614d99565b600460016004546130059190615372565b10156130235760405162461bcd60e51b815260040161033590614c4b565b6001600160a01b0381166000908152600360205260408120805460ff191690556004805460019290613056908490615372565b90915550506040517fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f90612cd0908390614310565b6001600160a01b0382166130b15760405162461bcd60e51b815260040161033590615298565b600081116130d15760405162461bcd60e51b815260040161033590614a93565b478111156130f15760405162461bcd60e51b81526004016103359061479a565b604080516000808252602082019092526001600160a01b03841690839060405161311b91906142f4565b60006040518083038185875af1925050503d8060008114613158576040519150601f19603f3d011682016040523d82523d6000602084013e61315d565b606091505b505090508061317e5760405162461bcd60e51b8152600401610335906148e8565b7f1445764fe3fdfc2a9812ff42e9b65c2e7896d5162851f78f7d4a5578f7346ff183836040516128b592919061441b565b6001600160a01b0383166131d55760405162461bcd60e51b815260040161033590614d05565b6001600160a01b0382166131fb5760405162461bcd60e51b815260040161033590614b5c565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063095ea7b390613242908590859060040161441b565b602060405180830381600087803b15801561325c57600080fd5b505af1158015613270573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132949190614015565b507fe285444a44723385de85da4844cbb9105030b82a9300a3ffca99054d624c5e308383836040516128b593929190614348565b6001600160a01b0381166132ee5760405162461bcd60e51b81526004016103359061491f565b6001600160a01b03811660009081526009602052604090205460ff166133265760405162461bcd60e51b815260040161033590614683565b6001600160a01b0381166000908152600960205260408120805460ff19169055600a805460019290613359908490615372565b90915550506040517f4a2cf608bfb427f53279ec7f0eadf48913b9346ccefc3af138dbdec14ea0907d90612cd0908390614310565b6001600160a01b0381166133b45760405162461bcd60e51b815260040161033590614df6565b6001600160a01b03811660009081526003602052604090205460ff16156133ed5760405162461bcd60e51b8152600401610335906151de565b600a60045460016133fe919061533a565b111561341c5760405162461bcd60e51b815260040161033590614eb0565b6001600160a01b0381166000908152600360205260408120805460ff19166001908117909155600480549192909161345590849061533a565b90915550506040517f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e33990612cd0908390614310565b6001600160a01b0383166134b05760405162461bcd60e51b815260040161033590614d05565b6001600160a01b0382166134d65760405162461bcd60e51b815260040161033590614f0d565b600081116134f65760405162461bcd60e51b8152600401610335906148b1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038416906370a082319061353b903090600401614310565b60206040518083038186803b15801561355357600080fd5b505afa158015613567573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061358b91906140c4565b8111156135aa5760405162461bcd60e51b815260040161033590614f6a565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063a9059cbb906135f1908590859060040161441b565b602060405180830381600087803b15801561360b57600080fd5b505af115801561361f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136439190614015565b507fe8de91d538b06154a2c48315768c5046f47e127d7fd3f726fd85cc723f29b0528383836040516128b593929190614348565b6001600160a01b03811661369d5760405162461bcd60e51b815260040161033590614854565b6001600160a01b03811660009081526005602052604090205460ff16156136d65760405162461bcd60e51b8152600401610335906145c9565b6001600160a01b0381166000908152600560205260408120805460ff19166001908117909155600680549192909161370f90849061533a565b90915550506040517f021a687fbe334e9e815cee8b399c0bc42e82356eb7f63a09ddb558a25d3dcdbd90612cd0908390614310565b6001600160a01b03831661376a5760405162461bcd60e51b815260040161033590614592565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063095ea7b3906137b1908590859060040161441b565b600060405180830381600087803b1580156137cb57600080fd5b505af11580156137df573d6000803e3d6000fd5b505050507fd28f69cf4df1f60ab7617e7a45ff83d9ea9c984c0839ca7c7bbea0654520b1758383836040516128b593929190614348565b6001600160a01b03831661383c5760405162461bcd60e51b815260040161033590614c16565b6001600160a01b0382166138625760405162461bcd60e51b815260040161033590614ffe565b6040517fa22cb4650000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063a22cb465906138a99085908590600401614400565b600060405180830381600087803b1580156138c357600080fd5b505af11580156138d7573d6000803e3d6000fd5b505050507fdd7643f09c4969b2b902e40fb0b08a3c9cbf7f60975628ed6c175e85c851e2228383836040516128b593929190614324565b600d805460ff1916821515179081905560ff1615613954576040517fc900358025f09a872d1a6e53c30e64a77566eada5220d1044c2636f83a0c8bcf90600090a161397e565b6040517ffb2915041896c6af47e9321d19194f79106105a83cf67d0262283fb48cebf14890600090a15b50565b6001600160a01b0381166139a75760405162461bcd60e51b815260040161033590614535565b6001600160a01b03811660009081526007602052604090205460ff166139df5760405162461bcd60e51b81526004016103359061523b565b6001600160a01b0381166000908152600760205260408120805460ff191690556008805460019290613a12908490615372565b90915550506040517fc6e35658c76ecdde40a54f31a91fb7c8615e9893cc0885584b27bb3433270d4690612cd0908390614310565b6001600160a01b038316613a6d5760405162461bcd60e51b815260040161033590614592565b6001600160a01b038216613a935760405162461bcd60e51b8152600401610335906147f7565b6040517fa22cb4650000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063a22cb46590613ada9085908590600401614400565b600060405180830381600087803b158015613af457600080fd5b505af1158015613b08573d6000803e3d6000fd5b505050507fa7bccb6e0f084533659b39f9e36504532604da7f98afa2c4763a0ab3224a4c2b8383836040516128b593929190614324565b6001600160a01b038116613b655760405162461bcd60e51b8152600401610335906150b8565b6001600160a01b0381166000908152600b602052604090205460ff1615613b9e5760405162461bcd60e51b8152600401610335906149d9565b6001600160a01b0381166000908152600b60205260408120805460ff19166001908117909155600c805491929091613bd790849061533a565b90915550506040517f71e5b5f10a15e7289cadf7a68cf7be4dd27de56f07efc169e0de27e0a3114f8a90612cd0908390614310565b6000613c17826124c1565b613c335760405162461bcd60e51b815260040161033590614b27565b613c3c826124d5565b15613c62576002600454613c509190615352565b613c5b90600161533a565b9050610a3a565b6002600854613c509190615352565b828054613c7d906153b5565b90600052602060002090601f016020900481019282613c9f5760008555613ce5565b82601f10613cb857805160ff1916838001178555613ce5565b82800160010185558215613ce5579182015b82811115613ce5578251825591602001919060010190613cca565b50613cf1929150613cf5565b5090565b5b80821115613cf15760008155600101613cf6565b80356001600160a01b0381168114610a3a57600080fd5b60008083601f840112613d32578081fd5b50813567ffffffffffffffff811115613d49578182fd5b6020830191508360208083028501011115613d6357600080fd5b9250929050565b60008083601f840112613d7b578182fd5b50813567ffffffffffffffff811115613d92578182fd5b602083019150836020828501011115613d6357600080fd5b600082601f830112613dba578081fd5b813567ffffffffffffffff80821115613dd557613dd5615439565b604051601f8301601f19908116603f01168101908282118183101715613dfd57613dfd615439565b81604052838152866020858801011115613e15578485fd5b8360208701602083013792830160200193909352509392505050565b600060208284031215613e42578081fd5b613e4b82613d0a565b9392505050565b60008060008060008060008060a0898b031215613e6d578384fd5b613e7689613d0a565b9750613e8460208a01613d0a565b9650604089013567ffffffffffffffff80821115613ea0578586fd5b613eac8c838d01613d21565b909850965060608b0135915080821115613ec4578586fd5b613ed08c838d01613d21565b909650945060808b0135915080821115613ee8578384fd5b50613ef58b828c01613d6a565b999c989b5096995094979396929594505050565b600080600080600060808688031215613f20578081fd5b613f2986613d0a565b9450613f3760208701613d0a565b935060408601359250606086013567ffffffffffffffff811115613f59578182fd5b613f6588828901613d6a565b969995985093965092949392505050565b60008060008060008060a08789031215613f8e578182fd5b613f9787613d0a565b9550613fa560208801613d0a565b94506040870135935060608701359250608087013567ffffffffffffffff811115613fce578283fd5b613fda89828a01613d6a565b979a9699509497509295939492505050565b60008060408385031215613ffe578182fd5b61400783613d0a565b946020939093013593505050565b600060208284031215614026578081fd5b8151613e4b8161544f565b600060208284031215614042578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114613e4b578182fd5b600060208284031215614082578081fd5b813567ffffffffffffffff811115614098578182fd5b6140a484828501613daa565b949350505050565b6000602082840312156140bd578081fd5b5035919050565b6000602082840312156140d5578081fd5b5051919050565b600080604083850312156140ee578182fd5b823591506140fe60208401613d0a565b90509250929050565b60008060006060848603121561411b578283fd5b8335925061412b60208501613d0a565b915061413960408501613d0a565b90509250925092565b60008060008060808587031215614157578182fd5b8435935061416760208601613d0a565b925061417560408601613d0a565b915060608501356141858161544f565b939692955090935050565b600080600080608085870312156141a5578182fd5b843593506141b560208601613d0a565b92506141c360408601613d0a565b9396929550929360600135925050565b600080600080600060a086880312156141ea578283fd5b853594506141fa60208701613d0a565b935061420860408701613d0a565b94979396509394606081013594506080013592915050565b600080600060608486031215614234578081fd5b8335925061424460208501613d0a565b9150604084013590509250925092565b60008060408385031215614266578182fd5b8235915060208301356142788161544f565b809150509250929050565b60008060408385031215614295578182fd5b82359150602083013567ffffffffffffffff8111156142b2578182fd5b6142be85828601613daa565b9150509250929050565b600081518084526142e0816020860160208601615389565b601f01601f19169290920160200192915050565b60008251614306818460208701615389565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039384168152919092166020820152604081019190915260806060820181905260009082015260a00190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b600060208252613e4b60208301846142c8565b60006040825261449260408301856142c8565b905082151560208301529392505050565b6020808252602d908201527f46696e616c697a6572526f6c65456e61626c65643a206e6f7420612066696e6160408201527f6c697a6572206163636f756e7400000000000000000000000000000000000000606082015260800190565b6020808252818101527f5461736b4d616e616765643a207461736b20646f6573206e6f74206578697374604082015260600190565b60208082526030908201527f417070726f766572526f6c65456e61626c65643a207a65726f206163636f756e60408201527f742063616e6e6f74206265207573656400000000000000000000000000000000606082015260800190565b6020808252601f908201527f4552433732315661756c743a207a65726f20746f6b656e206164647265737300604082015260600190565b6020808252602d908201527f43726561746f72526f6c65456e61626c65643a20616c7265616479206120637260408201527f6561746f72206163636f756e7400000000000000000000000000000000000000606082015260800190565b60208082526022908201527f5461736b4d616e616765723a2066616c6c6261636b20616c776179732066616960408201527f6c73000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602c908201527f4578656375746f72526f6c65456e61626c65643a206e6f7420616e206578656360408201527f75746f72206163636f756e740000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f5461736b4d616e616765723a206e6f7420616e2061646d696e206163636f756e60408201527f7400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f5461736b4d616e616765643a207461736b20697320616c72656164792061707060408201527f726f766564000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f4554485661756c743a207472616e73666572206d6f7265207468616e2062616c60408201527f616e636500000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f4552433732315661756c743a207a65726f206164647265737320666f72206f7060408201527f657261746f720000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602f908201527f43726561746f72526f6c65456e61626c65643a207a65726f206163636f756e7460408201527f2063616e6e6f7420626520757365640000000000000000000000000000000000606082015260800190565b6020808252601a908201527f45524332305661756c743a20616d6f756e74206973207a65726f000000000000604082015260600190565b6020808252601c908201527f4554485661756c743a206661696c656420746f207472616e7366657200000000604082015260600190565b60208082526030908201527f4578656375746f72526f6c65456e61626c65643a207a65726f206163636f756e60408201527f742063616e6e6f74206265207573656400000000000000000000000000000000606082015260800190565b6020808252602a908201527f4554485661756c74456e61626c65643a2063616e6e6f7420736574207468652060408201527f73616d652076616c756500000000000000000000000000000000000000000000606082015260800190565b60208082526031908201527f46696e616c697a6572526f6c65456e61626c65643a20616c726561647920612060408201527f66696e616c697a6572206163636f756e74000000000000000000000000000000606082015260800190565b60208082526030908201527f417070726f766572526f6c65456e61626c65643a20616c726561647920616e2060408201527f617070726f766572206163636f756e7400000000000000000000000000000000606082015260800190565b60208082526018908201527f4554485661756c743a20616d6f756e74206973207a65726f0000000000000000604082015260600190565b60208082526030908201527f4578656375746f72526f6c65456e61626c65643a20616c726561647920616e2060408201527f6578656375746f72206163636f756e7400000000000000000000000000000000606082015260800190565b6020808252818101527f5461736b4d616e616765723a207461736b20646f6573206e6f74206578697374604082015260600190565b60208082526024908201527f45524332305661756c743a207a65726f206164647265737320666f722073706560408201527f6e64657200000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526029908201527f43726561746f72526f6c65456e61626c65643a206e6f7420612063726561746f60408201527f72206163636f756e740000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f455243313135355661756c743a207a65726f20746f6b656e2061646472657373604082015260600190565b6020808252603d908201527f41646d696e526f6c65456e61626c65643a20676f65732062656c6f77206d696e60408201527f696d756d206e756d626572206f662061646d696e206163636f756e7473000000606082015260800190565b60208082526021908201527f5461736b4d616e616765643a207461736b206973206e6f7420617070726f766560408201527f6400000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f45524332305661756c743a207a65726f20746f6b656e20616464726573730000604082015260600190565b60208082526025908201527f455243313135355661756c743a2063616e6e6f74207472616e7366657220746f60408201527f207a65726f000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f41646d696e526f6c65456e61626c65643a206e6f7420616e2061646d696e206160408201527f63636f756e740000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602d908201527f41646d696e526f6c65456e61626c65643a207a65726f206163636f756e74206360408201527f616e6e6f74206265207573656400000000000000000000000000000000000000606082015260800190565b60208082526032908201527f43726561746f72526f6c65456e61626c65643a206e6f7420612063726561746f60408201527f72206f722061646d696e206163636f756e740000000000000000000000000000606082015260800190565b6020808252603a908201527f41646d696e526f6c65456e61626c65643a2065786365656473206d6178696d7560408201527f6d206e756d626572206f662061646d696e206163636f756e7473000000000000606082015260800190565b60208082526023908201527f45524332305661756c743a2063616e6e6f74207472616e7366657220746f207a60408201527f65726f0000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f45524332305661756c743a207472616e73666572206d6f7265207468616e206260408201527f616c616e63650000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f5461736b4d616e616765643a207461736b2069732066696e616c697a65640000604082015260600190565b60208082526027908201527f455243313135355661756c743a207a65726f206164647265737320666f72206f60408201527f70657261746f7200000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f5461736b4d616e616765723a206e6f7420612070726976696c6567656420616360408201527f636f756e74000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526031908201527f46696e616c697a6572526f6c65456e61626c65643a207a65726f206163636f7560408201527f6e742063616e6e6f742062652075736564000000000000000000000000000000606082015260800190565b6020808252818101527f5461736b4d616e616765723a2063616e6e6f7420616363657074206574686572604082015260600190565b60208082526024908201527f4552433732315661756c743a2063616e6e6f74207472616e7366657220746f2060408201527f7a65726f00000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f5461736b4d616e616765643a20696e76616c6964207461736b20747970650000604082015260600190565b6020808252602a908201527f41646d696e526f6c65456e61626c65643a20616c726561647920616e2061646d60408201527f696e206163636f756e7400000000000000000000000000000000000000000000606082015260800190565b6020808252602c908201527f417070726f766572526f6c65456e61626c65643a206e6f7420616e206170707260408201527f6f766572206163636f756e740000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f4554485661756c743a2063616e6e6f74207472616e7366657220746f207a657260408201527f6f00000000000000000000000000000000000000000000000000000000000000606082015260800190565b90815260200190565b6000838252604060208301526140a460408301846142c8565b948552602085019390935260408401919091526060830152608082015260a00190565b6000821982111561534d5761534d615423565b500190565b60008261536d57634e487b7160e01b81526012600452602481fd5b500490565b60008282101561538457615384615423565b500390565b60005b838110156153a457818101518382015260200161538c565b83811115610ae25750506000910152565b6002810460018216806153c957607f821691505b60208210811415610d8c57634e487b7160e01b600052602260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561541c5761541c615423565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b801515811461397e57600080fdfea26469706673582212205a7413348f098222aacf539bc64fe7236d3090108a527471fb18b8969d78c1fc64736f6c63430008010033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004000000000000000000000000c615db34d128a4ee002006d76897934f0b13b62d00000000000000000000000055c84dd2f587885129d448315499fa92b5d06f81000000000000000000000000548730ef6c35ccac1caa7772c2f24d153ef3b1d90000000000000000000000006443fd423ff590d40ec784e3fb17b753684f3e990000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c615db34d128a4ee002006d76897934f0b13b62d0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000c615db34d128a4ee002006d76897934f0b13b62d0000000000000000000000006443fd423ff590d40ec784e3fb17b753684f3e9900000000000000000000000055c84dd2f587885129d448315499fa92b5d06f810000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c615db34d128a4ee002006d76897934f0b13b62d
-----Decoded View---------------
Arg [0] : initialAdmins (address[]): 0xc615db34D128A4EE002006d76897934F0b13B62d,0x55C84dd2f587885129D448315499FA92B5d06f81,0x548730EF6C35CCaC1Caa7772c2F24d153Ef3b1d9,0x6443fd423Ff590d40EC784e3Fb17B753684F3e99
Arg [1] : initialCreators (address[]): 0xc615db34D128A4EE002006d76897934F0b13B62d
Arg [2] : initialApprovers (address[]): 0xc615db34D128A4EE002006d76897934F0b13B62d,0x6443fd423Ff590d40EC784e3Fb17B753684F3e99,0x55C84dd2f587885129D448315499FA92B5d06f81
Arg [3] : initialExecutors (address[]): 0xc615db34D128A4EE002006d76897934F0b13B62d
Arg [4] : enableDeposit (bool): True
-----Encoded View---------------
18 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000200
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [6] : 000000000000000000000000c615db34d128a4ee002006d76897934f0b13b62d
Arg [7] : 00000000000000000000000055c84dd2f587885129d448315499fa92b5d06f81
Arg [8] : 000000000000000000000000548730ef6c35ccac1caa7772c2f24d153ef3b1d9
Arg [9] : 0000000000000000000000006443fd423ff590d40ec784e3fb17b753684f3e99
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [11] : 000000000000000000000000c615db34d128a4ee002006d76897934f0b13b62d
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [13] : 000000000000000000000000c615db34d128a4ee002006d76897934f0b13b62d
Arg [14] : 0000000000000000000000006443fd423ff590d40ec784e3fb17b753684f3e99
Arg [15] : 00000000000000000000000055c84dd2f587885129d448315499fa92b5d06f81
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [17] : 000000000000000000000000c615db34d128a4ee002006d76897934f0b13b62d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.000446 | 8,133,573,831 | $3,624,157.83 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.