[英]Why is my NFT metadata not showing on opensea?
我正在使用開放式 Zeppelin 在 ETH 上開發 NFT 合約,並達到了部署在 rinkeby 上的階段。 但是,由於圖像和元數據未在 opensea 上顯示,因此 tokenURI 和 contractURI 似乎存在問題。
我像這樣實現 tokenURI 和 ContractURI:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.1;
import "hardhat/console.sol";
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
//access control
import "@openzeppelin/contracts/access/Ownable.sol";
// Helper functions OpenZeppelin provides.
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "./libraries/Base64.sol";
contract MetropolisWorldGenesis is ERC721, Ownable {
....
string private _contractURI;
function contractURI() public view returns (string memory) {
return _contractURI;
}
function tokenURI(uint256 _tokenId) public view override returns (string memory) {
PropertyAttributes memory propAttributes = nftHolderAttributes[_tokenId];
string memory json = Base64.encode(
abi.encodePacked(
'{"name": "',
propAttributes.name,
'", "description": "',propAttributes.description,'", "image": "',
propAttributes.image,
'", "attributes": [ { "trait_type": "Tower", "value": ',propAttributes.properties.tower,', "trait_type": "District", "value":',propAttributes.properties.district, ', "trait_type": "neighborhood", "value":',propAttributes.properties.neighborhood,',]}'
)
);
string memory output = string(
abi.encodePacked("data:application/json;base64,", json)
);
return output;
}
function setContractURI(
string memory name, string memory desc,
string memory image,string memory link,
uint royalty) public onlyOwner() {
string memory x = Base64.encode(
abi.encodePacked(
'{"name": "',
name,
'", "description": "',
desc,
'", "image": "',
image,
'", "external_link": "',
link,
'","seller_fee_basis_points":"', royalty, // 100 Indicates a 1% seller fee
'", "fee_recipient": "0xA97F337c39cccE66adfeCB2BF99C1DdC54C2D721" }' // Where seller fees will be paid to.}
)
);
_contractURI = string(abi.encodePacked(
"data:application/json;base64,", x
));
console.log("contract uri updated");
}
}
在本地運行時,返回 tokenURI 給出以下輸出,解析為瀏覽器中的正確數據:
data:application/json;base64,eyJuYW1lIjogIkdpbGRlZCBBdHRpYyIsICJkZXNjcmlwdGlvbiI6ICJUaGUgQXN0cm9ub21lcidzIFN0dWRpbwpVbmRlciB0aGUgZG9tZSBpcyBhIHBsYW5ldHJpdW0gClJlc2VhcmNoZXMgdGhlIG9yaWdpbnMgb2YgdGhlIE1ldHJvcG9saXMiLCAiaW1hZ2UiOiAiaXBmczovL1FtWnc3NzY1ZG04aHBIRndITDl3b29RSkNzSkd6TFR3WTIyNjVDR1lpeFB3aUciLCAiYXR0cmlidXRlcyI6IFsgeyAidHJhaXRfdHlwZSI6ICJUb3dlciIsICJ2YWx1ZSI6IFRvd2VyIDEsICJ0cmFpdF90eXBlIjogIkRpc3RyaWN0IiwgInZhbHVlIjpIaWdoLUZseWVyLCAidHJhaXRfdHlwZSI6ICJuZWlnaGJvcmhvb2QiLCAidmFsdWUiOkZyZWUgQWxsZXkgUXVhcnRlcnMsXX0=
我哪里出錯了?
您的 JSON 屬性數組格式不正確,值周圍沒有雙引號,並且數組中的每個項目都應該是 object 帶有trait-type
和value
鍵。
當前的:
[ { "trait_type": "Tower", "value": Tower 1, "trait_type": "District", "value":High-Flyer, "trait_type": "neighborhood", "value":Free Alley Quarters,]
應該:
[
{"trait_type":"Tower","value":"Tower 1"},
{"trait_type":"District","value":"High-Flyer"},
{"trait_type":"neighborhood","value":"Free Alley Quarters"}
]
此代碼段應生成正確的 output,但我尚未對其進行測試。
string memory json = Base64.encode(
abi.encodePacked(
'{"name":"', propAttributes.name,
'","description":"',propAttributes.description,
'","image":"', propAttributes.image,
'","attributes":[{"trait_type":"Tower","value":"', propAttributes.properties.tower, '"},{"trait_type":"District","value":"', propAttributes.properties.district, '"},{"trait_type": "neighborhood","value":"', propAttributes.properties.neighborhood, '"}]}'
)
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.