Source Code
Latest 25 from a total of 242 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Approve Task | 17927771 | 920 days ago | IN | 0 ETH | 0.00215096 | ||||
| Approve Task | 17927579 | 920 days ago | IN | 0 ETH | 0.00212726 | ||||
| Approve Task | 17927573 | 920 days ago | IN | 0 ETH | 0.0028559 | ||||
| Create Task | 17927569 | 920 days ago | IN | 0 ETH | 0.00303566 | ||||
| Approve Task | 17619974 | 963 days ago | IN | 0 ETH | 0.00095349 | ||||
| Approve Task | 17619971 | 963 days ago | IN | 0 ETH | 0.00126661 | ||||
| Create Task | 17619946 | 963 days ago | IN | 0 ETH | 0.00131036 | ||||
| Approve Task | 17088524 | 1038 days ago | IN | 0 ETH | 0.00593613 | ||||
| Approve Task | 17087003 | 1038 days ago | IN | 0 ETH | 0.0033965 | ||||
| Approve Task | 17087002 | 1038 days ago | IN | 0 ETH | 0.00417168 | ||||
| Create Task | 17086999 | 1038 days ago | IN | 0 ETH | 0.00492721 | ||||
| Approve Task | 17086979 | 1038 days ago | IN | 0 ETH | 0.00273497 | ||||
| Approve Task | 17086976 | 1038 days ago | IN | 0 ETH | 0.00353081 | ||||
| Create Task | 17086971 | 1038 days ago | IN | 0 ETH | 0.00577739 | ||||
| Approve Task | 17080724 | 1039 days ago | IN | 0 ETH | 0.00439647 | ||||
| Approve Task | 17080719 | 1039 days ago | IN | 0 ETH | 0.00516624 | ||||
| Create Task | 17080717 | 1039 days ago | IN | 0 ETH | 0.0084552 | ||||
| Approve Task | 17065781 | 1041 days ago | IN | 0 ETH | 0.00167933 | ||||
| Approve Task | 17065779 | 1041 days ago | IN | 0 ETH | 0.00200428 | ||||
| Create Task | 17065749 | 1041 days ago | IN | 0 ETH | 0.00217968 | ||||
| Approve Task | 16967218 | 1055 days ago | IN | 0 ETH | 0.0012722 | ||||
| Approve Task | 16941823 | 1059 days ago | IN | 0 ETH | 0.00208137 | ||||
| Create Task | 16939304 | 1059 days ago | IN | 0 ETH | 0.0022687 | ||||
| Approve Task | 16898540 | 1065 days ago | IN | 0 ETH | 0.00161967 | ||||
| Approve Task | 16898496 | 1065 days ago | IN | 0 ETH | 0.00266893 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
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 <kam@arteq.io>
///
/// @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 <kam@arteq.io>
///
/// @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 <kam@arteq.io>
///
/// @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 <kam@arteq.io>
///
/// @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 <kam@arteq.io>
///
/// @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 <kam@arteq.io>
///
/// @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 <kam@arteq.io>
///
/// @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 <kam@arteq.io>
///
/// @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 <kam@arteq.io>
///
/// @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 <kam@arteq.io>
///
/// @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 <kam@arteq.io>
///
/// @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 <kam@arteq.io>
///
/// @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 <kam@arteq.io>
///
/// @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 <kam@arteq.io>
///
/// @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 <kam@arteq.io>
///
/// @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 <kam@arteq.io>
///
/// @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 <kam@arteq.io>
///
/// @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
Contract ABI
API[{"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
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.