Created
March 2, 2019 06:43
-
-
Save yuyasugano/e1c7bdb99b22f22e8b8a99d9a8e16878 to your computer and use it in GitHub Desktop.
ERC721 Metadata implementation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.4.23; | |
import "./ERC721.sol"; | |
import "./IERC721Metadata.sol"; | |
import "../../introspection/ERC165.sol"; | |
contract ERC721Metadata is ERC165, ERC721, IERC721Metadata { | |
// Token name | |
string private _name; | |
// Token symbol | |
string private _symbol; | |
// Optional mapping for token URIs | |
mapping(uint256 => string) private _tokenURIs; | |
bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; | |
/* | |
* 0x5b5e139f === | |
* bytes4(keccak256('name()')) ^ | |
* bytes4(keccak256('symbol()')) ^ | |
* bytes4(keccak256('tokenURI(uint256)')) | |
*/ | |
/** | |
* @dev Constructor function | |
*/ | |
constructor (string memory name, string memory symbol) public { | |
_name = name; | |
_symbol = symbol; | |
// register the supported interfaces to conform to ERC721 via ERC165 | |
_registerInterface(_INTERFACE_ID_ERC721_METADATA); | |
} | |
/** | |
* @dev Gets the token name | |
* @return string representing the token name | |
*/ | |
function name() external view returns (string memory) { | |
return _name; | |
} | |
/** | |
* @dev Gets the token symbol | |
* @return string representing the token symbol | |
*/ | |
function symbol() external view returns (string memory) { | |
return _symbol; | |
} | |
/** | |
* @dev Returns an URI for a given token ID | |
* Throws if the token ID does not exist. May return an empty string. | |
* @param tokenId uint256 ID of the token to query | |
*/ | |
function tokenURI(uint256 tokenId) external view returns (string memory) { | |
require(_exists(tokenId)); | |
return _tokenURIs[tokenId]; | |
} | |
/** | |
* @dev Internal function to set the token URI for a given token | |
* Reverts if the token ID does not exist | |
* @param tokenId uint256 ID of the token to set its URI | |
* @param uri string URI to assign | |
*/ | |
function _setTokenURI(uint256 tokenId, string memory uri) internal { | |
require(_exists(tokenId)); | |
_tokenURIs[tokenId] = uri; | |
} | |
/** | |
* @dev Internal function to burn a specific token | |
* Reverts if the token does not exist | |
* Deprecated, use _burn(uint256) instead | |
* @param owner owner of the token to burn | |
* @param tokenId uint256 ID of the token being burned by the msg.sender | |
*/ | |
function _burn(address owner, uint256 tokenId) internal { | |
super._burn(owner, tokenId); | |
// Clear metadata (if any) | |
if (bytes(_tokenURIs[tokenId]).length != 0) { | |
delete _tokenURIs[tokenId]; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment