Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Latest 25 from a total of 526 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
Amount
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Enact Motion | 1856854 | 24 days ago | IN | 0 ETH | 0.00085574 | ||||
| Enact Motion | 1856765 | 24 days ago | IN | 0 ETH | 0.0002213 | ||||
| Enact Motion | 1856759 | 24 days ago | IN | 0 ETH | 0.0008959 | ||||
| Enact Motion | 1856740 | 24 days ago | IN | 0 ETH | 0.00023039 | ||||
| Enact Motion | 1856738 | 24 days ago | IN | 0 ETH | 0.00078324 | ||||
| Enact Motion | 1856737 | 24 days ago | IN | 0 ETH | 0.00089056 | ||||
| Enact Motion | 1856735 | 24 days ago | IN | 0 ETH | 0.00079265 | ||||
| Enact Motion | 1856733 | 24 days ago | IN | 0 ETH | 0.00102023 | ||||
| Enact Motion | 1856730 | 24 days ago | IN | 0 ETH | 0.00039537 | ||||
| Enact Motion | 1856477 | 24 days ago | IN | 0 ETH | 0.00088116 | ||||
| Enact Motion | 1856444 | 24 days ago | IN | 0 ETH | 0.00088958 | ||||
| Enact Motion | 1856329 | 25 days ago | IN | 0 ETH | 0.00032122 | ||||
| Enact Motion | 1856310 | 25 days ago | IN | 0 ETH | 0.00029925 | ||||
| Enact Motion | 1856050 | 25 days ago | IN | 0 ETH | 0.00023175 | ||||
| Enact Motion | 1856049 | 25 days ago | IN | 0 ETH | 0.00090178 | ||||
| Enact Motion | 1856049 | 25 days ago | IN | 0 ETH | 0.00021596 | ||||
| Enact Motion | 1856049 | 25 days ago | IN | 0 ETH | 0.00022846 | ||||
| Enact Motion | 1856047 | 25 days ago | IN | 0 ETH | 0.00022594 | ||||
| Enact Motion | 1856046 | 25 days ago | IN | 0 ETH | 0.00084291 | ||||
| Enact Motion | 1856045 | 25 days ago | IN | 0 ETH | 0.00019358 | ||||
| Enact Motion | 1850460 | 25 days ago | IN | 0 ETH | 0.00078773 | ||||
| Enact Motion | 1849918 | 25 days ago | IN | 0 ETH | 0.00064922 | ||||
| Enact Motion | 1848688 | 26 days ago | IN | 0 ETH | 0.00069482 | ||||
| Enact Motion | 1841633 | 27 days ago | IN | 0 ETH | 0.00078401 | ||||
| Enact Motion | 1841559 | 27 days ago | IN | 0 ETH | 0.00082731 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
To
|
Amount
|
||
|---|---|---|---|---|---|---|---|
| Execute EVM Scri... | 1969934 | 7 days ago | 0 ETH | ||||
| Create EVM Scrip... | 1969934 | 7 days ago | 0 ETH | ||||
| Enact Motion | 1969934 | 7 days ago | 0 ETH | ||||
| Create EVM Scrip... | 1969581 | 8 days ago | 0 ETH | ||||
| Create Motion | 1969581 | 8 days ago | 0 ETH | ||||
| Create EVM Scrip... | 1904311 | 17 days ago | 0 ETH | ||||
| Create Motion | 1904311 | 17 days ago | 0 ETH | ||||
| Execute EVM Scri... | 1903834 | 17 days ago | 0 ETH | ||||
| Create EVM Scrip... | 1903834 | 17 days ago | 0 ETH | ||||
| Enact Motion | 1903834 | 17 days ago | 0 ETH | ||||
| Execute EVM Scri... | 1902141 | 18 days ago | 0 ETH | ||||
| Create EVM Scrip... | 1902141 | 18 days ago | 0 ETH | ||||
| Enact Motion | 1902141 | 18 days ago | 0 ETH | ||||
| Create EVM Scrip... | 1898866 | 18 days ago | 0 ETH | ||||
| Create Motion | 1898866 | 18 days ago | 0 ETH | ||||
| Create EVM Scrip... | 1898864 | 18 days ago | 0 ETH | ||||
| Create Motion | 1898864 | 18 days ago | 0 ETH | ||||
| Execute EVM Scri... | 1898799 | 18 days ago | 0 ETH | ||||
| Create EVM Scrip... | 1898799 | 18 days ago | 0 ETH | ||||
| Enact Motion | 1898799 | 18 days ago | 0 ETH | ||||
| Execute EVM Scri... | 1898732 | 18 days ago | 0 ETH | ||||
| Create EVM Scrip... | 1898732 | 18 days ago | 0 ETH | ||||
| Enact Motion | 1898732 | 18 days ago | 0 ETH | ||||
| Execute EVM Scri... | 1895864 | 19 days ago | 0 ETH | ||||
| Create EVM Scrip... | 1895864 | 19 days ago | 0 ETH |
Loading...
Loading
Loading...
Loading
Contract Name:
EasyTrack
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2025-04-08 */ // SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.0 ^0.8.4; // contracts/interfaces/IEVMScriptExecutor.sol // SPDX-FileCopyrightText: 2021 Lido <[email protected]> /// @notice Interface of EVMScript executor used by EasyTrack interface IEVMScriptExecutor { function executeEVMScript(bytes memory _evmScript) external returns (bytes memory); } // contracts/interfaces/IEVMScriptFactory.sol // SPDX-FileCopyrightText: 2021 Lido <[email protected]> /// @author psirex /// @notice Interface which every EVMScript factory used in EasyTrack contract has to implement interface IEVMScriptFactory { function createEVMScript(address _creator, bytes memory _evmScriptCallData) external returns (bytes memory); } // contracts/libraries/BytesUtils.sol // SPDX-FileCopyrightText: 2021 Lido <[email protected]> /// @author psirex /// @notice Contains methods to extract primitive types from bytes library BytesUtils { function bytes24At(bytes memory data, uint256 location) internal pure returns (bytes24 result) { uint256 word = uint256At(data, location); assembly { result := word } } function addressAt(bytes memory data, uint256 location) internal pure returns (address result) { uint256 word = uint256At(data, location); assembly { result := shr( 96, and(word, 0xffffffffffffffffffffffffffffffffffffffff000000000000000000000000) ) } } function uint32At(bytes memory _data, uint256 _location) internal pure returns (uint32 result) { uint256 word = uint256At(_data, _location); assembly { result := shr( 224, and(word, 0xffffffff00000000000000000000000000000000000000000000000000000000) ) } } function uint256At(bytes memory data, uint256 location) internal pure returns (uint256 result) { assembly { result := mload(add(data, add(0x20, location))) } } } // dependencies/OpenZeppelin/[email protected]/contracts/access/IAccessControl.sol /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // dependencies/OpenZeppelin/[email protected]/contracts/utils/Context.sol /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // dependencies/OpenZeppelin/[email protected]/contracts/utils/Strings.sol /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // dependencies/OpenZeppelin/[email protected]/contracts/utils/introspection/IERC165.sol /** * @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); } // contracts/libraries/EVMScriptPermissions.sol // SPDX-FileCopyrightText: 2021 Lido <[email protected]> /// @author psirex /// @notice Provides methods to convinient work with permissions bytes /// @dev Permissions - is a list of tuples (address, bytes4) encoded into a bytes representation. /// Each tuple (address, bytes4) describes a method allowed to be called by EVMScript library EVMScriptPermissions { using BytesUtils for bytes; // ------------- // CONSTANTS // ------------- /// Bytes size of SPEC_ID in EVMScript uint256 private constant SPEC_ID_SIZE = 4; /// Size of the address type in bytes uint256 private constant ADDRESS_SIZE = 20; /// Bytes size of calldata length in EVMScript uint256 private constant CALLDATA_LENGTH_SIZE = 4; /// Bytes size of method selector uint256 private constant METHOD_SELECTOR_SIZE = 4; /// Bytes size of one item in permissions uint256 private constant PERMISSION_SIZE = ADDRESS_SIZE + METHOD_SELECTOR_SIZE; // ------------------ // INTERNAL METHODS // ------------------ /// @notice Validates that passed EVMScript calls only methods allowed in permissions. /// @dev Returns false if provided permissions are invalid (has a wrong length or empty) function canExecuteEVMScript(bytes memory _permissions, bytes memory _evmScript) internal pure returns (bool) { uint256 location = SPEC_ID_SIZE; // first 4 bytes reserved for SPEC_ID if (!isValidPermissions(_permissions) || _evmScript.length <= location) { return false; } while (location < _evmScript.length) { (bytes24 methodToCall, uint32 callDataLength) = _getNextMethodId(_evmScript, location); if (!_hasPermission(_permissions, methodToCall)) { return false; } location += ADDRESS_SIZE + CALLDATA_LENGTH_SIZE + callDataLength; } return true; } /// @notice Validates that bytes with permissions not empty and has correct length function isValidPermissions(bytes memory _permissions) internal pure returns (bool) { return _permissions.length > 0 && _permissions.length % PERMISSION_SIZE == 0; } // Retrieves bytes24 which describes tuple (address, bytes4) // from EVMScript starting from _location position function _getNextMethodId(bytes memory _evmScript, uint256 _location) private pure returns (bytes24, uint32) { address recipient = _evmScript.addressAt(_location); uint32 callDataLength = _evmScript.uint32At(_location + ADDRESS_SIZE); uint32 functionSelector = _evmScript.uint32At(_location + ADDRESS_SIZE + CALLDATA_LENGTH_SIZE); return (bytes24(uint192(functionSelector)) | bytes20(recipient), callDataLength); } // Validates that passed _methodToCall contained in permissions function _hasPermission(bytes memory _permissions, bytes24 _methodToCall) private pure returns (bool) { uint256 location = 0; while (location < _permissions.length) { bytes24 permission = _permissions.bytes24At(location); if (permission == _methodToCall) { return true; } location += PERMISSION_SIZE; } return false; } } // dependencies/OpenZeppelin/[email protected]/contracts/security/Pausable.sol /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // dependencies/OpenZeppelin/[email protected]/contracts/utils/introspection/ERC165.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; } } // dependencies/OpenZeppelin/[email protected]/contracts/access/AccessControl.sol /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // contracts/MotionSettings.sol // SPDX-FileCopyrightText: 2021 Lido <[email protected]> /// @author psirex /// @notice Provides methods to update motion duration, objections threshold, and limit of active motions of Easy Track contract MotionSettings is AccessControl { // ------------- // EVENTS // ------------- event MotionDurationChanged(uint256 _motionDuration); event MotionsCountLimitChanged(uint256 _newMotionsCountLimit); event ObjectionsThresholdChanged(uint256 _newThreshold); // ------------- // ERRORS // ------------- string private constant ERROR_VALUE_TOO_SMALL = "VALUE_TOO_SMALL"; string private constant ERROR_VALUE_TOO_LARGE = "VALUE_TOO_LARGE"; // ------------ // CONSTANTS // ------------ /// @notice Upper bound for motionsCountLimit variable. uint256 public constant MAX_MOTIONS_LIMIT = 255; /// @notice Upper bound for objectionsThreshold variable. /// @dev Stored in basis points (1% = 100) uint256 public constant MAX_OBJECTIONS_THRESHOLD = 1000; /// @notice Lower bound for motionDuration variable uint256 public constant MIN_MOTION_DURATION = 60 seconds; /// ------------------ /// STORAGE VARIABLES /// ------------------ /// @notice Percent from total supply of governance tokens required to reject motion. /// @dev Value stored in basis points: 1% == 100. uint256 public objectionsThreshold; /// @notice Max count of active motions uint256 public motionsCountLimit; /// @notice Minimal time required to pass before enacting of motion uint256 public motionDuration; // ------------ // CONSTRUCTOR // ------------ constructor( address _admin, uint256 _motionDuration, uint256 _motionsCountLimit, uint256 _objectionsThreshold ) { _setupRole(DEFAULT_ADMIN_ROLE, _admin); _setMotionDuration(_motionDuration); _setMotionsCountLimit(_motionsCountLimit); _setObjectionsThreshold(_objectionsThreshold); } // ------------------ // EXTERNAL METHODS // ------------------ /// @notice Sets the minimal time required to pass before enacting of motion function setMotionDuration(uint256 _motionDuration) external onlyRole(DEFAULT_ADMIN_ROLE) { _setMotionDuration(_motionDuration); } /// @notice Sets percent from total supply of governance tokens required to reject motion function setObjectionsThreshold(uint256 _objectionsThreshold) external onlyRole(DEFAULT_ADMIN_ROLE) { _setObjectionsThreshold(_objectionsThreshold); } /// @notice Sets max count of active motions. function setMotionsCountLimit(uint256 _motionsCountLimit) external onlyRole(DEFAULT_ADMIN_ROLE) { _setMotionsCountLimit(_motionsCountLimit); } function _setMotionDuration(uint256 _motionDuration) internal { require(_motionDuration >= MIN_MOTION_DURATION, ERROR_VALUE_TOO_SMALL); motionDuration = _motionDuration; emit MotionDurationChanged(_motionDuration); } function _setObjectionsThreshold(uint256 _objectionsThreshold) internal { require(_objectionsThreshold <= MAX_OBJECTIONS_THRESHOLD, ERROR_VALUE_TOO_LARGE); objectionsThreshold = _objectionsThreshold; emit ObjectionsThresholdChanged(_objectionsThreshold); } function _setMotionsCountLimit(uint256 _motionsCountLimit) internal { require(_motionsCountLimit <= MAX_MOTIONS_LIMIT, ERROR_VALUE_TOO_LARGE); motionsCountLimit = _motionsCountLimit; emit MotionsCountLimitChanged(_motionsCountLimit); } } // contracts/EVMScriptFactoriesRegistry.sol // SPDX-FileCopyrightText: 2021 Lido <[email protected]> /// @author psirex /// @notice Provides methods to add/remove EVMScript factories /// and contains an internal method for the convenient creation of EVMScripts contract EVMScriptFactoriesRegistry is AccessControl { using EVMScriptPermissions for bytes; // ------------- // EVENTS // ------------- event EVMScriptFactoryAdded(address indexed _evmScriptFactory, bytes _permissions); event EVMScriptFactoryRemoved(address indexed _evmScriptFactory); // ------------ // STORAGE VARIABLES // ------------ /// @notice List of allowed EVMScript factories address[] public evmScriptFactories; // Position of the EVMScript factory in the `evmScriptFactories` array, // plus 1 because index 0 means a value is not in the set. mapping(address => uint256) internal evmScriptFactoryIndices; /// @notice Permissions of current list of allowed EVMScript factories. mapping(address => bytes) public evmScriptFactoryPermissions; // ------------ // CONSTRUCTOR // ------------ constructor(address _admin) { _setupRole(DEFAULT_ADMIN_ROLE, _admin); } // ------------------ // EXTERNAL METHODS // ------------------ /// @notice Adds new EVMScript Factory to the list of allowed EVMScript factories with given permissions. /// Be careful about factories and their permissions added via this method. Only reviewed and tested /// factories must be added via this method. function addEVMScriptFactory(address _evmScriptFactory, bytes memory _permissions) external onlyRole(DEFAULT_ADMIN_ROLE) { require(_permissions.isValidPermissions(), "INVALID_PERMISSIONS"); require(!_isEVMScriptFactory(_evmScriptFactory), "EVM_SCRIPT_FACTORY_ALREADY_ADDED"); evmScriptFactories.push(_evmScriptFactory); evmScriptFactoryIndices[_evmScriptFactory] = evmScriptFactories.length; evmScriptFactoryPermissions[_evmScriptFactory] = _permissions; emit EVMScriptFactoryAdded(_evmScriptFactory, _permissions); } /// @notice Removes EVMScript factory from the list of allowed EVMScript factories /// @dev To delete a EVMScript factory from the rewardPrograms array in O(1), /// we swap the element to delete with the last one in the array, and then remove /// the last element (sometimes called as 'swap and pop'). function removeEVMScriptFactory(address _evmScriptFactory) external onlyRole(DEFAULT_ADMIN_ROLE) { uint256 index = _getEVMScriptFactoryIndex(_evmScriptFactory); uint256 lastIndex = evmScriptFactories.length - 1; if (index != lastIndex) { address lastEVMScriptFactory = evmScriptFactories[lastIndex]; evmScriptFactories[index] = lastEVMScriptFactory; evmScriptFactoryIndices[lastEVMScriptFactory] = index + 1; } evmScriptFactories.pop(); delete evmScriptFactoryIndices[_evmScriptFactory]; delete evmScriptFactoryPermissions[_evmScriptFactory]; emit EVMScriptFactoryRemoved(_evmScriptFactory); } /// @notice Returns current list of EVMScript factories function getEVMScriptFactories() external view returns (address[] memory) { return evmScriptFactories; } /// @notice Returns if passed address are listed as EVMScript factory in the registry function isEVMScriptFactory(address _maybeEVMScriptFactory) external view returns (bool) { return _isEVMScriptFactory(_maybeEVMScriptFactory); } // ------------------ // INTERNAL METHODS // ------------------ /// @notice Creates EVMScript using given EVMScript factory /// @dev Checks permissions of resulting EVMScript and reverts with error /// if script tries to call methods not listed in permissions function _createEVMScript( address _evmScriptFactory, address _creator, bytes memory _evmScriptCallData ) internal returns (bytes memory _evmScript) { require(_isEVMScriptFactory(_evmScriptFactory), "EVM_SCRIPT_FACTORY_NOT_FOUND"); _evmScript = IEVMScriptFactory(_evmScriptFactory).createEVMScript( _creator, _evmScriptCallData ); bytes memory permissions = evmScriptFactoryPermissions[_evmScriptFactory]; require(permissions.canExecuteEVMScript(_evmScript), "HAS_NO_PERMISSIONS"); } // ------------------ // PRIVATE METHODS // ------------------ function _getEVMScriptFactoryIndex(address _evmScriptFactory) private view returns (uint256 _index) { _index = evmScriptFactoryIndices[_evmScriptFactory]; require(_index > 0, "EVM_SCRIPT_FACTORY_NOT_FOUND"); _index -= 1; } function _isEVMScriptFactory(address _maybeEVMScriptFactory) private view returns (bool) { return evmScriptFactoryIndices[_maybeEVMScriptFactory] > 0; } } // contracts/EasyTrack.sol // SPDX-FileCopyrightText: 2021 Lido <[email protected]> interface IMiniMeToken { function balanceOfAt(address _owner, uint256 _blockNumber) external pure returns (uint256); function totalSupplyAt(uint256 _blockNumber) external view returns (uint256); } /// @author psirex /// @notice Contains main logic of Easy Track contract EasyTrack is Pausable, AccessControl, MotionSettings, EVMScriptFactoriesRegistry { struct Motion { uint256 id; address evmScriptFactory; address creator; uint256 duration; uint256 startDate; uint256 snapshotBlock; uint256 objectionsThreshold; uint256 objectionsAmount; bytes32 evmScriptHash; } // ------------- // EVENTS // ------------- event MotionCreated( uint256 indexed _motionId, address _creator, address indexed _evmScriptFactory, bytes _evmScriptCallData, bytes _evmScript ); event MotionObjected( uint256 indexed _motionId, address indexed _objector, uint256 _weight, uint256 _newObjectionsAmount, uint256 _newObjectionsAmountPct ); event MotionRejected(uint256 indexed _motionId); event MotionCanceled(uint256 indexed _motionId); event MotionEnacted(uint256 indexed _motionId); event EVMScriptExecutorChanged(address indexed _evmScriptExecutor); // ------------- // ERRORS // ------------- string private constant ERROR_ALREADY_OBJECTED = "ALREADY_OBJECTED"; string private constant ERROR_NOT_ENOUGH_BALANCE = "NOT_ENOUGH_BALANCE"; string private constant ERROR_NOT_CREATOR = "NOT_CREATOR"; string private constant ERROR_MOTION_NOT_PASSED = "MOTION_NOT_PASSED"; string private constant ERROR_UNEXPECTED_EVM_SCRIPT = "UNEXPECTED_EVM_SCRIPT"; string private constant ERROR_MOTION_NOT_FOUND = "MOTION_NOT_FOUND"; string private constant ERROR_MOTIONS_LIMIT_REACHED = "MOTIONS_LIMIT_REACHED"; // ------------- // ROLES // ------------- bytes32 public constant PAUSE_ROLE = keccak256("PAUSE_ROLE"); bytes32 public constant UNPAUSE_ROLE = keccak256("UNPAUSE_ROLE"); bytes32 public constant CANCEL_ROLE = keccak256("CANCEL_ROLE"); // ------------- // CONSTANTS // ------------- // Stores 100% in basis points uint256 internal constant HUNDRED_PERCENT = 10000; // ------------ // STORAGE VARIABLES // ------------ /// @notice List of active motions Motion[] public motions; // Id of the lastly created motion uint256 internal lastMotionId; /// @notice Address of governanceToken which implements IMiniMeToken interface IMiniMeToken public governanceToken; /// @notice Address of current EVMScriptExecutor IEVMScriptExecutor public evmScriptExecutor; // Position of the motion in the `motions` array, plus 1 // because index 0 means a value is not in the set. mapping(uint256 => uint256) internal motionIndicesByMotionId; /// @notice Stores if motion with given id has been objected from given address. mapping(uint256 => mapping(address => bool)) public objections; // ------------ // CONSTRUCTOR // ------------ constructor( address _governanceToken, address _admin, uint256 _motionDuration, uint256 _motionsCountLimit, uint256 _objectionsThreshold ) EVMScriptFactoriesRegistry(_admin) MotionSettings(_admin, _motionDuration, _motionsCountLimit, _objectionsThreshold) { _setupRole(DEFAULT_ADMIN_ROLE, _admin); _setupRole(PAUSE_ROLE, _admin); _setupRole(UNPAUSE_ROLE, _admin); _setupRole(CANCEL_ROLE, _admin); governanceToken = IMiniMeToken(_governanceToken); } // ------------------ // EXTERNAL METHODS // ------------------ /// @notice Creates new motion /// @param _evmScriptFactory Address of EVMScript factory registered in Easy Track /// @param _evmScriptCallData Encoded call data of EVMScript factory /// @return _newMotionId Id of created motion function createMotion(address _evmScriptFactory, bytes memory _evmScriptCallData) external whenNotPaused returns (uint256 _newMotionId) { require(motions.length < motionsCountLimit, ERROR_MOTIONS_LIMIT_REACHED); Motion storage newMotion = motions.push(); _newMotionId = ++lastMotionId; newMotion.id = _newMotionId; newMotion.creator = msg.sender; newMotion.startDate = block.timestamp; newMotion.snapshotBlock = block.number; newMotion.duration = motionDuration; newMotion.objectionsThreshold = objectionsThreshold; newMotion.evmScriptFactory = _evmScriptFactory; motionIndicesByMotionId[_newMotionId] = motions.length; bytes memory evmScript = _createEVMScript(_evmScriptFactory, msg.sender, _evmScriptCallData); newMotion.evmScriptHash = keccak256(evmScript); emit MotionCreated( _newMotionId, msg.sender, _evmScriptFactory, _evmScriptCallData, evmScript ); } /// @notice Enacts motion with given id /// @param _motionId Id of motion to enact /// @param _evmScriptCallData Encoded call data of EVMScript factory. Same as passed on the creation /// of motion with the given motion id. Transaction reverts if EVMScript factory call data differs function enactMotion(uint256 _motionId, bytes memory _evmScriptCallData) external whenNotPaused { Motion storage motion = _getMotion(_motionId); require(motion.startDate + motion.duration <= block.timestamp, ERROR_MOTION_NOT_PASSED); address creator = motion.creator; bytes32 evmScriptHash = motion.evmScriptHash; address evmScriptFactory = motion.evmScriptFactory; _deleteMotion(_motionId); emit MotionEnacted(_motionId); bytes memory evmScript = _createEVMScript(evmScriptFactory, creator, _evmScriptCallData); require(evmScriptHash == keccak256(evmScript), ERROR_UNEXPECTED_EVM_SCRIPT); evmScriptExecutor.executeEVMScript(evmScript); } /// @notice Submits an objection from `governanceToken` holder. /// @param _motionId Id of motion to object function objectToMotion(uint256 _motionId) external { Motion storage motion = _getMotion(_motionId); require(!objections[_motionId][msg.sender], ERROR_ALREADY_OBJECTED); objections[_motionId][msg.sender] = true; uint256 snapshotBlock = motion.snapshotBlock; uint256 objectorBalance = governanceToken.balanceOfAt(msg.sender, snapshotBlock); require(objectorBalance > 0, ERROR_NOT_ENOUGH_BALANCE); uint256 totalSupply = governanceToken.totalSupplyAt(snapshotBlock); uint256 newObjectionsAmount = motion.objectionsAmount + objectorBalance; uint256 newObjectionsAmountPct = (HUNDRED_PERCENT * newObjectionsAmount) / totalSupply; emit MotionObjected( _motionId, msg.sender, objectorBalance, newObjectionsAmount, newObjectionsAmountPct ); if (newObjectionsAmountPct < motion.objectionsThreshold) { motion.objectionsAmount = newObjectionsAmount; } else { _deleteMotion(_motionId); emit MotionRejected(_motionId); } } /// @notice Cancels motion with given id /// @param _motionId Id of motion to cancel /// @dev Method reverts if it is called with not existed _motionId function cancelMotion(uint256 _motionId) external { Motion storage motion = _getMotion(_motionId); require(motion.creator == msg.sender, ERROR_NOT_CREATOR); _deleteMotion(_motionId); emit MotionCanceled(_motionId); } /// @notice Cancels all motions with given ids /// @param _motionIds Ids of motions to cancel function cancelMotions(uint256[] memory _motionIds) external onlyRole(CANCEL_ROLE) { for (uint256 i = 0; i < _motionIds.length; ++i) { if (motionIndicesByMotionId[_motionIds[i]] > 0) { _deleteMotion(_motionIds[i]); emit MotionCanceled(_motionIds[i]); } } } /// @notice Cancels all active motions function cancelAllMotions() external onlyRole(CANCEL_ROLE) { uint256 motionsCount = motions.length; while (motionsCount > 0) { motionsCount -= 1; uint256 motionId = motions[motionsCount].id; _deleteMotion(motionId); emit MotionCanceled(motionId); } } /// @notice Sets new EVMScriptExecutor /// @param _evmScriptExecutor Address of new EVMScriptExecutor function setEVMScriptExecutor(address _evmScriptExecutor) external onlyRole(DEFAULT_ADMIN_ROLE) { evmScriptExecutor = IEVMScriptExecutor(_evmScriptExecutor); emit EVMScriptExecutorChanged(_evmScriptExecutor); } /// @notice Pauses Easy Track if it isn't paused. /// Paused Easy Track can't create and enact motions function pause() external whenNotPaused onlyRole(PAUSE_ROLE) { _pause(); } /// @notice Unpauses Easy Track if it is paused function unpause() external whenPaused onlyRole(UNPAUSE_ROLE) { _unpause(); } /// @notice Returns if an _objector can submit an objection to motion with id equals to _motionId or not /// @param _motionId Id of motion to check opportunity to object /// @param _objector Address of objector function canObjectToMotion(uint256 _motionId, address _objector) external view returns (bool) { Motion storage motion = _getMotion(_motionId); uint256 balance = governanceToken.balanceOfAt(_objector, motion.snapshotBlock); return balance > 0 && !objections[_motionId][_objector]; } /// @notice Returns list of active motions function getMotions() external view returns (Motion[] memory) { return motions; } /// @notice Returns motion with the given id /// @param _motionId Id of motion to retrieve function getMotion(uint256 _motionId) external view returns (Motion memory) { return _getMotion(_motionId); } // ------- // PRIVATE METHODS // ------- // Removes motion from list of active moitons // To delete a motion from the moitons array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). function _deleteMotion(uint256 _motionId) private { uint256 index = motionIndicesByMotionId[_motionId] - 1; uint256 lastIndex = motions.length - 1; if (index != lastIndex) { Motion storage lastMotion = motions[lastIndex]; motions[index] = lastMotion; motionIndicesByMotionId[lastMotion.id] = index + 1; } motions.pop(); delete motionIndicesByMotionId[_motionId]; } // Returns motion with given id if it exists function _getMotion(uint256 _motionId) private view returns (Motion storage) { uint256 _motionIndex = motionIndicesByMotionId[_motionId]; require(_motionIndex > 0, ERROR_MOTION_NOT_FOUND); return motions[_motionIndex - 1]; } }
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_governanceToken","type":"address"},{"internalType":"address","name":"_admin","type":"address"},{"internalType":"uint256","name":"_motionDuration","type":"uint256"},{"internalType":"uint256","name":"_motionsCountLimit","type":"uint256"},{"internalType":"uint256","name":"_objectionsThreshold","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_evmScriptExecutor","type":"address"}],"name":"EVMScriptExecutorChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_evmScriptFactory","type":"address"},{"indexed":false,"internalType":"bytes","name":"_permissions","type":"bytes"}],"name":"EVMScriptFactoryAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_evmScriptFactory","type":"address"}],"name":"EVMScriptFactoryRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_motionId","type":"uint256"}],"name":"MotionCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_motionId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_creator","type":"address"},{"indexed":true,"internalType":"address","name":"_evmScriptFactory","type":"address"},{"indexed":false,"internalType":"bytes","name":"_evmScriptCallData","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"_evmScript","type":"bytes"}],"name":"MotionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_motionDuration","type":"uint256"}],"name":"MotionDurationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_motionId","type":"uint256"}],"name":"MotionEnacted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_motionId","type":"uint256"},{"indexed":true,"internalType":"address","name":"_objector","type":"address"},{"indexed":false,"internalType":"uint256","name":"_weight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newObjectionsAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newObjectionsAmountPct","type":"uint256"}],"name":"MotionObjected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_motionId","type":"uint256"}],"name":"MotionRejected","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_newMotionsCountLimit","type":"uint256"}],"name":"MotionsCountLimitChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_newThreshold","type":"uint256"}],"name":"ObjectionsThresholdChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"CANCEL_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MOTIONS_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_OBJECTIONS_THRESHOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_MOTION_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNPAUSE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_evmScriptFactory","type":"address"},{"internalType":"bytes","name":"_permissions","type":"bytes"}],"name":"addEVMScriptFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_motionId","type":"uint256"},{"internalType":"address","name":"_objector","type":"address"}],"name":"canObjectToMotion","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelAllMotions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_motionId","type":"uint256"}],"name":"cancelMotion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_motionIds","type":"uint256[]"}],"name":"cancelMotions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_evmScriptFactory","type":"address"},{"internalType":"bytes","name":"_evmScriptCallData","type":"bytes"}],"name":"createMotion","outputs":[{"internalType":"uint256","name":"_newMotionId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_motionId","type":"uint256"},{"internalType":"bytes","name":"_evmScriptCallData","type":"bytes"}],"name":"enactMotion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"evmScriptExecutor","outputs":[{"internalType":"contract IEVMScriptExecutor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"evmScriptFactories","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"evmScriptFactoryPermissions","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEVMScriptFactories","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_motionId","type":"uint256"}],"name":"getMotion","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"evmScriptFactory","type":"address"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"startDate","type":"uint256"},{"internalType":"uint256","name":"snapshotBlock","type":"uint256"},{"internalType":"uint256","name":"objectionsThreshold","type":"uint256"},{"internalType":"uint256","name":"objectionsAmount","type":"uint256"},{"internalType":"bytes32","name":"evmScriptHash","type":"bytes32"}],"internalType":"struct EasyTrack.Motion","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMotions","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"evmScriptFactory","type":"address"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"startDate","type":"uint256"},{"internalType":"uint256","name":"snapshotBlock","type":"uint256"},{"internalType":"uint256","name":"objectionsThreshold","type":"uint256"},{"internalType":"uint256","name":"objectionsAmount","type":"uint256"},{"internalType":"bytes32","name":"evmScriptHash","type":"bytes32"}],"internalType":"struct EasyTrack.Motion[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceToken","outputs":[{"internalType":"contract IMiniMeToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_maybeEVMScriptFactory","type":"address"}],"name":"isEVMScriptFactory","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"motionDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"motions","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"evmScriptFactory","type":"address"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"startDate","type":"uint256"},{"internalType":"uint256","name":"snapshotBlock","type":"uint256"},{"internalType":"uint256","name":"objectionsThreshold","type":"uint256"},{"internalType":"uint256","name":"objectionsAmount","type":"uint256"},{"internalType":"bytes32","name":"evmScriptHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"motionsCountLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_motionId","type":"uint256"}],"name":"objectToMotion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"objections","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"objectionsThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_evmScriptFactory","type":"address"}],"name":"removeEVMScriptFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_evmScriptExecutor","type":"address"}],"name":"setEVMScriptExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_motionDuration","type":"uint256"}],"name":"setMotionDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_motionsCountLimit","type":"uint256"}],"name":"setMotionsCountLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_objectionsThreshold","type":"uint256"}],"name":"setObjectionsThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b5060405162002fff38038062002fff833981016040819052620000349162000392565b6000805460ff191681558490819085908590859062000054908562000147565b6200005f8362000157565b6200006a82620001e8565b62000075816200026a565b506200008992506000915083905062000147565b506200009760008562000147565b620000c37f139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d8562000147565b620000ef7f265b220c5a8891efdd9e1b1b7fa72f257bd5169f8d87e319cf3dad6ff52b94ae8562000147565b6200011b7f9f959e00d95122f5cbd677010436cf273ef535b86b056afc172852144b9491d78562000147565b5050600a80546001600160a01b0319166001600160a01b039490941693909317909255506200043d9050565b620001538282620002ed565b5050565b60408051808201909152600f81526e159053155157d513d3d7d4d3505313608a1b6020820152603c821015620001ab5760405162461bcd60e51b8152600401620001a29190620003e5565b60405180910390fd5b5060048190556040518181527f03765c4aa18fde3bfe4015073c2b138ce5a02536dd88ceae9739d3e0dbad5d0e906020015b60405180910390a150565b60408051808201909152600f81526e56414c55455f544f4f5f4c4152474560881b602082015260ff821115620002335760405162461bcd60e51b8152600401620001a29190620003e5565b5060038190556040518181527f5e368703b7ab35fe9ef4dbc482cd414476841204c7484b8e834d0d3ac4ed867290602001620001dd565b60408051808201909152600f81526e56414c55455f544f4f5f4c4152474560881b60208201526103e8821115620002b65760405162461bcd60e51b8152600401620001a29190620003e5565b5060028190556040518181527fd60715ce58337415334d06256811f30ed8db120287970870d8505e5ed9074c6090602001620001dd565b60008281526001602090815260408083206001600160a01b038516845290915290205460ff16620001535760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b80516001600160a01b03811681146200038d57600080fd5b919050565b600080600080600060a08688031215620003ab57600080fd5b620003b68662000375565b9450620003c66020870162000375565b6040870151606088015160809098015196999198509695945092505050565b600060208083528351808285015260005b818110156200041457858101830151858201604001528201620003f6565b8181111562000427576000604083870101525b50601f01601f1916929092016040019392505050565b612bb2806200044d6000396000f3fe608060405234801561001057600080fd5b506004361061025e5760003560e01c80639a4ee59c11610146578063de7cb878116100c3578063ef1ae2f611610087578063ef1ae2f61461058b578063ef89ad951461059e578063f0fdd736146105c9578063f96dae0a146105dc578063f9783b48146105ef578063fdc28ab81461060f57600080fd5b8063de7cb87814610525578063e16373951461052d578063e6f5ed5d14610535578063ee20ff0814610548578063ee7eae291461055d57600080fd5b8063b2223eb51161010a578063b2223eb5146104d0578063c34205cd146104e3578063c7794870146104f6578063cdb6aefc14610509578063d547741f1461051257600080fd5b80639a4ee59c1461041f578063a217fddf14610432578063a3e730781461043a578063ad15aad21461044d578063b21d36a81461046d57600080fd5b8063389ed267116101df57806364993a73116101a357806364993a73146103d75780637d3ac0fb146103e05780638456cb59146103f357806388407bd4146103fb57806391d1485414610403578063930c2b311461041657600080fd5b8063389ed2671461037757806338c1f8761461039e5780633f4ba83a146103b157806342f04989146103b95780635c975abb146103cc57600080fd5b8063309756fb11610226578063309756fb1461030c5780633128cce01461033357806331a40e6e1461033c578063329696bc1461034f57806336568abe1461036457600080fd5b806301ffc9a71461026357806313c27ca71461028b578063248a9ca3146102c05780632d65a9f0146102e45780632f2ff15d146102f7575b600080fd5b610276610271366004612677565b610622565b60405190151581526020015b60405180910390f35b6102b27f9f959e00d95122f5cbd677010436cf273ef535b86b056afc172852144b9491d781565b604051908152602001610282565b6102b26102ce366004612632565b6000908152600160208190526040909120015490565b6102766102f236600461251c565b610659565b61030a61030536600461264b565b610679565b005b6102b27f265b220c5a8891efdd9e1b1b7fa72f257bd5169f8d87e319cf3dad6ff52b94ae81565b6102b260035481565b61030a61034a366004612632565b6106a5565b6103576106be565b6040516102829190612913565b61030a61037236600461264b565b61077f565b6102b27f139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d81565b61030a6103ac366004612632565b6107fe565b61030a610aba565b61030a6103c7366004612537565b610b39565b60005460ff16610276565b6102b260045481565b61030a6103ee36600461251c565b610cb0565b61030a610e11565b6102b2603c81565b61027661041136600461264b565b610e67565b6102b260025481565b61030a61042d366004612728565b610e92565b6102b2600081565b61027661044836600461264b565b611068565b61046061045b366004612632565b611141565b6040516102829190612993565b61048061047b366004612632565b611223565b60408051998a526001600160a01b0398891660208b015296909716958801959095526060870193909352608086019190915260a085015260c084015260e083015261010082015261012001610282565b61030a6104de36600461251c565b61128b565b61030a6104f1366004612632565b6112e2565b61030a610504366004612585565b611378565b6102b26103e881565b61030a61052036600461264b565b61145d565b61030a611484565b6102b260ff81565b6102b2610543366004612537565b611529565b6105506116bc565b60405161028291906128c6565b61027661056b36600461264b565b600d60209081526000928352604080842090915290825290205460ff1681565b61030a610599366004612632565b61171e565b6105b16105ac366004612632565b611733565b6040516001600160a01b039091168152602001610282565b600b546105b1906001600160a01b031681565b600a546105b1906001600160a01b031681565b6106026105fd36600461251c565b61175d565b6040516102829190612956565b61030a61061d366004612632565b6117f7565b60006001600160e01b03198216637965db0b60e01b148061065357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6001600160a01b0381166000908152600660205260408120541515610653565b60008281526001602081905260409091200154610696813361180c565b6106a08383611870565b505050565b60006106b1813361180c565b6106ba826118db565b5050565b60606008805480602002602001604051908101604052809291908181526020016000905b82821015610776576000848152602090819020604080516101208101825260098602909201805483526001808201546001600160a01b0390811685870152600283015416928401929092526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460e08401526008015461010083015290835290920191016106e2565b50505050905090565b6001600160a01b03811633146107f45760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6106ba8282611960565b6000610809826119c7565b6000838152600d60209081526040808320338452825291829020548251808401909352601083526f1053149150511657d3d0929150d5115160821b918301919091529192509060ff16156108705760405162461bcd60e51b81526004016107eb9190612956565b506000828152600d60209081526040808320338085529252808320805460ff191660011790556005840154600a54915163277166bf60e11b815260048101939093526024830181905292916001600160a01b0390911690634ee2cd7e9060440160206040518083038186803b1580156108e857600080fd5b505afa1580156108fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610920919061270f565b905060008111604051806040016040528060128152602001714e4f545f454e4f5547485f42414c414e434560701b8152509061096f5760405162461bcd60e51b81526004016107eb9190612956565b50600a54604051630981b24d60e41b8152600481018490526000916001600160a01b03169063981b24d09060240160206040518083038186803b1580156109b557600080fd5b505afa1580156109c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ed919061270f565b90506000828560070154610a0191906129fb565b9050600082610a1283612710612a27565b610a1c9190612a13565b6040805186815260208101859052908101829052909150339088907fa64d606df8b3e72e8f53ac4185170bbd4348d0ee03c2cfceadeafc2b316c3e6b9060600160405180910390a38560060154811015610a7c5760078601829055610ab1565b610a8587611a52565b60405187907f6a4120e111f0bfb3586b7dc9317f9ae5441ce866d1ad9d221ce6d76431f8442690600090a25b50505050505050565b60005460ff16610b035760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016107eb565b7f265b220c5a8891efdd9e1b1b7fa72f257bd5169f8d87e319cf3dad6ff52b94ae610b2e813361180c565b610b36611bf8565b50565b6000610b45813361180c565b610b4e82611c8b565b610b905760405162461bcd60e51b8152602060048201526013602482015272494e56414c49445f5045524d495353494f4e5360681b60448201526064016107eb565b6001600160a01b03831660009081526006602052604090205415610bf65760405162461bcd60e51b815260206004820181905260248201527f45564d5f5343524950545f464143544f52595f414c52454144595f414444454460448201526064016107eb565b600580546001810182557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b03861690811790915590546000918252600660209081526040808420929092556007815291208351610c69928501906123db565b50826001600160a01b03167fa95e7ae5870d8fc3c3f7b7a378c9c4f469e724c240ee45fbab61758fe7eb981783604051610ca39190612956565b60405180910390a2505050565b6000610cbc813361180c565b6000610cc783611cb7565b600554909150600090610cdc90600190612a46565b9050808214610d7857600060058281548110610cfa57610cfa612b50565b600091825260209091200154600580546001600160a01b039092169250829185908110610d2957610d29612b50565b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055610d5d8360016129fb565b6001600160a01b039091166000908152600660205260409020555b6005805480610d8957610d89612b3a565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038616825260068152604080832083905560079091528120610dd79161245f565b6040516001600160a01b038516907f158e73cc156a7591e8e04fa6cdfc13d89de9e19fdc692bf0502e2a622c08a12a90600090a250505050565b60005460ff1615610e345760405162461bcd60e51b81526004016107eb90612969565b7f139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d610e5f813361180c565b610b36611d28565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60005460ff1615610eb55760405162461bcd60e51b81526004016107eb90612969565b6000610ec0836119c7565b90504281600301548260040154610ed791906129fb565b1115604051806040016040528060118152602001701353d51253d397d393d517d41054d4d151607a1b81525090610f215760405162461bcd60e51b81526004016107eb9190612956565b506002810154600882015460018301546001600160a01b039283169216610f4786611a52565b60405186907fd4fbbd7bf63590ce72807eb770b83aaf2f3a7958a4b2093fd9ab89b27609694290600090a26000610f7f828588611d80565b9050808051906020012083146040518060400160405280601581526020017415539156141150d5115117d1559357d4d0d4925415605a1b81525090610fd75760405162461bcd60e51b81526004016107eb9190612956565b50600b54604051634a27111d60e01b81526001600160a01b0390911690634a27111d90611008908490600401612956565b600060405180830381600087803b15801561102257600080fd5b505af1158015611036573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261105e91908101906126a1565b5050505050505050565b600080611074846119c7565b600a54600582015460405163277166bf60e11b81526001600160a01b0387811660048301526024820192909252929350600092911690634ee2cd7e9060440160206040518083038186803b1580156110cb57600080fd5b505afa1580156110df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611103919061270f565b905060008111801561113857506000858152600d602090815260408083206001600160a01b038816845290915290205460ff16155b95945050505050565b6111a56040518061012001604052806000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600080191681525090565b6111ae826119c7565b60408051610120810182528254815260018301546001600160a01b039081166020830152600284015416918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260089091015461010082015292915050565b6008818154811061123357600080fd5b60009182526020909120600990910201805460018201546002830154600384015460048501546005860154600687015460078801546008909801549698506001600160a01b0395861697949095169592949193909289565b6000611297813361180c565b600b80546001600160a01b0319166001600160a01b0384169081179091556040517f5ed6ba59d23ef79b1a31c9f04da9f879ef6cdb89ad0241716ebdc1f02f5f465a90600090a25050565b60006112ed826119c7565b600281015460408051808201909152600b81526a2727aa2fa1a922a0aa27a960a91b60208201529192506001600160a01b0316331461133f5760405162461bcd60e51b81526004016107eb9190612956565b5061134982611a52565b60405182907f801fcb98a9fa2e695209772f0a24f3f7ac36f6568659ae2e0cd7763fb73f286290600090a25050565b7f9f959e00d95122f5cbd677010436cf273ef535b86b056afc172852144b9491d76113a3813361180c565b60005b82518110156106a0576000600c60008584815181106113c7576113c7612b50565b6020026020010151815260200190815260200160002054111561144d576114068382815181106113f9576113f9612b50565b6020026020010151611a52565b82818151811061141857611418612b50565b60200260200101517f801fcb98a9fa2e695209772f0a24f3f7ac36f6568659ae2e0cd7763fb73f286260405160405180910390a25b61145681612adf565b90506113a6565b6000828152600160208190526040909120015461147a813361180c565b6106a08383611960565b7f9f959e00d95122f5cbd677010436cf273ef535b86b056afc172852144b9491d76114af813361180c565b6008545b80156106ba576114c4600182612a46565b90506000600882815481106114db576114db612b50565b90600052602060002090600902016000015490506114f881611a52565b60405181907f801fcb98a9fa2e695209772f0a24f3f7ac36f6568659ae2e0cd7763fb73f286290600090a2506114b3565b6000805460ff161561154d5760405162461bcd60e51b81526004016107eb90612969565b6003546008546040805180820190915260158152741353d51253d394d7d31253525517d4915050d21151605a1b6020820152911161159e5760405162461bcd60e51b81526004016107eb9190612956565b50600880546001810182556000918252600980549181027ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3019290916115e390612adf565b918290555080825560028083018054336001600160a01b0319918216811790925542600480870191909155436005870155546003860155915460068501556001840180549092166001600160a01b038816179091556008546000838152600c602052604081209190915591935061165c90869086611d80565b905080805190602001208260080181905550846001600160a01b0316837f2775db1f1f2dd97c60ba2903b3ca235c9cecb3cb47a9cb464f86578b9877f4a43387856040516116ac93929190612886565b60405180910390a3505092915050565b6060600580548060200260200160405190810160405280929190818152602001828054801561171457602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116116f6575b5050505050905090565b600061172a813361180c565b6106ba82611f77565b6005818154811061174357600080fd5b6000918252602090912001546001600160a01b0316905081565b6007602052600090815260409020805461177690612aa4565b80601f01602080910402602001604051908101604052809291908181526020018280546117a290612aa4565b80156117ef5780601f106117c4576101008083540402835291602001916117ef565b820191906000526020600020905b8154815290600101906020018083116117d257829003601f168201915b505050505081565b6000611803813361180c565b6106ba82611ff6565b6118168282610e67565b6106ba5761182e816001600160a01b03166014612074565b611839836020612074565b60405160200161184a9291906127ed565b60408051601f198184030181529082905262461bcd60e51b82526107eb91600401612956565b61187a8282610e67565b6106ba5760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b60408051808201909152600f81526e159053155157d513d3d7d4d3505313608a1b6020820152603c8210156119235760405162461bcd60e51b81526004016107eb9190612956565b5060048190556040518181527f03765c4aa18fde3bfe4015073c2b138ce5a02536dd88ceae9739d3e0dbad5d0e906020015b60405180910390a150565b61196a8282610e67565b156106ba5760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000818152600c60209081526040808320548151808301909252601082526f1353d51253d397d393d517d193d5539160821b9282019290925281611a1e5760405162461bcd60e51b81526004016107eb9190612956565b506008611a2c600183612a46565b81548110611a3c57611a3c612b50565b9060005260206000209060090201915050919050565b6000818152600c6020526040812054611a6d90600190612a46565b600854909150600090611a8290600190612a46565b9050808214611b7057600060088281548110611aa057611aa0612b50565b906000526020600020906009020190508060088481548110611ac457611ac4612b50565b60009182526020909120825460099092020190815560018083015481830180546001600160a01b039283166001600160a01b031991821617909155600280860154908501805491909316911617905560038084015490830155600480840154908301556005808401549083015560068084015490830155600780840154908301556008928301549290910191909155611b5e9084906129fb565b90546000908152600c60205260409020555b6008805480611b8157611b81612b3a565b600082815260208082206009600019909401938402018281556001810180546001600160a01b03199081169091556002820180549091169055600381018390556004810183905560058101839055600681018390556007810183905560080182905591909255938152600c90935250506040812055565b60005460ff16611c415760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016107eb565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60008082511180156106535750611ca4600460146129fb565b8251611cb09190612afa565b1592915050565b6001600160a01b03811660009081526006602052604090205480611d1d5760405162461bcd60e51b815260206004820152601c60248201527f45564d5f5343524950545f464143544f52595f4e4f545f464f554e440000000060448201526064016107eb565b610653600182612a46565b60005460ff1615611d4b5760405162461bcd60e51b81526004016107eb90612969565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611c6e3390565b6060611da3846001600160a01b0316600090815260066020526040902054151590565b611def5760405162461bcd60e51b815260206004820152601c60248201527f45564d5f5343524950545f464143544f52595f4e4f545f464f554e440000000060448201526064016107eb565b604051633fa8872760e21b81526001600160a01b0385169063fea21c9c90611e1d9086908690600401612862565b600060405180830381600087803b158015611e3757600080fd5b505af1158015611e4b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611e7391908101906126a1565b6001600160a01b038516600090815260076020526040812080549293509091611e9b90612aa4565b80601f0160208091040260200160405190810160405280929190818152602001828054611ec790612aa4565b8015611f145780601f10611ee957610100808354040283529160200191611f14565b820191906000526020600020905b815481529060010190602001808311611ef757829003601f168201915b50505050509050611f2e828261221790919063ffffffff16565b611f6f5760405162461bcd60e51b81526020600482015260126024820152714841535f4e4f5f5045524d495353494f4e5360701b60448201526064016107eb565b509392505050565b60408051808201909152600f81526e56414c55455f544f4f5f4c4152474560881b60208201526103e8821115611fc05760405162461bcd60e51b81526004016107eb9190612956565b5060028190556040518181527fd60715ce58337415334d06256811f30ed8db120287970870d8505e5ed9074c6090602001611955565b60408051808201909152600f81526e56414c55455f544f4f5f4c4152474560881b602082015260ff82111561203e5760405162461bcd60e51b81526004016107eb9190612956565b5060038190556040518181527f5e368703b7ab35fe9ef4dbc482cd414476841204c7484b8e834d0d3ac4ed867290602001611955565b60606000612083836002612a27565b61208e9060026129fb565b67ffffffffffffffff8111156120a6576120a6612b66565b6040519080825280601f01601f1916602001820160405280156120d0576020820181803683370190505b509050600360fc1b816000815181106120eb576120eb612b50565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061211a5761211a612b50565b60200101906001600160f81b031916908160001a905350600061213e846002612a27565b6121499060016129fb565b90505b60018111156121c1576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061217d5761217d612b50565b1a60f81b82828151811061219357612193612b50565b60200101906001600160f81b031916908160001a90535060049490941c936121ba81612a8d565b905061214c565b5083156122105760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016107eb565b9392505050565b6000600461222484611c8b565b1580612231575080835111155b15612240576000915050610653565b82518110156122a45760008061225685846122ae565b915091506122648683612329565b6122745760009350505050610653565b63ffffffff8116612287600460146129fb565b61229191906129fb565b61229b90846129fb565b92505050612240565b5060019392505050565b600080806122bc858561238d565b905060006122d56122ce6014876129fb565b87906123a8565b905060006122fa60046122e96014896129fb565b6122f391906129fb565b88906123a8565b90508260601b6bffffffffffffffffffffffff19168163ffffffff1660401b1782945094505050509250929050565b6000805b835181101561238357600061234285836123c3565b905067ffffffffffffffff19808216908516141561236557600192505050610653565b612371600460146129fb565b61237b90836129fb565b91505061232d565b5060009392505050565b60008061239d8484016020015190565b60601c949350505050565b6000806123b88484016020015190565b60e01c949350505050565b6000806123d38484016020015190565b949350505050565b8280546123e790612aa4565b90600052602060002090601f016020900481019282612409576000855561244f565b82601f1061242257805160ff191683800117855561244f565b8280016001018555821561244f579182015b8281111561244f578251825591602001919060010190612434565b5061245b929150612495565b5090565b50805461246b90612aa4565b6000825580601f1061247b575050565b601f016020900490600052602060002090810190610b3691905b5b8082111561245b5760008155600101612496565b80356001600160a01b03811681146124c157600080fd5b919050565b600082601f8301126124d757600080fd5b81356124ea6124e5826129d3565b6129a2565b8181528460208386010111156124ff57600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561252e57600080fd5b612210826124aa565b6000806040838503121561254a57600080fd5b612553836124aa565b9150602083013567ffffffffffffffff81111561256f57600080fd5b61257b858286016124c6565b9150509250929050565b6000602080838503121561259857600080fd5b823567ffffffffffffffff808211156125b057600080fd5b818501915085601f8301126125c457600080fd5b8135818111156125d6576125d6612b66565b8060051b91506125e78483016129a2565b8181528481019084860184860187018a101561260257600080fd5b600095505b83861015612625578035835260019590950194918601918601612607565b5098975050505050505050565b60006020828403121561264457600080fd5b5035919050565b6000806040838503121561265e57600080fd5b8235915061266e602084016124aa565b90509250929050565b60006020828403121561268957600080fd5b81356001600160e01b03198116811461221057600080fd5b6000602082840312156126b357600080fd5b815167ffffffffffffffff8111156126ca57600080fd5b8201601f810184136126db57600080fd5b80516126e96124e5826129d3565b8181528560208385010111156126fe57600080fd5b611138826020830160208601612a5d565b60006020828403121561272157600080fd5b5051919050565b6000806040838503121561273b57600080fd5b82359150602083013567ffffffffffffffff81111561256f57600080fd5b60008151808452612771816020860160208601612a5d565b601f01601f19169290920160200192915050565b80518252602081015160018060a01b0380821660208501528060408401511660408501525050606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351612825816017850160208801612a5d565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612856816028840160208801612a5d565b01602801949350505050565b6001600160a01b03831681526040602082018190526000906123d390830184612759565b6001600160a01b03841681526060602082018190526000906128aa90830185612759565b82810360408401526128bc8185612759565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156129075783516001600160a01b0316835292840192918401916001016128e2565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561290757612942838551612785565b92840192610120929092019160010161292f565b6020815260006122106020830184612759565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b61012081016106538284612785565b604051601f8201601f1916810167ffffffffffffffff811182821017156129cb576129cb612b66565b604052919050565b600067ffffffffffffffff8211156129ed576129ed612b66565b50601f01601f191660200190565b60008219821115612a0e57612a0e612b0e565b500190565b600082612a2257612a22612b24565b500490565b6000816000190483118215151615612a4157612a41612b0e565b500290565b600082821015612a5857612a58612b0e565b500390565b60005b83811015612a78578181015183820152602001612a60565b83811115612a87576000848401525b50505050565b600081612a9c57612a9c612b0e565b506000190190565b600181811c90821680612ab857607f821691505b60208210811415612ad957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612af357612af3612b0e565b5060010190565b600082612b0957612b09612b24565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212208175083e19f6286bcd779a108d71df991bd692666d34a8bfdc561c82b9570b9b64736f6c63430008060033000000000000000000000000ef2573966d009ccea0fc74451dee2193564198dc000000000000000000000000be2fd5a6ce6460eb5e9acc5d486697ae6402fdd20000000000000000000000000000000000000000000000000000000000000258000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000001f4
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061025e5760003560e01c80639a4ee59c11610146578063de7cb878116100c3578063ef1ae2f611610087578063ef1ae2f61461058b578063ef89ad951461059e578063f0fdd736146105c9578063f96dae0a146105dc578063f9783b48146105ef578063fdc28ab81461060f57600080fd5b8063de7cb87814610525578063e16373951461052d578063e6f5ed5d14610535578063ee20ff0814610548578063ee7eae291461055d57600080fd5b8063b2223eb51161010a578063b2223eb5146104d0578063c34205cd146104e3578063c7794870146104f6578063cdb6aefc14610509578063d547741f1461051257600080fd5b80639a4ee59c1461041f578063a217fddf14610432578063a3e730781461043a578063ad15aad21461044d578063b21d36a81461046d57600080fd5b8063389ed267116101df57806364993a73116101a357806364993a73146103d75780637d3ac0fb146103e05780638456cb59146103f357806388407bd4146103fb57806391d1485414610403578063930c2b311461041657600080fd5b8063389ed2671461037757806338c1f8761461039e5780633f4ba83a146103b157806342f04989146103b95780635c975abb146103cc57600080fd5b8063309756fb11610226578063309756fb1461030c5780633128cce01461033357806331a40e6e1461033c578063329696bc1461034f57806336568abe1461036457600080fd5b806301ffc9a71461026357806313c27ca71461028b578063248a9ca3146102c05780632d65a9f0146102e45780632f2ff15d146102f7575b600080fd5b610276610271366004612677565b610622565b60405190151581526020015b60405180910390f35b6102b27f9f959e00d95122f5cbd677010436cf273ef535b86b056afc172852144b9491d781565b604051908152602001610282565b6102b26102ce366004612632565b6000908152600160208190526040909120015490565b6102766102f236600461251c565b610659565b61030a61030536600461264b565b610679565b005b6102b27f265b220c5a8891efdd9e1b1b7fa72f257bd5169f8d87e319cf3dad6ff52b94ae81565b6102b260035481565b61030a61034a366004612632565b6106a5565b6103576106be565b6040516102829190612913565b61030a61037236600461264b565b61077f565b6102b27f139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d81565b61030a6103ac366004612632565b6107fe565b61030a610aba565b61030a6103c7366004612537565b610b39565b60005460ff16610276565b6102b260045481565b61030a6103ee36600461251c565b610cb0565b61030a610e11565b6102b2603c81565b61027661041136600461264b565b610e67565b6102b260025481565b61030a61042d366004612728565b610e92565b6102b2600081565b61027661044836600461264b565b611068565b61046061045b366004612632565b611141565b6040516102829190612993565b61048061047b366004612632565b611223565b60408051998a526001600160a01b0398891660208b015296909716958801959095526060870193909352608086019190915260a085015260c084015260e083015261010082015261012001610282565b61030a6104de36600461251c565b61128b565b61030a6104f1366004612632565b6112e2565b61030a610504366004612585565b611378565b6102b26103e881565b61030a61052036600461264b565b61145d565b61030a611484565b6102b260ff81565b6102b2610543366004612537565b611529565b6105506116bc565b60405161028291906128c6565b61027661056b36600461264b565b600d60209081526000928352604080842090915290825290205460ff1681565b61030a610599366004612632565b61171e565b6105b16105ac366004612632565b611733565b6040516001600160a01b039091168152602001610282565b600b546105b1906001600160a01b031681565b600a546105b1906001600160a01b031681565b6106026105fd36600461251c565b61175d565b6040516102829190612956565b61030a61061d366004612632565b6117f7565b60006001600160e01b03198216637965db0b60e01b148061065357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6001600160a01b0381166000908152600660205260408120541515610653565b60008281526001602081905260409091200154610696813361180c565b6106a08383611870565b505050565b60006106b1813361180c565b6106ba826118db565b5050565b60606008805480602002602001604051908101604052809291908181526020016000905b82821015610776576000848152602090819020604080516101208101825260098602909201805483526001808201546001600160a01b0390811685870152600283015416928401929092526003810154606084015260048101546080840152600581015460a0840152600681015460c0840152600781015460e08401526008015461010083015290835290920191016106e2565b50505050905090565b6001600160a01b03811633146107f45760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6106ba8282611960565b6000610809826119c7565b6000838152600d60209081526040808320338452825291829020548251808401909352601083526f1053149150511657d3d0929150d5115160821b918301919091529192509060ff16156108705760405162461bcd60e51b81526004016107eb9190612956565b506000828152600d60209081526040808320338085529252808320805460ff191660011790556005840154600a54915163277166bf60e11b815260048101939093526024830181905292916001600160a01b0390911690634ee2cd7e9060440160206040518083038186803b1580156108e857600080fd5b505afa1580156108fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610920919061270f565b905060008111604051806040016040528060128152602001714e4f545f454e4f5547485f42414c414e434560701b8152509061096f5760405162461bcd60e51b81526004016107eb9190612956565b50600a54604051630981b24d60e41b8152600481018490526000916001600160a01b03169063981b24d09060240160206040518083038186803b1580156109b557600080fd5b505afa1580156109c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ed919061270f565b90506000828560070154610a0191906129fb565b9050600082610a1283612710612a27565b610a1c9190612a13565b6040805186815260208101859052908101829052909150339088907fa64d606df8b3e72e8f53ac4185170bbd4348d0ee03c2cfceadeafc2b316c3e6b9060600160405180910390a38560060154811015610a7c5760078601829055610ab1565b610a8587611a52565b60405187907f6a4120e111f0bfb3586b7dc9317f9ae5441ce866d1ad9d221ce6d76431f8442690600090a25b50505050505050565b60005460ff16610b035760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016107eb565b7f265b220c5a8891efdd9e1b1b7fa72f257bd5169f8d87e319cf3dad6ff52b94ae610b2e813361180c565b610b36611bf8565b50565b6000610b45813361180c565b610b4e82611c8b565b610b905760405162461bcd60e51b8152602060048201526013602482015272494e56414c49445f5045524d495353494f4e5360681b60448201526064016107eb565b6001600160a01b03831660009081526006602052604090205415610bf65760405162461bcd60e51b815260206004820181905260248201527f45564d5f5343524950545f464143544f52595f414c52454144595f414444454460448201526064016107eb565b600580546001810182557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b03861690811790915590546000918252600660209081526040808420929092556007815291208351610c69928501906123db565b50826001600160a01b03167fa95e7ae5870d8fc3c3f7b7a378c9c4f469e724c240ee45fbab61758fe7eb981783604051610ca39190612956565b60405180910390a2505050565b6000610cbc813361180c565b6000610cc783611cb7565b600554909150600090610cdc90600190612a46565b9050808214610d7857600060058281548110610cfa57610cfa612b50565b600091825260209091200154600580546001600160a01b039092169250829185908110610d2957610d29612b50565b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055610d5d8360016129fb565b6001600160a01b039091166000908152600660205260409020555b6005805480610d8957610d89612b3a565b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b038616825260068152604080832083905560079091528120610dd79161245f565b6040516001600160a01b038516907f158e73cc156a7591e8e04fa6cdfc13d89de9e19fdc692bf0502e2a622c08a12a90600090a250505050565b60005460ff1615610e345760405162461bcd60e51b81526004016107eb90612969565b7f139c2898040ef16910dc9f44dc697df79363da767d8bc92f2e310312b816e46d610e5f813361180c565b610b36611d28565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60005460ff1615610eb55760405162461bcd60e51b81526004016107eb90612969565b6000610ec0836119c7565b90504281600301548260040154610ed791906129fb565b1115604051806040016040528060118152602001701353d51253d397d393d517d41054d4d151607a1b81525090610f215760405162461bcd60e51b81526004016107eb9190612956565b506002810154600882015460018301546001600160a01b039283169216610f4786611a52565b60405186907fd4fbbd7bf63590ce72807eb770b83aaf2f3a7958a4b2093fd9ab89b27609694290600090a26000610f7f828588611d80565b9050808051906020012083146040518060400160405280601581526020017415539156141150d5115117d1559357d4d0d4925415605a1b81525090610fd75760405162461bcd60e51b81526004016107eb9190612956565b50600b54604051634a27111d60e01b81526001600160a01b0390911690634a27111d90611008908490600401612956565b600060405180830381600087803b15801561102257600080fd5b505af1158015611036573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261105e91908101906126a1565b5050505050505050565b600080611074846119c7565b600a54600582015460405163277166bf60e11b81526001600160a01b0387811660048301526024820192909252929350600092911690634ee2cd7e9060440160206040518083038186803b1580156110cb57600080fd5b505afa1580156110df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611103919061270f565b905060008111801561113857506000858152600d602090815260408083206001600160a01b038816845290915290205460ff16155b95945050505050565b6111a56040518061012001604052806000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600080191681525090565b6111ae826119c7565b60408051610120810182528254815260018301546001600160a01b039081166020830152600284015416918101919091526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260089091015461010082015292915050565b6008818154811061123357600080fd5b60009182526020909120600990910201805460018201546002830154600384015460048501546005860154600687015460078801546008909801549698506001600160a01b0395861697949095169592949193909289565b6000611297813361180c565b600b80546001600160a01b0319166001600160a01b0384169081179091556040517f5ed6ba59d23ef79b1a31c9f04da9f879ef6cdb89ad0241716ebdc1f02f5f465a90600090a25050565b60006112ed826119c7565b600281015460408051808201909152600b81526a2727aa2fa1a922a0aa27a960a91b60208201529192506001600160a01b0316331461133f5760405162461bcd60e51b81526004016107eb9190612956565b5061134982611a52565b60405182907f801fcb98a9fa2e695209772f0a24f3f7ac36f6568659ae2e0cd7763fb73f286290600090a25050565b7f9f959e00d95122f5cbd677010436cf273ef535b86b056afc172852144b9491d76113a3813361180c565b60005b82518110156106a0576000600c60008584815181106113c7576113c7612b50565b6020026020010151815260200190815260200160002054111561144d576114068382815181106113f9576113f9612b50565b6020026020010151611a52565b82818151811061141857611418612b50565b60200260200101517f801fcb98a9fa2e695209772f0a24f3f7ac36f6568659ae2e0cd7763fb73f286260405160405180910390a25b61145681612adf565b90506113a6565b6000828152600160208190526040909120015461147a813361180c565b6106a08383611960565b7f9f959e00d95122f5cbd677010436cf273ef535b86b056afc172852144b9491d76114af813361180c565b6008545b80156106ba576114c4600182612a46565b90506000600882815481106114db576114db612b50565b90600052602060002090600902016000015490506114f881611a52565b60405181907f801fcb98a9fa2e695209772f0a24f3f7ac36f6568659ae2e0cd7763fb73f286290600090a2506114b3565b6000805460ff161561154d5760405162461bcd60e51b81526004016107eb90612969565b6003546008546040805180820190915260158152741353d51253d394d7d31253525517d4915050d21151605a1b6020820152911161159e5760405162461bcd60e51b81526004016107eb9190612956565b50600880546001810182556000918252600980549181027ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3019290916115e390612adf565b918290555080825560028083018054336001600160a01b0319918216811790925542600480870191909155436005870155546003860155915460068501556001840180549092166001600160a01b038816179091556008546000838152600c602052604081209190915591935061165c90869086611d80565b905080805190602001208260080181905550846001600160a01b0316837f2775db1f1f2dd97c60ba2903b3ca235c9cecb3cb47a9cb464f86578b9877f4a43387856040516116ac93929190612886565b60405180910390a3505092915050565b6060600580548060200260200160405190810160405280929190818152602001828054801561171457602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116116f6575b5050505050905090565b600061172a813361180c565b6106ba82611f77565b6005818154811061174357600080fd5b6000918252602090912001546001600160a01b0316905081565b6007602052600090815260409020805461177690612aa4565b80601f01602080910402602001604051908101604052809291908181526020018280546117a290612aa4565b80156117ef5780601f106117c4576101008083540402835291602001916117ef565b820191906000526020600020905b8154815290600101906020018083116117d257829003601f168201915b505050505081565b6000611803813361180c565b6106ba82611ff6565b6118168282610e67565b6106ba5761182e816001600160a01b03166014612074565b611839836020612074565b60405160200161184a9291906127ed565b60408051601f198184030181529082905262461bcd60e51b82526107eb91600401612956565b61187a8282610e67565b6106ba5760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b60408051808201909152600f81526e159053155157d513d3d7d4d3505313608a1b6020820152603c8210156119235760405162461bcd60e51b81526004016107eb9190612956565b5060048190556040518181527f03765c4aa18fde3bfe4015073c2b138ce5a02536dd88ceae9739d3e0dbad5d0e906020015b60405180910390a150565b61196a8282610e67565b156106ba5760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000818152600c60209081526040808320548151808301909252601082526f1353d51253d397d393d517d193d5539160821b9282019290925281611a1e5760405162461bcd60e51b81526004016107eb9190612956565b506008611a2c600183612a46565b81548110611a3c57611a3c612b50565b9060005260206000209060090201915050919050565b6000818152600c6020526040812054611a6d90600190612a46565b600854909150600090611a8290600190612a46565b9050808214611b7057600060088281548110611aa057611aa0612b50565b906000526020600020906009020190508060088481548110611ac457611ac4612b50565b60009182526020909120825460099092020190815560018083015481830180546001600160a01b039283166001600160a01b031991821617909155600280860154908501805491909316911617905560038084015490830155600480840154908301556005808401549083015560068084015490830155600780840154908301556008928301549290910191909155611b5e9084906129fb565b90546000908152600c60205260409020555b6008805480611b8157611b81612b3a565b600082815260208082206009600019909401938402018281556001810180546001600160a01b03199081169091556002820180549091169055600381018390556004810183905560058101839055600681018390556007810183905560080182905591909255938152600c90935250506040812055565b60005460ff16611c415760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016107eb565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b60008082511180156106535750611ca4600460146129fb565b8251611cb09190612afa565b1592915050565b6001600160a01b03811660009081526006602052604090205480611d1d5760405162461bcd60e51b815260206004820152601c60248201527f45564d5f5343524950545f464143544f52595f4e4f545f464f554e440000000060448201526064016107eb565b610653600182612a46565b60005460ff1615611d4b5760405162461bcd60e51b81526004016107eb90612969565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611c6e3390565b6060611da3846001600160a01b0316600090815260066020526040902054151590565b611def5760405162461bcd60e51b815260206004820152601c60248201527f45564d5f5343524950545f464143544f52595f4e4f545f464f554e440000000060448201526064016107eb565b604051633fa8872760e21b81526001600160a01b0385169063fea21c9c90611e1d9086908690600401612862565b600060405180830381600087803b158015611e3757600080fd5b505af1158015611e4b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611e7391908101906126a1565b6001600160a01b038516600090815260076020526040812080549293509091611e9b90612aa4565b80601f0160208091040260200160405190810160405280929190818152602001828054611ec790612aa4565b8015611f145780601f10611ee957610100808354040283529160200191611f14565b820191906000526020600020905b815481529060010190602001808311611ef757829003601f168201915b50505050509050611f2e828261221790919063ffffffff16565b611f6f5760405162461bcd60e51b81526020600482015260126024820152714841535f4e4f5f5045524d495353494f4e5360701b60448201526064016107eb565b509392505050565b60408051808201909152600f81526e56414c55455f544f4f5f4c4152474560881b60208201526103e8821115611fc05760405162461bcd60e51b81526004016107eb9190612956565b5060028190556040518181527fd60715ce58337415334d06256811f30ed8db120287970870d8505e5ed9074c6090602001611955565b60408051808201909152600f81526e56414c55455f544f4f5f4c4152474560881b602082015260ff82111561203e5760405162461bcd60e51b81526004016107eb9190612956565b5060038190556040518181527f5e368703b7ab35fe9ef4dbc482cd414476841204c7484b8e834d0d3ac4ed867290602001611955565b60606000612083836002612a27565b61208e9060026129fb565b67ffffffffffffffff8111156120a6576120a6612b66565b6040519080825280601f01601f1916602001820160405280156120d0576020820181803683370190505b509050600360fc1b816000815181106120eb576120eb612b50565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061211a5761211a612b50565b60200101906001600160f81b031916908160001a905350600061213e846002612a27565b6121499060016129fb565b90505b60018111156121c1576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061217d5761217d612b50565b1a60f81b82828151811061219357612193612b50565b60200101906001600160f81b031916908160001a90535060049490941c936121ba81612a8d565b905061214c565b5083156122105760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016107eb565b9392505050565b6000600461222484611c8b565b1580612231575080835111155b15612240576000915050610653565b82518110156122a45760008061225685846122ae565b915091506122648683612329565b6122745760009350505050610653565b63ffffffff8116612287600460146129fb565b61229191906129fb565b61229b90846129fb565b92505050612240565b5060019392505050565b600080806122bc858561238d565b905060006122d56122ce6014876129fb565b87906123a8565b905060006122fa60046122e96014896129fb565b6122f391906129fb565b88906123a8565b90508260601b6bffffffffffffffffffffffff19168163ffffffff1660401b1782945094505050509250929050565b6000805b835181101561238357600061234285836123c3565b905067ffffffffffffffff19808216908516141561236557600192505050610653565b612371600460146129fb565b61237b90836129fb565b91505061232d565b5060009392505050565b60008061239d8484016020015190565b60601c949350505050565b6000806123b88484016020015190565b60e01c949350505050565b6000806123d38484016020015190565b949350505050565b8280546123e790612aa4565b90600052602060002090601f016020900481019282612409576000855561244f565b82601f1061242257805160ff191683800117855561244f565b8280016001018555821561244f579182015b8281111561244f578251825591602001919060010190612434565b5061245b929150612495565b5090565b50805461246b90612aa4565b6000825580601f1061247b575050565b601f016020900490600052602060002090810190610b3691905b5b8082111561245b5760008155600101612496565b80356001600160a01b03811681146124c157600080fd5b919050565b600082601f8301126124d757600080fd5b81356124ea6124e5826129d3565b6129a2565b8181528460208386010111156124ff57600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561252e57600080fd5b612210826124aa565b6000806040838503121561254a57600080fd5b612553836124aa565b9150602083013567ffffffffffffffff81111561256f57600080fd5b61257b858286016124c6565b9150509250929050565b6000602080838503121561259857600080fd5b823567ffffffffffffffff808211156125b057600080fd5b818501915085601f8301126125c457600080fd5b8135818111156125d6576125d6612b66565b8060051b91506125e78483016129a2565b8181528481019084860184860187018a101561260257600080fd5b600095505b83861015612625578035835260019590950194918601918601612607565b5098975050505050505050565b60006020828403121561264457600080fd5b5035919050565b6000806040838503121561265e57600080fd5b8235915061266e602084016124aa565b90509250929050565b60006020828403121561268957600080fd5b81356001600160e01b03198116811461221057600080fd5b6000602082840312156126b357600080fd5b815167ffffffffffffffff8111156126ca57600080fd5b8201601f810184136126db57600080fd5b80516126e96124e5826129d3565b8181528560208385010111156126fe57600080fd5b611138826020830160208601612a5d565b60006020828403121561272157600080fd5b5051919050565b6000806040838503121561273b57600080fd5b82359150602083013567ffffffffffffffff81111561256f57600080fd5b60008151808452612771816020860160208601612a5d565b601f01601f19169290920160200192915050565b80518252602081015160018060a01b0380821660208501528060408401511660408501525050606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e08301526101008082015181840152505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351612825816017850160208801612a5d565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612856816028840160208801612a5d565b01602801949350505050565b6001600160a01b03831681526040602082018190526000906123d390830184612759565b6001600160a01b03841681526060602082018190526000906128aa90830185612759565b82810360408401526128bc8185612759565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156129075783516001600160a01b0316835292840192918401916001016128e2565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561290757612942838551612785565b92840192610120929092019160010161292f565b6020815260006122106020830184612759565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b61012081016106538284612785565b604051601f8201601f1916810167ffffffffffffffff811182821017156129cb576129cb612b66565b604052919050565b600067ffffffffffffffff8211156129ed576129ed612b66565b50601f01601f191660200190565b60008219821115612a0e57612a0e612b0e565b500190565b600082612a2257612a22612b24565b500490565b6000816000190483118215151615612a4157612a41612b0e565b500290565b600082821015612a5857612a58612b0e565b500390565b60005b83811015612a78578181015183820152602001612a60565b83811115612a87576000848401525b50505050565b600081612a9c57612a9c612b0e565b506000190190565b600181811c90821680612ab857607f821691505b60208210811415612ad957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612af357612af3612b0e565b5060010190565b600082612b0957612b09612b24565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea26469706673582212208175083e19f6286bcd779a108d71df991bd692666d34a8bfdc561c82b9570b9b64736f6c63430008060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ef2573966d009ccea0fc74451dee2193564198dc000000000000000000000000be2fd5a6ce6460eb5e9acc5d486697ae6402fdd20000000000000000000000000000000000000000000000000000000000000258000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000001f4
-----Decoded View---------------
Arg [0] : _governanceToken (address): 0xEf2573966D009CcEA0Fc74451dee2193564198dc
Arg [1] : _admin (address): 0xBE2fD5a6Ce6460EB5e9aCC5d486697aE6402fdd2
Arg [2] : _motionDuration (uint256): 600
Arg [3] : _motionsCountLimit (uint256): 24
Arg [4] : _objectionsThreshold (uint256): 500
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000ef2573966d009ccea0fc74451dee2193564198dc
Arg [1] : 000000000000000000000000be2fd5a6ce6460eb5e9acc5d486697ae6402fdd2
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000258
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000018
Arg [4] : 00000000000000000000000000000000000000000000000000000000000001f4
Deployed Bytecode Sourcemap
32006:11411:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18066:204;;;;;;:::i;:::-;;:::i;:::-;;;9146:14:1;;9139:22;9121:41;;9109:2;9094:18;18066:204:0;;;;;;;;33908:62;;33946:24;33908:62;;;;;9319:25:1;;;9307:2;9292:18;33908:62:0;9274:76:1;19477:123:0;;;;;;:::i;:::-;19543:7;19570:12;;;:6;:12;;;;;;;;:22;;;19477:123;30039:158;;;;;;:::i;:::-;;:::i;19862:147::-;;;;;;:::i;:::-;;:::i;:::-;;33837:64;;33876:25;33837:64;;24215:32;;;;;;24965:144;;;;;;:::i;:::-;;:::i;41990:95::-;;;:::i;:::-;;;;;;;:::i;20910:218::-;;;;;;:::i;:::-;;:::i;33770:60::-;;33807:23;33770:60;;38229:1152;;;;;;:::i;:::-;;:::i;41296:91::-;;;:::i;28088:599::-;;;;;;:::i;:::-;;:::i;13405:86::-;13452:4;13476:7;;;13405:86;;24329:29;;;;;;29017:736;;;;;;:::i;:::-;;:::i;41147:88::-;;;:::i;23831:56::-;;23877:10;23831:56;;18362:139;;;;;;:::i;:::-;;:::i;24127:34::-;;;;;;37339:764;;;;;;:::i;:::-;;:::i;17453:49::-;;17498:4;17453:49;;41621:313;;;;;;:::i;:::-;;:::i;42194:123::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;34247:23::-;;;;;;:::i;:::-;;:::i;:::-;;;;13949:25:1;;;-1:-1:-1;;;;;14048:15:1;;;14043:2;14028:18;;14021:43;14100:15;;;;14080:18;;;14073:43;;;;14147:2;14132:18;;14125:34;;;;14190:3;14175:19;;14168:35;;;;14001:3;14219:19;;14212:35;14278:3;14263:19;;14256:35;14322:3;14307:19;;14300:35;14366:3;14351:19;;14344:35;13936:3;13921:19;34247:23:0;13903:482:1;40770:256:0;;;;;;:::i;:::-;;:::i;39556:257::-;;;;;;:::i;:::-;;:::i;39925:339::-;;;;;;:::i;:::-;;:::i;23710:55::-;;23761:4;23710:55;;20254:149;;;;;;:::i;:::-;;:::i;40316:334::-;;;:::i;23543:47::-;;23587:3;23543:47;;35909:1119;;;;;;:::i;:::-;;:::i;29822:118::-;;;:::i;:::-;;;;;;;:::i;34865:62::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;25212:187;;;;;;:::i;:::-;;:::i;27185:35::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6490:32:1;;;6472:51;;6460:2;6445:18;27185:35:0;6427:102:1;34539:43:0;;;;;-1:-1:-1;;;;;34539:43:0;;;34441:35;;;;;-1:-1:-1;;;;;34441:35:0;;;27516:60;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;25458:179::-;;;;;;:::i;:::-;;:::i;18066:204::-;18151:4;-1:-1:-1;;;;;;18175:47:0;;-1:-1:-1;;;18175:47:0;;:87;;-1:-1:-1;;;;;;;;;;15500:40:0;;;18226:36;18168:94;18066:204;-1:-1:-1;;18066:204:0:o;30039:158::-;-1:-1:-1;;;;;31577:47:0;;30122:4;31577:47;;;:23;:47;;;;;;:51;;30146:43;31470:166;19862:147;19543:7;19570:12;;;:6;:12;;;;;;;;:22;;17944:30;17955:4;5782:10;17944;:30::i;:::-;19976:25:::1;19987:4;19993:7;19976:10;:25::i;:::-;19862:147:::0;;;:::o;24965:144::-;17498:4;17944:30;17498:4;5782:10;17944;:30::i;:::-;25066:35:::1;25085:15;25066:18;:35::i;:::-;24965:144:::0;;:::o;41990:95::-;42035:15;42070:7;42063:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42063:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41990:95;:::o;20910:218::-;-1:-1:-1;;;;;21006:23:0;;5782:10;21006:23;20998:83;;;;-1:-1:-1;;;20998:83:0;;12933:2:1;20998:83:0;;;12915:21:1;12972:2;12952:18;;;12945:30;13011:34;12991:18;;;12984:62;-1:-1:-1;;;13062:18:1;;;13055:45;13117:19;;20998:83:0;;;;;;;;;21094:26;21106:4;21112:7;21094:11;:26::i;38229:1152::-;38292:21;38316;38327:9;38316:10;:21::i;:::-;38357;;;;:10;:21;;;;;;;;38379:10;38357:33;;;;;;;;;38392:22;;;;;;;;;;;-1:-1:-1;;;38392:22:0;;;;;;;38292:45;;-1:-1:-1;38392:22:0;38357:33;;38356:34;38348:67;;;;-1:-1:-1;;;38348:67:0;;;;;;;;:::i;:::-;-1:-1:-1;38426:21:0;;;;:10;:21;;;;;;;;38448:10;38426:33;;;;;;;;:40;;-1:-1:-1;;38426:40:0;38462:4;38426:40;;;38503:20;;;;38560:15;;:54;;-1:-1:-1;;;38560:54:0;;;;;7506:51:1;;;;7573:18;;;7566:34;;;38503:20:0;38426:21;-1:-1:-1;;;;;38560:15:0;;;;:27;;7479:18:1;;38560:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38534:80;;38651:1;38633:15;:19;38654:24;;;;;;;;;;;;;-1:-1:-1;;;38654:24:0;;;38625:54;;;;;-1:-1:-1;;;38625:54:0;;;;;;;;:::i;:::-;-1:-1:-1;38714:15:0;;:44;;-1:-1:-1;;;38714:44:0;;;;;9319:25:1;;;38692:19:0;;-1:-1:-1;;;;;38714:15:0;;:29;;9292:18:1;;38714:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38692:66;;38769:27;38825:15;38799:6;:23;;;:41;;;;:::i;:::-;38769:71;-1:-1:-1;38851:30:0;38926:11;38885:37;38769:71;34123:5;38885:37;:::i;:::-;38884:53;;;;:::i;:::-;38955:175;;;14592:25:1;;;14648:2;14633:18;;14626:34;;;14676:18;;;14669:34;;;38851:86:0;;-1:-1:-1;39008:10:0;;38984:9;;38955:175;;14580:2:1;14565:18;38955:175:0;;;;;;;39172:6;:26;;;39147:22;:51;39143:231;;;39215:23;;;:45;;;39143:231;;;39293:24;39307:9;39293:13;:24::i;:::-;39337:25;;39352:9;;39337:25;;;;;39143:231;38281:1100;;;;;;38229:1152;:::o;41296:91::-;13452:4;13476:7;;;14000:41;;;;-1:-1:-1;;;14000:41:0;;10826:2:1;14000:41:0;;;10808:21:1;10865:2;10845:18;;;10838:30;-1:-1:-1;;;10884:18:1;;;10877:50;10944:18;;14000:41:0;10798:170:1;14000:41:0;33876:25:::1;17944:30;33876:25:::0;5782:10;17944;:30::i;:::-:1;41369:10:::2;:8;:10::i;:::-;14052:1:::1;41296:91::o:0;28088:599::-;17498:4;17944:30;17498:4;5782:10;17944;:30::i;:::-;28251:33:::1;:12;:31;:33::i;:::-;28243:65;;;::::0;-1:-1:-1;;;28243:65:0;;11536:2:1;28243:65:0::1;::::0;::::1;11518:21:1::0;11575:2;11555:18;;;11548:30;-1:-1:-1;;;11594:18:1;;;11587:49;11653:18;;28243:65:0::1;11508:169:1::0;28243:65:0::1;-1:-1:-1::0;;;;;31577:47:0;;31553:4;31577:47;;;:23;:47;;;;;;:51;28319:84:::1;;;::::0;-1:-1:-1;;;28319:84:0;;11175:2:1;28319:84:0::1;::::0;::::1;11157:21:1::0;;;11194:18;;;11187:30;11253:34;11233:18;;;11226:62;11305:18;;28319:84:0::1;11147:182:1::0;28319:84:0::1;28414:18;:42:::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;;;28414:42:0::1;-1:-1:-1::0;;;;;28414:42:0;::::1;::::0;;::::1;::::0;;;28512:25;;-1:-1:-1;28467:42:0;;;:23:::1;28414:42;28467::::0;;;;;;;:70;;;;28548:27:::1;:46:::0;;;;:61;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;28647:17;-1:-1:-1::0;;;;;28625:54:0::1;;28666:12;28625:54;;;;;;:::i;:::-;;;;;;;;28088:599:::0;;;:::o;29017:736::-;17498:4;17944:30;17498:4;5782:10;17944;:30::i;:::-;29148:13:::1;29164:44;29190:17;29164:25;:44::i;:::-;29239:18;:25:::0;29148:60;;-1:-1:-1;29219:17:0::1;::::0;29239:29:::1;::::0;29267:1:::1;::::0;29239:29:::1;:::i;:::-;29219:49;;29294:9;29285:5;:18;29281:246;;29320:28;29351:18;29370:9;29351:29;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;29395:18:::1;:25:::0;;-1:-1:-1;;;;;29351:29:0;;::::1;::::0;-1:-1:-1;29351:29:0;;29414:5;;29395:25;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;:48:::0;;-1:-1:-1;;;;;;29395:48:0::1;-1:-1:-1::0;;;;;29395:48:0;;;::::1;::::0;;;::::1;::::0;;29506:9:::1;:5:::0;-1:-1:-1;29506:9:0::1;:::i;:::-;-1:-1:-1::0;;;;;29458:45:0;;::::1;;::::0;;;:23:::1;:45;::::0;;;;:57;29281:246:::1;29539:18;:24;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;-1:-1:-1;;29539:24:0;;;;;-1:-1:-1;;;;;;29539:24:0::1;::::0;;;;;;;;-1:-1:-1;;;;;29581:42:0;::::1;::::0;;:23:::1;:42:::0;;;;;;29574:49;;;29641:27:::1;:46:::0;;;;;29634:53:::1;::::0;::::1;:::i;:::-;29703:42;::::0;-1:-1:-1;;;;;29703:42:0;::::1;::::0;::::1;::::0;;;::::1;29137:616;;29017:736:::0;;:::o;41147:88::-;13452:4;13476:7;;;13730:9;13722:38;;;;-1:-1:-1;;;13722:38:0;;;;;;;:::i;:::-;33807:23:::1;17944:30;33807:23:::0;5782:10;17944;:30::i;:::-:1;41219:8:::2;:6;:8::i;18362:139::-:0;18440:4;18464:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;18464:29:0;;;;;;;;;;;;;;;18362:139::o;37339:764::-;13452:4;13476:7;;;13730:9;13722:38;;;;-1:-1:-1;;;13722:38:0;;;;;;;:::i;:::-;37469:21:::1;37493;37504:9;37493:10;:21::i;:::-;37469:45;;37571:15;37552:6;:15;;;37533:6;:16;;;:34;;;;:::i;:::-;:53;;37588:23;;;;;;;;;;;;;-1:-1:-1::0;;;37588:23:0::1;;::::0;37525:87:::1;;;;;-1:-1:-1::0;;;37525:87:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;37643:14:0::1;::::0;::::1;::::0;37692:20:::1;::::0;::::1;::::0;37643:14;37750:23;::::1;::::0;-1:-1:-1;;;;;37643:14:0;;::::1;::::0;37750:23:::1;37786:24;37800:9:::0;37786:13:::1;:24::i;:::-;37826;::::0;37840:9;;37826:24:::1;::::0;;;::::1;37863:22;37888:63;37905:16;37923:7;37932:18;37888:16;:63::i;:::-;37863:88;;37997:9;37987:20;;;;;;37970:13;:37;38009:27;;;;;;;;;;;;;-1:-1:-1::0;;;38009:27:0::1;;::::0;37962:75:::1;;;;;-1:-1:-1::0;;;37962:75:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;38050:17:0::1;::::0;:45:::1;::::0;-1:-1:-1;;;38050:45:0;;-1:-1:-1;;;;;38050:17:0;;::::1;::::0;:34:::1;::::0;:45:::1;::::0;38085:9;;38050:45:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;38050:45:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;;37458:645;;;;;37339:764:::0;;:::o;41621:313::-;41709:4;41726:21;41750;41761:9;41750:10;:21::i;:::-;41800:15;;41839:20;;;;41800:60;;-1:-1:-1;;;41800:60:0;;-1:-1:-1;;;;;7524:32:1;;;41800:60:0;;;7506:51:1;7573:18;;;7566:34;;;;41839:20:0;;-1:-1:-1;41782:15:0;;41800;;;:27;;7479:18:1;;41800:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41782:78;;41888:1;41878:7;:11;:48;;;;-1:-1:-1;41894:21:0;;;;:10;:21;;;;;;;;-1:-1:-1;;;;;41894:32:0;;;;;;;;;;;;41893:33;41878:48;41871:55;41621:313;-1:-1:-1;;;;;41621:313:0:o;42194:123::-;42255:13;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42255:13:0;42288:21;42299:9;42288:10;:21::i;:::-;42281:28;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42281:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42194:123;-1:-1:-1;;42194:123:0:o;34247:23::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34247:23:0;;;;;;;;;;;;;;;;:::o;40770:256::-;17498:4;17944:30;17498:4;5782:10;17944;:30::i;:::-;40900:17:::1;:58:::0;;-1:-1:-1;;;;;;40900:58:0::1;-1:-1:-1::0;;;;;40900:58:0;::::1;::::0;;::::1;::::0;;;40974:44:::1;::::0;::::1;::::0;-1:-1:-1;;40974:44:0::1;40770:256:::0;;:::o;39556:257::-;39617:21;39641;39652:9;39641:10;:21::i;:::-;39681:14;;;;39711:17;;;;;;;;;;;;-1:-1:-1;;;39711:17:0;;;;39617:45;;-1:-1:-1;;;;;;39681:14:0;39699:10;39681:28;39673:56;;;;-1:-1:-1;;;39673:56:0;;;;;;;;:::i;:::-;;39740:24;39754:9;39740:13;:24::i;:::-;39780:25;;39795:9;;39780:25;;;;;39606:207;39556:257;:::o;39925:339::-;33946:24;17944:30;33946:24;5782:10;17944;:30::i;:::-;40024:9:::1;40019:238;40043:10;:17;40039:1;:21;40019:238;;;40127:1;40086:23;:38;40110:10;40121:1;40110:13;;;;;;;;:::i;:::-;;;;;;;40086:38;;;;;;;;;;;;:42;40082:164;;;40149:28;40163:10;40174:1;40163:13;;;;;;;;:::i;:::-;;;;;;;40149;:28::i;:::-;40216:10;40227:1;40216:13;;;;;;;;:::i;:::-;;;;;;;40201:29;;;;;;;;;;40082:164;40062:3;::::0;::::1;:::i;:::-;;;40019:238;;20254:149:::0;19543:7;19570:12;;;:6;:12;;;;;;;;:22;;17944:30;17955:4;5782:10;17944;:30::i;:::-;20369:26:::1;20381:4;20387:7;20369:11;:26::i;40316:334::-:0;33946:24;17944:30;33946:24;5782:10;17944;:30::i;:::-;40409:7:::1;:14:::0;40434:209:::1;40441:16:::0;;40434:209:::1;;40474:17;40490:1;40474:17:::0;::::1;:::i;:::-;;;40506:16;40525:7;40533:12;40525:21;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;;40506:43;;40564:23;40578:8;40564:13;:23::i;:::-;40607:24;::::0;40622:8;;40607:24:::1;::::0;;;::::1;40459:184;40434:209;;35909:1119:::0;36050:20;13476:7;;;;13730:9;13722:38;;;;-1:-1:-1;;;13722:38:0;;;;;;;:::i;:::-;36113:17:::1;::::0;36096:7:::1;:14:::0;36132:27:::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;36132:27:0::1;::::0;::::1;::::0;;-1:-1:-1;36088:72:0::1;;;;-1:-1:-1::0;;;36088:72:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;36200:7:0::1;:14:::0;;::::1;::::0;::::1;::::0;;36173:24:::1;36200:14:::0;;;::::1;36240::::0;;36200;;::::1;::::0;::::1;::::0;;;36240::::1;::::0;::::1;:::i;:::-;::::0;;;;-1:-1:-1;36267:27:0;;;36305:17:::1;::::0;;::::1;:30:::0;;36325:10:::1;-1:-1:-1::0;;;;;;36305:30:0;;::::1;::::0;::::1;::::0;;;36368:15:::1;36346:19;::::0;;::::1;:37:::0;;;;36420:12:::1;36394:23;::::0;::::1;:38:::0;36464:14;36443:18:::1;::::0;::::1;:35:::0;36521:19;;36489:29:::1;::::0;::::1;:51:::0;-1:-1:-1;36551:26:0;::::1;:46:::0;;;;::::1;-1:-1:-1::0;;;;;36551:46:0;::::1;;::::0;;;36648:7:::1;:14:::0;-1:-1:-1;36608:37:0;;;:23:::1;:37;::::0;;;;:54;;;;36240:14;;-1:-1:-1;36713:67:0::1;::::0;36551:46;;36761:18;36713:16:::1;:67::i;:::-;36675:105;;36827:9;36817:20;;;;;;36791:9;:23;;:46;;;;36935:17;-1:-1:-1::0;;;;;36855:165:0::1;36883:12;36855:165;36910:10;36967:18;37000:9;36855:165;;;;;;;;:::i;:::-;;;;;;;;36077:951;;35909:1119:::0;;;;:::o;29822:118::-;29878:16;29914:18;29907:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29907:25:0;;;;;;;;;;;;;;;;;;;;;;;29822:118;:::o;25212:187::-;17498:4;17944:30;17498:4;5782:10;17944;:30::i;:::-;25346:45:::1;25370:20;25346:23;:45::i;27185:35::-:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27185:35:0;;-1:-1:-1;27185:35:0;:::o;27516:60::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25458:179::-;17498:4;17944:30;17498:4;5782:10;17944;:30::i;:::-;25588:41:::1;25610:18;25588:21;:41::i;18791:497::-:0;18872:22;18880:4;18886:7;18872;:22::i;:::-;18867:414;;19060:41;19088:7;-1:-1:-1;;;;;19060:41:0;19098:2;19060:19;:41::i;:::-;19174:38;19202:4;19209:2;19174:19;:38::i;:::-;18965:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;18965:270:0;;;;;;;;;;-1:-1:-1;;;18911:358:0;;;;;;;:::i;22214:229::-;22289:22;22297:4;22303:7;22289;:22::i;:::-;22284:152;;22328:12;;;;22360:4;22328:12;;;;;;;;-1:-1:-1;;;;;22328:29:0;;;;;;;;;;:36;;-1:-1:-1;;22328:36:0;;;;;;;22384:40;;5782:10;;22328:12;;22384:40;;22328:12;22384:40;22214:229;;:::o;25645:248::-;25766:21;;;;;;;;;;;;-1:-1:-1;;;25766:21:0;;;;23877:10;25726:38;;;25718:70;;;;-1:-1:-1;;;25718:70:0;;;;;;;;:::i;:::-;-1:-1:-1;25799:14:0;:32;;;25847:38;;9319:25:1;;;25847:38:0;;9307:2:1;9292:18;25847:38:0;;;;;;;;25645:248;:::o;22451:230::-;22526:22;22534:4;22540:7;22526;:22::i;:::-;22522:152;;;22597:5;22565:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;22565:29:0;;;;;;;;;;:37;;-1:-1:-1;;22565:37:0;;;22622:40;5782:10;;22565:12;;22622:40;;22597:5;22622:40;22451:230;;:::o;43158:256::-;43219:14;43269:34;;;:23;:34;;;;;;;;;43340:22;;;;;;;;;;;-1:-1:-1;;;43340:22:0;;;;;;;43322:16;43314:49;;;;-1:-1:-1;;;43314:49:0;;;;;;;;:::i;:::-;-1:-1:-1;43381:7:0;43389:16;43404:1;43389:12;:16;:::i;:::-;43381:25;;;;;;;;:::i;:::-;;;;;;;;;;;43374:32;;;43158:256;;;:::o;42634:466::-;42695:13;42711:34;;;:23;:34;;;;;;:38;;42748:1;;42711:38;:::i;:::-;42780:7;:14;42695:54;;-1:-1:-1;42760:17:0;;42780:18;;42797:1;;42780:18;:::i;:::-;42760:38;;42824:9;42815:5;:18;42811:204;;42850:25;42878:7;42886:9;42878:18;;;;;;;;:::i;:::-;;;;;;;;;;;42850:46;;42928:10;42911:7;42919:5;42911:14;;;;;;;;:::i;:::-;;;;;;;;;:27;;:14;;;;;:27;;;;;;;;;;;;;-1:-1:-1;;;;;42911:27:0;;;-1:-1:-1;;;;;;42911:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42994:9;;:5;;:9;:::i;:::-;42977:13;;42953:38;;;;:23;:38;;;;;:50;42811:204;43027:7;:13;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;43027:13:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;43027:13:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43058:34;;;:23;:34;;;-1:-1:-1;;43058:34:0;;;43051:41;42634:466::o;14464:120::-;13452:4;13476:7;;;14000:41;;;;-1:-1:-1;;;14000:41:0;;10826:2:1;14000:41:0;;;10808:21:1;10865:2;10845:18;;;10838:30;-1:-1:-1;;;10884:18:1;;;10877:50;10944:18;;14000:41:0;10798:170:1;14000:41:0;14533:5:::1;14523:15:::0;;-1:-1:-1;;14523:15:0::1;::::0;;14554:22:::1;5782:10:::0;14563:12:::1;14554:22;::::0;-1:-1:-1;;;;;6490:32:1;;;6472:51;;6460:2;6445:18;14554:22:0::1;;;;;;;14464:120::o:0;10976:179::-;11054:4;11100:1;11078:12;:19;:23;:69;;;;-1:-1:-1;9845:35:0;9745:1;9537:2;9845:35;:::i;:::-;11105:12;:19;:37;;;;:::i;:::-;:42;11071:76;10976:179;-1:-1:-1;;10976:179:0:o;31176:286::-;-1:-1:-1;;;;;31328:42:0;;31287:14;31328:42;;;:23;:42;;;;;;31389:10;31381:51;;;;-1:-1:-1;;;31381:51:0;;12576:2:1;31381:51:0;;;12558:21:1;12615:2;12595:18;;;12588:30;12654;12634:18;;;12627:58;12702:18;;31381:51:0;12548:178:1;31381:51:0;31443:11;31453:1;31443:11;;:::i;14205:118::-;13452:4;13476:7;;;13730:9;13722:38;;;;-1:-1:-1;;;13722:38:0;;;;;;;:::i;:::-;14265:7:::1;:14:::0;;-1:-1:-1;;14265:14:0::1;14275:4;14265:14;::::0;;14295:20:::1;14302:12;5782:10:::0;;5702:98;30497:591;30653:23;30697:38;30717:17;-1:-1:-1;;;;;31577:47:0;31553:4;31577:47;;;:23;:47;;;;;;:51;;;31470:166;30697:38;30689:79;;;;-1:-1:-1;;;30689:79:0;;12576:2:1;30689:79:0;;;12558:21:1;12615:2;12595:18;;;12588:30;12654;12634:18;;;12627:58;12702:18;;30689:79:0;12548:178:1;30689:79:0;30792:119;;-1:-1:-1;;;30792:119:0;;-1:-1:-1;;;;;30792:52:0;;;;;:119;;30859:8;;30882:18;;30792:119;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30792:119:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30949:46:0;;30922:24;30949:46;;;:27;:46;;;;;30922:73;;30779:132;;-1:-1:-1;30922:24:0;;:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31014:43;31046:10;31014:11;:31;;:43;;;;:::i;:::-;31006:74;;;;-1:-1:-1;;;31006:74:0;;12229:2:1;31006:74:0;;;12211:21:1;12268:2;12248:18;;;12241:30;-1:-1:-1;;;12287:18:1;;;12280:48;12345:18;;31006:74:0;12201:168:1;31006:74:0;30678:410;30497:591;;;;;:::o;25901:288::-;26042:21;;;;;;;;;;;;-1:-1:-1;;;26042:21:0;;;;23761:4;25992:48;;;25984:80;;;;-1:-1:-1;;;25984:80:0;;;;;;;;:::i;:::-;-1:-1:-1;26075:19:0;:42;;;26133:48;;9319:25:1;;;26133:48:0;;9307:2:1;9292:18;26133:48:0;9274:76:1;26197:267:0;26325:21;;;;;;;;;;;;-1:-1:-1;;;26325:21:0;;;;23587:3;26284:39;;;26276:71;;;;-1:-1:-1;;;26276:71:0;;;;;;;;:::i;:::-;-1:-1:-1;26358:17:0;:38;;;26412:44;;9319:25:1;;;26412:44:0;;9307:2:1;9292:18;26412:44:0;9274:76:1;7532:451:0;7607:13;7633:19;7665:10;7669:6;7665:1;:10;:::i;:::-;:14;;7678:1;7665:14;:::i;:::-;7655:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7655:25:0;;7633:47;;-1:-1:-1;;;7691:6:0;7698:1;7691:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;7691:15:0;;;;;;;;;-1:-1:-1;;;7717:6:0;7724:1;7717:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;7717:15:0;;;;;;;;-1:-1:-1;7748:9:0;7760:10;7764:6;7760:1;:10;:::i;:::-;:14;;7773:1;7760:14;:::i;:::-;7748:26;;7743:135;7780:1;7776;:5;7743:135;;;-1:-1:-1;;;7828:5:0;7836:3;7828:11;7815:25;;;;;;;:::i;:::-;;;;7803:6;7810:1;7803:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;7803:37:0;;;;;;;;-1:-1:-1;7865:1:0;7855:11;;;;;7783:3;;;:::i;:::-;;;7743:135;;;-1:-1:-1;7896:10:0;;7888:55;;;;-1:-1:-1;;;7888:55:0;;10465:2:1;7888:55:0;;;10447:21:1;;;10484:18;;;10477:30;10543:34;10523:18;;;10516:62;10595:18;;7888:55:0;10437:182:1;7888:55:0;7968:6;7532:451;-1:-1:-1;;;7532:451:0:o;10156:724::-;10287:4;9444:1;10394:32;10413:12;10394:18;:32::i;:::-;10393:33;:66;;;;10451:8;10430:10;:17;:29;;10393:66;10389:111;;;10483:5;10476:12;;;;;10389:111;10530:10;:17;10519:8;:28;10512:339;;;10565:20;10587:21;10612:38;10629:10;10641:8;10612:16;:38::i;:::-;10564:86;;;;10670:42;10685:12;10699;10670:14;:42::i;:::-;10665:96;;10740:5;10733:12;;;;;;;10665:96;10787:52;;;:35;9648:1;9537:2;10787:35;:::i;:::-;:52;;;;:::i;:::-;10775:64;;;;:::i;:::-;;;10549:302;;10512:339;;;-1:-1:-1;10868:4:0;;10156:724;-1:-1:-1;;;10156:724:0:o;11285:500::-;11404:7;;;11457:31;:10;11478:9;11457:20;:31::i;:::-;11437:51;-1:-1:-1;11499:21:0;11523:45;11543:24;9537:2;11543:9;:24;:::i;:::-;11523:10;;:19;:45::i;:::-;11499:69;-1:-1:-1;11579:23:0;11618:68;9648:1;11638:24;9537:2;11638:9;:24;:::i;:::-;:47;;;;:::i;:::-;11618:10;;:19;:68::i;:::-;11579:107;;11750:9;11742:18;;11705:55;;;11721:16;11713:25;;11705:34;;:55;11762:14;11697:80;;;;;;;11285:500;;;;;:::o;11862:460::-;11985:4;;12038:254;12056:12;:19;12045:8;:30;12038:254;;;12092:18;12113:32;:12;12136:8;12113:22;:32::i;:::-;12092:53;-1:-1:-1;;;12164:27:0;;;;;;;12160:79;;;12219:4;12212:11;;;;;;12160:79;9845:35;9745:1;9537:2;9845:35;:::i;:::-;12253:27;;;;:::i;:::-;;;12077:215;12038:254;;;-1:-1:-1;12309:5:0;;11862:460;-1:-1:-1;;;11862:460:0:o;1179:344::-;1258:14;1285:12;1300:25;1310:4;1316:8;2034:30;2048:4;2034:30;2028:37;;1888:195;1300:25;1392:2;1370:135;;1179:344;-1:-1:-1;;;;1179:344:0:o;1531:349::-;1611:13;1637:12;1652:27;1662:5;1669:9;2034:30;2048:4;2034:30;2028:37;;1888:195;1652:27;1748:3;1726:136;;1531:349;-1:-1:-1;;;;1531:349:0:o;958:213::-;1037:14;1064:12;1079:25;1089:4;1095:8;2034:30;2048:4;2034:30;2028:37;;1888:195;1079:25;1064:40;958:213;-1:-1:-1;;;;958:213:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:462::-;234:5;287:3;280:4;272:6;268:17;264:27;254:2;;305:1;302;295:12;254:2;341:6;328:20;372:48;388:31;416:2;388:31;:::i;:::-;372:48;:::i;:::-;445:2;436:7;429:19;491:3;484:4;479:2;471:6;467:15;463:26;460:35;457:2;;;508:1;505;498:12;457:2;573;566:4;558:6;554:17;547:4;538:7;534:18;521:55;621:1;596:16;;;614:4;592:27;585:38;;;;600:7;244:410;-1:-1:-1;;;244:410:1:o;659:186::-;718:6;771:2;759:9;750:7;746:23;742:32;739:2;;;787:1;784;777:12;739:2;810:29;829:9;810:29;:::i;850:394::-;927:6;935;988:2;976:9;967:7;963:23;959:32;956:2;;;1004:1;1001;994:12;956:2;1027:29;1046:9;1027:29;:::i;:::-;1017:39;;1107:2;1096:9;1092:18;1079:32;1134:18;1126:6;1123:30;1120:2;;;1166:1;1163;1156:12;1120:2;1189:49;1230:7;1221:6;1210:9;1206:22;1189:49;:::i;:::-;1179:59;;;946:298;;;;;:::o;1249:957::-;1333:6;1364:2;1407;1395:9;1386:7;1382:23;1378:32;1375:2;;;1423:1;1420;1413:12;1375:2;1463:9;1450:23;1492:18;1533:2;1525:6;1522:14;1519:2;;;1549:1;1546;1539:12;1519:2;1587:6;1576:9;1572:22;1562:32;;1632:7;1625:4;1621:2;1617:13;1613:27;1603:2;;1654:1;1651;1644:12;1603:2;1690;1677:16;1712:2;1708;1705:10;1702:2;;;1718:18;;:::i;:::-;1764:2;1761:1;1757:10;1747:20;;1787:28;1811:2;1807;1803:11;1787:28;:::i;:::-;1849:15;;;1880:12;;;;1912:11;;;1942;;;1938:20;;1935:33;-1:-1:-1;1932:2:1;;;1981:1;1978;1971:12;1932:2;2003:1;1994:10;;2013:163;2027:2;2024:1;2021:9;2013:163;;;2084:17;;2072:30;;2045:1;2038:9;;;;;2122:12;;;;2154;;2013:163;;;-1:-1:-1;2195:5:1;1344:862;-1:-1:-1;;;;;;;;1344:862:1:o;2211:180::-;2270:6;2323:2;2311:9;2302:7;2298:23;2294:32;2291:2;;;2339:1;2336;2329:12;2291:2;-1:-1:-1;2362:23:1;;2281:110;-1:-1:-1;2281:110:1:o;2396:254::-;2464:6;2472;2525:2;2513:9;2504:7;2500:23;2496:32;2493:2;;;2541:1;2538;2531:12;2493:2;2577:9;2564:23;2554:33;;2606:38;2640:2;2629:9;2625:18;2606:38;:::i;:::-;2596:48;;2483:167;;;;;:::o;2655:286::-;2713:6;2766:2;2754:9;2745:7;2741:23;2737:32;2734:2;;;2782:1;2779;2772:12;2734:2;2808:23;;-1:-1:-1;;;;;;2860:32:1;;2850:43;;2840:2;;2907:1;2904;2897:12;2946:634;3025:6;3078:2;3066:9;3057:7;3053:23;3049:32;3046:2;;;3094:1;3091;3084:12;3046:2;3127:9;3121:16;3160:18;3152:6;3149:30;3146:2;;;3192:1;3189;3182:12;3146:2;3215:22;;3268:4;3260:13;;3256:27;-1:-1:-1;3246:2:1;;3297:1;3294;3287:12;3246:2;3326;3320:9;3351:48;3367:31;3395:2;3367:31;:::i;3351:48::-;3422:2;3415:5;3408:17;3462:7;3457:2;3452;3448;3444:11;3440:20;3437:33;3434:2;;;3483:1;3480;3473:12;3434:2;3496:54;3547:2;3542;3535:5;3531:14;3526:2;3522;3518:11;3496:54;:::i;3770:184::-;3840:6;3893:2;3881:9;3872:7;3868:23;3864:32;3861:2;;;3909:1;3906;3899:12;3861:2;-1:-1:-1;3932:16:1;;3851:103;-1:-1:-1;3851:103:1:o;4218:388::-;4295:6;4303;4356:2;4344:9;4335:7;4331:23;4327:32;4324:2;;;4372:1;4369;4362:12;4324:2;4408:9;4395:23;4385:33;;4469:2;4458:9;4454:18;4441:32;4496:18;4488:6;4485:30;4482:2;;;4528:1;4525;4518:12;4611:257;4652:3;4690:5;4684:12;4717:6;4712:3;4705:19;4733:63;4789:6;4782:4;4777:3;4773:14;4766:4;4759:5;4755:16;4733:63;:::i;:::-;4850:2;4829:15;-1:-1:-1;;4825:29:1;4816:39;;;;4857:4;4812:50;;4660:208;-1:-1:-1;;4660:208:1:o;4873:657::-;4951:5;4945:12;4940:3;4933:25;5004:4;4997:5;4993:16;4987:23;5046:1;5042;5037:3;5033:11;5029:19;5098:2;5084:12;5080:21;5073:4;5068:3;5064:14;5057:45;5163:2;5155:4;5148:5;5144:16;5138:23;5134:32;5127:4;5122:3;5118:14;5111:56;;;5216:4;5209:5;5205:16;5199:23;5192:4;5187:3;5183:14;5176:47;5272:4;5265:5;5261:16;5255:23;5248:4;5243:3;5239:14;5232:47;5328:4;5321:5;5317:16;5311:23;5304:4;5299:3;5295:14;5288:47;5384:4;5377:5;5373:16;5367:23;5360:4;5355:3;5351:14;5344:47;5440:4;5433:5;5429:16;5423:23;5416:4;5411:3;5407:14;5400:47;5466:6;5519:2;5512:5;5508:14;5502:21;5497:2;5492:3;5488:12;5481:43;;4923:607;;:::o;5535:786::-;5946:25;5941:3;5934:38;5916:3;6001:6;5995:13;6017:62;6072:6;6067:2;6062:3;6058:12;6051:4;6043:6;6039:17;6017:62;:::i;:::-;-1:-1:-1;;;6138:2:1;6098:16;;;6130:11;;;6123:40;6188:13;;6210:63;6188:13;6259:2;6251:11;;6244:4;6232:17;;6210:63;:::i;:::-;6293:17;6312:2;6289:26;;5924:397;-1:-1:-1;;;;5924:397:1:o;6534:314::-;-1:-1:-1;;;;;6709:32:1;;6691:51;;6778:2;6773;6758:18;;6751:30;;;-1:-1:-1;;6798:44:1;;6823:18;;6815:6;6798:44;:::i;6853:474::-;-1:-1:-1;;;;;7074:32:1;;7056:51;;7143:2;7138;7123:18;;7116:30;;;-1:-1:-1;;7169:44:1;;7194:18;;7186:6;7169:44;:::i;:::-;7261:9;7253:6;7249:22;7244:2;7233:9;7229:18;7222:50;7289:32;7314:6;7306;7289:32;:::i;:::-;7281:40;7046:281;-1:-1:-1;;;;;;7046:281:1:o;7611:658::-;7782:2;7834:21;;;7904:13;;7807:18;;;7926:22;;;7753:4;;7782:2;8005:15;;;;7979:2;7964:18;;;7753:4;8048:195;8062:6;8059:1;8056:13;8048:195;;;8127:13;;-1:-1:-1;;;;;8123:39:1;8111:52;;8218:15;;;;8183:12;;;;8159:1;8077:9;8048:195;;;-1:-1:-1;8260:3:1;;7762:507;-1:-1:-1;;;;;;7762:507:1:o;8274:702::-;8493:2;8545:21;;;8615:13;;8518:18;;;8637:22;;;8464:4;;8493:2;8716:15;;;;8690:2;8675:18;;;8464:4;8759:191;8773:6;8770:1;8767:13;8759:191;;;8822:44;8862:3;8853:6;8847:13;8822:44;:::i;:::-;8925:15;;;;8895:6;8886:16;;;;;8795:1;8788:9;8759:191;;9355:217;9502:2;9491:9;9484:21;9465:4;9522:44;9562:2;9551:9;9547:18;9539:6;9522:44;:::i;11682:340::-;11884:2;11866:21;;;11923:2;11903:18;;;11896:30;-1:-1:-1;;;11957:2:1;11942:18;;11935:46;12013:2;11998:18;;11856:166::o;13147:244::-;13329:3;13314:19;;13342:43;13318:9;13367:6;13342:43;:::i;14714:275::-;14785:2;14779:9;14850:2;14831:13;;-1:-1:-1;;14827:27:1;14815:40;;14885:18;14870:34;;14906:22;;;14867:62;14864:2;;;14932:18;;:::i;:::-;14968:2;14961:22;14759:230;;-1:-1:-1;14759:230:1:o;14994:186::-;15042:4;15075:18;15067:6;15064:30;15061:2;;;15097:18;;:::i;:::-;-1:-1:-1;15163:2:1;15142:15;-1:-1:-1;;15138:29:1;15169:4;15134:40;;15051:129::o;15185:128::-;15225:3;15256:1;15252:6;15249:1;15246:13;15243:2;;;15262:18;;:::i;:::-;-1:-1:-1;15298:9:1;;15233:80::o;15318:120::-;15358:1;15384;15374:2;;15389:18;;:::i;:::-;-1:-1:-1;15423:9:1;;15364:74::o;15443:168::-;15483:7;15549:1;15545;15541:6;15537:14;15534:1;15531:21;15526:1;15519:9;15512:17;15508:45;15505:2;;;15556:18;;:::i;:::-;-1:-1:-1;15596:9:1;;15495:116::o;15616:125::-;15656:4;15684:1;15681;15678:8;15675:2;;;15689:18;;:::i;:::-;-1:-1:-1;15726:9:1;;15665:76::o;15746:258::-;15818:1;15828:113;15842:6;15839:1;15836:13;15828:113;;;15918:11;;;15912:18;15899:11;;;15892:39;15864:2;15857:10;15828:113;;;15959:6;15956:1;15953:13;15950:2;;;15994:1;15985:6;15980:3;15976:16;15969:27;15950:2;;15799:205;;;:::o;16009:136::-;16048:3;16076:5;16066:2;;16085:18;;:::i;:::-;-1:-1:-1;;;16121:18:1;;16056:89::o;16150:380::-;16229:1;16225:12;;;;16272;;;16293:2;;16347:4;16339:6;16335:17;16325:27;;16293:2;16400;16392:6;16389:14;16369:18;16366:38;16363:2;;;16446:10;16441:3;16437:20;16434:1;16427:31;16481:4;16478:1;16471:15;16509:4;16506:1;16499:15;16363:2;;16205:325;;;:::o;16535:135::-;16574:3;-1:-1:-1;;16595:17:1;;16592:2;;;16615:18;;:::i;:::-;-1:-1:-1;16662:1:1;16651:13;;16582:88::o;16675:112::-;16707:1;16733;16723:2;;16738:18;;:::i;:::-;-1:-1:-1;16772:9:1;;16713:74::o;16792:127::-;16853:10;16848:3;16844:20;16841:1;16834:31;16884:4;16881:1;16874:15;16908:4;16905:1;16898:15;16924:127;16985:10;16980:3;16976:20;16973:1;16966:31;17016:4;17013:1;17006:15;17040:4;17037:1;17030:15;17056:127;17117:10;17112:3;17108:20;17105:1;17098:31;17148:4;17145:1;17138:15;17172:4;17169:1;17162:15;17188:127;17249:10;17244:3;17240:20;17237:1;17230:31;17280:4;17277:1;17270:15;17304:4;17301:1;17294:15;17320:127;17381:10;17376:3;17372:20;17369:1;17362:31;17412:4;17409:1;17402:15;17436:4;17433:1;17426:15
Swarm Source
ipfs://8175083e19f6286bcd779a108d71df991bd692666d34a8bfdc561c82b9570b9b
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.