设置token URI功能

问题描述 投票:0回答:1

我了解到 setTokenURI 函数不再使用。如何更改我想要创建的 NFT 代币的代币 URI? 现在我在智能合约中的函数 createCollectible 看起来像这样:

function createCollectible(string memory tokenURI)
    public
    returns (uint256)
{
    uint256 newItemId = tokenId;
    _safeMint(msg.sender, newItemId);
    _setTokenURI(newItemId, tokenURI);
    tokenId = tokenId + 1;
    return newItemId;
}
ethereum solidity smartcontracts nft erc721
1个回答
5
投票

_setTokenURI
仍然使用,但已移至
ERC721URIStorage
。这是 openzeppelin 链接

当您创建合约时,您应该继承:

contract NFT is ERC721URIStorage { }

由于称其为昂贵的操作,团队希望您在

tokenUri
中使用
ERC721
函数:

function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

这是从

_baseUri()
继承的
ERC721
。它是
virtual
,因此您可以在
override
ERC721URIStorage
并将其从“”更改为您想要的任何内容。

function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

这次需要继承自

ERC721

 contract NFT is ERC721{
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
       require(_exists(tokenId), "...");
       _tokenURIs[tokenId] = _tokenURI;
           }
   }

它们都有不同的用例:在此讨论

© www.soinside.com 2019 - 2024. All rights reserved.