本文档介绍了 ERC-1155 多代币标准,该标准由三个接口组成,分别定义为 IERC1155、IERC1155MetadataURI 和 IERC1155Receiver。ERC1155 实现了强制性的 IERC1155 接口和可选扩展 IERC1155MetadataURI。此外,还有多个自定义扩展,包括指定可以暂停所有用户代币转账的地址,以及销毁自有代币。
| 建议在以下链接查看本文档:https://docs.openzeppelin.com/contracts/api/token/erc1155 |
这组接口和合约都与 ERC-1155 多代币标准 相关。
这个 ERC 由三个接口组成,它们承担不同的角色,分别是 IERC1155、IERC1155MetadataURI 和 IERC1155Receiver。
ERC1155 实现了强制性的 IERC1155 接口,以及可选的扩展 IERC1155MetadataURI,它依赖于替换机制来为所有代币类型使用相同的 URI,从而显著降低 gas 成本。
此外,还有多个自定义扩展,包括:
指定可以暂停所有用户代币转账的地址(ERC1155Pausable)。
销毁自己的代币(ERC1155Burnable)。
这组核心合约被设计为非预设的,允许开发者访问 ERC-1155 中的内部函数(例如 _mint),并以他们喜欢的方式将其公开为外部函数。 |
IERC1155import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
符合 ERC-1155 合约的必需接口,如 ERC 中定义。
函数
IERC165
事件
balanceOf(address account, uint256 id) → uint256 external返回 account 拥有的代币类型 id 的代币值。
balanceOfBatch(address[] accounts, uint256[] ids) → uint256[] external要求:
accounts 和 ids 必须具有相同的长度。setApprovalForAll(address operator, bool approved) external根据 approved,授予或撤销 operator 转移调用者代币的权限。
发出 ApprovalForAll 事件。
要求:
operator 不能是零地址。isApprovedForAll(address account, address operator) → bool external如果 operator 被批准转移 account 的代币,则返回 true。
safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes data) external将 value 数量的 id 类型的代币从 from 转移到 to。
当将代币转账到不受信任的合约时,此函数可能会引发重入攻击,当在接收者上调用 IERC1155Receiver.onERC1155Received 时。<br>确保遵循检查-效果-交互模式,并在与不受信任的合约交互时考虑采用重入保护。 |
发出 TransferSingle 事件。
要求:
to 不能是零地址。
如果调用者不是 from,则必须已通过 setApprovalForAll 批准花费 from 的代币。
from 必须至少有 value 数量的 id 类型的代币余额。
如果 to 指的是智能合约,则必须实现 IERC1155Receiver.onERC1155Received 并返回
接受魔法值。
safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] values, bytes data) externalsafeTransferFrom 的 批量 版本。
当将代币转账到不受信任的合约时,此函数可能会引发重入攻击,当在接收者上调用 IERC1155Receiver.onERC1155BatchReceived 时。<br>确保遵循检查-效果-交互模式,并在与不受信任的合约交互时考虑采用重入保护。 |
根据数组参数的长度,发出 TransferSingle 或 TransferBatch 事件。
要求:
ids 和 values 必须具有相同的长度。
如果 to 指的是智能合约,则必须实现 IERC1155Receiver.onERC1155BatchReceived 并返回
接受魔法值。
TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) event当 operator 将 value 数量的 id 类型的代币从 from 转移到 to 时发出。
TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) event等同于多个 TransferSingle 事件,其中 operator、from 和 to 对于所有转移都是相同的。
ApprovalForAll(address indexed account, address indexed operator, bool approved) event当 account 根据 approved 授予或撤销 operator 转移其代币的权限时发出。
URI(string value, uint256 indexed id) event如果 URI 事件是为 id 发出的,则当代币类型 id 的 URI 更改为 value 时发出,如果它是一个非程序化的 URI。
如果为 id 发出了一个 URI 事件,则该标准
保证 value 将等于
IERC1155MetadataURI.uri 返回的值。
IERC1155MetadataURIimport "@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol";
可选的 ERC1155MetadataExtension 接口的接口,如 ERC 中定义。
函数
IERC1155
IERC165
事件
IERC1155
uri(uint256 id) → string external返回代币类型 id 的 URI。
如果 URI 中存在 {id} 子字符串,则客户端必须将其替换为
实际的代币类型 ID。
ERC1155import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
基本标准多代币的实现。 参见 https://eips.ethereum.org/EIPS/eip-1155 最初基于 Enjin 的代码:https://github.com/enjin/erc-1155
函数
事件
IERC1155
错误
IERC1155Errors
constructor(string uri_) internal参见 _setURI。
supportsInterface(bytes4 interfaceId) → bool publicuri(uint256) → string public此实现为所有代币类型返回相同的 URI。它依赖于代币类型 ID 替换机制 在 ERC 中定义。
调用此函数的客户端必须将 {id} 子字符串替换为
实际的代币类型 ID。
balanceOf(address account, uint256 id) → uint256 publicbalanceOfBatch(address[] accounts, uint256[] ids) → uint256[] public要求:
accounts 和 ids 必须具有相同的长度。setApprovalForAll(address operator, bool approved) public参见 IERC1155.setApprovalForAll。
isApprovedForAll(address account, address operator) → bool publicsafeTransferFrom(address from, address to, uint256 id, uint256 value, bytes data) publicsafeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] values, bytes data) public参见 IERC1155.safeBatchTransferFrom。
_update(address from, address to, uint256[] ids, uint256[] values) internal将 value 数量的 id 类型的代币从 from 转移到 to。如果 from
(或 to)是零地址,则将铸造(或销毁)代币。
如果数组包含一个元素,则发出 TransferSingle 事件,否则发出 TransferBatch 事件。
要求:
如果 to 指的是智能合约,则它必须实现 IERC1155Receiver.onERC1155Received
或 IERC1155Receiver.onERC1155BatchReceived 并返回接受魔法值。
ids 和 values 必须具有相同的长度。
此函数不执行 ERC-1155 接受检查。 请参见 _updateWithAcceptanceCheck。 |
_updateWithAcceptanceCheck(address from, address to, uint256[] ids, uint256[] values, bytes data) internal_update 的版本,它通过调用
IERC1155Receiver.onERC1155Received 或 IERC1155Receiver.onERC1155BatchReceived 对接收者地址执行代币接受检查,如果接收者地址包含代码(例如,执行时是一个智能合约)。
不建议覆盖此函数,因为它会带来来自接收者的重入风险。 因此,在此函数之后的任何合约状态更新都会破坏检查-效果-交互模式。 考虑覆盖 _update 代替。 |
_safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes data) internal将 value 数量的 id 类型的代币从 from 转移到 to。
发出 TransferSingle 事件。
要求:
to 不能是零地址。
from 必须至少有 value 数量的 id 类型的代币余额。
如果 to 指的是智能合约,则它必须实现 IERC1155Receiver.onERC1155Received 并返回
接受魔法值。
_safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] values, bytes data) internal_safeTransferFrom 的 批量 版本。
发出 TransferBatch 事件。
要求:
如果 to 指的是智能合约,则它必须实现 IERC1155Receiver.onERC1155BatchReceived 并返回
接受魔法值。
ids 和 values 必须具有相同的长度。
_setURI(string newuri) internal通过依赖于代币类型 ID 替换机制,为所有代币类型设置一个新的 URI 在 ERC 中定义。
通过这种机制,URI 或所述 URI 的 JSON 文件中的任何值中出现的任何 {id} 子字符串都将被客户端替换为代币类型 ID。
例如,https://token-cdn-domain/{id}.json URI 将被客户端解释为
https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json
对于代币类型 ID 0x4cce0。
参见 uri。
因为这些 URI 无法通过 uri 事件有意义地表示,所以
此- paused()
ERC1155
Events
Pausable
IERC1155
Errors
Pausable
IERC1155Errors
_update(address from, address to, uint256[] ids, uint256[] values) internal参见 ERC1155._update。
要求:
ERC1155Burnableimport "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol";
ERC1155 的扩展,允许 token 持有者销毁他们自己的 token 以及那些他们被授权使用的 token。
函数
ERC1155
Events
IERC1155
Errors
IERC1155Errors
burn(address account, uint256 id, uint256 value) publicburnBatch(address account, uint256[] ids, uint256[] values) publicERC1155Supplyimport "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol";
ERC-1155 的扩展,增加了每个 id 的总供应量的跟踪。
适用于必须明确识别同质化和非同质化 token 的场景。注意:虽然 1 的 totalSupply 可能意味着对应的 token 是 NFT,但不能保证没有其他具有相同 id 的 token 不会被 铸造。
| 该合约意味着可以 铸造 的 token 数量的全局限制为 2**256 - 1。 |
| 此扩展不应添加到已部署合约的升级中。 |
函数
ERC1155
Events
IERC1155
Errors
IERC1155Errors
totalSupply(uint256 id) → uint256 public具有给定 id 的 token 的总价值。
totalSupply() → uint256 publictoken 的总价值。
exists(uint256 id) → bool public指示是否存在具有给定 id 的任何 token。
_update(address from, address to, uint256[] ids, uint256[] values) internal参见 ERC1155._update。
ERC1155URIStorageimport "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155URIStorage.sol";
具有基于存储的 token URI 管理的 ERC-1155 token。
灵感来自ERC721URIStorage扩展
函数
ERC1155
Events
IERC1155
Errors
IERC1155Errors
uri(uint256 tokenId) → string public此实现返回 _baseURI 和 token 特定的 uri 的串联,如果后者已设置
这启用了以下行为:
_tokenURIs[tokenId],则结果是 _baseURI
- 原文链接: docs.openzeppelin.com/co...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!