ERC721 - OpenZeppelin 文档

本文档介绍了OpenZeppelin Contracts库中与ERC721非同质化代币标准相关的接口、合约和实用程序。

你没有在阅读当前版本的文档。5.x 是当前版本。

ERC 721

最好在 https://docs.openzeppelin.com/contracts/api/token/erc721 查看此文档

这组接口、合约和实用程序都与 ERC721 非同质化代币标准 相关。

有关如何创建 ERC721 代币的演练,请阅读我们的 ERC721 指南

EIP 由三个接口组成,在此处可以找到,分别是 IERC721IERC721MetadataIERC721Enumerable。只有第一个是在合约中符合 ERC721 标准所必需的。但是,所有三个都在 ERC721 中实现。

此外,IERC721Receiver 可用于防止代币永远锁定在合约中。想象一下将游戏内物品发送到无法发送回的交易所地址!使用 safeTransferFrom 时,代币合约会检查接收者是否为 IERC721Receiver,这意味着它知道如何处理 ERC721 代币。如果你正在编写需要接收 ERC721 代币的合约,则需要包含此接口。

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

这组核心合约旨在保持客观性,允许开发人员访问 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,则必须已通过 approvesetApprovalForAll 允许其移动此代币。

  • 如果 to 指的是智能合约,则它必须实现 IERC721Receiver.onERC721Received,该合约在安全转移时被调用。

发出 Transfer 事件。

transferFrom(address from, address to, uint256 tokenId) external

tokenId 代币从 from 转移到 to

不建议使用此方法,请尽可能使用 safeTransferFrom

要求:

  • from 不能为零地址。

  • to 不能为零地址。

  • tokenId 代币必须归 from 所有。

  • 如果调用者不是 from,则必须已通过 approvesetApprovalForAll 批准其移动此代币。

发出 Transfer 事件。

approve(address to, uint256 tokenId) external

授予 totokenId 代币转账到另一个帐户的权限。 当代币被转移时,批准将被清除。

一次只能批准一个帐户,因此批准零地址会清除之前的批准。

要求:

  • 调用者必须拥有代币或是经过批准的运营者。

  • tokenId 必须存在。

发出 Approval 事件。

getApproved(uint256 tokenId) → address operator external

返回为 tokenId 代币批准的帐户。

要求:

  • tokenId 必须存在。
setApprovalForAll(address operator, bool _approved) external

批准或移除 operator 作为调用者的运营者。 运营者可以为调用者拥有的任何代币调用 transferFromsafeTransferFrom

要求:

  • operator 不能是调用者。

发出 ApprovalForAll 事件。

isApprovedForAll(address owner, address operator) → bool external

返回是否允许 operator 管理 owner 的所有资产。

参见 setApprovalForAll

safeTransferFrom(address from, address to, uint256 tokenId, bytes data) external

tokenId 代币从 from 安全地转移到 to

要求:

  • from 不能为零地址。

  • to 不能为零地址。

  • tokenId 代币必须存在且归 from 所有。

  • 如果调用者不是 from,则必须已通过 approvesetApprovalForAll 批准其移动此代币。

  • 如果 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 允许或禁用(approvedoperator 管理其所有资产时发出。

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

通过将 namesymbol 设置为代币集合来初始化合约。

balanceOf(address owner) → uint256 public

参见 IERC721.balanceOf

ownerOf(uint256 tokenId) → address public

参见 IERC721.ownerOf

name() → string public

参见 IERC721Metadata.name

symbol() → string public

参见 IERC721Metadata.symbol

tokenURI(uint256 tokenId) → string public

参见 IERC721Metadata.tokenURI

baseURI() → 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 public

参见 IERC721.getApproved

setApprovalForAll(address operator, bool approved) public

参见 IERC721.setApprovalForAll

isApprovedForAll(address owner, address operator) → bool public

参见 IERC721.isApprovedForAll

transferFrom(address from, address to, uint256 tokenId) public

参见 IERC721.transferFrom

safeTransferFrom(address from, address to, uint256 tokenId) public

参见 IERC721.safeTransferFrom

safeTransferFrom(address from, address to, uint256 tokenId, bytes _data) public

参见 IERC721.safeTransferFrom

_safeTransfer(address from, address to, uint256 tokenId, bytes _data) internal

tokenId 代币从 from 安全地转移到 to,首先检查合约接收者是否知道 ERC721 协议,以防止代币永远锁定。

_data 是附加数据,它没有指定的格式,并在调用 to 时发送。

此内部函数等效于 safeTransferFrom,并且可用于例如实施执行代币转账的替代机制,例如基于签名的方式。

要求:

用于设置所有 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。

调用条件:

  • fromto 都不为零时,fromtokenId 将被转移到 to

  • from 为零时,tokenId 将为 to 被 mint。

  • to 为零时,fromtokenId 将被 burn。

  • from 不能是零地址。

  • to 不能是零地址。

要了解有关 Hook 的更多信息,请访问 Using Hooks

IERC721Receiver

任何想要支持来自 ERC721 资产合约的 safeTransfers 的合约的接口。

函数

onERC721Received(address operator, address from, uint256 tokenId, bytes data) → bytes4 external

每当一个IERC721tokenId token 通过 operatorfrom 通过 IERC721.safeTransferFrom转移到此合约时,将调用此函数。

它必须返回它的 Solidity selector 以确认 token 转移。如果返回任何其他值或接收者未实现该接口,则转移将被还原。

selector 可以在 Solidity 中使用 IERC721.onERC721Received.selector 获得。

Extensions

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

Burns tokenId. See ERC721._burn.

要求:

  • 调用者必须拥有 tokenId 或被授权的操作者。

Convenience

ERC721Holder

IERC721Receiver 接口的实现。

接受所有 token 转移。 确保合约可以使用 IERC721.safeTransferFromIERC721.approveIERC721.setApprovalForAll 来使用它的 token。

函数

onERC721Received(address, address, uint256, bytes) → bytes4 public

参见 IERC721Receiver.onERC721Received

始终返回 IERC721Receiver.onERC721Received.selector

← ERC 20

ERC 777 →

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

0 条评论

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