tokenURI的实现方式
做数字藏品最重要的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的组合。
如果基本路径是 demo.com/meta/ 则可以返回 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 也可获得 demo.com/meta/1.json 的格式
不过都需要_setTokenURI了,就不差配置全部url地址了
相对比下,如果不想在铸造的时候配置URI,选第一种方式还是比较简单的
转载自:https://juejin.cn/post/7223670680826282041