本文档介绍了 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 ),并以他们喜欢的方式将其公开为外部函数。 |
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要求:
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
返回的值。
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
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
。
要求:
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)
publicburnBatch(address account, uint256[] ids, uint256[] values)
publicERC1155Supply
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
publictoken 的总价值。
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此实现返回 _baseURI
和 token 特定的 uri 的串联,如果后者已设置
这启用了以下行为:
_tokenURIs[tokenId]
,则结果是 _baseURI
- 原文链接: docs.openzeppelin.com/co...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!