Я пытаюсь создать 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);
}
}
пожалуйста, помогите мне в решении этого вопроса
Во-первых, я не понимаю, почему вы связываете идентификатор токена со значением предложения. Когда вы передаете токен, вы используете tokenId, тогда что будет с поставкой? Перейдет ли он целиком к новому владельцу?
Затем вы объявляете общедоступный (не очень хорошая идея, держите его закрытым) Cards[] public card
, который вы перезаписываете при создании новой карты ( card = Cards({supply:_supply, description:_desc,card_id:newNftTokenId});
). Возможно, используйте другое имя переменной, например, newCard или _card или что-то еще.
Другое дело, когда вы хотите добавить новую карточку в список карточек, не делайте этого так Cards[newNftTokenId-1].push(card);
, вам нужно вставить новую карточку в card
свойство:card.push(_newCard)
мзаиди