Получение ошибки `Структура, содержащая (вложенное) отображение, не может быть построена.` в контракте солидности версии 0.7.0

#solidity #smartcontracts

Вопрос:

У меня проблема с solitidy >0.7.0, у меня есть структура в контракте под названием > Product . В Product , имеет свойство , называемое bids , bids является отображением. bids используется для записи каждой ставки на этот продукт. Когда я звоню addProductToStore , должен быть создан новый продукт. Однако, когда я вызываю «addProductToStore», появляется следующая ошибка.

 contracts/Store.sol:52:38: TypeError: Struct containing a (nested) mapping cannot be constructed.
            Product memory product = Product(
                                     ^ (Relevant source part starts here and spans across multiple lines).
 

Как я могу сохранить ставки Product и назвать магазин AddProductToStore успешным?

 uint public productIndex;
mapping (uint => address) productIdInStore;
mapping (address => mapping(uint => Product)) stores;

struct Product{
    uint id;
    string name;
    string category;
    string  imgLink;
    string descLink;
    uint auctionStartTime;
    uint auctionEndTime;
    uint startPrice;
    address highestBidder;
    uint highestBid;
    uint secondHighestBid;
    uint totalBids;
    ProductStatus status;
    ProductCondition condition;
    mapping (address => mapping(bytes32 => Bid)) bids;
}    

struct Bid{
    address bidder;
    uint productId;
    uint value;
    bool revealed;
}

constructor() public{
    productIndex = 0;
}

function addProductToStore(
    string calldata _name,
    string calldata _category,
    string calldata _imgLink,
    string calldata _descLink,
    uint _auctionStartTime,
    uint _auctionEndTime,
    uint _startPrice,
    uint _productCondition
) public{
        require(_auctionStartTime < _auctionEndTime);
        productIndex  = 1;
        Product memory product = Product(
            productIndex,
            _name,
            _category,
            _imgLink,
            _descLink,
            _auctionStartTime,
            _auctionEndTime,
            _startPrice,
            address(0),
            0,
            0,
            0,
            ProductStatus.Open,
            ProductCondition(_productCondition),
        );
        stores[msg.sender][productIndex]=product;
        productIdInStore[productIndex] = msg.sender;
}
 

Ответ №1:

Вы можете назначить product как storage переменную, а затем назначить каждого из struct участников по отдельности.

 pragma solidity ^0.8;

contract MyContract {
    uint public productIndex;
    mapping (address => mapping(uint => Product)) stores;

    struct Product {
        uint id;
        string name;
        string category;
        // ...
        mapping (address => mapping(bytes32 => Bid)) bids;
    }

    struct Bid {
        address bidder;
        // ...
    }

    function addProductToStore(
        string calldata _name,
        string calldata _category
        // ...
    ) external {
        productIndex  = 1;
        Product storage product = stores[msg.sender][productIndex];
        product.name = _name;
        product.category = _category;
        // ...
    }
}