简介
- ERC20:以太坊上最重要、最广泛采用的可替代代币(Fungible Token)标准
- ERC721:以太坊上定义非同质化代币(Non-Fungible Token, NFT)的标准接口,使得每个代币都具有唯一性、不可分割性和可验证的所有权,成为数字收藏品、游戏资产、身份凭证等场景的核心基础设施
- ERC1155:以太坊上一种多代币标准(Multi-Token Standard),它突破了 ERC-20(同质化)和 ERC-721(非同质化)的单一模型限制,允许在单个智能合约中同时管理任意数量的同质化、非同质化甚至半同质化代币,显著提升效率并降低 Gas 成本
ERC20
其包含两个事件
- Transfer事件
- Approval事件
go
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
ERC721
支持安全转帐,当接收地址为合约地址时,会失败
<<interface>>
ERC721
<<interface>>
IERC165
其继承IERC165
go
interface IERC721 is IERC165 {
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);
function balanceOf(address owner) external view returns (uint256 balance);
function ownerOf(uint256 tokenId) external view returns (address owner);
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
function safeTransferFrom(address from, address to, uint256 tokenId) external;
function transferFrom(address from, address to, uint256 tokenId) external;
function approve(address to, uint256 tokenId) external;
function setApprovalForAll(address operator, bool approved) external;
function getApproved(uint256 tokenId) external view returns (address operator);
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
IERC165只有一个方法supportsInterface是否支持接口
go
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
IERC1155
<<interface>>
IERC1155
<<interface>>
IERC165
其继承IERC165
go
interface IERC1155 is IERC165 {
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
event TransferBatch(
address indexed operator,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] values
);
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
event URI(string value, uint256 indexed id);
function balanceOf(address account, uint256 id) external view returns (uint256);
function balanceOfBatch(
address[] calldata accounts,
uint256[] calldata ids
) external view returns (uint256[] memory);
function setApprovalForAll(address operator, bool approved) external;
function isApprovedForAll(address account, address operator) external view returns (bool);
function safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes calldata data) external;
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
) external;
}