Estructuras que dan error al crear nft en ropsten

Estoy tratando de crear 10 nfts aleatorios con diferentes suministros usando solidity versión 6 y remix ide. Sin embargo, sigo recibiendo los siguientes errores:

contract/bullrun_cards.sol:29:16: TypeError: Type struct MyNFT.Cards memory no se puede convertir implícitamente al tipo esperado struct MyNFT.Cards storage ref[] storage ref. card = Cards({suministro:_suministro, descripción:_desc,card_id:newNftTokenId}); ^------------------------------------------------- -------------^

contract/bullrun_cards.sol:30:35: TypeError: Type struct MyNFT.Cards storage ref[] la referencia de almacenamiento no se puede convertir implícitamente al tipo esperado struct MyNFT.Cards storage ref. allCards[newNftTokenId-1]=tarjeta;

contract/bullrun_cards.sol:31:15: TypeError: constante entera esperada. Tarjetas[nuevoNftTokenId-1].push(tarjeta); ^---------------^

Mi código es el siguiente:

// 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);
        
    }
}

por favor amablemente ayúdame a resolver este problema

Respuestas (1)

Primero, no veo por qué vincula una ID de token con un valor de suministro. Cuando transfiere un token, usa el tokenId, entonces, ¿qué sucederá con el suministro? ¿Irá íntegramente al nuevo propietario?

Luego declara un público (no es una buena idea, manténgalo privado) Cards[] public cardque sobrescribe al crear una nueva tarjeta ( card = Cards({supply:_supply, description:_desc,card_id:newNftTokenId});). Tal vez use otro nombre de variable, como newCard o _card, o lo que sea.

Otra cosa es cuando desea agregar la nueva tarjeta a la lista de tarjetas, no lo haga como Cards[newNftTokenId-1].push(card);, debe empujar la nueva tarjeta a la cardpropiedad:card.push(_newCard)

el suministro es otra cosa, no es lo que estás pensando. Estoy rastreando algo más.