// SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; import "@openzeppelin/contracts/utils/Base64.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; // import "./OnChainSVG.sol"; contract SoulboundToken is ERC721 { using Counters for Counters.Counter; Counters.Counter private _tokenIds; constructor() ERC721("Credit System SBT", "CS_SBT") {} function mint(address player) public returns (uint256) { _tokenIds.increment(); uint256 newItemId = _tokenIds.current(); _mint(player, newItemId); return newItemId; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory json = Base64.encode( bytes( string( abi.encodePacked( '{"name": "Credit System Soulbound Token (CSSBT) #', Strings.toString(tokenId), '",', '"image_data": "', getSvgImage(tokenId), '"', "}" ) ) ) ); return string(abi.encodePacked("data:application/json;base64,", json)); } function getSvgImage(uint uid) private pure returns (string memory){ string memory uid_str = Strings.toString(uid); string memory a = "Credit System Soulbound Token (CSSBT)#"; string memory b = ""; return string(abi.encodePacked(a, uid_str, b)); } }