0%

solidity | erc1155

参考资料

ERC721 中,每个代币都有一个 tokenId 作为唯一标识,每个 tokenId 只对应一个代币;

而在 ERC1155 中,每一种代币都有一个 id 作为唯一标识,每个 id 对应一种代币。这样,代币种类就可以非同质的在同一个合约里管理了,并且每种代币都有一个网址 uri 来存储它的元数据,类似 ERC721tokenURI

那么怎么区分 ERC1155 中的某类代币是同质化还是非同质化代币呢?其实很简单:如果某个 id 对应的代币总量为 1 ,那么它就是非同质化代币,类似 ERC721;如果某个 id 对应的代币总量大于 1,那么他就是同质化代币,因为这些代币都分享同一个id,类似ERC20

  • import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";

这里面一共有 4 个合约

IERC1155

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

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 amount,
bytes calldata data
) external;
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) external;
}

IERC1155事件

  • TransferSingle事件:单类代币转账事件,在单币种转账时释放。
  • TransferBatch事件:批量代币转账事件,在多币种转账时释放。
  • ApprovalForAll事件:批量授权事件,在批量授权时释放。
  • URI事件:元数据地址变更事件,在 uri 变化时释放。

IERC1155函数

  • balanceOf():单币种余额查询,返回 account 拥有的 id 种类的代币的持仓量。
  • balanceOfBatch():多币种余额查询,查询的地址 accounts 数组和代币种类 ids 数组的长度要相等。
  • setApprovalForAll():批量授权,将调用者的代币授权给operator地址。
  • isApprovedForAll():查询批量授权信息,如果授权地址 operatoraccount 授权,则返回true
  • safeTransferFrom():安全单币转账,将 amount 单位 id 种类的代币从 from 地址转账给 to 地址。如果 to 地址是合约,则会验证是否实现了 onERC1155Received() 接收函数。
  • safeBatchTransferFrom():安全多币转账,与单币转账类似,只不过转账数量 amounts 和代币种类 ids 变为数组,且长度相等。如果 to 地址是合约,则会验证是否实现了onERC1155BatchReceived()接收函数。

ERC1155 主合约

具体细节可以通过下面两个组合看,非常 nice

  • import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
  • ERC1155
请我喝杯咖啡吧~