|
|
|
@ -122,17 +122,19 @@ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { |
|
|
|
|
uint256 lastTokenIndex = balanceOf(from); |
|
|
|
|
uint256 tokenIndex = _ownedTokensIndex[tokenId]; |
|
|
|
|
|
|
|
|
|
mapping(uint256 index => uint256) storage _ownedTokensByOwner = _ownedTokens[from]; |
|
|
|
|
|
|
|
|
|
// When the token to delete is the last token, the swap operation is unnecessary |
|
|
|
|
if (tokenIndex != lastTokenIndex) { |
|
|
|
|
uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; |
|
|
|
|
uint256 lastTokenId = _ownedTokensByOwner[lastTokenIndex]; |
|
|
|
|
|
|
|
|
|
_ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token |
|
|
|
|
_ownedTokensByOwner[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token |
|
|
|
|
_ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// This also deletes the contents at the last position of the array |
|
|
|
|
delete _ownedTokensIndex[tokenId]; |
|
|
|
|
delete _ownedTokens[from][lastTokenIndex]; |
|
|
|
|
delete _ownedTokensByOwner[lastTokenIndex]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|