设置令牌 URI 函数

发布于 2025-01-09 17:09:09 字数 365 浏览 1 评论 0原文

我了解到 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;
}

I understood that setTokenURI function isn't in use anymore. How can I change the token URI of the NFT token I want to create?
for now my function createCollectible inside the smart contract looks like this:

function createCollectible(string memory tokenURI)
    public
    returns (uint256)
{
    uint256 newItemId = tokenId;
    _safeMint(msg.sender, newItemId);
    _setTokenURI(newItemId, tokenURI);
    tokenId = tokenId + 1;
    return newItemId;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

失与倦" 2025-01-16 17:09:09

_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())) : "";
    }

这是从ERC721继承的_baseUri()。它是虚拟的,因此您可以在 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;
           }
   }

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

_setTokenURI is still used but it is moved to the ERC721URIStorage. Here is the openzeppelin link

When you create your contract, you should inherit:

contract NFT is ERC721URIStorage { }

Since calling it an expensive operation, team wants you to use tokenUri function in 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())) : "";
    }

this is _baseUri() which is inherited from ERC721. It is virtual so that you can override it inside ERC721URIStorage and change it from "" to anything you want.

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

this time you need to inherit from ERC721

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

They both have different use cases: Discussed Here

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文