|
@@ -282,6 +282,9 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
|
|
|
|
|
|
_beforeTokenTransfer(address(0), to, tokenId);
|
|
|
|
|
|
+ // Check that tokenId was not minted by `_beforeTokenTransfer` hook
|
|
|
+ require(!_exists(tokenId), "ERC721: token already minted");
|
|
|
+
|
|
|
_balances[to] += 1;
|
|
|
_owners[tokenId] = to;
|
|
|
|
|
@@ -306,6 +309,9 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
|
|
|
|
|
|
_beforeTokenTransfer(owner, address(0), tokenId);
|
|
|
|
|
|
+ // Update ownership in case tokenId was transfered by `_beforeTokenTransfer` hook
|
|
|
+ owner = ERC721.ownerOf(tokenId);
|
|
|
+
|
|
|
// Clear approvals
|
|
|
delete _tokenApprovals[tokenId];
|
|
|
|
|
@@ -338,6 +344,9 @@ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
|
|
|
|
|
|
_beforeTokenTransfer(from, to, tokenId);
|
|
|
|
|
|
+ // Check that tokenId was not transfered by `_beforeTokenTransfer` hook
|
|
|
+ require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
|
|
|
+
|
|
|
// Clear approvals from the previous owner
|
|
|
delete _tokenApprovals[tokenId];
|
|
|
|