diff --git a/.changeset/empty-cheetahs-hunt.md b/.changeset/empty-cheetahs-hunt.md new file mode 100644 index 00000000000..eb20381a68a --- /dev/null +++ b/.changeset/empty-cheetahs-hunt.md @@ -0,0 +1,5 @@ +--- +'openzeppelin-solidity': major +--- + +`ERC721URIStorage`: Allow setting the token URI prior to minting. diff --git a/contracts/token/ERC721/extensions/ERC721URIStorage.sol b/contracts/token/ERC721/extensions/ERC721URIStorage.sol index cd4845b7864..dbcf3d4e602 100644 --- a/contracts/token/ERC721/extensions/ERC721URIStorage.sol +++ b/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); } diff --git a/test/token/ERC721/extensions/ERC721URIStorage.test.js b/test/token/ERC721/extensions/ERC721URIStorage.test.js index 129515514c8..dc208d1eae0 100644 --- a/test/token/ERC721/extensions/ERC721URIStorage.test.js +++ b/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 () {