Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
dotbit
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-31 */ // File: @openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControlUpgradeable { /** * @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; } // File: @openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { 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); } } // File: @openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol // OpenZeppelin Contracts (last updated v4.6.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = _setInitializedVersion(1); if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { bool isTopLevelCall = _setInitializedVersion(version); if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(version); } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { _setInitializedVersion(type(uint8).max); } function _setInitializedVersion(uint8 version) private returns (bool) { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level // of initializers, because in other contexts the contract may have been reentered. if (_initializing) { require( version == 1 && !AddressUpgradeable.isContract(address(this)), "Initializable: contract is already initialized" ); return false; } else { require(_initialized < version, "Initializable: contract is already initialized"); _initialized = version; return true; } } } // File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721ReceiverUpgradeable { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165Upgradeable { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @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 ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal onlyInitializing { } function __ERC165_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol // OpenZeppelin Contracts (last updated v4.6.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @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 AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable { function __AccessControl_init() internal onlyInitializing { } function __AccessControl_init_unchained() internal onlyInitializing { } 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); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @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 virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", StringsUpgradeable.toHexString(uint160(account), 20), " is missing role ", StringsUpgradeable.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 virtual 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 revoked `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}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ 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); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File: @openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721MetadataUpgradeable is IERC721Upgradeable { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable { using AddressUpgradeable for address; using StringsUpgradeable for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ function __ERC721_init(string memory name_, string memory symbol_) internal onlyInitializing { __ERC721_init_unchained(name_, symbol_); } function __ERC721_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC721Upgradeable).interfaceId || interfaceId == type(IERC721MetadataUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721Upgradeable.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721Upgradeable.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721Upgradeable.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721Upgradeable.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721Upgradeable.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721ReceiverUpgradeable.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[44] private __gap; } // File: contracts/DID/logic.sol pragma solidity ^0.8.14; contract dotbit is ERC721Upgradeable, AccessControlUpgradeable { string constant private EXPIRES_MESS = "expired"; string constant private NOT_EXPIRES_MESS = "unexpired"; string constant private NOT_EXIST_MESS = "not exist"; string constant private ONLY_OWNER_MESS = "only owner"; mapping(uint256 => uint) private expires; bytes32 public constant MANAGER_ROLE = keccak256("MANAGER_ROLE"); string private BASE_URL; event UserRecycle(address indexed uuid); uint constant public GRACE_PERIOD = 90 days; function initialize( address owner, address manager ) initializer public { __ERC721_init("dotbit: Web3 Identity", "DOTBIT"); BASE_URL = "https://display.did.id/erc721/data"; _setupRole(DEFAULT_ADMIN_ROLE, owner); _setupRole(MANAGER_ROLE, owner); _setupRole(MANAGER_ROLE, manager); } function ownerOf(uint256 tokenId) override public view returns (address) { require(expires[tokenId] != 0, NOT_EXIST_MESS); require(expires[tokenId] + GRACE_PERIOD > block.timestamp, EXPIRES_MESS); return super.ownerOf(tokenId); } function transferFrom( address from, address to, uint256 tokenId ) override public { require(expires[tokenId] > block.timestamp, EXPIRES_MESS); super.transferFrom(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId ) override public { require(expires[tokenId] > block.timestamp, EXPIRES_MESS); super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) override public { require(expires[tokenId] > block.timestamp, EXPIRES_MESS); super.safeTransferFrom(from, to, tokenId, _data); } function tokenURI(uint256 tokenId) override public view returns (string memory) { string memory output = string(abi.encodePacked(BASE_URL, '/', StringsUpgradeable.toString(tokenId))); // uint160 uuid = uint160(tokenId); // string memory output = string(abi.encodePacked(BASE_URL, '/', Strings.toHexString(uuid, 20))); return output; } function getExpires(uint256 tokenId) external view returns (uint256) { return expires[tokenId]; } function getExpiresUuid(address uuid) external view returns (uint256) { uint256 tokenId = uint256(uint160(uuid)); return expires[tokenId]; } function mint(address to, address uuid, uint256 expireAt) external onlyRole(MANAGER_ROLE) { uint256 tokenId = uint256(uint160(uuid)); require(expires[tokenId] + GRACE_PERIOD <= block.timestamp, NOT_EXPIRES_MESS); if (_exists(tokenId)) { _burn(tokenId); } expires[tokenId] = expireAt; _mint(to, tokenId); } function recycle(address uuid) external { uint256 tokenId = uint256(uint160(uuid)); require(_exists(tokenId)); require(expires[tokenId] + GRACE_PERIOD > block.timestamp, EXPIRES_MESS); address owner = ERC721Upgradeable.ownerOf(tokenId); require(owner == msg.sender, ONLY_OWNER_MESS); _burn(tokenId); expires[tokenId] = 0; emit UserRecycle(uuid); } function setBaseUrl(string memory _baseURL) external onlyRole(MANAGER_ROLE) { BASE_URL = _baseURL; } function supportsInterface(bytes4 interfaceId) public view override(ERC721Upgradeable, AccessControlUpgradeable) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"uuid","type":"address"}],"name":"UserRecycle","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GRACE_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getExpires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"uuid","type":"address"}],"name":"getExpiresUuid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"owner","type":"address"},{"internalType":"address","name":"manager","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"uuid","type":"address"},{"internalType":"uint256","name":"expireAt","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"uuid","type":"address"}],"name":"recycle","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURL","type":"string"}],"name":"setBaseUrl","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":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50612333806100206000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c806370a08231116100f9578063c1a287e211610097578063c87b56dd11610071578063c87b56dd146103b6578063d547741f146103c9578063e985e9c5146103dc578063ec87621c1461041857600080fd5b8063c1a287e214610386578063c6c3bbe614610390578063c7c3268b146103a357600080fd5b8063a217fddf116100d3578063a217fddf14610345578063a22cb4651461034d578063b88d4fde14610360578063baca00041461037357600080fd5b806370a082311461031757806391d148541461032a57806395d89b411461033d57600080fd5b80632f2ff15d11610166578063409209861161014057806340920986146102b557806342842e0e146102de578063485cc955146102f15780636352211e1461030457600080fd5b80632f2ff15d1461026f57806336568abe146102825780633dca885d1461029557600080fd5b806301ffc9a7146101ae57806306fdde03146101d6578063081812fc146101eb578063095ea7b31461021657806323b872dd1461022b578063248a9ca31461023e575b600080fd5b6101c16101bc366004611ba0565b61042d565b60405190151581526020015b60405180910390f35b6101de61043e565b6040516101cd9190611c15565b6101fe6101f9366004611c28565b6104d0565b6040516001600160a01b0390911681526020016101cd565b610229610224366004611c58565b61056a565b005b610229610239366004611c82565b61067f565b61026161024c366004611c28565b60009081526097602052604090206001015490565b6040519081526020016101cd565b61022961027d366004611cbe565b6106df565b610229610290366004611cbe565b610704565b6102616102a3366004611c28565b600090815260c9602052604090205490565b6102616102c3366004611cea565b6001600160a01b0316600090815260c9602052604090205490565b6102296102ec366004611c82565b610782565b6102296102ff366004611d05565b6107e2565b6101fe610312366004611c28565b61090e565b610261610325366004611cea565b6109c7565b6101c1610338366004611cbe565b610a4e565b6101de610a79565b610261600081565b61022961035b366004611d2f565b610a88565b61022961036e366004611df7565b610a93565b610229610381366004611cea565b610afa565b6102616276a70081565b61022961039e366004611c82565b610c35565b6102296103b1366004611e73565b610d01565b6101de6103c4366004611c28565b610d2c565b6102296103d7366004611cbe565b610d63565b6101c16103ea366004611d05565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b6102616000805160206122bc83398151915281565b600061043882610d88565b92915050565b60606065805461044d90611ebc565b80601f016020809104026020016040519081016040528092919081815260200182805461047990611ebc565b80156104c65780601f1061049b576101008083540402835291602001916104c6565b820191906000526020600020905b8154815290600101906020018083116104a957829003601f168201915b5050505050905090565b6000818152606760205260408120546001600160a01b031661054e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152606960205260409020546001600160a01b031690565b600061057582610dad565b9050806001600160a01b0316836001600160a01b0316036105e25760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610545565b336001600160a01b03821614806105fe57506105fe81336103ea565b6106705760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610545565b61067a8383610e24565b505050565b4260c96000838152602001908152602001600020541160405180604001604052806007815260200166195e1c1a5c995960ca1b815250906106d35760405162461bcd60e51b81526004016105459190611c15565b5061067a838383610e92565b6000828152609760205260409020600101546106fa81610ec3565b61067a8383610ed0565b6001600160a01b03811633146107745760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610545565b61077e8282610f56565b5050565b4260c96000838152602001908152602001600020541160405180604001604052806007815260200166195e1c1a5c995960ca1b815250906107d65760405162461bcd60e51b81526004016105459190611c15565b5061067a838383610fbd565b60006107ee6001610fd8565b90508015610806576000805461ff0019166101001790555b61085b60405180604001604052806015815260200174646f746269743a2057656233204964656e7469747960581b815250604051806040016040528060068152602001651113d510925560d21b815250611065565b6040518060600160405280602281526020016122dc6022913980516108889160ca91602090910190611af1565b50610894600084611096565b6108ac6000805160206122bc83398151915284611096565b6108c46000805160206122bc83398151915283611096565b801561067a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b600081815260c96020908152604080832054815180830190925260098252681b9bdd08195e1a5cdd60ba1b928201929092529061095e5760405162461bcd60e51b81526004016105459190611c15565b50600082815260c96020526040902054429061097e906276a70090611f0c565b1160405180604001604052806007815260200166195e1c1a5c995960ca1b815250906109bd5760405162461bcd60e51b81526004016105459190611c15565b5061043882610dad565b60006001600160a01b038216610a325760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610545565b506001600160a01b031660009081526068602052604090205490565b60009182526097602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606066805461044d90611ebc565b61077e3383836110a0565b4260c96000848152602001908152602001600020541160405180604001604052806007815260200166195e1c1a5c995960ca1b81525090610ae75760405162461bcd60e51b81526004016105459190611c15565b50610af48484848461116e565b50505050565b6001600160a01b038116610b25816000908152606760205260409020546001600160a01b0316151590565b610b2e57600080fd5b600081815260c960205260409020544290610b4d906276a70090611f0c565b1160405180604001604052806007815260200166195e1c1a5c995960ca1b81525090610b8c5760405162461bcd60e51b81526004016105459190611c15565b506000610b9882610dad565b60408051808201909152600a81526937b7363c9037bbb732b960b11b60208201529091506001600160a01b0382163314610be55760405162461bcd60e51b81526004016105459190611c15565b50610bef826111a0565b600082815260c96020526040808220829055516001600160a01b038516917fa3d7775bd5f9cdedbb729ccb32f865235da08da2a0fba8eade799a56b4463aca91a2505050565b6000805160206122bc833981519152610c4d81610ec3565b6001600160a01b038316600081815260c960205260409020544290610c76906276a70090611f0c565b1115604051806040016040528060098152602001681d5b995e1c1a5c995960ba1b81525090610cb85760405162461bcd60e51b81526004016105459190611c15565b506000818152606760205260409020546001600160a01b031615610cdf57610cdf816111a0565b600081815260c960205260409020839055610cfa858261123b565b5050505050565b6000805160206122bc833981519152610d1981610ec3565b815161067a9060ca906020850190611af1565b6060600060ca610d3b8461137d565b604051602001610d4c929190611f40565b60408051601f198184030181529190529392505050565b600082815260976020526040902060010154610d7e81610ec3565b61067a8383610f56565b60006001600160e01b03198216637965db0b60e01b1480610438575061043882611486565b6000818152606760205260408120546001600160a01b0316806104385760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610545565b600081815260696020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610e5982610dad565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610e9c33826114d6565b610eb85760405162461bcd60e51b815260040161054590611ff6565b61067a8383836115cc565b610ecd8133611768565b50565b610eda8282610a4e565b61077e5760008281526097602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610f123390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610f608282610a4e565b1561077e5760008281526097602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b61067a83838360405180602001604052806000815250610a93565b60008054610100900460ff161561101f578160ff166001148015610ffb5750303b155b6110175760405162461bcd60e51b815260040161054590612047565b506000919050565b60005460ff8084169116106110465760405162461bcd60e51b815260040161054590612047565b506000805460ff191660ff92909216919091179055600190565b919050565b600054610100900460ff1661108c5760405162461bcd60e51b815260040161054590612095565b61077e82826117cc565b61077e8282610ed0565b816001600160a01b0316836001600160a01b0316036111015760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610545565b6001600160a01b038381166000818152606a6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61117833836114d6565b6111945760405162461bcd60e51b815260040161054590611ff6565b610af48484848461181a565b60006111ab82610dad565b90506111b8600083610e24565b6001600160a01b03811660009081526068602052604081208054600192906111e19084906120e0565b909155505060008281526067602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b0382166112915760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610545565b6000818152606760205260409020546001600160a01b0316156112f65760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610545565b6001600160a01b038216600090815260686020526040812080546001929061131f908490611f0c565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060816000036113a45750506040805180820190915260018152600360fc1b602082015290565b8160005b81156113ce57806113b8816120f7565b91506113c79050600a83612126565b91506113a8565b60008167ffffffffffffffff8111156113e9576113e9611d6b565b6040519080825280601f01601f191660200182016040528015611413576020820181803683370190505b5090505b841561147e576114286001836120e0565b9150611435600a8661213a565b611440906030611f0c565b60f81b8183815181106114555761145561214e565b60200101906001600160f81b031916908160001a905350611477600a86612126565b9450611417565b949350505050565b60006001600160e01b031982166380ac58cd60e01b14806114b757506001600160e01b03198216635b5e139f60e01b145b8061043857506301ffc9a760e01b6001600160e01b0319831614610438565b6000818152606760205260408120546001600160a01b031661154f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610545565b600061155a83610dad565b9050806001600160a01b0316846001600160a01b031614806115a157506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff165b8061147e5750836001600160a01b03166115ba846104d0565b6001600160a01b031614949350505050565b826001600160a01b03166115df82610dad565b6001600160a01b0316146116435760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610545565b6001600160a01b0382166116a55760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610545565b6116b0600082610e24565b6001600160a01b03831660009081526068602052604081208054600192906116d99084906120e0565b90915550506001600160a01b0382166000908152606860205260408120805460019290611707908490611f0c565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6117728282610a4e565b61077e5761178a816001600160a01b0316601461184d565b61179583602061184d565b6040516020016117a6929190612164565b60408051601f198184030181529082905262461bcd60e51b825261054591600401611c15565b600054610100900460ff166117f35760405162461bcd60e51b815260040161054590612095565b8151611806906065906020850190611af1565b50805161067a906066906020840190611af1565b6118258484846115cc565b611831848484846119f0565b610af45760405162461bcd60e51b8152600401610545906121d9565b6060600061185c83600261222b565b611867906002611f0c565b67ffffffffffffffff81111561187f5761187f611d6b565b6040519080825280601f01601f1916602001820160405280156118a9576020820181803683370190505b509050600360fc1b816000815181106118c4576118c461214e565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106118f3576118f361214e565b60200101906001600160f81b031916908160001a905350600061191784600261222b565b611922906001611f0c565b90505b600181111561199a576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106119565761195661214e565b1a60f81b82828151811061196c5761196c61214e565b60200101906001600160f81b031916908160001a90535060049490941c936119938161224a565b9050611925565b5083156119e95760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610545565b9392505050565b60006001600160a01b0384163b15611ae657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611a34903390899088908890600401612261565b6020604051808303816000875af1925050508015611a6f575060408051601f3d908101601f19168201909252611a6c9181019061229e565b60015b611acc573d808015611a9d576040519150601f19603f3d011682016040523d82523d6000602084013e611aa2565b606091505b508051600003611ac45760405162461bcd60e51b8152600401610545906121d9565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061147e565b506001949350505050565b828054611afd90611ebc565b90600052602060002090601f016020900481019282611b1f5760008555611b65565b82601f10611b3857805160ff1916838001178555611b65565b82800160010185558215611b65579182015b82811115611b65578251825591602001919060010190611b4a565b50611b71929150611b75565b5090565b5b80821115611b715760008155600101611b76565b6001600160e01b031981168114610ecd57600080fd5b600060208284031215611bb257600080fd5b81356119e981611b8a565b60005b83811015611bd8578181015183820152602001611bc0565b83811115610af45750506000910152565b60008151808452611c01816020860160208601611bbd565b601f01601f19169290920160200192915050565b6020815260006119e96020830184611be9565b600060208284031215611c3a57600080fd5b5035919050565b80356001600160a01b038116811461106057600080fd5b60008060408385031215611c6b57600080fd5b611c7483611c41565b946020939093013593505050565b600080600060608486031215611c9757600080fd5b611ca084611c41565b9250611cae60208501611c41565b9150604084013590509250925092565b60008060408385031215611cd157600080fd5b82359150611ce160208401611c41565b90509250929050565b600060208284031215611cfc57600080fd5b6119e982611c41565b60008060408385031215611d1857600080fd5b611d2183611c41565b9150611ce160208401611c41565b60008060408385031215611d4257600080fd5b611d4b83611c41565b915060208301358015158114611d6057600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611d9c57611d9c611d6b565b604051601f8501601f19908116603f01168101908282118183101715611dc457611dc4611d6b565b81604052809350858152868686011115611ddd57600080fd5b858560208301376000602087830101525050509392505050565b60008060008060808587031215611e0d57600080fd5b611e1685611c41565b9350611e2460208601611c41565b925060408501359150606085013567ffffffffffffffff811115611e4757600080fd5b8501601f81018713611e5857600080fd5b611e6787823560208401611d81565b91505092959194509250565b600060208284031215611e8557600080fd5b813567ffffffffffffffff811115611e9c57600080fd5b8201601f81018413611ead57600080fd5b61147e84823560208401611d81565b600181811c90821680611ed057607f821691505b602082108103611ef057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115611f1f57611f1f611ef6565b500190565b60008151611f36818560208601611bbd565b9290920192915050565b600080845481600182811c915080831680611f5c57607f831692505b60208084108203611f7b57634e487b7160e01b86526022600452602486fd5b818015611f8f5760018114611fa057611fcd565b60ff19861689528489019650611fcd565b60008b81526020902060005b86811015611fc55781548b820152908501908301611fac565b505084890196505b505050505050611fed611fe782602f60f81b815260010190565b85611f24565b95945050505050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000828210156120f2576120f2611ef6565b500390565b60006001820161210957612109611ef6565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008261213557612135612110565b500490565b60008261214957612149612110565b500690565b634e487b7160e01b600052603260045260246000fd5b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161219c816017850160208801611bbd565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516121cd816028840160208801611bbd565b01602801949350505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600081600019048311821515161561224557612245611ef6565b500290565b60008161225957612259611ef6565b506000190190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061229490830184611be9565b9695505050505050565b6000602082840312156122b057600080fd5b81516119e981611b8a56fe241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0868747470733a2f2f646973706c61792e6469642e69642f6572633732312f64617461a2646970667358221220228a774e808b4528713e937cb0a9b9de927f380a3e0e41decd8a48a9fb5b5e7664736f6c634300080e0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101a95760003560e01c806370a08231116100f9578063c1a287e211610097578063c87b56dd11610071578063c87b56dd146103b6578063d547741f146103c9578063e985e9c5146103dc578063ec87621c1461041857600080fd5b8063c1a287e214610386578063c6c3bbe614610390578063c7c3268b146103a357600080fd5b8063a217fddf116100d3578063a217fddf14610345578063a22cb4651461034d578063b88d4fde14610360578063baca00041461037357600080fd5b806370a082311461031757806391d148541461032a57806395d89b411461033d57600080fd5b80632f2ff15d11610166578063409209861161014057806340920986146102b557806342842e0e146102de578063485cc955146102f15780636352211e1461030457600080fd5b80632f2ff15d1461026f57806336568abe146102825780633dca885d1461029557600080fd5b806301ffc9a7146101ae57806306fdde03146101d6578063081812fc146101eb578063095ea7b31461021657806323b872dd1461022b578063248a9ca31461023e575b600080fd5b6101c16101bc366004611ba0565b61042d565b60405190151581526020015b60405180910390f35b6101de61043e565b6040516101cd9190611c15565b6101fe6101f9366004611c28565b6104d0565b6040516001600160a01b0390911681526020016101cd565b610229610224366004611c58565b61056a565b005b610229610239366004611c82565b61067f565b61026161024c366004611c28565b60009081526097602052604090206001015490565b6040519081526020016101cd565b61022961027d366004611cbe565b6106df565b610229610290366004611cbe565b610704565b6102616102a3366004611c28565b600090815260c9602052604090205490565b6102616102c3366004611cea565b6001600160a01b0316600090815260c9602052604090205490565b6102296102ec366004611c82565b610782565b6102296102ff366004611d05565b6107e2565b6101fe610312366004611c28565b61090e565b610261610325366004611cea565b6109c7565b6101c1610338366004611cbe565b610a4e565b6101de610a79565b610261600081565b61022961035b366004611d2f565b610a88565b61022961036e366004611df7565b610a93565b610229610381366004611cea565b610afa565b6102616276a70081565b61022961039e366004611c82565b610c35565b6102296103b1366004611e73565b610d01565b6101de6103c4366004611c28565b610d2c565b6102296103d7366004611cbe565b610d63565b6101c16103ea366004611d05565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b6102616000805160206122bc83398151915281565b600061043882610d88565b92915050565b60606065805461044d90611ebc565b80601f016020809104026020016040519081016040528092919081815260200182805461047990611ebc565b80156104c65780601f1061049b576101008083540402835291602001916104c6565b820191906000526020600020905b8154815290600101906020018083116104a957829003601f168201915b5050505050905090565b6000818152606760205260408120546001600160a01b031661054e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152606960205260409020546001600160a01b031690565b600061057582610dad565b9050806001600160a01b0316836001600160a01b0316036105e25760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610545565b336001600160a01b03821614806105fe57506105fe81336103ea565b6106705760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610545565b61067a8383610e24565b505050565b4260c96000838152602001908152602001600020541160405180604001604052806007815260200166195e1c1a5c995960ca1b815250906106d35760405162461bcd60e51b81526004016105459190611c15565b5061067a838383610e92565b6000828152609760205260409020600101546106fa81610ec3565b61067a8383610ed0565b6001600160a01b03811633146107745760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610545565b61077e8282610f56565b5050565b4260c96000838152602001908152602001600020541160405180604001604052806007815260200166195e1c1a5c995960ca1b815250906107d65760405162461bcd60e51b81526004016105459190611c15565b5061067a838383610fbd565b60006107ee6001610fd8565b90508015610806576000805461ff0019166101001790555b61085b60405180604001604052806015815260200174646f746269743a2057656233204964656e7469747960581b815250604051806040016040528060068152602001651113d510925560d21b815250611065565b6040518060600160405280602281526020016122dc6022913980516108889160ca91602090910190611af1565b50610894600084611096565b6108ac6000805160206122bc83398151915284611096565b6108c46000805160206122bc83398151915283611096565b801561067a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b600081815260c96020908152604080832054815180830190925260098252681b9bdd08195e1a5cdd60ba1b928201929092529061095e5760405162461bcd60e51b81526004016105459190611c15565b50600082815260c96020526040902054429061097e906276a70090611f0c565b1160405180604001604052806007815260200166195e1c1a5c995960ca1b815250906109bd5760405162461bcd60e51b81526004016105459190611c15565b5061043882610dad565b60006001600160a01b038216610a325760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610545565b506001600160a01b031660009081526068602052604090205490565b60009182526097602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606066805461044d90611ebc565b61077e3383836110a0565b4260c96000848152602001908152602001600020541160405180604001604052806007815260200166195e1c1a5c995960ca1b81525090610ae75760405162461bcd60e51b81526004016105459190611c15565b50610af48484848461116e565b50505050565b6001600160a01b038116610b25816000908152606760205260409020546001600160a01b0316151590565b610b2e57600080fd5b600081815260c960205260409020544290610b4d906276a70090611f0c565b1160405180604001604052806007815260200166195e1c1a5c995960ca1b81525090610b8c5760405162461bcd60e51b81526004016105459190611c15565b506000610b9882610dad565b60408051808201909152600a81526937b7363c9037bbb732b960b11b60208201529091506001600160a01b0382163314610be55760405162461bcd60e51b81526004016105459190611c15565b50610bef826111a0565b600082815260c96020526040808220829055516001600160a01b038516917fa3d7775bd5f9cdedbb729ccb32f865235da08da2a0fba8eade799a56b4463aca91a2505050565b6000805160206122bc833981519152610c4d81610ec3565b6001600160a01b038316600081815260c960205260409020544290610c76906276a70090611f0c565b1115604051806040016040528060098152602001681d5b995e1c1a5c995960ba1b81525090610cb85760405162461bcd60e51b81526004016105459190611c15565b506000818152606760205260409020546001600160a01b031615610cdf57610cdf816111a0565b600081815260c960205260409020839055610cfa858261123b565b5050505050565b6000805160206122bc833981519152610d1981610ec3565b815161067a9060ca906020850190611af1565b6060600060ca610d3b8461137d565b604051602001610d4c929190611f40565b60408051601f198184030181529190529392505050565b600082815260976020526040902060010154610d7e81610ec3565b61067a8383610f56565b60006001600160e01b03198216637965db0b60e01b1480610438575061043882611486565b6000818152606760205260408120546001600160a01b0316806104385760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610545565b600081815260696020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610e5982610dad565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610e9c33826114d6565b610eb85760405162461bcd60e51b815260040161054590611ff6565b61067a8383836115cc565b610ecd8133611768565b50565b610eda8282610a4e565b61077e5760008281526097602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610f123390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610f608282610a4e565b1561077e5760008281526097602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b61067a83838360405180602001604052806000815250610a93565b60008054610100900460ff161561101f578160ff166001148015610ffb5750303b155b6110175760405162461bcd60e51b815260040161054590612047565b506000919050565b60005460ff8084169116106110465760405162461bcd60e51b815260040161054590612047565b506000805460ff191660ff92909216919091179055600190565b919050565b600054610100900460ff1661108c5760405162461bcd60e51b815260040161054590612095565b61077e82826117cc565b61077e8282610ed0565b816001600160a01b0316836001600160a01b0316036111015760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610545565b6001600160a01b038381166000818152606a6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61117833836114d6565b6111945760405162461bcd60e51b815260040161054590611ff6565b610af48484848461181a565b60006111ab82610dad565b90506111b8600083610e24565b6001600160a01b03811660009081526068602052604081208054600192906111e19084906120e0565b909155505060008281526067602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b0382166112915760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610545565b6000818152606760205260409020546001600160a01b0316156112f65760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610545565b6001600160a01b038216600090815260686020526040812080546001929061131f908490611f0c565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060816000036113a45750506040805180820190915260018152600360fc1b602082015290565b8160005b81156113ce57806113b8816120f7565b91506113c79050600a83612126565b91506113a8565b60008167ffffffffffffffff8111156113e9576113e9611d6b565b6040519080825280601f01601f191660200182016040528015611413576020820181803683370190505b5090505b841561147e576114286001836120e0565b9150611435600a8661213a565b611440906030611f0c565b60f81b8183815181106114555761145561214e565b60200101906001600160f81b031916908160001a905350611477600a86612126565b9450611417565b949350505050565b60006001600160e01b031982166380ac58cd60e01b14806114b757506001600160e01b03198216635b5e139f60e01b145b8061043857506301ffc9a760e01b6001600160e01b0319831614610438565b6000818152606760205260408120546001600160a01b031661154f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610545565b600061155a83610dad565b9050806001600160a01b0316846001600160a01b031614806115a157506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff165b8061147e5750836001600160a01b03166115ba846104d0565b6001600160a01b031614949350505050565b826001600160a01b03166115df82610dad565b6001600160a01b0316146116435760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610545565b6001600160a01b0382166116a55760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610545565b6116b0600082610e24565b6001600160a01b03831660009081526068602052604081208054600192906116d99084906120e0565b90915550506001600160a01b0382166000908152606860205260408120805460019290611707908490611f0c565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6117728282610a4e565b61077e5761178a816001600160a01b0316601461184d565b61179583602061184d565b6040516020016117a6929190612164565b60408051601f198184030181529082905262461bcd60e51b825261054591600401611c15565b600054610100900460ff166117f35760405162461bcd60e51b815260040161054590612095565b8151611806906065906020850190611af1565b50805161067a906066906020840190611af1565b6118258484846115cc565b611831848484846119f0565b610af45760405162461bcd60e51b8152600401610545906121d9565b6060600061185c83600261222b565b611867906002611f0c565b67ffffffffffffffff81111561187f5761187f611d6b565b6040519080825280601f01601f1916602001820160405280156118a9576020820181803683370190505b509050600360fc1b816000815181106118c4576118c461214e565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106118f3576118f361214e565b60200101906001600160f81b031916908160001a905350600061191784600261222b565b611922906001611f0c565b90505b600181111561199a576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106119565761195661214e565b1a60f81b82828151811061196c5761196c61214e565b60200101906001600160f81b031916908160001a90535060049490941c936119938161224a565b9050611925565b5083156119e95760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610545565b9392505050565b60006001600160a01b0384163b15611ae657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611a34903390899088908890600401612261565b6020604051808303816000875af1925050508015611a6f575060408051601f3d908101601f19168201909252611a6c9181019061229e565b60015b611acc573d808015611a9d576040519150601f19603f3d011682016040523d82523d6000602084013e611aa2565b606091505b508051600003611ac45760405162461bcd60e51b8152600401610545906121d9565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061147e565b506001949350505050565b828054611afd90611ebc565b90600052602060002090601f016020900481019282611b1f5760008555611b65565b82601f10611b3857805160ff1916838001178555611b65565b82800160010185558215611b65579182015b82811115611b65578251825591602001919060010190611b4a565b50611b71929150611b75565b5090565b5b80821115611b715760008155600101611b76565b6001600160e01b031981168114610ecd57600080fd5b600060208284031215611bb257600080fd5b81356119e981611b8a565b60005b83811015611bd8578181015183820152602001611bc0565b83811115610af45750506000910152565b60008151808452611c01816020860160208601611bbd565b601f01601f19169290920160200192915050565b6020815260006119e96020830184611be9565b600060208284031215611c3a57600080fd5b5035919050565b80356001600160a01b038116811461106057600080fd5b60008060408385031215611c6b57600080fd5b611c7483611c41565b946020939093013593505050565b600080600060608486031215611c9757600080fd5b611ca084611c41565b9250611cae60208501611c41565b9150604084013590509250925092565b60008060408385031215611cd157600080fd5b82359150611ce160208401611c41565b90509250929050565b600060208284031215611cfc57600080fd5b6119e982611c41565b60008060408385031215611d1857600080fd5b611d2183611c41565b9150611ce160208401611c41565b60008060408385031215611d4257600080fd5b611d4b83611c41565b915060208301358015158114611d6057600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611d9c57611d9c611d6b565b604051601f8501601f19908116603f01168101908282118183101715611dc457611dc4611d6b565b81604052809350858152868686011115611ddd57600080fd5b858560208301376000602087830101525050509392505050565b60008060008060808587031215611e0d57600080fd5b611e1685611c41565b9350611e2460208601611c41565b925060408501359150606085013567ffffffffffffffff811115611e4757600080fd5b8501601f81018713611e5857600080fd5b611e6787823560208401611d81565b91505092959194509250565b600060208284031215611e8557600080fd5b813567ffffffffffffffff811115611e9c57600080fd5b8201601f81018413611ead57600080fd5b61147e84823560208401611d81565b600181811c90821680611ed057607f821691505b602082108103611ef057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008219821115611f1f57611f1f611ef6565b500190565b60008151611f36818560208601611bbd565b9290920192915050565b600080845481600182811c915080831680611f5c57607f831692505b60208084108203611f7b57634e487b7160e01b86526022600452602486fd5b818015611f8f5760018114611fa057611fcd565b60ff19861689528489019650611fcd565b60008b81526020902060005b86811015611fc55781548b820152908501908301611fac565b505084890196505b505050505050611fed611fe782602f60f81b815260010190565b85611f24565b95945050505050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000828210156120f2576120f2611ef6565b500390565b60006001820161210957612109611ef6565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008261213557612135612110565b500490565b60008261214957612149612110565b500690565b634e487b7160e01b600052603260045260246000fd5b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161219c816017850160208801611bbd565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516121cd816028840160208801611bbd565b01602801949350505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600081600019048311821515161561224557612245611ef6565b500290565b60008161225957612259611ef6565b506000190190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061229490830184611be9565b9695505050505050565b6000602082840312156122b057600080fd5b81516119e981611b8a56fe241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0868747470733a2f2f646973706c61792e6469642e69642f6572633732312f64617461a2646970667358221220228a774e808b4528713e937cb0a9b9de927f380a3e0e41decd8a48a9fb5b5e7664736f6c634300080e0033
Deployed Bytecode Sourcemap
53670:3668:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57143:190;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;57143:190:0;;;;;;;;41053:100;;;:::i;:::-;;;;;;;:::i;42624:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1714:32:1;;;1696:51;;1684:2;1669:18;42624:221:0;1550:203:1;42136:422:0;;;;;;:::i;:::-;;:::i;:::-;;54841:207;;;;;;:::i;:::-;;:::i;28698:131::-;;;;;;:::i;:::-;28772:7;28799:12;;;:6;:12;;;;;:22;;;;28698:131;;;;2859:25:1;;;2847:2;2832:18;28698:131:0;2713:177:1;29091:147:0;;;;;;:::i;:::-;;:::i;30139:218::-;;;;;;:::i;:::-;;:::i;55914:111::-;;;;;;:::i;:::-;55974:7;56001:16;;;:7;:16;;;;;;;55914:111;56033:163;;;;;;:::i;:::-;-1:-1:-1;;;;;56132:22:0;56094:7;56172:16;;;:7;:16;;;;;;;56033:163;55056:215;;;;;;:::i;:::-;;:::i;54232:332::-;;;;;;:::i;:::-;;:::i;54572:261::-;;;;;;:::i;:::-;;:::i;40477:208::-;;;;;;:::i;:::-;;:::i;27136:147::-;;;;;;:::i;:::-;;:::i;41222:104::-;;;:::i;26230:49::-;;26275:4;26230:49;;42917:155;;;;;;:::i;:::-;;:::i;55279:242::-;;;;;;:::i;:::-;;:::i;56589:424::-;;;;;;:::i;:::-;;:::i;54180:43::-;;54216:7;54180:43;;56204:377;;;;;;:::i;:::-;;:::i;57021:114::-;;;;;;:::i;:::-;;:::i;55531:375::-;;;;;;:::i;:::-;;:::i;29483:149::-;;;;;;:::i;:::-;;:::i;43143:164::-;;;;;;:::i;:::-;-1:-1:-1;;;;;43264:25:0;;;43240:4;43264:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;43143:164;54029:64;;-1:-1:-1;;;;;;;;;;;54029:64:0;;57143:190;57265:4;57289:36;57313:11;57289:23;:36::i;:::-;57282:43;57143:190;-1:-1:-1;;57143:190:0:o;41053:100::-;41107:13;41140:5;41133:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41053:100;:::o;42624:221::-;42700:7;45967:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45967:16:0;42720:73;;;;-1:-1:-1;;;42720:73:0;;6625:2:1;42720:73:0;;;6607:21:1;6664:2;6644:18;;;6637:30;6703:34;6683:18;;;6676:62;-1:-1:-1;;;6754:18:1;;;6747:42;6806:19;;42720:73:0;;;;;;;;;-1:-1:-1;42813:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;42813:24:0;;42624:221::o;42136:422::-;42217:13;42233:34;42259:7;42233:25;:34::i;:::-;42217:50;;42292:5;-1:-1:-1;;;;;42286:11:0;:2;-1:-1:-1;;;;;42286:11:0;;42278:57;;;;-1:-1:-1;;;42278:57:0;;7038:2:1;42278:57:0;;;7020:21:1;7077:2;7057:18;;;7050:30;7116:34;7096:18;;;7089:62;-1:-1:-1;;;7167:18:1;;;7160:31;7208:19;;42278:57:0;6836:397:1;42278:57:0;19999:10;-1:-1:-1;;;;;42370:21:0;;;;:62;;-1:-1:-1;42395:37:0;42412:5;19999:10;43143:164;:::i;42395:37::-;42348:168;;;;-1:-1:-1;;;42348:168:0;;7440:2:1;42348:168:0;;;7422:21:1;7479:2;7459:18;;;7452:30;7518:34;7498:18;;;7491:62;7589:26;7569:18;;;7562:54;7633:19;;42348:168:0;7238:420:1;42348:168:0;42529:21;42538:2;42542:7;42529:8;:21::i;:::-;42206:352;42136:422;;:::o;54841:207::-;54962:15;54943:7;:16;54951:7;54943:16;;;;;;;;;;;;:34;54979:12;;;;;;;;;;;;;-1:-1:-1;;;54979:12:0;;;54935:57;;;;;-1:-1:-1;;;54935:57:0;;;;;;;;:::i;:::-;;55003:37;55022:4;55028:2;55032:7;55003:18;:37::i;29091:147::-;28772:7;28799:12;;;:6;:12;;;;;:22;;;26721:16;26732:4;26721:10;:16::i;:::-;29205:25:::1;29216:4;29222:7;29205:10;:25::i;30139:218::-:0;-1:-1:-1;;;;;30235:23:0;;19999:10;30235:23;30227:83;;;;-1:-1:-1;;;30227:83:0;;7865:2:1;30227:83:0;;;7847:21:1;7904:2;7884:18;;;7877:30;7943:34;7923:18;;;7916:62;-1:-1:-1;;;7994:18:1;;;7987:45;8049:19;;30227:83:0;7663:411:1;30227:83:0;30323:26;30335:4;30341:7;30323:11;:26::i;:::-;30139:218;;:::o;55056:215::-;55181:15;55162:7;:16;55170:7;55162:16;;;;;;;;;;;;:34;55198:12;;;;;;;;;;;;;-1:-1:-1;;;55198:12:0;;;55154:57;;;;;-1:-1:-1;;;55154:57:0;;;;;;;;:::i;:::-;;55222:41;55245:4;55251:2;55255:7;55222:22;:41::i;54232:332::-;15983:19;16005:25;16028:1;16005:22;:25::i;:::-;15983:47;;16045:14;16041:67;;;16076:13;:20;;-1:-1:-1;;16076:20:0;;;;;16041:67;54316:48:::1;;;;;;;;;;;;;;-1:-1:-1::0;;;54316:48:0::1;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;54316:48:0::1;;::::0;:13:::1;:48::i;:::-;54375:47;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;:8:::1;::::0;:47:::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;54433:37:0::1;26275:4;54464:5:::0;54433:10:::1;:37::i;:::-;54481:31;-1:-1:-1::0;;;;;;;;;;;54506:5:0::1;54481:10;:31::i;:::-;54523:33;-1:-1:-1::0;;;;;;;;;;;54548:7:0::1;54523:10;:33::i;:::-;16134:14:::0;16130:102;;;16181:5;16165:21;;-1:-1:-1;;16165:21:0;;;16206:14;;-1:-1:-1;8231:36:1;;16206:14:0;;8219:2:1;8204:18;16206:14:0;;;;;;;15972:267;54232:332;;:::o;54572:261::-;54636:7;54664:16;;;:7;:16;;;;;;;;;54687:14;;;;;;;;;;;-1:-1:-1;;;54687:14:0;;;;;;;;54656:46;;;;-1:-1:-1;;;54656:46:0;;;;;;;;:::i;:::-;-1:-1:-1;54721:16:0;;;;:7;:16;;;;;;54755:15;;54721:31;;54216:7;;54721:31;:::i;:::-;:49;54772:12;;;;;;;;;;;;;-1:-1:-1;;;54772:12:0;;;54713:72;;;;;-1:-1:-1;;;54713:72:0;;;;;;;;:::i;:::-;;54803:22;54817:7;54803:13;:22::i;40477:208::-;40549:7;-1:-1:-1;;;;;40577:19:0;;40569:74;;;;-1:-1:-1;;;40569:74:0;;8745:2:1;40569:74:0;;;8727:21:1;8784:2;8764:18;;;8757:30;8823:34;8803:18;;;8796:62;-1:-1:-1;;;8874:18:1;;;8867:40;8924:19;;40569:74:0;8543:406:1;40569:74:0;-1:-1:-1;;;;;;40661:16:0;;;;;:9;:16;;;;;;;40477:208::o;27136:147::-;27222:4;27246:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;27246:29:0;;;;;;;;;;;;;;;27136:147::o;41222:104::-;41278:13;41311:7;41304:14;;;;;:::i;42917:155::-;43012:52;19999:10;43045:8;43055;43012:18;:52::i;55279:242::-;55424:15;55405:7;:16;55413:7;55405:16;;;;;;;;;;;;:34;55441:12;;;;;;;;;;;;;-1:-1:-1;;;55441:12:0;;;55397:57;;;;;-1:-1:-1;;;55397:57:0;;;;;;;;:::i;:::-;;55465:48;55488:4;55494:2;55498:7;55507:5;55465:22;:48::i;:::-;55279:242;;;;:::o;56589:424::-;-1:-1:-1;;;;;56658:22:0;;56699:16;56658:22;45943:4;45967:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45967:16:0;:30;;;45878:127;56699:16;56691:25;;;;;;56735:16;;;;:7;:16;;;;;;56769:15;;56735:31;;54216:7;;56735:31;:::i;:::-;:49;56786:12;;;;;;;;;;;;;-1:-1:-1;;;56786:12:0;;;56727:72;;;;;-1:-1:-1;;;56727:72:0;;;;;;;;:::i;:::-;;56810:13;56826:34;56852:7;56826:25;:34::i;:::-;56900:15;;;;;;;;;;;;-1:-1:-1;;;56900:15:0;;;;56810:50;;-1:-1:-1;;;;;;56879:19:0;;56888:10;56879:19;56871:45;;;;-1:-1:-1;;;56871:45:0;;;;;;;;:::i;:::-;;56927:14;56933:7;56927:5;:14::i;:::-;56971:1;56952:16;;;:7;:16;;;;;;:20;;;56988:17;-1:-1:-1;;;;;56988:17:0;;;;;;56629:384;;56589:424;:::o;56204:377::-;-1:-1:-1;;;;;;;;;;;26721:16:0;26732:4;26721:10;:16::i;:::-;-1:-1:-1;;;;;56323:22:0;::::1;56305:15;56364:16:::0;;;:7:::1;:16;::::0;;;;;56399:15:::1;::::0;56364:31:::1;::::0;54216:7:::1;::::0;56364:31:::1;:::i;:::-;:50;;56416:16;;;;;;;;;;;;;-1:-1:-1::0;;;56416:16:0::1;;::::0;56356:77:::1;;;;;-1:-1:-1::0;;;56356:77:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;45943:4:0;45967:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45967:16:0;:30;56444:63:::1;;56481:14;56487:7;56481:5;:14::i;:::-;56517:16;::::0;;;:7:::1;:16;::::0;;;;:27;;;56555:18:::1;56561:2:::0;56525:7;56555:5:::1;:18::i;:::-;56294:287;56204:377:::0;;;;:::o;57021:114::-;-1:-1:-1;;;;;;;;;;;26721:16:0;26732:4;26721:10;:16::i;:::-;57108:19;;::::1;::::0;:8:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;55531:375::-:0;55596:13;55622:20;55669:8;55684:36;55712:7;55684:27;:36::i;:::-;55652:69;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;55652:69:0;;;;;;;;;;55531:375;-1:-1:-1;;;55531:375:0:o;29483:149::-;28772:7;28799:12;;;:6;:12;;;;;:22;;;26721:16;26732:4;26721:10;:16::i;:::-;29598:26:::1;29610:4;29616:7;29598:11;:26::i;26829:215::-:0;26914:4;-1:-1:-1;;;;;;26938:58:0;;-1:-1:-1;;;26938:58:0;;:98;;;27000:36;27024:11;27000:23;:36::i;40747:239::-;40819:7;40855:16;;;:7;:16;;;;;;-1:-1:-1;;;;;40855:16:0;;40882:73;;;;-1:-1:-1;;;40882:73:0;;10902:2:1;40882:73:0;;;10884:21:1;10941:2;10921:18;;;10914:30;10980:34;10960:18;;;10953:62;-1:-1:-1;;;11031:18:1;;;11024:39;11080:19;;40882:73:0;10700:405:1;50057:185:0;50132:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;50132:29:0;-1:-1:-1;;;;;50132:29:0;;;;;;;;:24;;50186:34;50132:24;50186:25;:34::i;:::-;-1:-1:-1;;;;;50177:57:0;;;;;;;;;;;50057:185;;:::o;43374:339::-;43569:41;19999:10;43602:7;43569:18;:41::i;:::-;43561:103;;;;-1:-1:-1;;;43561:103:0;;;;;;;:::i;:::-;43677:28;43687:4;43693:2;43697:7;43677:9;:28::i;27587:105::-;27654:30;27665:4;19999:10;27654;:30::i;:::-;27587:105;:::o;31640:238::-;31724:22;31732:4;31738:7;31724;:22::i;:::-;31719:152;;31763:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;31763:29:0;;;;;;;;;:36;;-1:-1:-1;;31763:36:0;31795:4;31763:36;;;31846:12;19999:10;;19919:98;31846:12;-1:-1:-1;;;;;31819:40:0;31837:7;-1:-1:-1;;;;;31819:40:0;31831:4;31819:40;;;;;;;;;;31640:238;;:::o;32010:239::-;32094:22;32102:4;32108:7;32094;:22::i;:::-;32090:152;;;32165:5;32133:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;32133:29:0;;;;;;;;;;:37;;-1:-1:-1;;32133:37:0;;;32190:40;19999:10;;32133:12;;32190:40;;32165:5;32190:40;32010:239;;:::o;43784:185::-;43922:39;43939:4;43945:2;43949:7;43922:39;;;;;;;;;;;;:16;:39::i;18213:823::-;18277:4;18614:13;;;;;;;18610:419;;;18670:7;:12;;18681:1;18670:12;:61;;;;-1:-1:-1;18725:4:0;6795:19;:23;18670:61;18644:169;;;;-1:-1:-1;;;18644:169:0;;;;;;;:::i;:::-;-1:-1:-1;18835:5:0;;18213:823;-1:-1:-1;18213:823:0:o;18610:419::-;18881:12;;:22;;;;:12;;:22;18873:81;;;;-1:-1:-1;;;18873:81:0;;;;;;;:::i;:::-;-1:-1:-1;18969:12:0;:22;;-1:-1:-1;;18969:22:0;;;;;;;;;;;;-1:-1:-1;;18213:823:0:o;18610:419::-;18213:823;;;:::o;39670:151::-;17610:13;;;;;;;17602:69;;;;-1:-1:-1;;;17602:69:0;;;;;;;:::i;:::-;39774:39:::1;39798:5;39805:7;39774:23;:39::i;31016:112::-:0;31095:25;31106:4;31112:7;31095:10;:25::i;50384:315::-;50539:8;-1:-1:-1;;;;;50530:17:0;:5;-1:-1:-1;;;;;50530:17:0;;50522:55;;;;-1:-1:-1;;;50522:55:0;;12557:2:1;50522:55:0;;;12539:21:1;12596:2;12576:18;;;12569:30;12635:27;12615:18;;;12608:55;12680:18;;50522:55:0;12355:349:1;50522:55:0;-1:-1:-1;;;;;50588:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;50588:46:0;;;;;;;;;;50650:41;;540::1;;;50650::0;;513:18:1;50650:41:0;;;;;;;50384:315;;;:::o;44040:328::-;44215:41;19999:10;44248:7;44215:18;:41::i;:::-;44207:103;;;;-1:-1:-1;;;44207:103:0;;;;;;;:::i;:::-;44321:39;44335:4;44341:2;44345:7;44354:5;44321:13;:39::i;48535:431::-;48595:13;48611:34;48637:7;48611:25;:34::i;:::-;48595:50;;48747:29;48764:1;48768:7;48747:8;:29::i;:::-;-1:-1:-1;;;;;48789:16:0;;;;;;:9;:16;;;;;:21;;48809:1;;48789:16;:21;;48809:1;;48789:21;:::i;:::-;;;;-1:-1:-1;;48828:16:0;;;;:7;:16;;;;;;48821:23;;-1:-1:-1;;;;;;48821:23:0;;;48862:36;48836:7;;48828:16;-1:-1:-1;;;;;48862:36:0;;;;;48828:16;;48862:36;30139:218;;:::o;47867:439::-;-1:-1:-1;;;;;47947:16:0;;47939:61;;;;-1:-1:-1;;;47939:61:0;;13041:2:1;47939:61:0;;;13023:21:1;;;13060:18;;;13053:30;13119:34;13099:18;;;13092:62;13171:18;;47939:61:0;12839:356:1;47939:61:0;45943:4;45967:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45967:16:0;:30;48011:58;;;;-1:-1:-1;;;48011:58:0;;13402:2:1;48011:58:0;;;13384:21:1;13441:2;13421:18;;;13414:30;13480;13460:18;;;13453:58;13528:18;;48011:58:0;13200:352:1;48011:58:0;-1:-1:-1;;;;;48140:13:0;;;;;;:9;:13;;;;;:18;;48157:1;;48140:13;:18;;48157:1;;48140:18;:::i;:::-;;;;-1:-1:-1;;48169:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;48169:21:0;-1:-1:-1;;;;;48169:21:0;;;;;;;;48208:33;;48169:16;;;48208:33;;48169:16;;48208:33;30139:218;;:::o;3474:723::-;3530:13;3751:5;3760:1;3751:10;3747:53;;-1:-1:-1;;3778:10:0;;;;;;;;;;;;-1:-1:-1;;;3778:10:0;;;;;3474:723::o;3747:53::-;3825:5;3810:12;3866:78;3873:9;;3866:78;;3899:8;;;;:::i;:::-;;-1:-1:-1;3922:10:0;;-1:-1:-1;3930:2:0;3922:10;;:::i;:::-;;;3866:78;;;3954:19;3986:6;3976:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3976:17:0;;3954:39;;4004:154;4011:10;;4004:154;;4038:11;4048:1;4038:11;;:::i;:::-;;-1:-1:-1;4107:10:0;4115:2;4107:5;:10;:::i;:::-;4094:24;;:2;:24;:::i;:::-;4081:39;;4064:6;4071;4064:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;4064:56:0;;;;;;;;-1:-1:-1;4135:11:0;4144:2;4135:11;;:::i;:::-;;;4004:154;;;4182:6;3474:723;-1:-1:-1;;;;3474:723:0:o;40064:349::-;40188:4;-1:-1:-1;;;;;;40225:51:0;;-1:-1:-1;;;40225:51:0;;:127;;-1:-1:-1;;;;;;;40293:59:0;;-1:-1:-1;;;40293:59:0;40225:127;:180;;;-1:-1:-1;;;;;;;;;;23648:51:0;;;40369:36;23539:168;46172:359;46265:4;45967:16;;;:7;:16;;;;;;-1:-1:-1;;;;;45967:16:0;46282:73;;;;-1:-1:-1;;;46282:73:0;;14405:2:1;46282:73:0;;;14387:21:1;14444:2;14424:18;;;14417:30;14483:34;14463:18;;;14456:62;-1:-1:-1;;;14534:18:1;;;14527:42;14586:19;;46282:73:0;14203:408:1;46282:73:0;46366:13;46382:34;46408:7;46382:25;:34::i;:::-;46366:50;;46446:5;-1:-1:-1;;;;;46435:16:0;:7;-1:-1:-1;;;;;46435:16:0;;:52;;;-1:-1:-1;;;;;;43264:25:0;;;43240:4;43264:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;46455:32;46435:87;;;;46515:7;-1:-1:-1;;;;;46491:31:0;:20;46503:7;46491:11;:20::i;:::-;-1:-1:-1;;;;;46491:31:0;;46427:96;46172:359;-1:-1:-1;;;;46172:359:0:o;49303:636::-;49473:4;-1:-1:-1;;;;;49435:42:0;:34;49461:7;49435:25;:34::i;:::-;-1:-1:-1;;;;;49435:42:0;;49427:92;;;;-1:-1:-1;;;49427:92:0;;14818:2:1;49427:92:0;;;14800:21:1;14857:2;14837:18;;;14830:30;14896:34;14876:18;;;14869:62;-1:-1:-1;;;14947:18:1;;;14940:35;14992:19;;49427:92:0;14616:401:1;49427:92:0;-1:-1:-1;;;;;49538:16:0;;49530:65;;;;-1:-1:-1;;;49530:65:0;;15224:2:1;49530:65:0;;;15206:21:1;15263:2;15243:18;;;15236:30;15302:34;15282:18;;;15275:62;-1:-1:-1;;;15353:18:1;;;15346:34;15397:19;;49530:65:0;15022:400:1;49530:65:0;49712:29;49729:1;49733:7;49712:8;:29::i;:::-;-1:-1:-1;;;;;49754:15:0;;;;;;:9;:15;;;;;:20;;49773:1;;49754:15;:20;;49773:1;;49754:20;:::i;:::-;;;;-1:-1:-1;;;;;;;49785:13:0;;;;;;:9;:13;;;;;:18;;49802:1;;49785:13;:18;;49802:1;;49785:18;:::i;:::-;;;;-1:-1:-1;;49814:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;49814:21:0;-1:-1:-1;;;;;49814:21:0;;;;;;;;;49853:27;;49814:16;;49853:27;;;;;;;42206:352;42136:422;;:::o;27982:527::-;28071:22;28079:4;28085:7;28071;:22::i;:::-;28066:436;;28259:52;28298:7;-1:-1:-1;;;;;28259:52:0;28308:2;28259:30;:52::i;:::-;28384:49;28423:4;28430:2;28384:30;:49::i;:::-;28164:292;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;28164:292:0;;;;;;;;;;-1:-1:-1;;;28110:380:0;;;;;;;:::i;39829:163::-;17610:13;;;;;;;17602:69;;;;-1:-1:-1;;;17602:69:0;;;;;;;:::i;:::-;39943:13;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;39967:17:0;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;45250:315::-:0;45407:28;45417:4;45423:2;45427:7;45407:9;:28::i;:::-;45454:48;45477:4;45483:2;45487:7;45496:5;45454:22;:48::i;:::-;45446:111;;;;-1:-1:-1;;;45446:111:0;;;;;;;:::i;4775:451::-;4850:13;4876:19;4908:10;4912:6;4908:1;:10;:::i;:::-;:14;;4921:1;4908:14;:::i;:::-;4898:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4898:25:0;;4876:47;;-1:-1:-1;;;4934:6:0;4941:1;4934:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;4934:15:0;;;;;;;;;-1:-1:-1;;;4960:6:0;4967:1;4960:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;4960:15:0;;;;;;;;-1:-1:-1;4991:9:0;5003:10;5007:6;5003:1;:10;:::i;:::-;:14;;5016:1;5003:14;:::i;:::-;4991:26;;4986:135;5023:1;5019;:5;4986:135;;;-1:-1:-1;;;5071:5:0;5079:3;5071:11;5058:25;;;;;;;:::i;:::-;;;;5046:6;5053:1;5046:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;5046:37:0;;;;;;;;-1:-1:-1;5108:1:0;5098:11;;;;;5026:3;;;:::i;:::-;;;4986:135;;;-1:-1:-1;5139:10:0;;5131:55;;;;-1:-1:-1;;;5131:55:0;;17153:2:1;5131:55:0;;;17135:21:1;;;17172:18;;;17165:30;17231:34;17211:18;;;17204:62;17283:18;;5131:55:0;16951:356:1;5131:55:0;5211:6;4775:451;-1:-1:-1;;;4775:451:0:o;51264:821::-;51419:4;-1:-1:-1;;;;;51440:13:0;;6795:19;:23;51436:642;;51476:83;;-1:-1:-1;;;51476:83:0;;-1:-1:-1;;;;;51476:47:0;;;;;:83;;19999:10;;51538:4;;51544:7;;51553:5;;51476:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51476:83:0;;;;;;;;-1:-1:-1;;51476:83:0;;;;;;;;;;;;:::i;:::-;;;51472:551;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51740:6;:13;51757:1;51740:18;51736:272;;51783:60;;-1:-1:-1;;;51783:60:0;;;;;;;:::i;51736:272::-;51958:6;51952:13;51943:6;51939:2;51935:15;51928:38;51472:551;-1:-1:-1;;;;;;51610:62:0;-1:-1:-1;;;51610:62:0;;-1:-1:-1;51603:69:0;;51436:642;-1:-1:-1;52062:4:0;51264:821;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:269::-;908:3;946:5;940:12;973:6;968:3;961:19;989:63;1045:6;1038:4;1033:3;1029:14;1022:4;1015:5;1011:16;989:63;:::i;:::-;1106:2;1085:15;-1:-1:-1;;1081:29:1;1072:39;;;;1113:4;1068:50;;855:269;-1:-1:-1;;855:269:1:o;1129:231::-;1278:2;1267:9;1260:21;1241:4;1298:56;1350:2;1339:9;1335:18;1327:6;1298:56;:::i;1365:180::-;1424:6;1477:2;1465:9;1456:7;1452:23;1448:32;1445:52;;;1493:1;1490;1483:12;1445:52;-1:-1:-1;1516:23:1;;1365:180;-1:-1:-1;1365:180:1:o;1758:173::-;1826:20;;-1:-1:-1;;;;;1875:31:1;;1865:42;;1855:70;;1921:1;1918;1911:12;1936:254;2004:6;2012;2065:2;2053:9;2044:7;2040:23;2036:32;2033:52;;;2081:1;2078;2071:12;2033:52;2104:29;2123:9;2104:29;:::i;:::-;2094:39;2180:2;2165:18;;;;2152:32;;-1:-1:-1;;;1936:254:1:o;2195:328::-;2272:6;2280;2288;2341:2;2329:9;2320:7;2316:23;2312:32;2309:52;;;2357:1;2354;2347:12;2309:52;2380:29;2399:9;2380:29;:::i;:::-;2370:39;;2428:38;2462:2;2451:9;2447:18;2428:38;:::i;:::-;2418:48;;2513:2;2502:9;2498:18;2485:32;2475:42;;2195:328;;;;;:::o;2895:254::-;2963:6;2971;3024:2;3012:9;3003:7;2999:23;2995:32;2992:52;;;3040:1;3037;3030:12;2992:52;3076:9;3063:23;3053:33;;3105:38;3139:2;3128:9;3124:18;3105:38;:::i;:::-;3095:48;;2895:254;;;;;:::o;3336:186::-;3395:6;3448:2;3436:9;3427:7;3423:23;3419:32;3416:52;;;3464:1;3461;3454:12;3416:52;3487:29;3506:9;3487:29;:::i;3527:260::-;3595:6;3603;3656:2;3644:9;3635:7;3631:23;3627:32;3624:52;;;3672:1;3669;3662:12;3624:52;3695:29;3714:9;3695:29;:::i;:::-;3685:39;;3743:38;3777:2;3766:9;3762:18;3743:38;:::i;3792:347::-;3857:6;3865;3918:2;3906:9;3897:7;3893:23;3889:32;3886:52;;;3934:1;3931;3924:12;3886:52;3957:29;3976:9;3957:29;:::i;:::-;3947:39;;4036:2;4025:9;4021:18;4008:32;4083:5;4076:13;4069:21;4062:5;4059:32;4049:60;;4105:1;4102;4095:12;4049:60;4128:5;4118:15;;;3792:347;;;;;:::o;4144:127::-;4205:10;4200:3;4196:20;4193:1;4186:31;4236:4;4233:1;4226:15;4260:4;4257:1;4250:15;4276:631;4340:5;4370:18;4411:2;4403:6;4400:14;4397:40;;;4417:18;;:::i;:::-;4492:2;4486:9;4460:2;4546:15;;-1:-1:-1;;4542:24:1;;;4568:2;4538:33;4534:42;4522:55;;;4592:18;;;4612:22;;;4589:46;4586:72;;;4638:18;;:::i;:::-;4678:10;4674:2;4667:22;4707:6;4698:15;;4737:6;4729;4722:22;4777:3;4768:6;4763:3;4759:16;4756:25;4753:45;;;4794:1;4791;4784:12;4753:45;4844:6;4839:3;4832:4;4824:6;4820:17;4807:44;4899:1;4892:4;4883:6;4875;4871:19;4867:30;4860:41;;;;4276:631;;;;;:::o;4912:666::-;5007:6;5015;5023;5031;5084:3;5072:9;5063:7;5059:23;5055:33;5052:53;;;5101:1;5098;5091:12;5052:53;5124:29;5143:9;5124:29;:::i;:::-;5114:39;;5172:38;5206:2;5195:9;5191:18;5172:38;:::i;:::-;5162:48;;5257:2;5246:9;5242:18;5229:32;5219:42;;5312:2;5301:9;5297:18;5284:32;5339:18;5331:6;5328:30;5325:50;;;5371:1;5368;5361:12;5325:50;5394:22;;5447:4;5439:13;;5435:27;-1:-1:-1;5425:55:1;;5476:1;5473;5466:12;5425:55;5499:73;5564:7;5559:2;5546:16;5541:2;5537;5533:11;5499:73;:::i;:::-;5489:83;;;4912:666;;;;;;;:::o;5583:450::-;5652:6;5705:2;5693:9;5684:7;5680:23;5676:32;5673:52;;;5721:1;5718;5711:12;5673:52;5761:9;5748:23;5794:18;5786:6;5783:30;5780:50;;;5826:1;5823;5816:12;5780:50;5849:22;;5902:4;5894:13;;5890:27;-1:-1:-1;5880:55:1;;5931:1;5928;5921:12;5880:55;5954:73;6019:7;6014:2;6001:16;5996:2;5992;5988:11;5954:73;:::i;6038:380::-;6117:1;6113:12;;;;6160;;;6181:61;;6235:4;6227:6;6223:17;6213:27;;6181:61;6288:2;6280:6;6277:14;6257:18;6254:38;6251:161;;6334:10;6329:3;6325:20;6322:1;6315:31;6369:4;6366:1;6359:15;6397:4;6394:1;6387:15;6251:161;;6038:380;;;:::o;8278:127::-;8339:10;8334:3;8330:20;8327:1;8320:31;8370:4;8367:1;8360:15;8394:4;8391:1;8384:15;8410:128;8450:3;8481:1;8477:6;8474:1;8471:13;8468:39;;;8487:18;;:::i;:::-;-1:-1:-1;8523:9:1;;8410:128::o;9199:185::-;9241:3;9279:5;9273:12;9294:52;9339:6;9334:3;9327:4;9320:5;9316:16;9294:52;:::i;:::-;9362:16;;;;;9199:185;-1:-1:-1;;9199:185:1:o;9389:1306::-;9666:3;9695:1;9728:6;9722:13;9758:3;9780:1;9808:9;9804:2;9800:18;9790:28;;9868:2;9857:9;9853:18;9890;9880:61;;9934:4;9926:6;9922:17;9912:27;;9880:61;9960:2;10008;10000:6;9997:14;9977:18;9974:38;9971:165;;-1:-1:-1;;;10035:33:1;;10091:4;10088:1;10081:15;10121:4;10042:3;10109:17;9971:165;10152:18;10179:104;;;;10297:1;10292:320;;;;10145:467;;10179:104;-1:-1:-1;;10212:24:1;;10200:37;;10257:16;;;;-1:-1:-1;10179:104:1;;10292:320;9027:1;9020:14;;;9064:4;9051:18;;10387:1;10401:165;10415:6;10412:1;10409:13;10401:165;;;10493:14;;10480:11;;;10473:35;10536:16;;;;10430:10;;10401:165;;;10405:3;;10595:6;10590:3;10586:16;10579:23;;10145:467;;;;;;;10628:61;10654:34;10684:3;-1:-1:-1;;;9145:16:1;;9186:1;9177:11;;9080:114;10654:34;10646:6;10628:61;:::i;:::-;10621:68;9389:1306;-1:-1:-1;;;;;9389:1306:1:o;11110:413::-;11312:2;11294:21;;;11351:2;11331:18;;;11324:30;11390:34;11385:2;11370:18;;11363:62;-1:-1:-1;;;11456:2:1;11441:18;;11434:47;11513:3;11498:19;;11110:413::o;11528:410::-;11730:2;11712:21;;;11769:2;11749:18;;;11742:30;11808:34;11803:2;11788:18;;11781:62;-1:-1:-1;;;11874:2:1;11859:18;;11852:44;11928:3;11913:19;;11528:410::o;11943:407::-;12145:2;12127:21;;;12184:2;12164:18;;;12157:30;12223:34;12218:2;12203:18;;12196:62;-1:-1:-1;;;12289:2:1;12274:18;;12267:41;12340:3;12325:19;;11943:407::o;12709:125::-;12749:4;12777:1;12774;12771:8;12768:34;;;12782:18;;:::i;:::-;-1:-1:-1;12819:9:1;;12709:125::o;13557:135::-;13596:3;13617:17;;;13614:43;;13637:18;;:::i;:::-;-1:-1:-1;13684:1:1;13673:13;;13557:135::o;13697:127::-;13758:10;13753:3;13749:20;13746:1;13739:31;13789:4;13786:1;13779:15;13813:4;13810:1;13803:15;13829:120;13869:1;13895;13885:35;;13900:18;;:::i;:::-;-1:-1:-1;13934:9:1;;13829:120::o;13954:112::-;13986:1;14012;14002:35;;14017:18;;:::i;:::-;-1:-1:-1;14051:9:1;;13954:112::o;14071:127::-;14132:10;14127:3;14123:20;14120:1;14113:31;14163:4;14160:1;14153:15;14187:4;14184:1;14177:15;15427:786;15838:25;15833:3;15826:38;15808:3;15893:6;15887:13;15909:62;15964:6;15959:2;15954:3;15950:12;15943:4;15935:6;15931:17;15909:62;:::i;:::-;-1:-1:-1;;;16030:2:1;15990:16;;;16022:11;;;16015:40;16080:13;;16102:63;16080:13;16151:2;16143:11;;16136:4;16124:17;;16102:63;:::i;:::-;16185:17;16204:2;16181:26;;15427:786;-1:-1:-1;;;;15427:786:1:o;16218:414::-;16420:2;16402:21;;;16459:2;16439:18;;;16432:30;16498:34;16493:2;16478:18;;16471:62;-1:-1:-1;;;16564:2:1;16549:18;;16542:48;16622:3;16607:19;;16218:414::o;16637:168::-;16677:7;16743:1;16739;16735:6;16731:14;16728:1;16725:21;16720:1;16713:9;16706:17;16702:45;16699:71;;;16750:18;;:::i;:::-;-1:-1:-1;16790:9:1;;16637:168::o;16810:136::-;16849:3;16877:5;16867:39;;16886:18;;:::i;:::-;-1:-1:-1;;;16922:18:1;;16810:136::o;17312:500::-;-1:-1:-1;;;;;17581:15:1;;;17563:34;;17633:15;;17628:2;17613:18;;17606:43;17680:2;17665:18;;17658:34;;;17728:3;17723:2;17708:18;;17701:31;;;17506:4;;17749:57;;17786:19;;17778:6;17749:57;:::i;:::-;17741:65;17312:500;-1:-1:-1;;;;;;17312:500:1:o;17817:249::-;17886:6;17939:2;17927:9;17918:7;17914:23;17910:32;17907:52;;;17955:1;17952;17945:12;17907:52;17987:9;17981:16;18006:30;18030:5;18006:30;:::i
Swarm Source
ipfs://228a774e808b4528713e937cb0a9b9de927f380a3e0e41decd8a48a9fb5b5e76
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.