参考资料
在 ERC721 中,每个代币都有一个 tokenId 作为唯一标识,每个 tokenId 只对应一个代币;
而在 ERC1155 中,每一种代币都有一个 id 作为唯一标识,每个 id 对应一种代币。这样,代币种类就可以非同质的在同一个合约里管理了,并且每种代币都有一个网址 uri 来存储它的元数据,类似 ERC721 的 tokenURI。
那么怎么区分 ERC1155 中的某类代币是同质化还是非同质化代币呢?其实很简单:如果某个 id 对应的代币总量为 1 ,那么它就是非同质化代币,类似 ERC721;如果某个 id 对应的代币总量大于 1,那么他就是同质化代币,因为这些代币都分享同一个id,类似ERC20。
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
这里面一共有 4 个合约
ContextERC165IERC1155IERC1155MetadataURI
IERC1155
1 | pragma solidity ^0.8.0; |
IERC1155事件
TransferSingle事件:单类代币转账事件,在单币种转账时释放。TransferBatch事件:批量代币转账事件,在多币种转账时释放。ApprovalForAll事件:批量授权事件,在批量授权时释放。URI事件:元数据地址变更事件,在uri变化时释放。
IERC1155函数
balanceOf():单币种余额查询,返回account拥有的id种类的代币的持仓量。balanceOfBatch():多币种余额查询,查询的地址accounts数组和代币种类ids数组的长度要相等。setApprovalForAll():批量授权,将调用者的代币授权给operator地址。isApprovedForAll():查询批量授权信息,如果授权地址operator被account授权,则返回true。safeTransferFrom():安全单币转账,将amount单位id种类的代币从from地址转账给to地址。如果to地址是合约,则会验证是否实现了onERC1155Received()接收函数。safeBatchTransferFrom():安全多币转账,与单币转账类似,只不过转账数量amounts和代币种类ids变为数组,且长度相等。如果to地址是合约,则会验证是否实现了onERC1155BatchReceived()接收函数。
ERC1155 主合约
具体细节可以通过下面两个组合看,非常 nice。
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";- ERC1155