12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- // SPDX-License-Identifier: MIT
- // OpenZeppelin Contracts v4.4.0-rc.0 (token/ERC721/extensions/ERC721URIStorage.sol)
- pragma solidity ^0.8.0;
- import "../ERC721.sol";
- /**
- * @dev ERC721 token with storage based token URI management.
- */
- abstract contract ERC721URIStorage is ERC721 {
- using Strings for uint256;
- // Optional mapping for token URIs
- mapping(uint256 => string) private _tokenURIs;
- /**
- * @dev See {IERC721Metadata-tokenURI}.
- */
- function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
- require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");
- string memory _tokenURI = _tokenURIs[tokenId];
- string memory base = _baseURI();
- // If there is no base URI, return the token URI.
- if (bytes(base).length == 0) {
- return _tokenURI;
- }
- // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
- if (bytes(_tokenURI).length > 0) {
- return string(abi.encodePacked(base, _tokenURI));
- }
- return super.tokenURI(tokenId);
- }
- /**
- * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
- *
- * Requirements:
- *
- * - `tokenId` must exist.
- */
- function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
- require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
- _tokenURIs[tokenId] = _tokenURI;
- }
- /**
- * @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 override {
- super._burn(tokenId);
- if (bytes(_tokenURIs[tokenId]).length != 0) {
- delete _tokenURIs[tokenId];
- }
- }
- }
|