参考资料
在 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 个合约
Context
ERC165
IERC1155
IERC1155MetadataURI
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