SoulboundNFT
A non-transferable token. Once minted, it permanently belongs to the recipient.
SoulboundNFT.sol
// SPDX-License-Identifier: MITpragma solidity ^0.8.20; contract SoulboundNFT { string public name; string public symbol; address public owner; uint256 public nextTokenId; mapping(uint256 => address) public ownerOf; mapping(address => uint256) public balanceOf; event Mint(address indexed to, uint256 indexed tokenId); constructor(string memory name_, string memory symbol_) { name = name_; symbol = symbol_; owner = msg.sender; } function mint(address to) external returns (uint256) { require(msg.sender == owner, "NOT_OWNER"); require(to != address(0), "ZERO_ADDR"); uint256 id = nextTokenId++; ownerOf[id] = to; balanceOf[to] += 1; emit Mint(to, id); return id; } // Soulbound: tokens can never be transferred or approved once minted. function transferFrom(address, address, uint256) external pure { revert("SOULBOUND"); } function approve(address, uint256) external pure { revert("SOULBOUND"); }}