Soul-Bound Tokens (SBTs) for Credentials
SBT Implementation on EVM Chains
Key Features of EVM-Based SBTs
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract SoulBoundToken is ERC721Enumerable, Ownable {
struct SBTMetadata {
string credentialName;
string institution;
string issuedDate;
bool revoked;
}
mapping(uint256 => SBTMetadata) public tokenMetadata;
event CredentialIssued(uint256 tokenId, address recipient, string credentialName, string institution);
event CredentialRevoked(uint256 tokenId);
constructor() ERC721("SoulBoundToken", "SBT") {}
function mint(address recipient, uint256 tokenId, string memory credentialName, string memory institution, string memory issuedDate) external onlyOwner {
_safeMint(recipient, tokenId);
tokenMetadata[tokenId] = SBTMetadata(credentialName, institution, issuedDate, false);
emit CredentialIssued(tokenId, recipient, credentialName, institution);
}
function revoke(uint256 tokenId) external onlyOwner {
require(_exists(tokenId), "Token does not exist");
tokenMetadata[tokenId].revoked = true;
emit CredentialRevoked(tokenId);
}
function isRevoked(uint256 tokenId) public view returns (bool) {
return tokenMetadata[tokenId].revoked;
}
function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override {
require(from == address(0), "SBTs are non-transferable");
super._beforeTokenTransfer(from, to, tokenId);
}
}
PreviousHow Learning Content NFTs Revolutionize EducationNextKey Characteristics of Soul-Bound Tokens (SBTs)
Last updated