ERC Standards¶
约 600 个字 133 行代码 预计阅读时间 4 分钟
ERC-20¶
ERC-721¶
Events¶
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
- Emitted when
tokenId
token is transferred fromfrom
toto
.
- Emitted when
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
- Emitted when
owner
enablesapproved
to manage thetokenId
token.
- Emitted when
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
- Emitted when
owner
enables or disables (approved
)operator
to manage all of its assets.
- Emitted when
Approve¶
function approve(address to, uint256 tokenId) public virtual;
- 作用:授权
tokenId
给to
。 - 细节:见
_approve
,只有在需要发出事件(emitEvent
为真)或者授权者不为 0 时才读取所有者,这时候会检查代币拥有者是否是授权者、auth
是否被代币的拥有者授权,这两个条件均不满足就会抛出异常。我们经常使用的approve
函数就默认了emitEvent
为真,这时候会仔细检查授权情况。在最后将_tokenApprovals[tokenId]
设置为to
。 - 实现:
- 作用:授权
function setApprovalForAll(address operator, bool approved) public virtual;
- 实现:
- 实现:
Inquire¶
-
function balanceOf(address owner) public view virtual returns (uint256);
-
function ownerOf(uint256 tokenId) public view virtual returns (address);
-
function getApproved(uint256 tokenId) public view virtual returns (address);
- 作用:查询 tokenId 的授权者,也就是返回
_tokenApprovals[tokenId]
,同时要求该代币存在(拥有者不为 0)。 - 实现:
- 作用:查询 tokenId 的授权者,也就是返回
function isApprovedForAll(address owner, address operator) public view virtual returns (bool);
- 实现:
Check¶
function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool);
- 作用:检查
spender
是否有权限操作tokenId
,但是不抛出异常。 - 细节:要求
spender
不为 0,同时需要下面三个要求满足其一:owner
与spender
相同,拥有者自然有权操纵代币;owner
授权给spender
,全局授权,spender
可以操纵owner
的所有代币;tokenId
的授权者是spender
。
- 实现:
- 作用:检查
function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual;
- 作用:检查
spender
是否有权限操作tokenId
,如果没有就抛出异常。 - 细节:首先调用
_isAuthorized
检查权限,如果没有权限就抛出异常,异常分为两种情况:owner
为 0,代币不存在,抛出ERC721NonexistentToken
异常;owner
为 0,代币存在,但是spender
没有权限,抛出ERC721InsufficientApproval
异常,在做 SchoolBus Safe NFT 一题的过程中遇见最多的就是这个异常。
- 实现:
- 作用:检查
function _update(address to, uint256 tokenId, address auth) internal virtual returns (address);
- 实现:
- 实现:
function _requireOwned(uint256 tokenId) internal view virtual returns (address);
- 作用:检查 tokenId 是否存在,如果不存在(也就是拥有者为地址 0)就抛出异常。
- 实现:
Transfer¶
function transferFrom(address from, address to, uint256 tokenId) public virtual;
- 实现:
- 实现:
function safeTransferFrom(address from, address to, uint256 tokenId) public;
- 实现:
- 实现: