// 获取owner地址代币数量
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: address zero is not a valid owner");
return _balances[owner];
}
function approve(address to, uint256 tokenId) public virtual override {
// 获取token的owner地址
address owner = ERC721.ownerOf(tokenId);
// 检查 to 和 owner 不相等
require(to != owner, "ERC721: approval to current owner");
// 检查 合约调用者是owner 或者 合约调用者获得了owner的授权approve
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not token owner or approved for all"
);
// 授权
_approve(to, tokenId);
}
getApproved function
// 获取token的approve地址
function getApproved(uint256 tokenId) public view virtual override returns (address) {
// 检查token是否存在
_requireMinted(tokenId);
return _tokenApprovals[tokenId];
}
setApprovalForAll function
// 设置 给operator的授权情况
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), operator, approved);
}
isApprovedForAll function
// 判断 owner是否授权给operate
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
transferFrom function
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
//检查 合约调用者是否是token的拥有者或者被授权approve
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
// 转移token
_transfer(from, to, tokenId);
}
safeTransferFrom function
// 转移token
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
safeTransferFrom function
// 转移函数
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory data
) public virtual override {
//检查 合约调用者是否是token的拥有者或者被授权approve
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
_safeTransfer(from, to, tokenId, data);
}
_safeTransfer function
// 转移token
function _safeTransfer(
address from,
address to,
uint256 tokenId,
bytes memory data
) internal virtual {
_transfer(from, to, tokenId);
// 检查合约地址是否实现ERC721Receiver
require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
}
// 铸造token
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
_safeMint function
// 铸造token
function _safeMint(
address to,
uint256 tokenId,
bytes memory data
) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
_mint function
// 铸造token
function _mint(address to, uint256 tokenId) internal virtual {
// 检查to不为空地址
require(to != address(0), "ERC721: mint to the zero address");
// 检查token是否存在
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId);
// to地址余额+1
_balances[to] += 1;
// 添加映射
_owners[tokenId] = to;
// 触发 Transfer事件
emit Transfer(address(0), to, tokenId);
_afterTokenTransfer(address(0), to, tokenId);
}