// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "@openzeppelin/contracts@4.6.0/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts@4.6.0/token/ERC721/extensions/ERC721Enumerable.sol"; import "@openzeppelin/contracts@4.6.0/token/ERC721/extensions/ERC721URIStorage.sol"; import "@openzeppelin/contracts@4.6.0/security/Pausable.sol"; import "@openzeppelin/contracts@4.6.0/access/Ownable.sol"; import "@openzeppelin/contracts@4.6.0/token/ERC721/extensions/ERC721Burnable.sol"; import "@openzeppelin/contracts@4.6.0/utils/cryptography/draft-EIP712.sol"; import "@openzeppelin/contracts@4.6.0/token/ERC721/extensions/draft-ERC721Votes.sol"; contract MyToken is ERC721, ERC721Enumerable, ERC721URIStorage, Pausable, Ownable, ERC721Burnable, EIP712, ERC721Votes { constructor() ERC721("MyToken", "MTK") EIP712("MyToken", "1") {} function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function safeMint(address to, uint256 tokenId, string memory uri) public onlyOwner { _safeMint(to, tokenId); _setTokenURI(tokenId, uri); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal whenNotPaused override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } // The following functions are overrides required by Solidity. function _afterTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Votes) { super._afterTokenTransfer(from, to, tokenId); } function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }