Token¶
ERC20¶
最广泛的代币标准:https://docs.openzeppelin.com/contracts/4.x/api/token/erc20
IERC20
EIP定义的ERC20标准接口IERC20Metadata
扩展的ERC20接口,包括名称、符号和小数功能SafeERC20
接口的包装器,无需处理布尔返回值,using SafeERC20 for IERC20;
ERC20
IERC20接口的基本实现,包括名称、符号和小数可选标准扩展等
只要合约实现了IERC20接口列出的所有方法,就满足了ERC20标准,至于合约逻辑如何实现没有强制要求。
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
// 可升级合约
import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol";
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract BFToken is ERC20 {
constructor(uint256 initialSupply) ERC20("BugFree", "BF") {
_mint(msg.sender, initialSupply); // initialSupply为初始供应量
}
// 默认18位精度
function decimals() public view virtual override returns (uint8) {
return 18;
}
}
ERC777¶
更丰富的可替代代币标准,兼容ERC20
ERC721¶
NFT(non-fungible tokens) 不可替代代币
通常用于收藏品和游戏
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
contract GameItem is ERC721URIStorage {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
constructor() ERC721("GameItem", "ITM") {}
// NFT 是不可分割的,所以他不支持精度设置
function awardItem(address player, string memory tokenURI) public returns (uint256) {
uint256 newItemId = _tokenIds.current();
_mint(player, newItemId);
_setTokenURI(newItemId, tokenURI);
_tokenIds.increment();
return newItemId;
}
}
ERC1155¶
一种新的多代币标准,允许单个合约代表多个可替代和不可替代的代币,以及用于提高 gas 效率的批量操作
最后更新:
2023-05-08