tokenURI的实现方式
  iQN3saqQGbmw 2023年11月02日 47 0

做数字藏品最重要的function是tokenURI(tokenId)。

实现1 基本路径+tokenID ERC721

```

function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    _requireMinted(tokenId);
    
    string memory baseURI = _baseURI();
    return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
}

```

没有配置基本路径(baseURI)时,tokenURI返回空,如果配置基本路径,则返回基本路径+tokenID的组合。

如果基本路径是 http://demo.com/meta/ 则可以返回 http://demo.com/meta/1 这样的tokenURI

注:若我们想返回带 .json 的 tokenURI ,我们可以重载这个函数

```

function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    _requireMinted(tokenId);
    
    string memory baseURI = _baseURI();
    return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(), ".json")) : "";
}

```

实现2 给每一个tokenID配上独立的tokenURI ERC721URIStorage

```

function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    _requireMinted(tokenId);

    string memory _tokenURI = _tokenURIs[tokenId];
    string memory base = _baseURI();

    // If there is no base URI, return the token URI.
    if (bytes(base).length == 0) {
        return _tokenURI;
    }
    // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
    if (bytes(_tokenURI).length > 0) {
        return string(abi.encodePacked(base, _tokenURI));
    }

    return super.tokenURI(tokenId);
}

```

我们用了一个变量 _tokenURIs 单独保存每一个token的uri

如果没有使用_baseURI配置,则函数返回全部tokenURI

如果使用了_baseURI配置,则拼接基本路径+tokenURI

在使用_baseURI的情况下,只要把每一个tokenURI配置成 {id}.json 也可获得 http://demo.com/meta/1.json 的格式

不过都需要_setTokenURI了,就不差配置全部url地址了

相对比下,如果不想在铸造的时候配置URI,选第一种方式还是比较简单的

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  tEcohMEyDsEb   2023年11月02日   98   0   0 JSON跨域上传图片
iQN3saqQGbmw