Strukturen geben Fehler beim Erstellen von nft auf ropsten

Ich versuche, 10 zufällige NFTs mit verschiedenen Materialien mit Solidity Version 6 und Remix ide zu erstellen. Allerdings bekomme ich immer wieder folgende Fehler:

Contracts/bullrun_cards.sol:29:16: TypeError: Type struct MyNFT.Cards memory is not implizit konvertierbar in den erwarteten Typ struct MyNFT.Cards storage ref[] storage ref. card = Cards({supply:_supply, description:_desc,card_id:newNftTokenId}); ^------------------------------------------------------------- -------------^

Contracts/bullrun_cards.sol:30:35: TypeError: Type struct MyNFT.Cards storage ref[] storage ref ist nicht implizit in den erwarteten Typ struct MyNFT.Cards storage ref konvertierbar. allCards[newNftTokenId-1]=Karte;

Contracts/bullrun_cards.sol:31:15: TypeError: Integer-Konstante erwartet. Cards[newNftTokenId-1].push(card); ^---------------------^

Mein Code ist wie folgt:

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.12;

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/solc-0.6/contracts/token/ERC721/ERC721.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/solc-0.6/contracts/utils/Counters.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/solc-0.6/contracts/access/Ownable.sol";

contract MyNFT is ERC721, Ownable {
    
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds; //Counter is a struct in the Counters library
    uint constant total_supply =7777;
    
    constructor() ERC721("MyNFT", "MNFT") public {}
    
    struct Cards{
        uint supply;
        string description;
        uint card_id;
    }
    
    Cards[] public card;
    mapping(uint =>Cards)public allCards;
    
    function createCard(uint _supply, string memory _desc) public returns(uint){
        assert(_supply<total_supply);
        _tokenIds.increment();
        uint256 newNftTokenId = _tokenIds.current();
        card = Cards({supply:_supply, description:_desc,card_id:newNftTokenId});
        allCards[newNftTokenId-1]=card;
        Cards[newNftTokenId-1].push(card);
        
    }
    
    function mintToken( uint _s, string memory _d,  string memory _tokenURI) public onlyOwner
    {
        uint newid=createCard(_s, _d);
        address _address = msg.sender;
        _safeMint(_address, newid);
        _setTokenURI(newid, _tokenURI);
        
    }
}

Bitte helfen Sie mir bei der Lösung dieses Problems

Antworten (1)

Erstens verstehe ich nicht, warum Sie eine Token-ID mit einem Lieferwert verknüpfen. Wenn Sie einen Token übertragen, verwenden Sie die TokenId, was passiert dann mit der Lieferung? Geht es komplett an den neuen Eigentümer?

Dann deklarieren Sie eine öffentliche (keine gute Idee, halten Sie sie privat), Cards[] public carddie Sie beim Erstellen einer neuen Karte überschreiben ( card = Cards({supply:_supply, description:_desc,card_id:newNftTokenId});). Verwenden Sie vielleicht einen anderen Variablennamen, wie newCard oder _card oder was auch immer.

Eine andere Sache ist, wenn Sie die neue Karte zur Kartenliste hinzufügen möchten, tun Sie es nicht wie Cards[newNftTokenId-1].push(card);, Sie müssen die neue Karte in die cardEigenschaft schieben:card.push(_newCard)

Das Angebot ist etwas anderes, es ist nicht das, was Sie denken. Ich verfolge etwas anderes.