# Token Contract 教學 >Ray Huang | Blockchain Developer >Contact: ray.huang@tkspring.com ### ERC20 #### Token Standard [EIP-20: Token Standard](https://eips.ethereum.org/EIPS/eip-20) [Openzeppelin docs](https://docs.openzeppelin.com/contracts/2.x/api/token/erc20) [Openzeppelin implementation](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol) ```solidity= // function function name() public view returns (string) function symbol() public view returns (string) function decimals() public view returns (uint8) function totalSupply() public view returns (uint256) function balanceOf(address _owner) public view returns (uint256 balance) function transfer(address _to, uint256 _value) public returns (bool success) function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) function approve(address _spender, uint256 _value) public returns (bool success) function allowance(address _owner, address _spender) public view returns (uint256 remaining) // event event Transfer(address indexed _from, address indexed _to, uint256 _value) event Approval(address indexed _owner, address indexed _spender, uint256 _value) ``` #### Approve ![](https://i.imgur.com/qwBVugL.png =300x) ![](https://i.imgur.com/Kri9z9q.png =300x) #### Supplement [SafeERC20](https://docs.openzeppelin.com/contracts/2.x/api/token/erc20#SafeERC20) [ERC20 missing return value bug](https://twitter.com/Uniswap/status/1072286773554876416) ### ERC721 #### Token Standard [EIP-721: Non-Fungible Token Standard](https://eips.ethereum.org/EIPS/eip-721) [Openzeppelin docs](https://docs.openzeppelin.com/contracts/2.x/api/token/erc721) [Openzeppelin implementation](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol) [ERC721Enumerable](https://docs.openzeppelin.com/contracts/2.x/api/token/erc721#ERC721Enumerable) [ERC721Metadata](https://docs.openzeppelin.com/contracts/2.x/api/token/erc721#ERC721Metadata) ```solidity= // function function balanceOf(address _owner) external view returns (uint256); function ownerOf(uint256 _tokenId) external view returns (address); function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable; function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable; function transferFrom(address _from, address _to, uint256 _tokenId) external payable; function approve(address _approved, uint256 _tokenId) external payable; function setApprovalForAll(address _operator, bool _approved) external; function getApproved(uint256 _tokenId) external view returns (address); function isApprovedForAll(address _owner, address _operator) external view returns (bool); function supportsInterface(bytes4 interfaceID) external view returns (bool); // event event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); ``` #### Supplement [OpenSea Metadata Standards](https://docs.opensea.io/docs/metadata-standards) ```json= { "description": "Friendly OpenSea Creature that enjoys long swims in the ocean.", "external_url": "https://openseacreatures.io/3", "image": "https://storage.googleapis.com/opensea-prod.appspot.com/puffs/3.png", "name": "Dave Starbelly", "attributes": [ ... ] } ``` [ERC721 explanation](https://anallergytoanalogy.medium.com/jumping-into-solidity-the-erc721-standard-part-4-ad21e3a5d9c) [ERC721A](https://www.erc721a.org/) [PlutoLab Interactive music NFT](https://opensea.io/assets/ethereum/0x63a2502977a7ee8b4345a9d8b8e10ad278c63d46/3272) ###### tags: `TEM 2022/11/17`