该文档介绍了 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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!