# 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
 
#### 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`