// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import '@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol'; import './abstracts/MintableNonFungible.sol'; import './abstracts/Controllable.sol'; /** * @title BlockchainListCurator */ contract BlockchainListCurator is MintableNonFungible, Controllable { using StringsUpgradeable for uint256; string private constant IPFS_FILE_EXTENSION = '.json'; /** * @dev Limit usage by owner only or everyone once minting has started */ modifier mintStartedOrOwner() { require(isStarted() || isAdmin(_msgSender()), 'BlockchainListCurator: minting has not started'); _; } function initialize(string memory name_, string memory symbol_) external initializer { __MintableNonFungible_init(name_, symbol_); __Controllable_init(); } function version() public pure virtual returns (string memory) { return '0.1'; } /** * @dev allow to get version for EIP712 domain dynamically. * */ function _EIP712VersionHash() internal pure virtual returns (bytes32) { return keccak256(bytes(version())); } /** * @dev The hash of the name parameter for the EIP712 domain based on token name. * */ function _EIP712NameHash() internal view virtual returns (bytes32) { return keccak256(bytes(name())); } function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControlEnumerableUpgradeable, ERC721AUpgradeable) returns (bool) { return ERC721AUpgradeable.supportsInterface(interfaceId) || AccessControlUpgradeable.supportsInterface(interfaceId); } /** * @dev Regular mint function * - Minting need to be started * - 1 token costs 0.1 ether * - owner of the contract is except from these rules */ function mint() external payable mintStartedOrOwner { if (!isAdmin(_msgSender())) { require(msg.value >= 0.1 ether, 'BlockchainListCurator: Insufficient funds for minting'); MintableNonFungible._mint(_msgSender(), 1); } else MintableNonFungible._mint(_msgSender(), 1); } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token appended of IPFS_FILE_EXTENSION. * @param tokenId - Token ID */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), 'BlockchainListCurator: TokenId does not exist'); string memory baseURI_ = _baseURI(); return bytes(_baseURI()).length != 0 ? string(abi.encodePacked(baseURI_, _toString(tokenId), IPFS_FILE_EXTENSION)) : ''; } /** * @dev Overridde _baseURI to return the base URI for the token. */ function _baseURI() internal view virtual override(ERC721AUpgradeable) returns (string memory) { return Controllable.baseURI(); } }