Структуры, выдающие ошибку при создании nft на ropsten

Я пытаюсь создать 10 случайных nfts с разными расходными материалами, используя Solidity версии 6 и remix ide. Однако я продолжаю получать следующие ошибки:

Contracts/bullrun_cards.sol:29:16: TypeError: Type struct MyNFT.Cards memory не может быть неявно преобразована в ожидаемый тип 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 не может быть неявно преобразован в ожидаемый тип struct MyNFT.Cards storage ref. allCards[newNftTokenId-1]=карта;

Contracts/bullrun_cards.sol:31:15: TypeError: ожидается целочисленная константа. Карты[newNftTokenId-1].push(карта); ^-------------^

Мой код выглядит следующим образом:

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

пожалуйста, помогите мне в решении этого вопроса

Ответы (1)

Во-первых, я не понимаю, почему вы связываете идентификатор токена со значением предложения. Когда вы передаете токен, вы используете tokenId, тогда что будет с поставкой? Перейдет ли он целиком к новому владельцу?

Затем вы объявляете общедоступный (не очень хорошая идея, держите его закрытым) Cards[] public card, который вы перезаписываете при создании новой карты ( card = Cards({supply:_supply, description:_desc,card_id:newNftTokenId});). Возможно, используйте другое имя переменной, например, newCard или _card или что-то еще.

Другое дело, когда вы хотите добавить новую карточку в список карточек, не делайте этого так Cards[newNftTokenId-1].push(card);, вам нужно вставить новую карточку в cardсвойство:card.push(_newCard)

поставка - это что-то другое, это не то, что вы думаете. Я отслеживаю что-то еще.