ERC-1155 - OpenZeppelin 文档

本文档介绍了 ERC-1155 多代币标准,该标准由三个接口组成,分别定义为 IERC1155、IERC1155MetadataURI 和 IERC1155Receiver。ERC1155 实现了强制性的 IERC1155 接口和可选扩展 IERC1155MetadataURI。此外,还有多个自定义扩展,包括指定可以暂停所有用户代币转账的地址,以及销毁自有代币。

ERC-1155

建议在以下链接查看本文档:https://docs.openzeppelin.com/contracts/api/token/erc1155

这组接口和合约都与 ERC-1155 多代币标准 相关。

这个 ERC 由三个接口组成,它们承担不同的角色,分别是 IERC1155IERC1155MetadataURIIERC1155Receiver

ERC1155 实现了强制性的 IERC1155 接口,以及可选的扩展 IERC1155MetadataURI,它依赖于替换机制来为所有代币类型使用相同的 URI,从而显著降低 gas 成本。

此外,还有多个自定义扩展,包括:

这组核心合约被设计为非预设的,允许开发者访问 ERC-1155 中的内部函数(例如 _mint),并以他们喜欢的方式将其公开为外部函数。

核心

IERC1155

import "@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

balanceOf批量 版本。

要求:

  • accountsids 必须具有相同的长度。
setApprovalForAll(address operator, bool approved) external

根据 approved,授予或撤销 operator 转移调用者代币的权限。

发出 ApprovalForAll 事件。

要求:

  • operator 不能是零地址。
isApprovedForAll(address account, address operator) → bool external

如果 operator 被批准转移 account 的代币,则返回 true。

参见 setApprovalForAll

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) external

safeTransferFrom批量 版本。

当将代币转账到不受信任的合约时,此函数可能会引发重入攻击,当在接收者上调用 IERC1155Receiver.onERC1155BatchReceived 时。<br>确保遵循检查-效果-交互模式,并在与不受信任的合约交互时考虑采用重入保护。

根据数组参数的长度,发出 TransferSingleTransferBatch 事件。

要求:

TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value) event

operatorvalue 数量的 id 类型的代币从 from 转移到 to 时发出。

TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values) event

等同于多个 TransferSingle 事件,其中 operatorfromto 对于所有转移都是相同的。

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 返回的值。

IERC1155MetadataURI

import "@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol";

可选的 ERC1155MetadataExtension 接口的接口,如 ERC 中定义。

函数

IERC1155

IERC165

事件

IERC1155

uri(uint256 id) → string external

返回代币类型 id 的 URI。

如果 URI 中存在 {id} 子字符串,则客户端必须将其替换为 实际的代币类型 ID。

ERC1155

import "@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 public

参见 IERC165.supportsInterface

uri(uint256) → string public

参见 IERC1155MetadataURI.uri

此实现为所有代币类型返回相同的 URI。它依赖于代币类型 ID 替换机制 在 ERC 中定义

调用此函数的客户端必须将 {id} 子字符串替换为 实际的代币类型 ID。

balanceOf(address account, uint256 id) → uint256 public

参见 IERC1155.balanceOf

balanceOfBatch(address[] accounts, uint256[] ids) → uint256[] public

参见 IERC1155.balanceOfBatch

要求:

  • accountsids 必须具有相同的长度。
setApprovalForAll(address operator, bool approved) public

参见 IERC1155.setApprovalForAll

isApprovedForAll(address account, address operator) → bool public

参见 IERC1155.isApprovedForAll

safeTransferFrom(address from, address to, uint256 id, uint256 value, bytes data) public

参见 IERC1155.safeTransferFrom

safeBatchTransferFrom(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 事件。

要求:

此函数不执行 ERC-1155 接受检查。 请参见 _updateWithAcceptanceCheck
_updateWithAcceptanceCheck(address from, address to, uint256[] ids, uint256[] values, bytes data) internal

_update 的版本,它通过调用 IERC1155Receiver.onERC1155ReceivedIERC1155Receiver.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 事件。

要求:

_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

要求:

  • 合约不能被暂停。

ERC1155Burnable

import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol";

ERC1155 的扩展,允许 token 持有者销毁他们自己的 token 以及那些他们被授权使用的 token。

函数

ERC1155

Events

IERC1155

Errors

IERC1155Errors

burn(address account, uint256 id, uint256 value) public
burnBatch(address account, uint256[] ids, uint256[] values) public

ERC1155Supply

import "@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 public

token 的总价值。

exists(uint256 id) → bool public

指示是否存在具有给定 id 的任何 token。

_update(address from, address to, uint256[] ids, uint256[] values) internal

参见 ERC1155._update

ERC1155URIStorage

import "@openzeppelin/contracts/token/ERC1155/extensions/ERC1155URIStorage.sol";

具有基于存储的 token URI 管理的 ERC-1155 token。 灵感来自ERC721URIStorage扩展

函数

ERC1155

Events

IERC1155

Errors

IERC1155Errors

uri(uint256 tokenId) → string public

参见 IERC1155MetadataURI.uri

此实现返回 _baseURI 和 token 特定的 uri 的串联,如果后者已设置

这启用了以下行为:

  • 如果设置了 _tokenURIs[tokenId],则结果是 _baseURI
  • 原文链接: docs.openzeppelin.com/co...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
OpenZeppelin
OpenZeppelin
江湖只有他的大名,没有他的介绍。