本文档介绍了OpenZeppelin Contracts库中与ERC721非同质化代币标准相关的接口、合约和实用程序。
你没有在阅读当前版本的文档。5.x 是当前版本。
最好在 https://docs.openzeppelin.com/contracts/api/token/erc721 查看此文档 |
这组接口、合约和实用程序都与 ERC721 非同质化代币标准 相关。
有关如何创建 ERC721 代币的演练,请阅读我们的 ERC721 指南。 |
EIP 由三个接口组成,在此处可以找到,分别是 IERC721
、IERC721Metadata
和 IERC721Enumerable
。只有第一个是在合约中符合 ERC721 标准所必需的。但是,所有三个都在 ERC721
中实现。
此外,IERC721Receiver
可用于防止代币永远锁定在合约中。想象一下将游戏内物品发送到无法发送回的交易所地址!使用 safeTransferFrom
时,代币合约会检查接收者是否为 IERC721Receiver
,这意味着它知道如何处理 ERC721
代币。如果你正在编写需要接收 ERC721
代币的合约,则需要包含此接口。
此外,还有多个自定义扩展,包括:
指定可以暂停所有用户的代币转账的地址(ERC721Pausable
)。
销毁自己的代币(ERC721Burnable
)。
这组核心合约旨在保持客观性,允许开发人员访问 ERC721 中的内部函数(例如 _mint ),并以他们喜欢的方式将其公开为外部函数。另一方面,ERC721 预设(例如 ERC721PresetMinterPauserAutoId )使用主观模式设计,以便为开发人员提供随时可用、可部署的合约。 |
IERC721
符合 ERC721 的合约的必需接口。
函数
IERC165
事件
balanceOf(address owner) → uint256 balance
external返回 owner
帐户中的代币数量。
ownerOf(uint256 tokenId) → address owner
external返回 tokenId
代币的所有者。
要求:
tokenId
必须存在。safeTransferFrom(address from, address to, uint256 tokenId)
external将 tokenId
代币从 from
安全地转移到 to
,首先检查合约接收者是否知道 ERC721 协议,以防止代币永远锁定。
要求:
from
不能为零地址。
to
不能为零地址。
tokenId
代币必须存在且归 from
所有。
如果调用者不是 from
,则必须已通过 approve
或 setApprovalForAll
允许其移动此代币。
如果 to
指的是智能合约,则它必须实现 IERC721Receiver.onERC721Received
,该合约在安全转移时被调用。
发出 Transfer
事件。
transferFrom(address from, address to, uint256 tokenId)
external将 tokenId
代币从 from
转移到 to
。
不建议使用此方法,请尽可能使用 safeTransferFrom 。 |
要求:
from
不能为零地址。
to
不能为零地址。
tokenId
代币必须归 from
所有。
如果调用者不是 from
,则必须已通过 approve
或 setApprovalForAll
批准其移动此代币。
发出 Transfer
事件。
approve(address to, uint256 tokenId)
external授予 to
将 tokenId
代币转账到另一个帐户的权限。
当代币被转移时,批准将被清除。
一次只能批准一个帐户,因此批准零地址会清除之前的批准。
要求:
调用者必须拥有代币或是经过批准的运营者。
tokenId
必须存在。
发出 Approval
事件。
getApproved(uint256 tokenId) → address operator
external返回为 tokenId
代币批准的帐户。
要求:
tokenId
必须存在。setApprovalForAll(address operator, bool _approved)
external批准或移除 operator
作为调用者的运营者。
运营者可以为调用者拥有的任何代币调用 transferFrom
或 safeTransferFrom
。
要求:
operator
不能是调用者。发出 ApprovalForAll
事件。
isApprovedForAll(address owner, address operator) → bool
external返回是否允许 operator
管理 owner
的所有资产。
safeTransferFrom(address from, address to, uint256 tokenId, bytes data)
external将 tokenId
代币从 from
安全地转移到 to
。
要求:
from
不能为零地址。
to
不能为零地址。
tokenId
代币必须存在且归 from
所有。
如果调用者不是 from
,则必须已通过 approve
或 setApprovalForAll
批准其移动此代币。
如果 to
指的是智能合约,则它必须实现 IERC721Receiver.onERC721Received
,该合约在安全转移时被调用。
发出 Transfer
事件。
Transfer(address from, address to, uint256 tokenId)
event当 tokenId
代币从 from
转移到 to
时发出。
Approval(address owner, address approved, uint256 tokenId)
event当 owner
允许 approved
管理 tokenId
代币时发出。
ApprovalForAll(address owner, address operator, bool approved)
event当 owner
允许或禁用(approved
)operator
管理其所有资产时发出。
IERC721Metadata
参见 https://learnblockchain.cn/docs/eips/EIPS/eip-721
函数
IERC721
IERC165
事件
IERC721
name() → string
external返回代币集合名称。
symbol() → string
external返回代币集合符号。
tokenURI(uint256 tokenId) → string
external返回 tokenId
代币的统一资源标识符 (URI)。
IERC721Enumerable
参见 https://learnblockchain.cn/docs/eips/EIPS/eip-721
函数
IERC721
IERC165
事件
IERC721
totalSupply() → uint256
external返回合约存储的代币总数。
tokenOfOwnerByIndex(address owner, uint256 index) → uint256 tokenId
external返回 owner
在其代币列表的给定 index
处拥有的代币 ID。
与 balanceOf
一起使用以枚举 owner
的所有代币。
tokenByIndex(uint256 index) → uint256
external返回合约存储的所有代币的给定 index
处的代币 ID。
与 totalSupply
一起使用以枚举所有代币。
ERC721
参见 https://learnblockchain.cn/docs/eips/EIPS/eip-721
函数
ERC165
事件
IERC721
constructor(string name_, string symbol_)
public通过将 name
和 symbol
设置为代币集合来初始化合约。
balanceOf(address owner) → uint256
publicownerOf(uint256 tokenId) → address
public参见 IERC721.ownerOf
。
name() → string
publicsymbol() → string
publictokenURI(uint256 tokenId) → string
publicbaseURI() → string
public返回通过 _setBaseURI
设置的基本 URI。这将自动作为前缀添加到 tokenURI
中每个代币的 URI,或者如果没有为该代币 ID 设置特定 URI,则添加到代币 ID。
tokenOfOwnerByIndex(address owner, uint256 index) → uint256
public参见 IERC721Enumerable.tokenOfOwnerByIndex
。
totalSupply() → uint256
public参见 IERC721Enumerable.totalSupply
。
tokenByIndex(uint256 index) → uint256
public参见 IERC721Enumerable.tokenByIndex
。
approve(address to, uint256 tokenId)
public参见 IERC721.approve
。
getApproved(uint256 tokenId) → address
publicsetApprovalForAll(address operator, bool approved)
publicisApprovedForAll(address owner, address operator) → bool
publictransferFrom(address from, address to, uint256 tokenId)
publicsafeTransferFrom(address from, address to, uint256 tokenId)
publicsafeTransferFrom(address from, address to, uint256 tokenId, bytes _data)
public_safeTransfer(address from, address to, uint256 tokenId, bytes _data)
internal将 tokenId
代币从 from
安全地转移到 to
,首先检查合约接收者是否知道 ERC721 协议,以防止代币永远锁定。
_data
是附加数据,它没有指定的格式,并在调用 to
时发送。
此内部函数等效于 safeTransferFrom
,并且可用于例如实施执行代币转账的替代机制,例如基于签名的方式。
要求:
from
不能为零地址。
to
不能为零地址。
tokenId
代币必须存在且归 from
所有。
如果 to
指的是智能合约,则它必须实现 [IERC721Receiver.onERC721Received
](https://docs.openzeppelin.com/contracts/3.x/api/token/erc721#IERC721Receiver-onERC72##### `_setBaseURI(string baseURI_)
internal`
用于设置所有 token ID 的基础 URI的内部函数。它会自动作为前缀添加到tokenURI
中返回的值,或者如果tokenURI
为空,则添加到 token ID。
`_approve(address to, uint256 tokenId)
internal`授权 to
操作 tokenId
触发一个Approval
事件。
`_beforeTokenTransfer(address from, address to, uint256 tokenId)
internal`在任何 token 转移之前调用的 Hook。 这包括 mint 和 burn。
调用条件:
当 from
和 to
都不为零时,from
的 tokenId
将被转移到 to
。
当 from
为零时,tokenId
将为 to
被 mint。
当 to
为零时,from
的 tokenId
将被 burn。
from
不能是零地址。
to
不能是零地址。
要了解有关 Hook 的更多信息,请访问 Using Hooks。
IERC721Receiver
任何想要支持来自 ERC721 资产合约的 safeTransfers 的合约的接口。
函数
onERC721Received(address operator, address from, uint256 tokenId, bytes data) → bytes4
external每当一个IERC721
的 tokenId
token 通过 operator
从 from
通过 IERC721.safeTransferFrom
转移到此合约时,将调用此函数。
它必须返回它的 Solidity selector 以确认 token 转移。如果返回任何其他值或接收者未实现该接口,则转移将被还原。
selector 可以在 Solidity 中使用 IERC721.onERC721Received.selector
获得。
ERC721Pausable
具有可暂停的 token 转移、mint 和 burn 的 ERC721 token。
适用于诸如在评估期结束前阻止交易,或者在发生重大错误时具有用于冻结所有 token 转移的紧急开关等情况。
函数
Pausable
ERC721
ERC165
Events
Pausable
IERC721
_beforeTokenTransfer(address from, address to, uint256 tokenId)
internal参见 ERC721._beforeTokenTransfer
。
要求:
ERC721Burnable
可以被不可逆转地烧毁(销毁)的 ERC721 Token。
函数
ERC721
ERC165
Events
IERC721
burn(uint256 tokenId)
publicBurns tokenId
. See ERC721._burn
.
要求:
tokenId
或被授权的操作者。ERC721Holder
IERC721Receiver
接口的实现。
接受所有 token 转移。
确保合约可以使用 IERC721.safeTransferFrom
,IERC721.approve
或 IERC721.setApprovalForAll
来使用它的 token。
函数
onERC721Received(address, address, uint256, bytes) → bytes4
public参见 IERC721Receiver.onERC721Received
。
始终返回 IERC721Receiver.onERC721Received.selector
。
- 原文链接: docs.openzeppelin.com/co...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!