// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/Base64.sol"; contract NftCertificate is ERC721 { using Strings for uint256; uint256 public nextTokenId; mapping(uint256 => CertificateInfo) private certificateInfoMapping; struct CertificateInfo { string studentFullName; string courseName; string instructorFullName; } constructor() ERC721("CubLearn Certificate", "CUBCERT") {} function mintCertificate( address recipient, string memory studentFullName, string memory courseName, string memory instructorFullName ) external { uint256 tokenId = nextTokenId; _storeCertificateInfo(tokenId, studentFullName, courseName, instructorFullName); _safeMint(recipient, tokenId); nextTokenId++; } function _storeCertificateInfo( uint256 tokenId, string memory studentFullName, string memory courseName, string memory instructorFullName ) internal { certificateInfoMapping[tokenId] = CertificateInfo({ studentFullName: studentFullName, courseName: courseName, instructorFullName: instructorFullName }); } // function getCertificateInfo(uint256 tokenId) // external // view // returns ( // CertificateInfo memory certInfo // ) // { // return certificateInfoMapping[tokenId]; // } function _getSvg(uint256 tokenId) internal view returns (string memory) { CertificateInfo storage certInfo = certificateInfoMapping[tokenId]; string memory svg = string( abi.encodePacked( unicode"data:image/svg+xml;utf8,Cub#", tokenId.toString(), unicode"LearnÖĞRENCİ", certInfo.studentFullName, "KURS", certInfo.courseName, unicode"EĞİTMEN", certInfo.instructorFullName, "" ) ); return svg; } function tokenURI(uint256 tokenId) public view override returns (string memory) { bytes memory json = abi.encodePacked( '{', '"name": "CubLearn Certificate #', tokenId.toString(), '",', '"image_data": "', _getSvg(tokenId), '"', '}' ); return string( abi.encodePacked( "data:application/json;base64,", Base64.encode(json) ) ); } }