From 88c5aa6ec8d7d935f3ad3aca95ec939aebf256dc Mon Sep 17 00:00:00 2001 From: osmannyildiz Date: Sat, 16 Dec 2023 18:19:50 +0300 Subject: [PATCH] update nft contract --- contracts/NftCertificate.sol | 106 +++++++++++++++++++++++------------ 1 file changed, 69 insertions(+), 37 deletions(-) diff --git a/contracts/NftCertificate.sol b/contracts/NftCertificate.sol index 283d88b..9619bd6 100644 --- a/contracts/NftCertificate.sol +++ b/contracts/NftCertificate.sol @@ -2,60 +2,57 @@ pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; -import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/utils/Strings.sol"; +import "@openzeppelin/contracts/utils/Base64.sol"; -contract Certificate is ERC721, Ownable { - uint256 public nextCertificateId; +contract NftCertificate is ERC721 { + using Strings for uint256; + + uint256 public nextTokenId; - // Mapping to store additional information for each certificate mapping(uint256 => CertificateInfo) private certificateInfoMapping; - // Mapping to check if a certificate with a given name and wallet address has been issued + // course id => student address => is cert issued mapping(string => mapping(address => bool)) private issuedCertificates; struct CertificateInfo { - string userName; - string surName; - string email; - string companyName; + string studentFullName; + string courseName; + string instructorFullName; } - constructor() ERC721("Certificate", "CERT") Ownable(msg.sender) {} + constructor() ERC721("CubLearn Certificate", "CUBCERT") {} function mintCertificate( - uint256 certificateId, - string memory userName, - string memory surName, - string memory email, - string memory companyName + string memory courseId, + string memory studentFullName, + string memory courseName, + string memory instructorFullName ) external { - // Check if the certificate with the given ID has already been issued - require(!issuedCertificates[userName][msg.sender], "Certificate already issued"); + require(!issuedCertificates[courseId][msg.sender], "Certificate already issued."); - _safeMint(msg.sender, certificateId); + uint256 tokenId = nextTokenId; + + _storeCertificateInfo(tokenId, studentFullName, courseName, instructorFullName); - // Store additional information using a mapping - _storeCertificateInfo(certificateId, userName, surName, email, companyName); + _safeMint(msg.sender, tokenId); // Mark the certificate as issued - issuedCertificates[userName][msg.sender] = true; + issuedCertificates[courseId][msg.sender] = true; - // Update the nextCertificateId only if the mint is successful - nextCertificateId = certificateId + 1; + nextTokenId++; } function _storeCertificateInfo( uint256 tokenId, - string memory userName, - string memory surName, - string memory email, - string memory companyName + string memory studentFullName, + string memory courseName, + string memory instructorFullName ) internal { certificateInfoMapping[tokenId] = CertificateInfo({ - userName: userName, - surName: surName, - email: email, - companyName: companyName + studentFullName: studentFullName, + courseName: courseName, + instructorFullName: instructorFullName }); } @@ -63,13 +60,48 @@ contract Certificate is ERC721, Ownable { external view returns ( - string memory userName, - string memory surName, - string memory email, - string memory companyName + CertificateInfo memory certInfo ) { - CertificateInfo storage info = certificateInfoMapping[tokenId]; - return (info.userName, info.surName, info.email, info.companyName); + 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) + external + 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) + ) + ); } }