简体   繁体   English

为什么我的 NFT 元数据没有显示在 opensea 上?

[英]Why is my NFT metadata not showing on opensea?

I am developing a NFT contract on ETH using open Zeppelin, and reached the stage where, I am deploy on rinkeby.我正在使用开放式 Zeppelin 在 ETH 上开发 NFT 合约,并达到了部署在 rinkeby 上的阶段。 However there appears to an issue with the tokenURI and contractURI as the image and metadata is not showing on opensea.但是,由于图像和元数据未在 opensea 上显示,因此 tokenURI 和 contractURI 似乎存在问题。

I implement the tokenURI and ContractURI like this:我像这样实现 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");
    }
}

When run locally the return the tokenURI gives the following out put, which resolves to correct data in the browser:在本地运行时,返回 tokenURI 给出以下输出,解析为浏览器中的正确数据:

data:application/json;base64,eyJuYW1lIjogIkdpbGRlZCBBdHRpYyIsICJkZXNjcmlwdGlvbiI6ICJUaGUgQXN0cm9ub21lcidzIFN0dWRpbwpVbmRlciB0aGUgZG9tZSBpcyBhIHBsYW5ldHJpdW0gClJlc2VhcmNoZXMgdGhlIG9yaWdpbnMgb2YgdGhlIE1ldHJvcG9saXMiLCAiaW1hZ2UiOiAiaXBmczovL1FtWnc3NzY1ZG04aHBIRndITDl3b29RSkNzSkd6TFR3WTIyNjVDR1lpeFB3aUciLCAiYXR0cmlidXRlcyI6IFsgeyAidHJhaXRfdHlwZSI6ICJUb3dlciIsICJ2YWx1ZSI6IFRvd2VyIDEsICJ0cmFpdF90eXBlIjogIkRpc3RyaWN0IiwgInZhbHVlIjpIaWdoLUZseWVyLCAidHJhaXRfdHlwZSI6ICJuZWlnaGJvcmhvb2QiLCAidmFsdWUiOkZyZWUgQWxsZXkgUXVhcnRlcnMsXX0=

Any Ideas where I am going wrong?我哪里出错了?

Your JSON attributes array is formatted incorrectly, the values don't have double quotes surrounding them, and each item in the array should be an object with trait-type and value keys.您的 JSON 属性数组格式不正确,值周围没有双引号,并且数组中的每个项目都应该是 object 带有trait-typevalue键。

Current:当前的:

[ { "trait_type": "Tower", "value": Tower 1, "trait_type": "District", "value":High-Flyer, "trait_type": "neighborhood", "value":Free Alley Quarters,]

Should be:应该:

[
  {"trait_type":"Tower","value":"Tower 1"},
  {"trait_type":"District","value":"High-Flyer"},
  {"trait_type":"neighborhood","value":"Free Alley Quarters"}
]

This snippet should generate the correct output, although I haven't tested it.此代码段应生成正确的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM