1// SPDX-License-Identifier: MIT2pragma solidity ^0.8.9;34import "./@openzeppelin/contracts/token/ERC721/ERC721.sol";5import "./@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";6import "./@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";7import "./@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol";8import "./@openzeppelin/contracts/access/Ownable.sol";9import "./@openzeppelin/contracts/utils/Counters.sol";1011contract ZeppelinContract is ERC721, ERC721Enumerable, ERC721URIStorage, ERC721Burnable, Ownable {12 using Counters for Counters.Counter;1314 Counters.Counter private _tokenIdCounter;1516 constructor() ERC721("ZeppelinContract", "UNQ") {}1718 function _baseURI() internal pure override returns (string memory) {19 return "test";20 }2122 function safeMint(address to, string memory uri) public onlyOwner {23 uint256 tokenId = _tokenIdCounter.current();24 _tokenIdCounter.increment();25 _safeMint(to, tokenId);26 _setTokenURI(tokenId, uri);27 }2829 // The following functions are overrides required by Solidity.3031 function _beforeTokenTransfer(address from, address to, uint256 tokenId, uint256 batchSize)32 internal33 override(ERC721, ERC721Enumerable)34 {35 super._beforeTokenTransfer(from, to, tokenId, batchSize);36 }3738 function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {39 super._burn(tokenId);40 }4142 function tokenURI(uint256 tokenId)43 public44 view45 override(ERC721, ERC721URIStorage)46 returns (string memory)47 {48 return super.tokenURI(tokenId);49 }5051 function supportsInterface(bytes4 interfaceId)52 public53 view54 override(ERC721, ERC721Enumerable)55 returns (bool)56 {57 return super.supportsInterface(interfaceId);58 }59}