More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 242 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Approve Task | 17927771 | 317 days ago | IN | 0 ETH | 0.00215096 | ||||
Approve Task | 17927579 | 317 days ago | IN | 0 ETH | 0.00212726 | ||||
Approve Task | 17927573 | 317 days ago | IN | 0 ETH | 0.0028559 | ||||
Create Task | 17927569 | 317 days ago | IN | 0 ETH | 0.00303566 | ||||
Approve Task | 17619974 | 360 days ago | IN | 0 ETH | 0.00095349 | ||||
Approve Task | 17619971 | 360 days ago | IN | 0 ETH | 0.00126661 | ||||
Create Task | 17619946 | 360 days ago | IN | 0 ETH | 0.00131036 | ||||
Approve Task | 17088524 | 435 days ago | IN | 0 ETH | 0.00593613 | ||||
Approve Task | 17087003 | 436 days ago | IN | 0 ETH | 0.0033965 | ||||
Approve Task | 17087002 | 436 days ago | IN | 0 ETH | 0.00417168 | ||||
Create Task | 17086999 | 436 days ago | IN | 0 ETH | 0.00492721 | ||||
Approve Task | 17086979 | 436 days ago | IN | 0 ETH | 0.00273497 | ||||
Approve Task | 17086976 | 436 days ago | IN | 0 ETH | 0.00353081 | ||||
Create Task | 17086971 | 436 days ago | IN | 0 ETH | 0.00577739 | ||||
Approve Task | 17080724 | 436 days ago | IN | 0 ETH | 0.00439647 | ||||
Approve Task | 17080719 | 436 days ago | IN | 0 ETH | 0.00516624 | ||||
Create Task | 17080717 | 436 days ago | IN | 0 ETH | 0.0084552 | ||||
Approve Task | 17065781 | 439 days ago | IN | 0 ETH | 0.00167933 | ||||
Approve Task | 17065779 | 439 days ago | IN | 0 ETH | 0.00200428 | ||||
Create Task | 17065749 | 439 days ago | IN | 0 ETH | 0.00217968 | ||||
Approve Task | 16967218 | 453 days ago | IN | 0 ETH | 0.0012722 | ||||
Approve Task | 16941823 | 456 days ago | IN | 0 ETH | 0.00208137 | ||||
Create Task | 16939304 | 457 days ago | IN | 0 ETH | 0.0022687 | ||||
Approve Task | 16898540 | 462 days ago | IN | 0 ETH | 0.00161967 | ||||
Approve Task | 16898496 | 462 days ago | IN | 0 ETH | 0.00266893 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
arteQTaskManager
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 contracts written for artèQ Investment Fund (https://github.com/arteq-io/contracts). * Copyright (c) 2022 artèQ (https://arteq.io) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ // SPDX-License-Identifier: GNU General Public License v3.0 pragma solidity 0.8.1; import "../../arteq-tech/contracts/TaskManager.sol"; /// @notice Use at your own risk contract arteQTaskManager 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 onlyExecutor() { require(_isExecutor(msg.sender), "ExecutorRoleEnabled: not an executor 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 MAX_NR_OF_ADMINS = 10; uint public 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 minNrOfAdmins() external view returns (uint) { return MIN_NR_OF_ADMINS; } function maxNrOfAdmins() external view returns (uint) { return MAX_NR_OF_ADMINS; } 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":[],"name":"maxNrOfAdmins","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minNrOfAdmins","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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
6080604052600a600355600480553480156200001a57600080fd5b506040516200617a3803806200617a8339810160408190526200003d9162000774565b6001600255600060068190556008819055600a819055600c819055600e55600f805460ff1916905560045485518691869186918691869111156200009e5760405162461bcd60e51b8152600401620000959062000856565b60405180910390fd5b60005b8551811015620000f957620000e4868281518110620000d057634e487b7160e01b600052603260045260246000fd5b60200260200101516200029860201b60201c565b80620000f08162000c1d565b915050620000a1565b506001845110156200011f5760405162461bcd60e51b8152600401620000959062000a9f565b60005b84518110156200017a57620001658582815181106200015157634e487b7160e01b600052603260045260246000fd5b6020026020010151620003ae60201b60201c565b80620001718162000c1d565b91505062000122565b50600383511015620001a05760405162461bcd60e51b81526004016200009590620009c7565b60005b8351811015620001fb57620001e6848281518110620001d257634e487b7160e01b600052603260045260246000fd5b60200260200101516200048560201b60201c565b80620001f28162000c1d565b915050620001a3565b50600182511015620002215760405162461bcd60e51b8152600401620000959062000bca565b60005b82518110156200027c57620002678382815181106200025357634e487b7160e01b600052603260045260246000fd5b60200260200101516200055c60201b60201c565b80620002738162000c1d565b91505062000224565b50620002888162000633565b5050505050505050505062000c67565b6001600160a01b038116620002c15760405162461bcd60e51b8152600401620000959062000ad6565b6001600160a01b03811660009081526005602052604090205460ff1615620002fd5760405162461bcd60e51b8152600401620000959062000b80565b6003546006546200031090600162000c02565b1115620003315760405162461bcd60e51b8152600401620000959062000b23565b6001600160a01b0381166000908152600560205260408120805460ff1916600190811790915560068054919290916200036c90849062000c02565b90915550506040517f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e33990620003a390839062000842565b60405180910390a150565b6001600160a01b038116620003d75760405162461bcd60e51b8152600401620000959062000928565b6001600160a01b03811660009081526007602052604090205460ff1615620004135760405162461bcd60e51b81526004016200009590620008db565b6001600160a01b0381166000908152600760205260408120805460ff1916600190811790915560088054919290916200044e90849062000c02565b90915550506040517f021a687fbe334e9e815cee8b399c0bc42e82356eb7f63a09ddb558a25d3dcdbd90620003a390839062000842565b6001600160a01b038116620004ae5760405162461bcd60e51b815260040162000095906200088b565b6001600160a01b03811660009081526009602052604090205460ff1615620004ea5760405162461bcd60e51b81526004016200009590620009ff565b6001600160a01b0381166000908152600960205260408120805460ff19166001908117909155600a8054919290916200052590849062000c02565b90915550506040517f835bddf1ceee4956e4329af9edf018523c1191238187a597453f6020bcadb04290620003a390839062000842565b6001600160a01b038116620005855760405162461bcd60e51b8152600401620000959062000977565b6001600160a01b0381166000908152600b602052604090205460ff1615620005c15760405162461bcd60e51b8152600401620000959062000a4f565b6001600160a01b0381166000908152600b60205260408120805460ff19166001908117909155600c805491929091620005fc90849062000c02565b90915550506040517fae5b7c3b000f575c241001dc9bcb3d8778376889353b07121115574eceff78c590620003a390839062000842565b600f805460ff1916821515179081905560ff16156200067b576040517fc900358025f09a872d1a6e53c30e64a77566eada5220d1044c2636f83a0c8bcf90600090a1620006a5565b6040517ffb2915041896c6af47e9321d19194f79106105a83cf67d0262283fb48cebf14890600090a15b50565b80516001600160a01b0381168114620006c057600080fd5b919050565b600082601f830112620006d6578081fd5b815160206001600160401b0380831115620006f557620006f562000c51565b818302604051601f19603f830116810181811084821117156200071c576200071c62000c51565b604052848152838101925086840182880185018910156200073b578687fd5b8692505b8583101562000768576200075381620006a8565b8452928401926001929092019184016200073f565b50979650505050505050565b600080600080600060a086880312156200078c578081fd5b85516001600160401b0380821115620007a3578283fd5b620007b189838a01620006c5565b96506020880151915080821115620007c7578283fd5b620007d589838a01620006c5565b95506040880151915080821115620007eb578283fd5b620007f989838a01620006c5565b945060608801519150808211156200080f578283fd5b506200081e88828901620006c5565b9250506080860151801515811462000834578182fd5b809150509295509295909350565b6001600160a01b0391909116815260200190565b60208082526026908201526000805160206200615a83398151915260408201526561646d696e7360d01b606082015260800190565b60208082526030908201527f417070726f766572526f6c65456e61626c65643a207a65726f206163636f756e60408201526f1d0818d85b9b9bdd081899481d5cd95960821b606082015260800190565b6020808252602d908201527f43726561746f72526f6c65456e61626c65643a20616c7265616479206120637260408201526c19585d1bdc881858d8dbdd5b9d609a1b606082015260800190565b6020808252602f908201527f43726561746f72526f6c65456e61626c65643a207a65726f206163636f756e7460408201526e0818d85b9b9bdd081899481d5cd959608a1b606082015260800190565b60208082526030908201527f4578656375746f72526f6c65456e61626c65643a207a65726f206163636f756e60408201526f1d0818d85b9b9bdd081899481d5cd95960821b606082015260800190565b60208082526029908201526000805160206200615a833981519152604082015268617070726f7665727360b81b606082015260800190565b60208082526030908201527f417070726f766572526f6c65456e61626c65643a20616c726561647920616e2060408201526f185c1c1c9bdd995c881858d8dbdd5b9d60821b606082015260800190565b60208082526030908201527f4578656375746f72526f6c65456e61626c65643a20616c726561647920616e2060408201526f195e1958dd5d1bdc881858d8dbdd5b9d60821b606082015260800190565b60208082526028908201526000805160206200615a83398151915260408201526763726561746f727360c01b606082015260800190565b6020808252602d908201527f41646d696e526f6c65456e61626c65643a207a65726f206163636f756e74206360408201526c185b9b9bdd081899481d5cd959609a1b606082015260800190565b6020808252603a908201527f41646d696e526f6c65456e61626c65643a2065786365656473206d6178696d7560408201527f6d206e756d626572206f662061646d696e206163636f756e7473000000000000606082015260800190565b6020808252602a908201527f41646d696e526f6c65456e61626c65643a20616c726561647920616e2061646d6040820152691a5b881858d8dbdd5b9d60b21b606082015260800190565b60208082526029908201526000805160206200615a8339815191526040820152686578656375746f727360b81b606082015260800190565b6000821982111562000c185762000c1862000c3b565b500190565b600060001982141562000c345762000c3462000c3b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6154e38062000c776000396000f3fe6080604052600436106103225760003560e01c80637ec9152f116101a5578063b544414e116100ec578063d80528ae11610095578063efd460651161006f578063efd460651461090f578063f04907691461092f578063f23a6e611461094f578063f9a7640b1461096f57610356565b8063d80528ae146108a9578063dbdc814b146108cf578063debfda30146108ef57610356565b8063c9d14c14116100c6578063c9d14c1414610854578063cbe4c6ef14610874578063d06dcc511461089457610356565b8063b544414e146107f4578063bb6c352c14610814578063bc197c811461083457610356565b8063976d57701161014e578063a37ef8f811610128578063a37ef8f81461079f578063a4305937146107bf578063b42aebd1146107d457610356565b8063976d57701461074a5780639d6aacb01461076a578063a36b626f1461077f57610356565b806389d936371161017f57806389d93637146106ea5780638d134ad01461070a5780638f4ac6251461072a57610356565b80637ec9152f146106955780637fcd7e0f146106b557806382a22456146106ca57610356565b806333727c4d116102695780635f13c947116102125780636d633a5c116101ec5780636d633a5c1461063557806370fbe9ff146106555780637eb0bdc91461067557610356565b80635f13c947146105d55780636a83f109146105f55780636d218e481461061557610356565b806352f815131161024357806352f815131461057e5780635317234e146105a05780635656fc78146105c057610356565b806333727c4d1461051e578063374fea911461053e5780634895cdb51461055e57610356565b806318d07e7c116102cb578063292fd8f0116102a5578063292fd8f0146104be5780632d31479b146104de57806330454997146104fe57610356565b806318d07e7c14610451578063248bec701461047157806324d7806c1461049e57610356565b806314779cda116102fc57806314779cda146103e4578063150b7a021461040457806315d544061461043157610356565b806301ffc9a71461036e5780630a07fae6146103a4578063111002aa146103c457610356565b366103565761032f61098f565b6103545760405162461bcd60e51b815260040161034b90615165565b60405180910390fd5b005b60405162461bcd60e51b815260040161034b90614676565b34801561037a57600080fd5b5061038e610389366004614081565b610998565b60405161039b9190614484565b60405180910390f35b3480156103b057600080fd5b506103546103bf3660046140fc565b610a7f565b3480156103d057600080fd5b506103546103df3660046140c1565b610b28565b3480156103f057600080fd5b506103546103ff3660046141e0565b610b5c565b34801561041057600080fd5b5061042461041f366004613f59565b610c48565b60405161039b919061448f565b34801561043d57600080fd5b5061035461044c3660046140fc565b610c72565b34801561045d57600080fd5b5061035461046c3660046140c1565b610ce3565b34801561047d57600080fd5b5061049161048c3660046140fc565b610d13565b60405161039b91906144bc565b3480156104aa57600080fd5b5061038e6104b9366004613e81565b610dd2565b3480156104ca57600080fd5b506103546104d93660046140fc565b610e02565b3480156104ea57600080fd5b506103546104f9366004614223565b610ea4565b34801561050a57600080fd5b506103546105193660046140fc565b610f92565b34801561052a57600080fd5b5061038e6105393660046140fc565b611004565b34801561054a57600080fd5b5061035461055936600461412c565b6110ba565b34801561056a57600080fd5b5061035461057936600461412c565b6111a2565b34801561058a57600080fd5b50610593611269565b60405161039b9190615345565b3480156105ac57600080fd5b506103546105bb36600461412c565b61126f565b3480156105cc57600080fd5b5061038e611336565b3480156105e157600080fd5b506103546105f036600461412c565b61136a565b34801561060157600080fd5b5061035461061036600461403c565b611431565b34801561062157600080fd5b5061038e610630366004613e81565b611572565b34801561064157600080fd5b506105936106503660046140fc565b6115a2565b34801561066157600080fd5b5061038e610670366004613e81565b611658565b34801561068157600080fd5b5061035461069036600461412c565b611688565b3480156106a157600080fd5b506103546106b0366004614270565b61174f565b3480156106c157600080fd5b50610593611839565b3480156106d657600080fd5b506103546106e53660046141e0565b61183f565b3480156106f657600080fd5b5061035461070536600461412c565b611908565b34801561071657600080fd5b50610354610725366004614157565b6119cf565b34801561073657600080fd5b506103546107453660046141e0565b611ac2565b34801561075657600080fd5b5061035461076536600461412c565b611b8b565b34801561077657600080fd5b50610593611c52565b34801561078b57600080fd5b5061035461079a3660046142d3565b611c80565b3480156107ab57600080fd5b506103546107ba3660046141e0565b611d39565b3480156107cb57600080fd5b50610593611e02565b3480156107e057600080fd5b506103546107ef366004614192565b611e08565b34801561080057600080fd5b5061035461080f3660046142a4565b611ed1565b34801561082057600080fd5b5061035461082f36600461412c565b611fc3565b34801561084057600080fd5b5061042461084f366004613ea2565b61208a565b34801561086057600080fd5b5061035461086f3660046142d3565b6120b7565b34801561088057600080fd5b5061035461088f366004614192565b612128565b3480156108a057600080fd5b506105936121f1565b3480156108b557600080fd5b506108be6121f7565b60405161039b959493929190615367565b3480156108db57600080fd5b506103546108ea36600461412c565b612241565b3480156108fb57600080fd5b5061038e61090a366004613e81565b612308565b34801561091b57600080fd5b5061038e61092a366004613e81565b612338565b34801561093b57600080fd5b5061035461094a36600461403c565b612368565b34801561095b57600080fd5b5061042461096a366004613fc6565b612400565b34801561097b57600080fd5b5061035461098a36600461412c565b61242b565b600f5460ff1690565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f9acaf660000000000000000000000000000000000000000000000000000000001480610a2b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b80610a7757507fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000145b90505b919050565b610a88336124f2565b610aa45760405162461bcd60e51b815260040161034b9061528b565b80610aae81612510565b610aca5760405162461bcd60e51b815260040161034b90614550565b81610ad481612524565b15610af15760405162461bcd60e51b815260040161034b906151f7565b82610afb81612564565b15610b185760405162461bcd60e51b815260040161034b90615017565b610b2233856125a4565b50505050565b610b3133612696565b610b4d5760405162461bcd60e51b815260040161034b90614c09565b610b588160006126b4565b5050565b610b65336127a1565b610b815760405162461bcd60e51b815260040161034b90614de9565b83610b8b81612510565b610ba75760405162461bcd60e51b815260040161034b90614550565b84610bb181612524565b610bcd5760405162461bcd60e51b815260040161034b906151f7565b85610bd781612564565b15610bf45760405162461bcd60e51b815260040161034b90615017565b86610bfe816127bf565b610c1a5760405162461bcd60e51b815260040161034b90614cf8565b610c2587878761280a565b610c3e8860405180602001604052806000815250612911565b5050505050505050565b7f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f95945050505050565b610c7b336127a1565b610c975760405162461bcd60e51b815260040161034b90614de9565b80610ca181612510565b610cbd5760405162461bcd60e51b815260040161034b90614550565b81610cc781612524565b610af15760405162461bcd60e51b815260040161034b906151f7565b610cec336127a1565b610d085760405162461bcd60e51b815260040161034b90614de9565b610b588160016126b4565b6060610d1e336127a1565b80610d2d5750610d2d33612696565b80610d3c5750610d3c336124f2565b80610d4b5750610d4b33612984565b610d675760405162461bcd60e51b815260040161034b906150ab565b81610d7181612510565b610d8d5760405162461bcd60e51b815260040161034b90614550565b610d9683612524565b15610dc057610da4336127a1565b610dc05760405162461bcd60e51b815260040161034b90614730565b610dc9836129a2565b91505b50919050565b6000610ddd336127a1565b610df95760405162461bcd60e51b815260040161034b90614de9565b610a77826127a1565b610e0b336127a1565b610e275760405162461bcd60e51b815260040161034b90614de9565b80610e3181612510565b610e4d5760405162461bcd60e51b815260040161034b90614550565b81610e5781612524565b610e735760405162461bcd60e51b815260040161034b906151f7565b82610e7d81612564565b15610e9a5760405162461bcd60e51b815260040161034b90615017565b610b223385612a6a565b610ead336127a1565b610ec95760405162461bcd60e51b815260040161034b90614de9565b84610ed381612510565b610eef5760405162461bcd60e51b815260040161034b90614550565b85610ef981612524565b610f155760405162461bcd60e51b815260040161034b906151f7565b86610f1f81612564565b15610f3c5760405162461bcd60e51b815260040161034b90615017565b87610f46816127bf565b610f625760405162461bcd60e51b815260040161034b90614cf8565b610f6e88888888612b4d565b610f878960405180602001604052806000815250612911565b505050505050505050565b610f9b336124f2565b610fb75760405162461bcd60e51b815260040161034b9061528b565b80610fc181612510565b610fdd5760405162461bcd60e51b815260040161034b90614550565b81610fe781612524565b15610e735760405162461bcd60e51b815260040161034b906151f7565b600061100f336127a1565b8061101e575061101e33612696565b8061102d575061102d336124f2565b8061103c575061103c33612984565b6110585760405162461bcd60e51b815260040161034b906150ab565b8161106281612510565b61107e5760405162461bcd60e51b815260040161034b90614550565b61108783612524565b156110b157611095336127a1565b6110b15760405162461bcd60e51b815260040161034b90614730565b610dc983612564565b6110c3336127a1565b6110df5760405162461bcd60e51b815260040161034b90614de9565b816110e981612510565b6111055760405162461bcd60e51b815260040161034b90614550565b8261110f81612524565b61112b5760405162461bcd60e51b815260040161034b906151f7565b8361113581612564565b156111525760405162461bcd60e51b815260040161034b90615017565b8461115c816127bf565b6111785760405162461bcd60e51b815260040161034b90614cf8565b61118185612c59565b61119a8660405180602001604052806000815250612911565b505050505050565b6111ab336127a1565b6111c75760405162461bcd60e51b815260040161034b90614de9565b816111d181612510565b6111ed5760405162461bcd60e51b815260040161034b90614550565b826111f781612524565b6112135760405162461bcd60e51b815260040161034b906151f7565b8361121d81612564565b1561123a5760405162461bcd60e51b815260040161034b90615017565b84611244816127bf565b6112605760405162461bcd60e51b815260040161034b90614cf8565b61118185612d2a565b60035490565b611278336127a1565b6112945760405162461bcd60e51b815260040161034b90614de9565b8161129e81612510565b6112ba5760405162461bcd60e51b815260040161034b90614550565b826112c481612524565b6112e05760405162461bcd60e51b815260040161034b906151f7565b836112ea81612564565b156113075760405162461bcd60e51b815260040161034b90615017565b84611311816127bf565b61132d5760405162461bcd60e51b815260040161034b90614cf8565b61118185612df0565b6000611341336127a1565b61135d5760405162461bcd60e51b815260040161034b90614de9565b61136561098f565b905090565b611373336127a1565b61138f5760405162461bcd60e51b815260040161034b90614de9565b8161139981612510565b6113b55760405162461bcd60e51b815260040161034b90614550565b826113bf81612524565b6113db5760405162461bcd60e51b815260040161034b906151f7565b836113e581612564565b156114025760405162461bcd60e51b815260040161034b90615017565b8461140c816127bf565b6114285760405162461bcd60e51b815260040161034b90614cf8565b61118185612ebd565b61143a33612f8a565b6114565760405162461bcd60e51b815260040161034b906144f3565b8161146081612984565b61147c5760405162461bcd60e51b815260040161034b906146d3565b8161148681612510565b6114a25760405162461bcd60e51b815260040161034b90614550565b826114ac81612524565b6114c85760405162461bcd60e51b815260040161034b906151f7565b836114d2816127bf565b6114ee5760405162461bcd60e51b815260040161034b90614cf8565b846114f881612564565b156115155760405162461bcd60e51b815260040161034b90615017565b61152e8660405180602001604052806000815250612911565b7fb4b8589d8015ad1f83a922f4fd0d6498f557018656541ce92b6c18db2b70466133888860405161156193929190614398565b60405180910390a150505050505050565b600061157d336127a1565b6115995760405162461bcd60e51b815260040161034b90614de9565b610a77826124f2565b60006115ad336127a1565b806115bc57506115bc33612696565b806115cb57506115cb336124f2565b806115da57506115da33612984565b6115f65760405162461bcd60e51b815260040161034b906150ab565b8161160081612510565b61161c5760405162461bcd60e51b815260040161034b90614550565b61162583612524565b1561164f57611633336127a1565b61164f5760405162461bcd60e51b815260040161034b90614730565b610dc983612fa8565b6000611663336127a1565b61167f5760405162461bcd60e51b815260040161034b90614de9565b610a7782612f8a565b611691336127a1565b6116ad5760405162461bcd60e51b815260040161034b90614de9565b816116b781612510565b6116d35760405162461bcd60e51b815260040161034b90614550565b826116dd81612524565b6116f95760405162461bcd60e51b815260040161034b906151f7565b8361170381612564565b156117205760405162461bcd60e51b815260040161034b90615017565b8461172a816127bf565b6117465760405162461bcd60e51b815260040161034b90614cf8565b61118185612fe5565b611758336127a1565b6117745760405162461bcd60e51b815260040161034b90614de9565b8261177e81612510565b61179a5760405162461bcd60e51b815260040161034b90614550565b836117a481612524565b6117c05760405162461bcd60e51b815260040161034b906151f7565b846117ca81612564565b156117e75760405162461bcd60e51b815260040161034b90615017565b856117f1816127bf565b61180d5760405162461bcd60e51b815260040161034b90614cf8565b61181786866130db565b6118308760405180602001604052806000815250612911565b50505050505050565b60045481565b611848336127a1565b6118645760405162461bcd60e51b815260040161034b90614de9565b8361186e81612510565b61188a5760405162461bcd60e51b815260040161034b90614550565b8461189481612524565b6118b05760405162461bcd60e51b815260040161034b906151f7565b856118ba81612564565b156118d75760405162461bcd60e51b815260040161034b90615017565b866118e1816127bf565b6118fd5760405162461bcd60e51b815260040161034b90614cf8565b610c258787876131ff565b611911336127a1565b61192d5760405162461bcd60e51b815260040161034b90614de9565b8161193781612510565b6119535760405162461bcd60e51b815260040161034b90614550565b8261195d81612524565b6119795760405162461bcd60e51b815260040161034b906151f7565b8361198381612564565b156119a05760405162461bcd60e51b815260040161034b90615017565b846119aa816127bf565b6119c65760405162461bcd60e51b815260040161034b90614cf8565b61118185613318565b6119d8336127a1565b6119f45760405162461bcd60e51b815260040161034b90614de9565b826119fe81612510565b611a1a5760405162461bcd60e51b815260040161034b90614550565b83611a2481612524565b611a405760405162461bcd60e51b815260040161034b906151f7565b84611a4a81612564565b15611a675760405162461bcd60e51b815260040161034b90615017565b85611a71816127bf565b611a8d5760405162461bcd60e51b815260040161034b90614cf8565b6003546006541415611ab057611aa286612fe5565b611aab856133de565b611817565b611ab9856133de565b61181786612fe5565b611acb336127a1565b611ae75760405162461bcd60e51b815260040161034b90614de9565b83611af181612510565b611b0d5760405162461bcd60e51b815260040161034b90614550565b84611b1781612524565b611b335760405162461bcd60e51b815260040161034b906151f7565b85611b3d81612564565b15611b5a5760405162461bcd60e51b815260040161034b90615017565b86611b64816127bf565b611b805760405162461bcd60e51b815260040161034b90614cf8565b610c258787876134da565b611b94336127a1565b611bb05760405162461bcd60e51b815260040161034b90614de9565b81611bba81612510565b611bd65760405162461bcd60e51b815260040161034b90614550565b82611be081612524565b611bfc5760405162461bcd60e51b815260040161034b906151f7565b83611c0681612564565b15611c235760405162461bcd60e51b815260040161034b90615017565b84611c2d816127bf565b611c495760405162461bcd60e51b815260040161034b90614cf8565b611181856136c7565b6000611c5d336127a1565b611c795760405162461bcd60e51b815260040161034b90614de9565b5060065490565b611c8933612696565b80611c985750611c98336127a1565b611cb45760405162461bcd60e51b815260040161034b90614ea3565b81611cbe81612510565b611cda5760405162461bcd60e51b815260040161034b90614550565b82611ce481612524565b15611d015760405162461bcd60e51b815260040161034b906151f7565b83611d0b81612564565b15611d285760405162461bcd60e51b815260040161034b90615017565b611d328585612911565b5050505050565b611d42336127a1565b611d5e5760405162461bcd60e51b815260040161034b90614de9565b83611d6881612510565b611d845760405162461bcd60e51b815260040161034b90614550565b84611d8e81612524565b611daa5760405162461bcd60e51b815260040161034b906151f7565b85611db481612564565b15611dd15760405162461bcd60e51b815260040161034b90615017565b86611ddb816127bf565b611df75760405162461bcd60e51b815260040161034b90614cf8565b610c25878787613794565b60045490565b611e11336127a1565b611e2d5760405162461bcd60e51b815260040161034b90614de9565b83611e3781612510565b611e535760405162461bcd60e51b815260040161034b90614550565b84611e5d81612524565b611e795760405162461bcd60e51b815260040161034b906151f7565b85611e8381612564565b15611ea05760405162461bcd60e51b815260040161034b90615017565b86611eaa816127bf565b611ec65760405162461bcd60e51b815260040161034b90614cf8565b610c25878787613866565b611eda336127a1565b611ef65760405162461bcd60e51b815260040161034b90614de9565b81611f0081612510565b611f1c5760405162461bcd60e51b815260040161034b90614550565b82611f2681612524565b611f425760405162461bcd60e51b815260040161034b906151f7565b83611f4c81612564565b15611f695760405162461bcd60e51b815260040161034b90615017565b84611f73816127bf565b611f8f5760405162461bcd60e51b815260040161034b90614cf8565b841515611f9a61098f565b15151415611fba5760405162461bcd60e51b815260040161034b906149cc565b6111818561395e565b611fcc336127a1565b611fe85760405162461bcd60e51b815260040161034b90614de9565b81611ff281612510565b61200e5760405162461bcd60e51b815260040161034b90614550565b8261201881612524565b6120345760405162461bcd60e51b815260040161034b906151f7565b8361203e81612564565b1561205b5760405162461bcd60e51b815260040161034b90615017565b84612065816127bf565b6120815760405162461bcd60e51b815260040161034b90614cf8565b611181856139d1565b7fbc197c819b3e337a6f9652dd10becd7eef83032af3b9d958d3d42f669414662198975050505050505050565b6120c0336127a1565b6120dc5760405162461bcd60e51b815260040161034b90614de9565b816120e681612510565b6121025760405162461bcd60e51b815260040161034b90614550565b8261210c81612524565b611d015760405162461bcd60e51b815260040161034b906151f7565b612131336127a1565b61214d5760405162461bcd60e51b815260040161034b90614de9565b8361215781612510565b6121735760405162461bcd60e51b815260040161034b90614550565b8461217d81612524565b6121995760405162461bcd60e51b815260040161034b906151f7565b856121a381612564565b156121c05760405162461bcd60e51b815260040161034b90615017565b866121ca816127bf565b6121e65760405162461bcd60e51b815260040161034b90614cf8565b610c25878787613a97565b60035481565b6000806000806000612208336127a1565b6122245760405162461bcd60e51b815260040161034b90614de9565b5050600654600854600a54600c54600e5493979296509094509250565b61224a336127a1565b6122665760405162461bcd60e51b815260040161034b90614de9565b8161227081612510565b61228c5760405162461bcd60e51b815260040161034b90614550565b8261229681612524565b6122b25760405162461bcd60e51b815260040161034b906151f7565b836122bc81612564565b156122d95760405162461bcd60e51b815260040161034b90615017565b846122e3816127bf565b6122ff5760405162461bcd60e51b815260040161034b90614cf8565b611181856133de565b6000612313336127a1565b61232f5760405162461bcd60e51b815260040161034b90614de9565b610a7782612984565b6000612343336127a1565b61235f5760405162461bcd60e51b815260040161034b90614de9565b610a7782612696565b61237133612f8a565b61238d5760405162461bcd60e51b815260040161034b906144f3565b8161239781612984565b6123b35760405162461bcd60e51b815260040161034b906146d3565b816123bd81612510565b6123d95760405162461bcd60e51b815260040161034b90614550565b826123e381612524565b156114c85760405162461bcd60e51b815260040161034b906151f7565b7ff23a6e612e1ff4830e658fe43f4e3cb4a5f8170bd5d9e69fb5d7a7fa9e4fdf979695505050505050565b612434336127a1565b6124505760405162461bcd60e51b815260040161034b90614de9565b8161245a81612510565b6124765760405162461bcd60e51b815260040161034b90614550565b8261248081612524565b61249c5760405162461bcd60e51b815260040161034b906151f7565b836124a681612564565b156124c35760405162461bcd60e51b815260040161034b90615017565b846124cd816127bf565b6124e95760405162461bcd60e51b815260040161034b90614cf8565b61118185613b8f565b6001600160a01b031660009081526009602052604090205460ff1690565b600090815260208190526040902054151590565b600061252f82612510565b61254b5760405162461bcd60e51b815260040161034b90614550565b5060009081526020819052604090206002015460ff1690565b600061256f82612510565b61258b5760405162461bcd60e51b815260040161034b90614550565b5060009081526020819052604090206004015460ff1690565b6125ad81612510565b6125c95760405162461bcd60e51b815260040161034b90614550565b60008181526001602090815260408083206001600160a01b038616845290915290205460ff161561260c5760405162461bcd60e51b815260040161034b9061478d565b60008181526001602081815260408084206001600160a01b03871685528252808420805460ff19168417905584845290839052822060030180549192909161265590849061538a565b90915550506040517f3e9d27a1c2a828db29e4b2a17fbd1bc70201ef21aec4f74b9fa051b02e38e3f09061268a908390615345565b60405180910390a15050565b6001600160a01b031660009081526007602052604090205460ff1690565b600280546000918190836126c78361543a565b90915550506040805160a08101825282815260208082018781528615158385015260006060840181905260808401819052858152808352939093208251815592518051929384939092612721926001850192910190613cc1565b5060408281015160028301805491151560ff19928316179055606084015160038401556080909301516004909201805492151592909316919091179091555182907f05d0fb833127fc08168556d0e7ca9554fc3f6bc843b3b7d2bf1c35aea6bab6609061279190889088906144cf565b60405180910390a2509392505050565b6001600160a01b031660009081526005602052604090205460ff1690565b60006127ca82612510565b6127e65760405162461bcd60e51b815260040161034b90614550565b6127ef82613c5c565b60008381526020819052604090206003015410159050919050565b6001600160a01b0383166128305760405162461bcd60e51b815260040161034b906145e2565b6001600160a01b0382166128565760405162461bcd60e51b815260040161034b9061519a565b6040517fb88d4fde0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063b88d4fde9061289f903090869086906004016143bc565b600060405180830381600087803b1580156128b957600080fd5b505af11580156128cd573d6000803e3d6000fd5b505050507fcd68d836931d28b26c81fd06a68b603542d9b3a2fd1ba1c1bd30c9e2e5f4e6eb83838360405161290493929190614398565b60405180910390a1505050565b61291a82612510565b6129365760405162461bcd60e51b815260040161034b90614550565b60008281526020819052604090819020600401805460ff19166001179055517fe5516cdd051314d9e1a70e80776a58d2064a5468c26b2f1a7e13cd96ab2d65079061268a908490849061534e565b6001600160a01b03166000908152600b602052604090205460ff1690565b60606129ad82612510565b6129c95760405162461bcd60e51b815260040161034b90614550565b600082815260208190526040902060010180546129e590615405565b80601f0160208091040260200160405190810160405280929190818152602001828054612a1190615405565b8015612a5e5780601f10612a3357610100808354040283529160200191612a5e565b820191906000526020600020905b815481529060010190602001808311612a4157829003601f168201915b50505050509050919050565b612a7381612510565b612a8f5760405162461bcd60e51b815260040161034b90614550565b60008181526001602090815260408083206001600160a01b038616845290915290205460ff16612ad15760405162461bcd60e51b815260040161034b90614cf8565b60008181526001602081815260408084206001600160a01b03871685528252808420805460ff19169055848452908390528220600301805491929091612b189084906153c2565b90915550506040517fb2d3b7ccb3dd8e3420904dd2c5cf01ddbe69777044e015eb3c56294506067bab9061268a908390615345565b6001600160a01b038416612b735760405162461bcd60e51b815260040161034b90614c66565b6001600160a01b038316612b995760405162461bcd60e51b815260040161034b90614d8c565b6040517ff242432a0000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063f242432a90612be4903090879087908790600401614418565b600060405180830381600087803b158015612bfe57600080fd5b505af1158015612c12573d6000803e3d6000fd5b505050507f33627cfa024b2c6aba9bb8060d9b3112240af2250621855495464379de6ab1b584848484604051612c4b94939291906143ef565b60405180910390a150505050565b6001600160a01b038116612c7f5760405162461bcd60e51b815260040161034b906148a4565b6001600160a01b03811660009081526007602052604090205460ff16612cb75760405162461bcd60e51b815260040161034b90614c09565b6001600160a01b0381166000908152600760205260408120805460ff191690556008805460019290612cea9084906153c2565b90915550506040517f94a409f50d78dc8628b7499ba5af0848a134b9a935a59c0a45313b67f66920f890612d1f908390614360565b60405180910390a150565b6001600160a01b038116612d505760405162461bcd60e51b815260040161034b90615108565b6001600160a01b0381166000908152600d602052604090205460ff16612d885760405162461bcd60e51b815260040161034b906144f3565b6001600160a01b0381166000908152600d60205260408120805460ff19169055600e805460019290612dbb9084906153c2565b90915550506040517f69876ed6762df72762082100c5690190c4b64d6226f20712d3d8deb06053893890612d1f908390614360565b6001600160a01b038116612e165760405162461bcd60e51b815260040161034b90614585565b6001600160a01b03811660009081526009602052604090205460ff1615612e4f5760405162461bcd60e51b815260040161034b90614a86565b6001600160a01b0381166000908152600960205260408120805460ff19166001908117909155600a805491929091612e8890849061538a565b90915550506040517f835bddf1ceee4956e4329af9edf018523c1191238187a597453f6020bcadb04290612d1f908390614360565b6001600160a01b038116612ee35760405162461bcd60e51b815260040161034b9061496f565b6001600160a01b0381166000908152600b602052604090205460ff1615612f1c5760405162461bcd60e51b815260040161034b90614b1a565b6001600160a01b0381166000908152600b60205260408120805460ff19166001908117909155600c805491929091612f5590849061538a565b90915550506040517fae5b7c3b000f575c241001dc9bcb3d8778376889353b07121115574eceff78c590612d1f908390614360565b6001600160a01b03166000908152600d602052604090205460ff1690565b6000612fb382612510565b612fcf5760405162461bcd60e51b815260040161034b90614550565b5060009081526020819052604090206003015490565b6001600160a01b03811661300b5760405162461bcd60e51b815260040161034b90614e46565b6001600160a01b03811660009081526005602052604090205460ff166130435760405162461bcd60e51b815260040161034b90614de9565b600454600160065461305591906153c2565b10156130735760405162461bcd60e51b815260040161034b90614c9b565b6001600160a01b0381166000908152600560205260408120805460ff1916905560068054600192906130a69084906153c2565b90915550506040517fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f90612d1f908390614360565b6001600160a01b0382166131015760405162461bcd60e51b815260040161034b906152e8565b600081116131215760405162461bcd60e51b815260040161034b90614ae3565b478111156131415760405162461bcd60e51b815260040161034b906147ea565b604080516000808252602082019092526001600160a01b03841690839060405161316b9190614344565b60006040518083038185875af1925050503d80600081146131a8576040519150601f19603f3d011682016040523d82523d6000602084013e6131ad565b606091505b50509050806131ce5760405162461bcd60e51b815260040161034b90614938565b7f1445764fe3fdfc2a9812ff42e9b65c2e7896d5162851f78f7d4a5578f7346ff1838360405161290492919061446b565b6001600160a01b0383166132255760405162461bcd60e51b815260040161034b90614d55565b6001600160a01b03821661324b5760405162461bcd60e51b815260040161034b90614bac565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063095ea7b390613292908590859060040161446b565b602060405180830381600087803b1580156132ac57600080fd5b505af11580156132c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132e49190614065565b507fe285444a44723385de85da4844cbb9105030b82a9300a3ffca99054d624c5e3083838360405161290493929190614398565b6001600160a01b03811661333e5760405162461bcd60e51b815260040161034b9061496f565b6001600160a01b0381166000908152600b602052604090205460ff166133765760405162461bcd60e51b815260040161034b906146d3565b6001600160a01b0381166000908152600b60205260408120805460ff19169055600c8054600192906133a99084906153c2565b90915550506040517f4a2cf608bfb427f53279ec7f0eadf48913b9346ccefc3af138dbdec14ea0907d90612d1f908390614360565b6001600160a01b0381166134045760405162461bcd60e51b815260040161034b90614e46565b6001600160a01b03811660009081526005602052604090205460ff161561343d5760405162461bcd60e51b815260040161034b9061522e565b60035460065461344e90600161538a565b111561346c5760405162461bcd60e51b815260040161034b90614f00565b6001600160a01b0381166000908152600560205260408120805460ff1916600190811790915560068054919290916134a590849061538a565b90915550506040517f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e33990612d1f908390614360565b6001600160a01b0383166135005760405162461bcd60e51b815260040161034b90614d55565b6001600160a01b0382166135265760405162461bcd60e51b815260040161034b90614f5d565b600081116135465760405162461bcd60e51b815260040161034b90614901565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038416906370a082319061358b903090600401614360565b60206040518083038186803b1580156135a357600080fd5b505afa1580156135b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135db9190614114565b8111156135fa5760405162461bcd60e51b815260040161034b90614fba565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063a9059cbb90613641908590859060040161446b565b602060405180830381600087803b15801561365b57600080fd5b505af115801561366f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136939190614065565b507fe8de91d538b06154a2c48315768c5046f47e127d7fd3f726fd85cc723f29b05283838360405161290493929190614398565b6001600160a01b0381166136ed5760405162461bcd60e51b815260040161034b906148a4565b6001600160a01b03811660009081526007602052604090205460ff16156137265760405162461bcd60e51b815260040161034b90614619565b6001600160a01b0381166000908152600760205260408120805460ff19166001908117909155600880549192909161375f90849061538a565b90915550506040517f021a687fbe334e9e815cee8b399c0bc42e82356eb7f63a09ddb558a25d3dcdbd90612d1f908390614360565b6001600160a01b0383166137ba5760405162461bcd60e51b815260040161034b906145e2565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063095ea7b390613801908590859060040161446b565b600060405180830381600087803b15801561381b57600080fd5b505af115801561382f573d6000803e3d6000fd5b505050507fd28f69cf4df1f60ab7617e7a45ff83d9ea9c984c0839ca7c7bbea0654520b17583838360405161290493929190614398565b6001600160a01b03831661388c5760405162461bcd60e51b815260040161034b90614c66565b6001600160a01b0382166138b25760405162461bcd60e51b815260040161034b9061504e565b6040517fa22cb4650000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063a22cb465906138f99085908590600401614450565b600060405180830381600087803b15801561391357600080fd5b505af1158015613927573d6000803e3d6000fd5b505050507fdd7643f09c4969b2b902e40fb0b08a3c9cbf7f60975628ed6c175e85c851e22283838360405161290493929190614374565b600f805460ff1916821515179081905560ff16156139a4576040517fc900358025f09a872d1a6e53c30e64a77566eada5220d1044c2636f83a0c8bcf90600090a16139ce565b6040517ffb2915041896c6af47e9321d19194f79106105a83cf67d0262283fb48cebf14890600090a15b50565b6001600160a01b0381166139f75760405162461bcd60e51b815260040161034b90614585565b6001600160a01b03811660009081526009602052604090205460ff16613a2f5760405162461bcd60e51b815260040161034b9061528b565b6001600160a01b0381166000908152600960205260408120805460ff19169055600a805460019290613a629084906153c2565b90915550506040517fc6e35658c76ecdde40a54f31a91fb7c8615e9893cc0885584b27bb3433270d4690612d1f908390614360565b6001600160a01b038316613abd5760405162461bcd60e51b815260040161034b906145e2565b6001600160a01b038216613ae35760405162461bcd60e51b815260040161034b90614847565b6040517fa22cb4650000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063a22cb46590613b2a9085908590600401614450565b600060405180830381600087803b158015613b4457600080fd5b505af1158015613b58573d6000803e3d6000fd5b505050507fa7bccb6e0f084533659b39f9e36504532604da7f98afa2c4763a0ab3224a4c2b83838360405161290493929190614374565b6001600160a01b038116613bb55760405162461bcd60e51b815260040161034b90615108565b6001600160a01b0381166000908152600d602052604090205460ff1615613bee5760405162461bcd60e51b815260040161034b90614a29565b6001600160a01b0381166000908152600d60205260408120805460ff19166001908117909155600e805491929091613c2790849061538a565b90915550506040517f71e5b5f10a15e7289cadf7a68cf7be4dd27de56f07efc169e0de27e0a3114f8a90612d1f908390614360565b6000613c6782612510565b613c835760405162461bcd60e51b815260040161034b90614b77565b613c8c82612524565b15613cb2576002600654613ca091906153a2565b613cab90600161538a565b9050610a7a565b6002600a54613ca091906153a2565b828054613ccd90615405565b90600052602060002090601f016020900481019282613cef5760008555613d35565b82601f10613d0857805160ff1916838001178555613d35565b82800160010185558215613d35579182015b82811115613d35578251825591602001919060010190613d1a565b50613d41929150613d45565b5090565b5b80821115613d415760008155600101613d46565b80356001600160a01b0381168114610a7a57600080fd5b60008083601f840112613d82578081fd5b50813567ffffffffffffffff811115613d99578182fd5b6020830191508360208083028501011115613db357600080fd5b9250929050565b60008083601f840112613dcb578182fd5b50813567ffffffffffffffff811115613de2578182fd5b602083019150836020828501011115613db357600080fd5b600082601f830112613e0a578081fd5b813567ffffffffffffffff80821115613e2557613e25615489565b604051601f8301601f19908116603f01168101908282118183101715613e4d57613e4d615489565b81604052838152866020858801011115613e65578485fd5b8360208701602083013792830160200193909352509392505050565b600060208284031215613e92578081fd5b613e9b82613d5a565b9392505050565b60008060008060008060008060a0898b031215613ebd578384fd5b613ec689613d5a565b9750613ed460208a01613d5a565b9650604089013567ffffffffffffffff80821115613ef0578586fd5b613efc8c838d01613d71565b909850965060608b0135915080821115613f14578586fd5b613f208c838d01613d71565b909650945060808b0135915080821115613f38578384fd5b50613f458b828c01613dba565b999c989b5096995094979396929594505050565b600080600080600060808688031215613f70578081fd5b613f7986613d5a565b9450613f8760208701613d5a565b935060408601359250606086013567ffffffffffffffff811115613fa9578182fd5b613fb588828901613dba565b969995985093965092949392505050565b60008060008060008060a08789031215613fde578182fd5b613fe787613d5a565b9550613ff560208801613d5a565b94506040870135935060608701359250608087013567ffffffffffffffff81111561401e578283fd5b61402a89828a01613dba565b979a9699509497509295939492505050565b6000806040838503121561404e578182fd5b61405783613d5a565b946020939093013593505050565b600060208284031215614076578081fd5b8151613e9b8161549f565b600060208284031215614092578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114613e9b578182fd5b6000602082840312156140d2578081fd5b813567ffffffffffffffff8111156140e8578182fd5b6140f484828501613dfa565b949350505050565b60006020828403121561410d578081fd5b5035919050565b600060208284031215614125578081fd5b5051919050565b6000806040838503121561413e578182fd5b8235915061414e60208401613d5a565b90509250929050565b60008060006060848603121561416b578283fd5b8335925061417b60208501613d5a565b915061418960408501613d5a565b90509250925092565b600080600080608085870312156141a7578182fd5b843593506141b760208601613d5a565b92506141c560408601613d5a565b915060608501356141d58161549f565b939692955090935050565b600080600080608085870312156141f5578182fd5b8435935061420560208601613d5a565b925061421360408601613d5a565b9396929550929360600135925050565b600080600080600060a0868803121561423a578283fd5b8535945061424a60208701613d5a565b935061425860408701613d5a565b94979396509394606081013594506080013592915050565b600080600060608486031215614284578081fd5b8335925061429460208501613d5a565b9150604084013590509250925092565b600080604083850312156142b6578182fd5b8235915060208301356142c88161549f565b809150509250929050565b600080604083850312156142e5578182fd5b82359150602083013567ffffffffffffffff811115614302578182fd5b61430e85828601613dfa565b9150509250929050565b600081518084526143308160208601602086016153d9565b601f01601f19169290920160200192915050565b600082516143568184602087016153d9565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039384168152919092166020820152604081019190915260806060820181905260009082015260a00190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b600060208252613e9b6020830184614318565b6000604082526144e26040830185614318565b905082151560208301529392505050565b6020808252602d908201527f46696e616c697a6572526f6c65456e61626c65643a206e6f7420612066696e6160408201527f6c697a6572206163636f756e7400000000000000000000000000000000000000606082015260800190565b6020808252818101527f5461736b4d616e616765643a207461736b20646f6573206e6f74206578697374604082015260600190565b60208082526030908201527f417070726f766572526f6c65456e61626c65643a207a65726f206163636f756e60408201527f742063616e6e6f74206265207573656400000000000000000000000000000000606082015260800190565b6020808252601f908201527f4552433732315661756c743a207a65726f20746f6b656e206164647265737300604082015260600190565b6020808252602d908201527f43726561746f72526f6c65456e61626c65643a20616c7265616479206120637260408201527f6561746f72206163636f756e7400000000000000000000000000000000000000606082015260800190565b60208082526022908201527f5461736b4d616e616765723a2066616c6c6261636b20616c776179732066616960408201527f6c73000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602c908201527f4578656375746f72526f6c65456e61626c65643a206e6f7420616e206578656360408201527f75746f72206163636f756e740000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f5461736b4d616e616765723a206e6f7420616e2061646d696e206163636f756e60408201527f7400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f5461736b4d616e616765643a207461736b20697320616c72656164792061707060408201527f726f766564000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f4554485661756c743a207472616e73666572206d6f7265207468616e2062616c60408201527f616e636500000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f4552433732315661756c743a207a65726f206164647265737320666f72206f7060408201527f657261746f720000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602f908201527f43726561746f72526f6c65456e61626c65643a207a65726f206163636f756e7460408201527f2063616e6e6f7420626520757365640000000000000000000000000000000000606082015260800190565b6020808252601a908201527f45524332305661756c743a20616d6f756e74206973207a65726f000000000000604082015260600190565b6020808252601c908201527f4554485661756c743a206661696c656420746f207472616e7366657200000000604082015260600190565b60208082526030908201527f4578656375746f72526f6c65456e61626c65643a207a65726f206163636f756e60408201527f742063616e6e6f74206265207573656400000000000000000000000000000000606082015260800190565b6020808252602a908201527f4554485661756c74456e61626c65643a2063616e6e6f7420736574207468652060408201527f73616d652076616c756500000000000000000000000000000000000000000000606082015260800190565b60208082526031908201527f46696e616c697a6572526f6c65456e61626c65643a20616c726561647920612060408201527f66696e616c697a6572206163636f756e74000000000000000000000000000000606082015260800190565b60208082526030908201527f417070726f766572526f6c65456e61626c65643a20616c726561647920616e2060408201527f617070726f766572206163636f756e7400000000000000000000000000000000606082015260800190565b60208082526018908201527f4554485661756c743a20616d6f756e74206973207a65726f0000000000000000604082015260600190565b60208082526030908201527f4578656375746f72526f6c65456e61626c65643a20616c726561647920616e2060408201527f6578656375746f72206163636f756e7400000000000000000000000000000000606082015260800190565b6020808252818101527f5461736b4d616e616765723a207461736b20646f6573206e6f74206578697374604082015260600190565b60208082526024908201527f45524332305661756c743a207a65726f206164647265737320666f722073706560408201527f6e64657200000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526029908201527f43726561746f72526f6c65456e61626c65643a206e6f7420612063726561746f60408201527f72206163636f756e740000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f455243313135355661756c743a207a65726f20746f6b656e2061646472657373604082015260600190565b6020808252603d908201527f41646d696e526f6c65456e61626c65643a20676f65732062656c6f77206d696e60408201527f696d756d206e756d626572206f662061646d696e206163636f756e7473000000606082015260800190565b60208082526021908201527f5461736b4d616e616765643a207461736b206973206e6f7420617070726f766560408201527f6400000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f45524332305661756c743a207a65726f20746f6b656e20616464726573730000604082015260600190565b60208082526025908201527f455243313135355661756c743a2063616e6e6f74207472616e7366657220746f60408201527f207a65726f000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f41646d696e526f6c65456e61626c65643a206e6f7420616e2061646d696e206160408201527f63636f756e740000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602d908201527f41646d696e526f6c65456e61626c65643a207a65726f206163636f756e74206360408201527f616e6e6f74206265207573656400000000000000000000000000000000000000606082015260800190565b60208082526032908201527f43726561746f72526f6c65456e61626c65643a206e6f7420612063726561746f60408201527f72206f722061646d696e206163636f756e740000000000000000000000000000606082015260800190565b6020808252603a908201527f41646d696e526f6c65456e61626c65643a2065786365656473206d6178696d7560408201527f6d206e756d626572206f662061646d696e206163636f756e7473000000000000606082015260800190565b60208082526023908201527f45524332305661756c743a2063616e6e6f74207472616e7366657220746f207a60408201527f65726f0000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f45524332305661756c743a207472616e73666572206d6f7265207468616e206260408201527f616c616e63650000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f5461736b4d616e616765643a207461736b2069732066696e616c697a65640000604082015260600190565b60208082526027908201527f455243313135355661756c743a207a65726f206164647265737320666f72206f60408201527f70657261746f7200000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f5461736b4d616e616765723a206e6f7420612070726976696c6567656420616360408201527f636f756e74000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526031908201527f46696e616c697a6572526f6c65456e61626c65643a207a65726f206163636f7560408201527f6e742063616e6e6f742062652075736564000000000000000000000000000000606082015260800190565b6020808252818101527f5461736b4d616e616765723a2063616e6e6f7420616363657074206574686572604082015260600190565b60208082526024908201527f4552433732315661756c743a2063616e6e6f74207472616e7366657220746f2060408201527f7a65726f00000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f5461736b4d616e616765643a20696e76616c6964207461736b20747970650000604082015260600190565b6020808252602a908201527f41646d696e526f6c65456e61626c65643a20616c726561647920616e2061646d60408201527f696e206163636f756e7400000000000000000000000000000000000000000000606082015260800190565b6020808252602c908201527f417070726f766572526f6c65456e61626c65643a206e6f7420616e206170707260408201527f6f766572206163636f756e740000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f4554485661756c743a2063616e6e6f74207472616e7366657220746f207a657260408201527f6f00000000000000000000000000000000000000000000000000000000000000606082015260800190565b90815260200190565b6000838252604060208301526140f46040830184614318565b948552602085019390935260408401919091526060830152608082015260a00190565b6000821982111561539d5761539d615473565b500190565b6000826153bd57634e487b7160e01b81526012600452602481fd5b500490565b6000828210156153d4576153d4615473565b500390565b60005b838110156153f45781810151838201526020016153dc565b83811115610b225750506000910152565b60028104600182168061541957607f821691505b60208210811415610dcc57634e487b7160e01b600052602260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561546c5761546c615473565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b80151581146139ce57600080fdfea2646970667358221220287173c325fe47c9ec3a9b1c968a55be2ae84e1898c5a5d6e5a23c25ef2f4b2964736f6c634300080100335461736b4d616e616765723a206e6f7420656e6f75676820696e697469616c2000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004000000000000000000000000393f7974f9a1c63e1d9d5d98c124a0914302faac0000000000000000000000003fe16f735438165d936680743132c53d114db5f7000000000000000000000000548730ef6c35ccac1caa7772c2f24d153ef3b1d90000000000000000000000006443fd423ff590d40ec784e3fb17b753684f3e990000000000000000000000000000000000000000000000000000000000000001000000000000000000000000393f7974f9a1c63e1d9d5d98c124a0914302faac0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000393f7974f9a1c63e1d9d5d98c124a0914302faac000000000000000000000000548730ef6c35ccac1caa7772c2f24d153ef3b1d90000000000000000000000006443fd423ff590d40ec784e3fb17b753684f3e990000000000000000000000000000000000000000000000000000000000000001000000000000000000000000393f7974f9a1c63e1d9d5d98c124a0914302faac
Deployed Bytecode
0x6080604052600436106103225760003560e01c80637ec9152f116101a5578063b544414e116100ec578063d80528ae11610095578063efd460651161006f578063efd460651461090f578063f04907691461092f578063f23a6e611461094f578063f9a7640b1461096f57610356565b8063d80528ae146108a9578063dbdc814b146108cf578063debfda30146108ef57610356565b8063c9d14c14116100c6578063c9d14c1414610854578063cbe4c6ef14610874578063d06dcc511461089457610356565b8063b544414e146107f4578063bb6c352c14610814578063bc197c811461083457610356565b8063976d57701161014e578063a37ef8f811610128578063a37ef8f81461079f578063a4305937146107bf578063b42aebd1146107d457610356565b8063976d57701461074a5780639d6aacb01461076a578063a36b626f1461077f57610356565b806389d936371161017f57806389d93637146106ea5780638d134ad01461070a5780638f4ac6251461072a57610356565b80637ec9152f146106955780637fcd7e0f146106b557806382a22456146106ca57610356565b806333727c4d116102695780635f13c947116102125780636d633a5c116101ec5780636d633a5c1461063557806370fbe9ff146106555780637eb0bdc91461067557610356565b80635f13c947146105d55780636a83f109146105f55780636d218e481461061557610356565b806352f815131161024357806352f815131461057e5780635317234e146105a05780635656fc78146105c057610356565b806333727c4d1461051e578063374fea911461053e5780634895cdb51461055e57610356565b806318d07e7c116102cb578063292fd8f0116102a5578063292fd8f0146104be5780632d31479b146104de57806330454997146104fe57610356565b806318d07e7c14610451578063248bec701461047157806324d7806c1461049e57610356565b806314779cda116102fc57806314779cda146103e4578063150b7a021461040457806315d544061461043157610356565b806301ffc9a71461036e5780630a07fae6146103a4578063111002aa146103c457610356565b366103565761032f61098f565b6103545760405162461bcd60e51b815260040161034b90615165565b60405180910390fd5b005b60405162461bcd60e51b815260040161034b90614676565b34801561037a57600080fd5b5061038e610389366004614081565b610998565b60405161039b9190614484565b60405180910390f35b3480156103b057600080fd5b506103546103bf3660046140fc565b610a7f565b3480156103d057600080fd5b506103546103df3660046140c1565b610b28565b3480156103f057600080fd5b506103546103ff3660046141e0565b610b5c565b34801561041057600080fd5b5061042461041f366004613f59565b610c48565b60405161039b919061448f565b34801561043d57600080fd5b5061035461044c3660046140fc565b610c72565b34801561045d57600080fd5b5061035461046c3660046140c1565b610ce3565b34801561047d57600080fd5b5061049161048c3660046140fc565b610d13565b60405161039b91906144bc565b3480156104aa57600080fd5b5061038e6104b9366004613e81565b610dd2565b3480156104ca57600080fd5b506103546104d93660046140fc565b610e02565b3480156104ea57600080fd5b506103546104f9366004614223565b610ea4565b34801561050a57600080fd5b506103546105193660046140fc565b610f92565b34801561052a57600080fd5b5061038e6105393660046140fc565b611004565b34801561054a57600080fd5b5061035461055936600461412c565b6110ba565b34801561056a57600080fd5b5061035461057936600461412c565b6111a2565b34801561058a57600080fd5b50610593611269565b60405161039b9190615345565b3480156105ac57600080fd5b506103546105bb36600461412c565b61126f565b3480156105cc57600080fd5b5061038e611336565b3480156105e157600080fd5b506103546105f036600461412c565b61136a565b34801561060157600080fd5b5061035461061036600461403c565b611431565b34801561062157600080fd5b5061038e610630366004613e81565b611572565b34801561064157600080fd5b506105936106503660046140fc565b6115a2565b34801561066157600080fd5b5061038e610670366004613e81565b611658565b34801561068157600080fd5b5061035461069036600461412c565b611688565b3480156106a157600080fd5b506103546106b0366004614270565b61174f565b3480156106c157600080fd5b50610593611839565b3480156106d657600080fd5b506103546106e53660046141e0565b61183f565b3480156106f657600080fd5b5061035461070536600461412c565b611908565b34801561071657600080fd5b50610354610725366004614157565b6119cf565b34801561073657600080fd5b506103546107453660046141e0565b611ac2565b34801561075657600080fd5b5061035461076536600461412c565b611b8b565b34801561077657600080fd5b50610593611c52565b34801561078b57600080fd5b5061035461079a3660046142d3565b611c80565b3480156107ab57600080fd5b506103546107ba3660046141e0565b611d39565b3480156107cb57600080fd5b50610593611e02565b3480156107e057600080fd5b506103546107ef366004614192565b611e08565b34801561080057600080fd5b5061035461080f3660046142a4565b611ed1565b34801561082057600080fd5b5061035461082f36600461412c565b611fc3565b34801561084057600080fd5b5061042461084f366004613ea2565b61208a565b34801561086057600080fd5b5061035461086f3660046142d3565b6120b7565b34801561088057600080fd5b5061035461088f366004614192565b612128565b3480156108a057600080fd5b506105936121f1565b3480156108b557600080fd5b506108be6121f7565b60405161039b959493929190615367565b3480156108db57600080fd5b506103546108ea36600461412c565b612241565b3480156108fb57600080fd5b5061038e61090a366004613e81565b612308565b34801561091b57600080fd5b5061038e61092a366004613e81565b612338565b34801561093b57600080fd5b5061035461094a36600461403c565b612368565b34801561095b57600080fd5b5061042461096a366004613fc6565b612400565b34801561097b57600080fd5b5061035461098a36600461412c565b61242b565b600f5460ff1690565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f9acaf660000000000000000000000000000000000000000000000000000000001480610a2b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b80610a7757507fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a0200000000000000000000000000000000000000000000000000000000145b90505b919050565b610a88336124f2565b610aa45760405162461bcd60e51b815260040161034b9061528b565b80610aae81612510565b610aca5760405162461bcd60e51b815260040161034b90614550565b81610ad481612524565b15610af15760405162461bcd60e51b815260040161034b906151f7565b82610afb81612564565b15610b185760405162461bcd60e51b815260040161034b90615017565b610b2233856125a4565b50505050565b610b3133612696565b610b4d5760405162461bcd60e51b815260040161034b90614c09565b610b588160006126b4565b5050565b610b65336127a1565b610b815760405162461bcd60e51b815260040161034b90614de9565b83610b8b81612510565b610ba75760405162461bcd60e51b815260040161034b90614550565b84610bb181612524565b610bcd5760405162461bcd60e51b815260040161034b906151f7565b85610bd781612564565b15610bf45760405162461bcd60e51b815260040161034b90615017565b86610bfe816127bf565b610c1a5760405162461bcd60e51b815260040161034b90614cf8565b610c2587878761280a565b610c3e8860405180602001604052806000815250612911565b5050505050505050565b7f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f95945050505050565b610c7b336127a1565b610c975760405162461bcd60e51b815260040161034b90614de9565b80610ca181612510565b610cbd5760405162461bcd60e51b815260040161034b90614550565b81610cc781612524565b610af15760405162461bcd60e51b815260040161034b906151f7565b610cec336127a1565b610d085760405162461bcd60e51b815260040161034b90614de9565b610b588160016126b4565b6060610d1e336127a1565b80610d2d5750610d2d33612696565b80610d3c5750610d3c336124f2565b80610d4b5750610d4b33612984565b610d675760405162461bcd60e51b815260040161034b906150ab565b81610d7181612510565b610d8d5760405162461bcd60e51b815260040161034b90614550565b610d9683612524565b15610dc057610da4336127a1565b610dc05760405162461bcd60e51b815260040161034b90614730565b610dc9836129a2565b91505b50919050565b6000610ddd336127a1565b610df95760405162461bcd60e51b815260040161034b90614de9565b610a77826127a1565b610e0b336127a1565b610e275760405162461bcd60e51b815260040161034b90614de9565b80610e3181612510565b610e4d5760405162461bcd60e51b815260040161034b90614550565b81610e5781612524565b610e735760405162461bcd60e51b815260040161034b906151f7565b82610e7d81612564565b15610e9a5760405162461bcd60e51b815260040161034b90615017565b610b223385612a6a565b610ead336127a1565b610ec95760405162461bcd60e51b815260040161034b90614de9565b84610ed381612510565b610eef5760405162461bcd60e51b815260040161034b90614550565b85610ef981612524565b610f155760405162461bcd60e51b815260040161034b906151f7565b86610f1f81612564565b15610f3c5760405162461bcd60e51b815260040161034b90615017565b87610f46816127bf565b610f625760405162461bcd60e51b815260040161034b90614cf8565b610f6e88888888612b4d565b610f878960405180602001604052806000815250612911565b505050505050505050565b610f9b336124f2565b610fb75760405162461bcd60e51b815260040161034b9061528b565b80610fc181612510565b610fdd5760405162461bcd60e51b815260040161034b90614550565b81610fe781612524565b15610e735760405162461bcd60e51b815260040161034b906151f7565b600061100f336127a1565b8061101e575061101e33612696565b8061102d575061102d336124f2565b8061103c575061103c33612984565b6110585760405162461bcd60e51b815260040161034b906150ab565b8161106281612510565b61107e5760405162461bcd60e51b815260040161034b90614550565b61108783612524565b156110b157611095336127a1565b6110b15760405162461bcd60e51b815260040161034b90614730565b610dc983612564565b6110c3336127a1565b6110df5760405162461bcd60e51b815260040161034b90614de9565b816110e981612510565b6111055760405162461bcd60e51b815260040161034b90614550565b8261110f81612524565b61112b5760405162461bcd60e51b815260040161034b906151f7565b8361113581612564565b156111525760405162461bcd60e51b815260040161034b90615017565b8461115c816127bf565b6111785760405162461bcd60e51b815260040161034b90614cf8565b61118185612c59565b61119a8660405180602001604052806000815250612911565b505050505050565b6111ab336127a1565b6111c75760405162461bcd60e51b815260040161034b90614de9565b816111d181612510565b6111ed5760405162461bcd60e51b815260040161034b90614550565b826111f781612524565b6112135760405162461bcd60e51b815260040161034b906151f7565b8361121d81612564565b1561123a5760405162461bcd60e51b815260040161034b90615017565b84611244816127bf565b6112605760405162461bcd60e51b815260040161034b90614cf8565b61118185612d2a565b60035490565b611278336127a1565b6112945760405162461bcd60e51b815260040161034b90614de9565b8161129e81612510565b6112ba5760405162461bcd60e51b815260040161034b90614550565b826112c481612524565b6112e05760405162461bcd60e51b815260040161034b906151f7565b836112ea81612564565b156113075760405162461bcd60e51b815260040161034b90615017565b84611311816127bf565b61132d5760405162461bcd60e51b815260040161034b90614cf8565b61118185612df0565b6000611341336127a1565b61135d5760405162461bcd60e51b815260040161034b90614de9565b61136561098f565b905090565b611373336127a1565b61138f5760405162461bcd60e51b815260040161034b90614de9565b8161139981612510565b6113b55760405162461bcd60e51b815260040161034b90614550565b826113bf81612524565b6113db5760405162461bcd60e51b815260040161034b906151f7565b836113e581612564565b156114025760405162461bcd60e51b815260040161034b90615017565b8461140c816127bf565b6114285760405162461bcd60e51b815260040161034b90614cf8565b61118185612ebd565b61143a33612f8a565b6114565760405162461bcd60e51b815260040161034b906144f3565b8161146081612984565b61147c5760405162461bcd60e51b815260040161034b906146d3565b8161148681612510565b6114a25760405162461bcd60e51b815260040161034b90614550565b826114ac81612524565b6114c85760405162461bcd60e51b815260040161034b906151f7565b836114d2816127bf565b6114ee5760405162461bcd60e51b815260040161034b90614cf8565b846114f881612564565b156115155760405162461bcd60e51b815260040161034b90615017565b61152e8660405180602001604052806000815250612911565b7fb4b8589d8015ad1f83a922f4fd0d6498f557018656541ce92b6c18db2b70466133888860405161156193929190614398565b60405180910390a150505050505050565b600061157d336127a1565b6115995760405162461bcd60e51b815260040161034b90614de9565b610a77826124f2565b60006115ad336127a1565b806115bc57506115bc33612696565b806115cb57506115cb336124f2565b806115da57506115da33612984565b6115f65760405162461bcd60e51b815260040161034b906150ab565b8161160081612510565b61161c5760405162461bcd60e51b815260040161034b90614550565b61162583612524565b1561164f57611633336127a1565b61164f5760405162461bcd60e51b815260040161034b90614730565b610dc983612fa8565b6000611663336127a1565b61167f5760405162461bcd60e51b815260040161034b90614de9565b610a7782612f8a565b611691336127a1565b6116ad5760405162461bcd60e51b815260040161034b90614de9565b816116b781612510565b6116d35760405162461bcd60e51b815260040161034b90614550565b826116dd81612524565b6116f95760405162461bcd60e51b815260040161034b906151f7565b8361170381612564565b156117205760405162461bcd60e51b815260040161034b90615017565b8461172a816127bf565b6117465760405162461bcd60e51b815260040161034b90614cf8565b61118185612fe5565b611758336127a1565b6117745760405162461bcd60e51b815260040161034b90614de9565b8261177e81612510565b61179a5760405162461bcd60e51b815260040161034b90614550565b836117a481612524565b6117c05760405162461bcd60e51b815260040161034b906151f7565b846117ca81612564565b156117e75760405162461bcd60e51b815260040161034b90615017565b856117f1816127bf565b61180d5760405162461bcd60e51b815260040161034b90614cf8565b61181786866130db565b6118308760405180602001604052806000815250612911565b50505050505050565b60045481565b611848336127a1565b6118645760405162461bcd60e51b815260040161034b90614de9565b8361186e81612510565b61188a5760405162461bcd60e51b815260040161034b90614550565b8461189481612524565b6118b05760405162461bcd60e51b815260040161034b906151f7565b856118ba81612564565b156118d75760405162461bcd60e51b815260040161034b90615017565b866118e1816127bf565b6118fd5760405162461bcd60e51b815260040161034b90614cf8565b610c258787876131ff565b611911336127a1565b61192d5760405162461bcd60e51b815260040161034b90614de9565b8161193781612510565b6119535760405162461bcd60e51b815260040161034b90614550565b8261195d81612524565b6119795760405162461bcd60e51b815260040161034b906151f7565b8361198381612564565b156119a05760405162461bcd60e51b815260040161034b90615017565b846119aa816127bf565b6119c65760405162461bcd60e51b815260040161034b90614cf8565b61118185613318565b6119d8336127a1565b6119f45760405162461bcd60e51b815260040161034b90614de9565b826119fe81612510565b611a1a5760405162461bcd60e51b815260040161034b90614550565b83611a2481612524565b611a405760405162461bcd60e51b815260040161034b906151f7565b84611a4a81612564565b15611a675760405162461bcd60e51b815260040161034b90615017565b85611a71816127bf565b611a8d5760405162461bcd60e51b815260040161034b90614cf8565b6003546006541415611ab057611aa286612fe5565b611aab856133de565b611817565b611ab9856133de565b61181786612fe5565b611acb336127a1565b611ae75760405162461bcd60e51b815260040161034b90614de9565b83611af181612510565b611b0d5760405162461bcd60e51b815260040161034b90614550565b84611b1781612524565b611b335760405162461bcd60e51b815260040161034b906151f7565b85611b3d81612564565b15611b5a5760405162461bcd60e51b815260040161034b90615017565b86611b64816127bf565b611b805760405162461bcd60e51b815260040161034b90614cf8565b610c258787876134da565b611b94336127a1565b611bb05760405162461bcd60e51b815260040161034b90614de9565b81611bba81612510565b611bd65760405162461bcd60e51b815260040161034b90614550565b82611be081612524565b611bfc5760405162461bcd60e51b815260040161034b906151f7565b83611c0681612564565b15611c235760405162461bcd60e51b815260040161034b90615017565b84611c2d816127bf565b611c495760405162461bcd60e51b815260040161034b90614cf8565b611181856136c7565b6000611c5d336127a1565b611c795760405162461bcd60e51b815260040161034b90614de9565b5060065490565b611c8933612696565b80611c985750611c98336127a1565b611cb45760405162461bcd60e51b815260040161034b90614ea3565b81611cbe81612510565b611cda5760405162461bcd60e51b815260040161034b90614550565b82611ce481612524565b15611d015760405162461bcd60e51b815260040161034b906151f7565b83611d0b81612564565b15611d285760405162461bcd60e51b815260040161034b90615017565b611d328585612911565b5050505050565b611d42336127a1565b611d5e5760405162461bcd60e51b815260040161034b90614de9565b83611d6881612510565b611d845760405162461bcd60e51b815260040161034b90614550565b84611d8e81612524565b611daa5760405162461bcd60e51b815260040161034b906151f7565b85611db481612564565b15611dd15760405162461bcd60e51b815260040161034b90615017565b86611ddb816127bf565b611df75760405162461bcd60e51b815260040161034b90614cf8565b610c25878787613794565b60045490565b611e11336127a1565b611e2d5760405162461bcd60e51b815260040161034b90614de9565b83611e3781612510565b611e535760405162461bcd60e51b815260040161034b90614550565b84611e5d81612524565b611e795760405162461bcd60e51b815260040161034b906151f7565b85611e8381612564565b15611ea05760405162461bcd60e51b815260040161034b90615017565b86611eaa816127bf565b611ec65760405162461bcd60e51b815260040161034b90614cf8565b610c25878787613866565b611eda336127a1565b611ef65760405162461bcd60e51b815260040161034b90614de9565b81611f0081612510565b611f1c5760405162461bcd60e51b815260040161034b90614550565b82611f2681612524565b611f425760405162461bcd60e51b815260040161034b906151f7565b83611f4c81612564565b15611f695760405162461bcd60e51b815260040161034b90615017565b84611f73816127bf565b611f8f5760405162461bcd60e51b815260040161034b90614cf8565b841515611f9a61098f565b15151415611fba5760405162461bcd60e51b815260040161034b906149cc565b6111818561395e565b611fcc336127a1565b611fe85760405162461bcd60e51b815260040161034b90614de9565b81611ff281612510565b61200e5760405162461bcd60e51b815260040161034b90614550565b8261201881612524565b6120345760405162461bcd60e51b815260040161034b906151f7565b8361203e81612564565b1561205b5760405162461bcd60e51b815260040161034b90615017565b84612065816127bf565b6120815760405162461bcd60e51b815260040161034b90614cf8565b611181856139d1565b7fbc197c819b3e337a6f9652dd10becd7eef83032af3b9d958d3d42f669414662198975050505050505050565b6120c0336127a1565b6120dc5760405162461bcd60e51b815260040161034b90614de9565b816120e681612510565b6121025760405162461bcd60e51b815260040161034b90614550565b8261210c81612524565b611d015760405162461bcd60e51b815260040161034b906151f7565b612131336127a1565b61214d5760405162461bcd60e51b815260040161034b90614de9565b8361215781612510565b6121735760405162461bcd60e51b815260040161034b90614550565b8461217d81612524565b6121995760405162461bcd60e51b815260040161034b906151f7565b856121a381612564565b156121c05760405162461bcd60e51b815260040161034b90615017565b866121ca816127bf565b6121e65760405162461bcd60e51b815260040161034b90614cf8565b610c25878787613a97565b60035481565b6000806000806000612208336127a1565b6122245760405162461bcd60e51b815260040161034b90614de9565b5050600654600854600a54600c54600e5493979296509094509250565b61224a336127a1565b6122665760405162461bcd60e51b815260040161034b90614de9565b8161227081612510565b61228c5760405162461bcd60e51b815260040161034b90614550565b8261229681612524565b6122b25760405162461bcd60e51b815260040161034b906151f7565b836122bc81612564565b156122d95760405162461bcd60e51b815260040161034b90615017565b846122e3816127bf565b6122ff5760405162461bcd60e51b815260040161034b90614cf8565b611181856133de565b6000612313336127a1565b61232f5760405162461bcd60e51b815260040161034b90614de9565b610a7782612984565b6000612343336127a1565b61235f5760405162461bcd60e51b815260040161034b90614de9565b610a7782612696565b61237133612f8a565b61238d5760405162461bcd60e51b815260040161034b906144f3565b8161239781612984565b6123b35760405162461bcd60e51b815260040161034b906146d3565b816123bd81612510565b6123d95760405162461bcd60e51b815260040161034b90614550565b826123e381612524565b156114c85760405162461bcd60e51b815260040161034b906151f7565b7ff23a6e612e1ff4830e658fe43f4e3cb4a5f8170bd5d9e69fb5d7a7fa9e4fdf979695505050505050565b612434336127a1565b6124505760405162461bcd60e51b815260040161034b90614de9565b8161245a81612510565b6124765760405162461bcd60e51b815260040161034b90614550565b8261248081612524565b61249c5760405162461bcd60e51b815260040161034b906151f7565b836124a681612564565b156124c35760405162461bcd60e51b815260040161034b90615017565b846124cd816127bf565b6124e95760405162461bcd60e51b815260040161034b90614cf8565b61118185613b8f565b6001600160a01b031660009081526009602052604090205460ff1690565b600090815260208190526040902054151590565b600061252f82612510565b61254b5760405162461bcd60e51b815260040161034b90614550565b5060009081526020819052604090206002015460ff1690565b600061256f82612510565b61258b5760405162461bcd60e51b815260040161034b90614550565b5060009081526020819052604090206004015460ff1690565b6125ad81612510565b6125c95760405162461bcd60e51b815260040161034b90614550565b60008181526001602090815260408083206001600160a01b038616845290915290205460ff161561260c5760405162461bcd60e51b815260040161034b9061478d565b60008181526001602081815260408084206001600160a01b03871685528252808420805460ff19168417905584845290839052822060030180549192909161265590849061538a565b90915550506040517f3e9d27a1c2a828db29e4b2a17fbd1bc70201ef21aec4f74b9fa051b02e38e3f09061268a908390615345565b60405180910390a15050565b6001600160a01b031660009081526007602052604090205460ff1690565b600280546000918190836126c78361543a565b90915550506040805160a08101825282815260208082018781528615158385015260006060840181905260808401819052858152808352939093208251815592518051929384939092612721926001850192910190613cc1565b5060408281015160028301805491151560ff19928316179055606084015160038401556080909301516004909201805492151592909316919091179091555182907f05d0fb833127fc08168556d0e7ca9554fc3f6bc843b3b7d2bf1c35aea6bab6609061279190889088906144cf565b60405180910390a2509392505050565b6001600160a01b031660009081526005602052604090205460ff1690565b60006127ca82612510565b6127e65760405162461bcd60e51b815260040161034b90614550565b6127ef82613c5c565b60008381526020819052604090206003015410159050919050565b6001600160a01b0383166128305760405162461bcd60e51b815260040161034b906145e2565b6001600160a01b0382166128565760405162461bcd60e51b815260040161034b9061519a565b6040517fb88d4fde0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063b88d4fde9061289f903090869086906004016143bc565b600060405180830381600087803b1580156128b957600080fd5b505af11580156128cd573d6000803e3d6000fd5b505050507fcd68d836931d28b26c81fd06a68b603542d9b3a2fd1ba1c1bd30c9e2e5f4e6eb83838360405161290493929190614398565b60405180910390a1505050565b61291a82612510565b6129365760405162461bcd60e51b815260040161034b90614550565b60008281526020819052604090819020600401805460ff19166001179055517fe5516cdd051314d9e1a70e80776a58d2064a5468c26b2f1a7e13cd96ab2d65079061268a908490849061534e565b6001600160a01b03166000908152600b602052604090205460ff1690565b60606129ad82612510565b6129c95760405162461bcd60e51b815260040161034b90614550565b600082815260208190526040902060010180546129e590615405565b80601f0160208091040260200160405190810160405280929190818152602001828054612a1190615405565b8015612a5e5780601f10612a3357610100808354040283529160200191612a5e565b820191906000526020600020905b815481529060010190602001808311612a4157829003601f168201915b50505050509050919050565b612a7381612510565b612a8f5760405162461bcd60e51b815260040161034b90614550565b60008181526001602090815260408083206001600160a01b038616845290915290205460ff16612ad15760405162461bcd60e51b815260040161034b90614cf8565b60008181526001602081815260408084206001600160a01b03871685528252808420805460ff19169055848452908390528220600301805491929091612b189084906153c2565b90915550506040517fb2d3b7ccb3dd8e3420904dd2c5cf01ddbe69777044e015eb3c56294506067bab9061268a908390615345565b6001600160a01b038416612b735760405162461bcd60e51b815260040161034b90614c66565b6001600160a01b038316612b995760405162461bcd60e51b815260040161034b90614d8c565b6040517ff242432a0000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063f242432a90612be4903090879087908790600401614418565b600060405180830381600087803b158015612bfe57600080fd5b505af1158015612c12573d6000803e3d6000fd5b505050507f33627cfa024b2c6aba9bb8060d9b3112240af2250621855495464379de6ab1b584848484604051612c4b94939291906143ef565b60405180910390a150505050565b6001600160a01b038116612c7f5760405162461bcd60e51b815260040161034b906148a4565b6001600160a01b03811660009081526007602052604090205460ff16612cb75760405162461bcd60e51b815260040161034b90614c09565b6001600160a01b0381166000908152600760205260408120805460ff191690556008805460019290612cea9084906153c2565b90915550506040517f94a409f50d78dc8628b7499ba5af0848a134b9a935a59c0a45313b67f66920f890612d1f908390614360565b60405180910390a150565b6001600160a01b038116612d505760405162461bcd60e51b815260040161034b90615108565b6001600160a01b0381166000908152600d602052604090205460ff16612d885760405162461bcd60e51b815260040161034b906144f3565b6001600160a01b0381166000908152600d60205260408120805460ff19169055600e805460019290612dbb9084906153c2565b90915550506040517f69876ed6762df72762082100c5690190c4b64d6226f20712d3d8deb06053893890612d1f908390614360565b6001600160a01b038116612e165760405162461bcd60e51b815260040161034b90614585565b6001600160a01b03811660009081526009602052604090205460ff1615612e4f5760405162461bcd60e51b815260040161034b90614a86565b6001600160a01b0381166000908152600960205260408120805460ff19166001908117909155600a805491929091612e8890849061538a565b90915550506040517f835bddf1ceee4956e4329af9edf018523c1191238187a597453f6020bcadb04290612d1f908390614360565b6001600160a01b038116612ee35760405162461bcd60e51b815260040161034b9061496f565b6001600160a01b0381166000908152600b602052604090205460ff1615612f1c5760405162461bcd60e51b815260040161034b90614b1a565b6001600160a01b0381166000908152600b60205260408120805460ff19166001908117909155600c805491929091612f5590849061538a565b90915550506040517fae5b7c3b000f575c241001dc9bcb3d8778376889353b07121115574eceff78c590612d1f908390614360565b6001600160a01b03166000908152600d602052604090205460ff1690565b6000612fb382612510565b612fcf5760405162461bcd60e51b815260040161034b90614550565b5060009081526020819052604090206003015490565b6001600160a01b03811661300b5760405162461bcd60e51b815260040161034b90614e46565b6001600160a01b03811660009081526005602052604090205460ff166130435760405162461bcd60e51b815260040161034b90614de9565b600454600160065461305591906153c2565b10156130735760405162461bcd60e51b815260040161034b90614c9b565b6001600160a01b0381166000908152600560205260408120805460ff1916905560068054600192906130a69084906153c2565b90915550506040517fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f90612d1f908390614360565b6001600160a01b0382166131015760405162461bcd60e51b815260040161034b906152e8565b600081116131215760405162461bcd60e51b815260040161034b90614ae3565b478111156131415760405162461bcd60e51b815260040161034b906147ea565b604080516000808252602082019092526001600160a01b03841690839060405161316b9190614344565b60006040518083038185875af1925050503d80600081146131a8576040519150601f19603f3d011682016040523d82523d6000602084013e6131ad565b606091505b50509050806131ce5760405162461bcd60e51b815260040161034b90614938565b7f1445764fe3fdfc2a9812ff42e9b65c2e7896d5162851f78f7d4a5578f7346ff1838360405161290492919061446b565b6001600160a01b0383166132255760405162461bcd60e51b815260040161034b90614d55565b6001600160a01b03821661324b5760405162461bcd60e51b815260040161034b90614bac565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063095ea7b390613292908590859060040161446b565b602060405180830381600087803b1580156132ac57600080fd5b505af11580156132c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132e49190614065565b507fe285444a44723385de85da4844cbb9105030b82a9300a3ffca99054d624c5e3083838360405161290493929190614398565b6001600160a01b03811661333e5760405162461bcd60e51b815260040161034b9061496f565b6001600160a01b0381166000908152600b602052604090205460ff166133765760405162461bcd60e51b815260040161034b906146d3565b6001600160a01b0381166000908152600b60205260408120805460ff19169055600c8054600192906133a99084906153c2565b90915550506040517f4a2cf608bfb427f53279ec7f0eadf48913b9346ccefc3af138dbdec14ea0907d90612d1f908390614360565b6001600160a01b0381166134045760405162461bcd60e51b815260040161034b90614e46565b6001600160a01b03811660009081526005602052604090205460ff161561343d5760405162461bcd60e51b815260040161034b9061522e565b60035460065461344e90600161538a565b111561346c5760405162461bcd60e51b815260040161034b90614f00565b6001600160a01b0381166000908152600560205260408120805460ff1916600190811790915560068054919290916134a590849061538a565b90915550506040517f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e33990612d1f908390614360565b6001600160a01b0383166135005760405162461bcd60e51b815260040161034b90614d55565b6001600160a01b0382166135265760405162461bcd60e51b815260040161034b90614f5d565b600081116135465760405162461bcd60e51b815260040161034b90614901565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038416906370a082319061358b903090600401614360565b60206040518083038186803b1580156135a357600080fd5b505afa1580156135b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135db9190614114565b8111156135fa5760405162461bcd60e51b815260040161034b90614fba565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063a9059cbb90613641908590859060040161446b565b602060405180830381600087803b15801561365b57600080fd5b505af115801561366f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136939190614065565b507fe8de91d538b06154a2c48315768c5046f47e127d7fd3f726fd85cc723f29b05283838360405161290493929190614398565b6001600160a01b0381166136ed5760405162461bcd60e51b815260040161034b906148a4565b6001600160a01b03811660009081526007602052604090205460ff16156137265760405162461bcd60e51b815260040161034b90614619565b6001600160a01b0381166000908152600760205260408120805460ff19166001908117909155600880549192909161375f90849061538a565b90915550506040517f021a687fbe334e9e815cee8b399c0bc42e82356eb7f63a09ddb558a25d3dcdbd90612d1f908390614360565b6001600160a01b0383166137ba5760405162461bcd60e51b815260040161034b906145e2565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063095ea7b390613801908590859060040161446b565b600060405180830381600087803b15801561381b57600080fd5b505af115801561382f573d6000803e3d6000fd5b505050507fd28f69cf4df1f60ab7617e7a45ff83d9ea9c984c0839ca7c7bbea0654520b17583838360405161290493929190614398565b6001600160a01b03831661388c5760405162461bcd60e51b815260040161034b90614c66565b6001600160a01b0382166138b25760405162461bcd60e51b815260040161034b9061504e565b6040517fa22cb4650000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063a22cb465906138f99085908590600401614450565b600060405180830381600087803b15801561391357600080fd5b505af1158015613927573d6000803e3d6000fd5b505050507fdd7643f09c4969b2b902e40fb0b08a3c9cbf7f60975628ed6c175e85c851e22283838360405161290493929190614374565b600f805460ff1916821515179081905560ff16156139a4576040517fc900358025f09a872d1a6e53c30e64a77566eada5220d1044c2636f83a0c8bcf90600090a16139ce565b6040517ffb2915041896c6af47e9321d19194f79106105a83cf67d0262283fb48cebf14890600090a15b50565b6001600160a01b0381166139f75760405162461bcd60e51b815260040161034b90614585565b6001600160a01b03811660009081526009602052604090205460ff16613a2f5760405162461bcd60e51b815260040161034b9061528b565b6001600160a01b0381166000908152600960205260408120805460ff19169055600a805460019290613a629084906153c2565b90915550506040517fc6e35658c76ecdde40a54f31a91fb7c8615e9893cc0885584b27bb3433270d4690612d1f908390614360565b6001600160a01b038316613abd5760405162461bcd60e51b815260040161034b906145e2565b6001600160a01b038216613ae35760405162461bcd60e51b815260040161034b90614847565b6040517fa22cb4650000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063a22cb46590613b2a9085908590600401614450565b600060405180830381600087803b158015613b4457600080fd5b505af1158015613b58573d6000803e3d6000fd5b505050507fa7bccb6e0f084533659b39f9e36504532604da7f98afa2c4763a0ab3224a4c2b83838360405161290493929190614374565b6001600160a01b038116613bb55760405162461bcd60e51b815260040161034b90615108565b6001600160a01b0381166000908152600d602052604090205460ff1615613bee5760405162461bcd60e51b815260040161034b90614a29565b6001600160a01b0381166000908152600d60205260408120805460ff19166001908117909155600e805491929091613c2790849061538a565b90915550506040517f71e5b5f10a15e7289cadf7a68cf7be4dd27de56f07efc169e0de27e0a3114f8a90612d1f908390614360565b6000613c6782612510565b613c835760405162461bcd60e51b815260040161034b90614b77565b613c8c82612524565b15613cb2576002600654613ca091906153a2565b613cab90600161538a565b9050610a7a565b6002600a54613ca091906153a2565b828054613ccd90615405565b90600052602060002090601f016020900481019282613cef5760008555613d35565b82601f10613d0857805160ff1916838001178555613d35565b82800160010185558215613d35579182015b82811115613d35578251825591602001919060010190613d1a565b50613d41929150613d45565b5090565b5b80821115613d415760008155600101613d46565b80356001600160a01b0381168114610a7a57600080fd5b60008083601f840112613d82578081fd5b50813567ffffffffffffffff811115613d99578182fd5b6020830191508360208083028501011115613db357600080fd5b9250929050565b60008083601f840112613dcb578182fd5b50813567ffffffffffffffff811115613de2578182fd5b602083019150836020828501011115613db357600080fd5b600082601f830112613e0a578081fd5b813567ffffffffffffffff80821115613e2557613e25615489565b604051601f8301601f19908116603f01168101908282118183101715613e4d57613e4d615489565b81604052838152866020858801011115613e65578485fd5b8360208701602083013792830160200193909352509392505050565b600060208284031215613e92578081fd5b613e9b82613d5a565b9392505050565b60008060008060008060008060a0898b031215613ebd578384fd5b613ec689613d5a565b9750613ed460208a01613d5a565b9650604089013567ffffffffffffffff80821115613ef0578586fd5b613efc8c838d01613d71565b909850965060608b0135915080821115613f14578586fd5b613f208c838d01613d71565b909650945060808b0135915080821115613f38578384fd5b50613f458b828c01613dba565b999c989b5096995094979396929594505050565b600080600080600060808688031215613f70578081fd5b613f7986613d5a565b9450613f8760208701613d5a565b935060408601359250606086013567ffffffffffffffff811115613fa9578182fd5b613fb588828901613dba565b969995985093965092949392505050565b60008060008060008060a08789031215613fde578182fd5b613fe787613d5a565b9550613ff560208801613d5a565b94506040870135935060608701359250608087013567ffffffffffffffff81111561401e578283fd5b61402a89828a01613dba565b979a9699509497509295939492505050565b6000806040838503121561404e578182fd5b61405783613d5a565b946020939093013593505050565b600060208284031215614076578081fd5b8151613e9b8161549f565b600060208284031215614092578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114613e9b578182fd5b6000602082840312156140d2578081fd5b813567ffffffffffffffff8111156140e8578182fd5b6140f484828501613dfa565b949350505050565b60006020828403121561410d578081fd5b5035919050565b600060208284031215614125578081fd5b5051919050565b6000806040838503121561413e578182fd5b8235915061414e60208401613d5a565b90509250929050565b60008060006060848603121561416b578283fd5b8335925061417b60208501613d5a565b915061418960408501613d5a565b90509250925092565b600080600080608085870312156141a7578182fd5b843593506141b760208601613d5a565b92506141c560408601613d5a565b915060608501356141d58161549f565b939692955090935050565b600080600080608085870312156141f5578182fd5b8435935061420560208601613d5a565b925061421360408601613d5a565b9396929550929360600135925050565b600080600080600060a0868803121561423a578283fd5b8535945061424a60208701613d5a565b935061425860408701613d5a565b94979396509394606081013594506080013592915050565b600080600060608486031215614284578081fd5b8335925061429460208501613d5a565b9150604084013590509250925092565b600080604083850312156142b6578182fd5b8235915060208301356142c88161549f565b809150509250929050565b600080604083850312156142e5578182fd5b82359150602083013567ffffffffffffffff811115614302578182fd5b61430e85828601613dfa565b9150509250929050565b600081518084526143308160208601602086016153d9565b601f01601f19169290920160200192915050565b600082516143568184602087016153d9565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b039384168152919092166020820152604081019190915260806060820181905260009082015260a00190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6001600160a01b039290921682521515602082015260400190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b600060208252613e9b6020830184614318565b6000604082526144e26040830185614318565b905082151560208301529392505050565b6020808252602d908201527f46696e616c697a6572526f6c65456e61626c65643a206e6f7420612066696e6160408201527f6c697a6572206163636f756e7400000000000000000000000000000000000000606082015260800190565b6020808252818101527f5461736b4d616e616765643a207461736b20646f6573206e6f74206578697374604082015260600190565b60208082526030908201527f417070726f766572526f6c65456e61626c65643a207a65726f206163636f756e60408201527f742063616e6e6f74206265207573656400000000000000000000000000000000606082015260800190565b6020808252601f908201527f4552433732315661756c743a207a65726f20746f6b656e206164647265737300604082015260600190565b6020808252602d908201527f43726561746f72526f6c65456e61626c65643a20616c7265616479206120637260408201527f6561746f72206163636f756e7400000000000000000000000000000000000000606082015260800190565b60208082526022908201527f5461736b4d616e616765723a2066616c6c6261636b20616c776179732066616960408201527f6c73000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602c908201527f4578656375746f72526f6c65456e61626c65643a206e6f7420616e206578656360408201527f75746f72206163636f756e740000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f5461736b4d616e616765723a206e6f7420616e2061646d696e206163636f756e60408201527f7400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f5461736b4d616e616765643a207461736b20697320616c72656164792061707060408201527f726f766564000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526024908201527f4554485661756c743a207472616e73666572206d6f7265207468616e2062616c60408201527f616e636500000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f4552433732315661756c743a207a65726f206164647265737320666f72206f7060408201527f657261746f720000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602f908201527f43726561746f72526f6c65456e61626c65643a207a65726f206163636f756e7460408201527f2063616e6e6f7420626520757365640000000000000000000000000000000000606082015260800190565b6020808252601a908201527f45524332305661756c743a20616d6f756e74206973207a65726f000000000000604082015260600190565b6020808252601c908201527f4554485661756c743a206661696c656420746f207472616e7366657200000000604082015260600190565b60208082526030908201527f4578656375746f72526f6c65456e61626c65643a207a65726f206163636f756e60408201527f742063616e6e6f74206265207573656400000000000000000000000000000000606082015260800190565b6020808252602a908201527f4554485661756c74456e61626c65643a2063616e6e6f7420736574207468652060408201527f73616d652076616c756500000000000000000000000000000000000000000000606082015260800190565b60208082526031908201527f46696e616c697a6572526f6c65456e61626c65643a20616c726561647920612060408201527f66696e616c697a6572206163636f756e74000000000000000000000000000000606082015260800190565b60208082526030908201527f417070726f766572526f6c65456e61626c65643a20616c726561647920616e2060408201527f617070726f766572206163636f756e7400000000000000000000000000000000606082015260800190565b60208082526018908201527f4554485661756c743a20616d6f756e74206973207a65726f0000000000000000604082015260600190565b60208082526030908201527f4578656375746f72526f6c65456e61626c65643a20616c726561647920616e2060408201527f6578656375746f72206163636f756e7400000000000000000000000000000000606082015260800190565b6020808252818101527f5461736b4d616e616765723a207461736b20646f6573206e6f74206578697374604082015260600190565b60208082526024908201527f45524332305661756c743a207a65726f206164647265737320666f722073706560408201527f6e64657200000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526029908201527f43726561746f72526f6c65456e61626c65643a206e6f7420612063726561746f60408201527f72206163636f756e740000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f455243313135355661756c743a207a65726f20746f6b656e2061646472657373604082015260600190565b6020808252603d908201527f41646d696e526f6c65456e61626c65643a20676f65732062656c6f77206d696e60408201527f696d756d206e756d626572206f662061646d696e206163636f756e7473000000606082015260800190565b60208082526021908201527f5461736b4d616e616765643a207461736b206973206e6f7420617070726f766560408201527f6400000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f45524332305661756c743a207a65726f20746f6b656e20616464726573730000604082015260600190565b60208082526025908201527f455243313135355661756c743a2063616e6e6f74207472616e7366657220746f60408201527f207a65726f000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f41646d696e526f6c65456e61626c65643a206e6f7420616e2061646d696e206160408201527f63636f756e740000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602d908201527f41646d696e526f6c65456e61626c65643a207a65726f206163636f756e74206360408201527f616e6e6f74206265207573656400000000000000000000000000000000000000606082015260800190565b60208082526032908201527f43726561746f72526f6c65456e61626c65643a206e6f7420612063726561746f60408201527f72206f722061646d696e206163636f756e740000000000000000000000000000606082015260800190565b6020808252603a908201527f41646d696e526f6c65456e61626c65643a2065786365656473206d6178696d7560408201527f6d206e756d626572206f662061646d696e206163636f756e7473000000000000606082015260800190565b60208082526023908201527f45524332305661756c743a2063616e6e6f74207472616e7366657220746f207a60408201527f65726f0000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f45524332305661756c743a207472616e73666572206d6f7265207468616e206260408201527f616c616e63650000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f5461736b4d616e616765643a207461736b2069732066696e616c697a65640000604082015260600190565b60208082526027908201527f455243313135355661756c743a207a65726f206164647265737320666f72206f60408201527f70657261746f7200000000000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f5461736b4d616e616765723a206e6f7420612070726976696c6567656420616360408201527f636f756e74000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526031908201527f46696e616c697a6572526f6c65456e61626c65643a207a65726f206163636f7560408201527f6e742063616e6e6f742062652075736564000000000000000000000000000000606082015260800190565b6020808252818101527f5461736b4d616e616765723a2063616e6e6f7420616363657074206574686572604082015260600190565b60208082526024908201527f4552433732315661756c743a2063616e6e6f74207472616e7366657220746f2060408201527f7a65726f00000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f5461736b4d616e616765643a20696e76616c6964207461736b20747970650000604082015260600190565b6020808252602a908201527f41646d696e526f6c65456e61626c65643a20616c726561647920616e2061646d60408201527f696e206163636f756e7400000000000000000000000000000000000000000000606082015260800190565b6020808252602c908201527f417070726f766572526f6c65456e61626c65643a206e6f7420616e206170707260408201527f6f766572206163636f756e740000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f4554485661756c743a2063616e6e6f74207472616e7366657220746f207a657260408201527f6f00000000000000000000000000000000000000000000000000000000000000606082015260800190565b90815260200190565b6000838252604060208301526140f46040830184614318565b948552602085019390935260408401919091526060830152608082015260a00190565b6000821982111561539d5761539d615473565b500190565b6000826153bd57634e487b7160e01b81526012600452602481fd5b500490565b6000828210156153d4576153d4615473565b500390565b60005b838110156153f45781810151838201526020016153dc565b83811115610b225750506000910152565b60028104600182168061541957607f821691505b60208210811415610dcc57634e487b7160e01b600052602260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561546c5761546c615473565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b80151581146139ce57600080fdfea2646970667358221220287173c325fe47c9ec3a9b1c968a55be2ae84e1898c5a5d6e5a23c25ef2f4b2964736f6c63430008010033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004000000000000000000000000393f7974f9a1c63e1d9d5d98c124a0914302faac0000000000000000000000003fe16f735438165d936680743132c53d114db5f7000000000000000000000000548730ef6c35ccac1caa7772c2f24d153ef3b1d90000000000000000000000006443fd423ff590d40ec784e3fb17b753684f3e990000000000000000000000000000000000000000000000000000000000000001000000000000000000000000393f7974f9a1c63e1d9d5d98c124a0914302faac0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000393f7974f9a1c63e1d9d5d98c124a0914302faac000000000000000000000000548730ef6c35ccac1caa7772c2f24d153ef3b1d90000000000000000000000006443fd423ff590d40ec784e3fb17b753684f3e990000000000000000000000000000000000000000000000000000000000000001000000000000000000000000393f7974f9a1c63e1d9d5d98c124a0914302faac
-----Decoded View---------------
Arg [0] : initialAdmins (address[]): 0x393f7974F9A1C63E1D9d5D98C124A0914302Faac,0x3fE16F735438165D936680743132C53d114Db5f7,0x548730EF6C35CCaC1Caa7772c2F24d153Ef3b1d9,0x6443fd423Ff590d40EC784e3Fb17B753684F3e99
Arg [1] : initialCreators (address[]): 0x393f7974F9A1C63E1D9d5D98C124A0914302Faac
Arg [2] : initialApprovers (address[]): 0x393f7974F9A1C63E1D9d5D98C124A0914302Faac,0x548730EF6C35CCaC1Caa7772c2F24d153Ef3b1d9,0x6443fd423Ff590d40EC784e3Fb17B753684F3e99
Arg [3] : initialExecutors (address[]): 0x393f7974F9A1C63E1D9d5D98C124A0914302Faac
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] : 000000000000000000000000393f7974f9a1c63e1d9d5d98c124a0914302faac
Arg [7] : 0000000000000000000000003fe16f735438165d936680743132c53d114db5f7
Arg [8] : 000000000000000000000000548730ef6c35ccac1caa7772c2f24d153ef3b1d9
Arg [9] : 0000000000000000000000006443fd423ff590d40ec784e3fb17b753684f3e99
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [11] : 000000000000000000000000393f7974f9a1c63e1d9d5d98c124a0914302faac
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [13] : 000000000000000000000000393f7974f9a1c63e1d9d5d98c124a0914302faac
Arg [14] : 000000000000000000000000548730ef6c35ccac1caa7772c2f24d153ef3b1d9
Arg [15] : 0000000000000000000000006443fd423ff590d40ec784e3fb17b753684f3e99
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [17] : 000000000000000000000000393f7974f9a1c63e1d9d5d98c124a0914302faac
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.