该文档介绍了 OpenZeppelin Contracts 3.x 版本中与 ERC1155 多重代币标准相关的接口和合约。
你没有在阅读此文档的当前版本。5.x 是当前版本。
| 最好在 https://docs.openzeppelin.com/contracts/api/token/erc1155 上查看此文档 |
这组接口和合约都与 ERC1155 多代币标准 有关。
EIP 由三个接口组成,它们履行不同的角色,在此处可以找到 IERC1155、IERC1155MetadataURI 和 IERC1155Receiver。
ERC1155 实现了强制性的 IERC1155 接口,以及可选的扩展 IERC1155MetadataURI,它依赖于替换机制来为所有代币类型使用相同的 URI,从而显着降低 Gas 成本。
此外,还有多个自定义扩展,包括:
指定可以暂停所有用户的代币转账的地址(ERC1155Pausable)。
销毁自己的代币(ERC1155Burnable)。
这组核心合约旨在保持公正,允许开发人员访问 ERC1155 中的内部函数(例如 _mint)并以他们喜欢的方式将其公开为外部函数。另一方面,ERC1155 预设(例如 ERC1155PresetMinterPauser)使用固定的模式进行设计,以便为开发人员提供随时可用、可部署的合约。 |
IERC1155符合 ERC1155 标准的合约的必需接口,如 EIP 中所定义。
自 v3.1 起可用。
函数
IERC165
事件
balanceOf(address account, uint256 id) → uint256 external返回 account 拥有的代币类型 id 的代币数量。
要求:
account 不能为零地址。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。
请参阅 setApprovalForAll。
safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) external将 amount 个代币类型的代币 id 从 from 转移到 to。
发出一个 TransferSingle 事件。
要求:
to 不能为零地址。
如果调用者不是 from,则必须已通过 setApprovalForAll 批准花费 from 的代币。
from 必须具有类型为 id 的代币余额,至少为 amount。
如果 to 是指智能合约,它必须实现 IERC1155Receiver.onERC1155Received 并返回
接受魔法值。
safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) externalsafeTransferFrom 的 批量 版本。
发出一个 TransferBatch 事件。
要求:
ids 和 amounts 的长度必须相同。
如果 to 是指智能合约,它必须实现 IERC1155Receiver.onERC1155BatchReceived 并返回
接受魔法值。
TransferSingle(address operator, address from, address to, uint256 id, uint256 value) event当 operator 将 value 个代币类型 id 的代币从 from 转移到 to 时发出。
TransferBatch(address operator, address from, address to, uint256[] ids, uint256[] values) event等效于多个 TransferSingle 事件,其中 operator、from 和 to 对于所有
转移都是相同的。
ApprovalForAll(address account, address operator, bool approved) event当 account 授予或撤销 operator 转移其代币的权限时,根据
approved 发出。
URI(string value, uint256 id) event当代币类型 id 的 URI 更改为 value 时发出,如果它是非程序化的 URI。
如果为 id 发出了 URI 事件,则标准
保证 value 将等于
IERC1155MetadataURI.uri 返回的值。
IERC1155MetadataURI可选的 ERC1155MetadataExtension 接口的接口,如 EIP 中所定义。
自 v3.1 起可用。
函数
IERC1155
IERC165
事件
IERC1155
uri(uint256 id) → string external返回代币类型 id 的 URI。
如果 {id} 子字符串存在于 URI 中,则客户端必须将其替换为
实际代币类型 ID。
ERC1155基本标准多代币的实现。 请参阅 https://learnblockchain.cn/docs/eips/EIPS/eip-1155 最初基于 Enjin 的代码:https://github.com/enjin/erc-1155
自 v3.1 起可用。
函数
ERC165
事件
IERC1155
constructor(string uri_) public请参阅 _setURI。
uri(uint256) → string external此实现为所有代币类型返回相同的 URI。它依赖于代币类型 ID 替换机制 在 EIP 中定义。
调用此函数的客户端必须将 {id} 子字符串替换为
实际代币类型 ID。
balanceOf(address account, uint256 id) → uint256 public请参阅 IERC1155.balanceOf。
要求:
account 不能为零地址。balanceOfBatch(address[] accounts, uint256[] ids) → uint256[] public要求:
accounts 和 ids 的长度必须相同。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 amount, bytes data) public请参阅 IERC1155.safeTransferFrom。
safeBatchTransferFrom(address from, address to, uint256[] ids, uint256[] amounts, bytes data) public请参阅 IERC1155.safeBatchTransferFrom。
_setURI(string newuri) internal通过依赖于代币类型 ID 替换机制,为所有代币类型设置新的 URI 在 EIP 中定义。
通过这种机制,URI 或 URI 处 JSON 文件中任何数量的 {id} 子字符串的任何出现都将被客户端替换为代币类型 ID。
例如,https://token-cdn-domain/{id}.json URI 将被客户端解释为
https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json
对于代币类型 ID 0x4cce0。
请参阅 uri。
因为这些 URI 不能通过 uri 事件有意义地表示,
此函数不会发出任何事件。
_mint(address account, uint256 id, uint256 amount, bytes data) internal创建 amount 个代币类型 id 的代币,并将它们分配给 account。
发出一个 TransferSingle 事件。
要求:
account 不能为零地址。
如果 account 是指智能合约,它必须实现 IERC1155Receiver.onERC1155Received 并返回
接受魔法值。
_mintBatch(address to, uint256[] ids, uint256[] amounts, bytes data) internal要求:
ids 和 amounts 的长度必须相同。
如果 to 是指智能合约,它必须实现 IERC1155Receiver.onERC1155BatchReceived 并返回
接受魔法值。
_burn(address account, uint256 id, uint256 amount) internal从 account 中销毁 amount 个代币类型 id 的代币
要求:
account 不能为零地址。
account 必须至少有 amount 个代币类型 id 的代币。
_burnBatch(address account, uint256[] ids, uint256[] amounts) internal要求:
ids 和 amounts 的长度必须相同。_beforeTokenTransfer(address operator, address from, address to, uint256[] ids, uint256[] amounts, bytes data) internal在任何代币转账之前调用的Hook。这包括铸造 和销毁,以及批量变体。
相同的Hook在单个和批量变体上都被调用。对于单个
转移,id 和 amount 数组的长度将为 1。
调用条件(对于每个 id 和 amount 对):
当 from 和 to 都不为零时,amount 个 from 的代币
代币类型 id 将被转移到 to。
当 from 为零时,将为 to 铸造 amount 个代币类型 id 的代币。
当 to 为零时,amount 个 from 的代币类型 id 的代币
将被销毁。
from 和 to 永远不会都为零。
ids 和 amounts 具有相同的不为零的长度。
要了解有关Hook的更多信息,请访问 使用Hook。
IERC1155Receiver函数
IERC165
onERC1155Received(address operator, address from, uint256 id, uint256 value, bytes data) → bytes4 external处理单个 ERC1155 代币类型的收到。在余额更新后,在 safeTransferFrom 结束时调用此函数。
要接受转移,这必须返回
bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))
(即 0xf23a6e61,或其自己的函数选择器)。
@param operator 发起转移的地址(即 msg.sender)
@param from 之前拥有代币的地址
@param id 正在转移的代币的 ID
@param value 正在转移的代币数量
@param data 没有指定格式的附加数据
@return bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)")) 如果允许转移
onERC1155BatchReceived(address operator, address from, uint256[] ids, uint256[] values, bytes data) → bytes4 external处理多个 ERC1155 代币类型的收到。在余额更新后,在 safeBatchTransferFrom 结束时调用此函数。
要接受转移,这必须返回
bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
(即 0xbc197c81,或其自己的函数选择器)。
@param operator 发起批量转移的地址(即 msg.sender)
@param from 之前拥有代币的地址
@param ids 包含每个正在转移的代币的 id 的数组(顺序和长度必须与 values 数组匹配)
@param values 包含每个正在转移的代币的数量的数组(顺序和长度必须与 ids 数组匹配)
@param data 没有指定格式的附加数据
@return bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)")) 如果允许转移
ERC1155Pausable具有可暂停代币转账、铸造和销毁的 ERC1155 代币。
适用于诸如在评估期结束之前阻止交易的场景,或者在出现重大错误时具有冻结所有代币转账的紧急开关。
自 v3.1 起可用。
函数
Pausable
ERC1155
ERC165
Events
IERC1155
burn(address account, uint256 id, uint256 value) publicburnBatch(address account, uint256[] ids, uint256[] values) publicERC1155Holder自 v3.1 版本可用。
Functions
函数
ERC1155Receiver
ERC1155接收器
ERC165
onERC1155Received(address, address, uint256, uint256, bytes) → bytes4 publiconERC1155BatchReceived(address, address, uint256[], uint256[], bytes) → bytes4 public
- 原文链接: docs.openzeppelin.com/co...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!