// SPDX-License-Identifier: MIT pragma solidity 0.8.10; import "@openzeppelin/contracts/utils/Base64.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; contract JSONMetadata is Ownable { using Strings for uint256; string constant _dataUri = "data:application/json;base64,"; struct MetaData { string name; string desc; string image; string external_str; } mapping(address => MetaData) public metaDatas; function getMetaData( address token, uint256 tokenId ) public view returns (string memory) { MetaData memory metaData = metaDatas[token]; string memory external_str; if (bytes(metaData.external_str).length > 0) { external_str = metaData.external_str; } bytes memory json = abi.encodePacked( '{"name":"', metaData.name, " #", tokenId.toString(), '","description":"', metaData.desc, '","image":"', metaData.image, '","external_url":"', metaData.image, '"', external_str, "}" ); return string(abi.encodePacked(_dataUri, Base64.encode(json))); } function setMetaData( address token, string memory name, string memory desc, string memory image, string memory external_str ) external onlyOwner { MetaData memory metaData = MetaData(name, desc, image, external_str); metaDatas[token] = metaData; } }