ソースを参照

Allow setting tokenURI for non-existent token (#4559)

Co-authored-by: Francisco <fg@frang.io>
Hadrien Croubois 2 年 前
コミット
00c5da2034

+ 5 - 0
.changeset/empty-cheetahs-hunt.md

@@ -0,0 +1,5 @@
+---
+'openzeppelin-solidity': major
+---
+
+`ERC721URIStorage`: Allow setting the token URI prior to minting.

+ 0 - 8
contracts/token/ERC721/extensions/ERC721URIStorage.sol

@@ -49,17 +49,9 @@ abstract contract ERC721URIStorage is IERC4906, ERC721 {
      * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
      *
      * Emits {MetadataUpdate}.
-     *
-     * Requirements:
-     *
-     * - `tokenId` must exist.
      */
     function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
-        if (_ownerOf(tokenId) == address(0)) {
-            revert ERC721NonexistentToken(tokenId);
-        }
         _tokenURIs[tokenId] = _tokenURI;
-
         emit MetadataUpdate(tokenId);
     }
 

+ 8 - 4
test/token/ERC721/extensions/ERC721URIStorage.test.js

@@ -50,10 +50,14 @@ contract('ERC721URIStorage', function (accounts) {
       });
     });
 
-    it('reverts when setting for non existent token id', async function () {
-      await expectRevertCustomError(this.token.$_setTokenURI(nonExistentTokenId, sampleUri), 'ERC721NonexistentToken', [
-        nonExistentTokenId,
-      ]);
+    it('setting the uri for non existent token id is allowed', async function () {
+      expectEvent(await this.token.$_setTokenURI(nonExistentTokenId, sampleUri), 'MetadataUpdate', {
+        _tokenId: nonExistentTokenId,
+      });
+
+      // value will be accessible after mint
+      await this.token.$_mint(owner, nonExistentTokenId);
+      expect(await this.token.tokenURI(nonExistentTokenId)).to.be.equal(sampleUri);
     });
 
     it('base URI can be set', async function () {