Skip to Content

@cfxdevkit/compiler


@cfxdevkit/compiler / ERC721_SOURCE

Variable: ERC721_SOURCE

const ERC721_SOURCE: ”// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\n/**\n * @title BasicNFT\n * @notice Minimal ERC-721 implementation from scratch.\n * Teaches: mappings, token ownership, approval patterns, events.\n */\ncontract BasicNFT {\n string public name;\n string public symbol;\n address public owner;\n uint256 public nextTokenId;\n\n mapping(uint256 => address) private _ownerOf;\n mapping(address => uint256) private _balanceOf;\n mapping(uint256 => address) private _approved;\n mapping(address => mapping(address => bool)) private _operatorApprovals;\n mapping(uint256 => string) private _tokenURIs;\n\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n event Approval(address indexed tokenOwner, address indexed approved, uint256 indexed tokenId);\n event ApprovalForAll(address indexed tokenOwner, address indexed operator, bool approved);\n\n modifier onlyOwner() {\n require(msg.sender == owner, “BasicNFT: not the owner”);\n _;\n }\n\n constructor(string memory _name, string memory _symbol) {\n name = _name;\n symbol = _symbol;\n owner = msg.sender;\n }\n\n function balanceOf(address account) public view returns (uint256) {\n require(account != address(0), “BasicNFT: zero address”);\n return _balanceOf[account];\n }\n\n function ownerOf(uint256 tokenId) public view returns (address) {\n address tokenOwner = _ownerOf[tokenId];\n require(tokenOwner != address(0), “BasicNFT: token does not exist”);\n return tokenOwner;\n }\n\n function tokenURI(uint256 tokenId) public view returns (string memory) {\n require(_ownerOf[tokenId] != address(0), “BasicNFT: token does not exist”);\n return _tokenURIs[tokenId];\n }\n\n /// @notice Mint a new token to `to` with metadata URI `uri`.\n function mint(address to, string calldata uri) external onlyOwner returns (uint256) {\n require(to != address(0), “BasicNFT: mint to zero address”);\n uint256 tokenId = nextTokenId++;\n _ownerOf[tokenId] = to;\n _balanceOf[to]++;\n _tokenURIs[tokenId] = uri;\n emit Transfer(address(0), to, tokenId);\n return tokenId;\n }\n\n function approve(address to, uint256 tokenId) external {\n address tokenOwner = ownerOf(tokenId);\n require(msg.sender == tokenOwner || _operatorApprovals[tokenOwner][msg.sender],\n “BasicNFT: not authorized”);\n _approved[tokenId] = to;\n emit Approval(tokenOwner, to, tokenId);\n }\n\n function getApproved(uint256 tokenId) public view returns (address) {\n require(_ownerOf[tokenId] != address(0), “BasicNFT: token does not exist”);\n return _approved[tokenId];\n }\n\n function setApprovalForAll(address operator, bool approved) external {\n require(operator != msg.sender, “BasicNFT: approve to caller”);\n _operatorApprovals[msg.sender][operator] = approved;\n emit ApprovalForAll(msg.sender, operator, approved);\n }\n\n function isApprovedForAll(address tokenOwner, address operator) public view returns (bool) {\n return _operatorApprovals[tokenOwner][operator];\n }\n\n function transferFrom(address from, address to, uint256 tokenId) public {\n require(to != address(0), “BasicNFT: transfer to zero address”);\n address tokenOwner = ownerOf(tokenId);\n require(tokenOwner == from, “BasicNFT: wrong from address”);\n require(\n msg.sender == tokenOwner ||\n msg.sender == _approved[tokenId] ||\n _operatorApprovals[tokenOwner][msg.sender],\n “BasicNFT: not authorized”\n );\n _balanceOf[from]—;\n _balanceOf[to]++;\n _ownerOf[tokenId] = to;\n delete _approved[tokenId];\n emit Transfer(from, to, tokenId);\n }\n}”

Defined in: templates/erc721.ts:12