Merge branch 'erc721-approve-0' into refactor/erc721-update-fnPointer

This commit is contained in:
Hadrien Croubois
2023-07-12 13:46:07 +02:00

View File

@ -114,12 +114,10 @@ abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Er
*/ */
function approve(address to, uint256 tokenId) public virtual { function approve(address to, uint256 tokenId) public virtual {
address owner = ownerOf(tokenId); address owner = ownerOf(tokenId);
if (to == owner) { address caller = _msgSender();
revert ERC721InvalidOperator(owner);
}
if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { if (owner != caller && !isApprovedForAll(owner, caller)) {
revert ERC721InvalidApprover(_msgSender()); revert ERC721InvalidApprover(caller);
} }
_approve(to, tokenId); _approve(to, tokenId);
@ -131,7 +129,7 @@ abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Er
function getApproved(uint256 tokenId) public view virtual returns (address) { function getApproved(uint256 tokenId) public view virtual returns (address) {
_requireMinted(tokenId); _requireMinted(tokenId);
return _tokenApprovals[tokenId]; return _getApproved(tokenId);
} }
/** /**
@ -200,6 +198,13 @@ abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Er
return _ownerOf(tokenId) != address(0); return _ownerOf(tokenId) != address(0);
} }
/**
* @dev Returns the approved address for `tokenId`. Returns 0 if `tokenId` is not minted.
*/
function _getApproved(uint256 tokenId) internal view virtual returns (address) {
return _tokenApprovals[tokenId];
}
/** /**
* @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in * @dev Returns whether `spender` is allowed to manage `owner`'s tokens, or `tokenId` in
* particular (ignoring whether it is owned by `owner`). * particular (ignoring whether it is owned by `owner`).
@ -378,8 +383,12 @@ abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Er
* Emits an {Approval} event. * Emits an {Approval} event.
*/ */
function _approve(address to, uint256 tokenId) internal virtual { function _approve(address to, uint256 tokenId) internal virtual {
address owner = ownerOf(tokenId);
if (to == owner) {
revert ERC721InvalidOperator(to);
}
_tokenApprovals[tokenId] = to; _tokenApprovals[tokenId] = to;
emit Approval(ownerOf(tokenId), to, tokenId); emit Approval(owner, to, tokenId);
} }
/** /**
@ -388,8 +397,8 @@ abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Er
* Emits an {ApprovalForAll} event. * Emits an {ApprovalForAll} event.
*/ */
function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { function _setApprovalForAll(address owner, address operator, bool approved) internal virtual {
if (owner == operator) { if (operator == owner || operator == address(0)) {
revert ERC721InvalidOperator(owner); revert ERC721InvalidOperator(operator);
} }
_operatorApprovals[owner][operator] = approved; _operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved); emit ApprovalForAll(owner, operator, approved);