Tanjin Alam
Tanjin Alam

Reputation: 2496

solidity array mapping with array inside struct

Unable to execture createSchema function. It gives following error

revert The transaction has been reverted to the initial state. Note: The called function should be payable if you send value and the value you send should be less than your current balance. Debug the transaction to get more information.

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract Testing {

    struct Schema {
        mapping(string => string) entity;
    }

    struct SchemaMapping {
        // mapping(string => string) key;
        // mapping(string => string) value;
        string[] key;
        string[] value;
    }

    mapping(uint256 => Schema) schemas;
    mapping(uint256 => SchemaMapping[]) schemaMappings;

    function createSchema(uint256 id, string memory key, string memory value) public {
        SchemaMapping[] storage schemamapping = schemaMappings[id];

        schemamapping[id].key.push(key);
        schemamapping[id].value.push(value);

        schemas[id].entity[key] = value;
    }

    function getSchemaElemet(uint256 id) public view returns (SchemaMapping[] memory) {
        return schemaMappings[id];
    }
}

Upvotes: -2

Views: 616

Answers (1)

Antonio Carito
Antonio Carito

Reputation: 1387

I adjusted your smart contract. The issue in your original contract is that you were trying to add values into schemaMapping without create SchemaMapping at specific index.

Smart contract:

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

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract Testing {

    struct Schema {
        mapping(string => string) entity;
    }

    struct SchemaMapping {
        string[] key;
        string[] value;
    }

    mapping(uint256 => Schema) schemas;
    mapping(uint256 => SchemaMapping[]) schemaMappings;

    function createSchema(uint256 id, string memory key, string memory value) public {
        SchemaMapping[] storage schemamapping = schemaMappings[id];
        // NOTE: I created an empty space in storage for create object and after bind it with values.
        SchemaMapping storage singleSchemaItem = schemamapping.push();
        // NOTE: I put values inside keys
        singleSchemaItem.key.push(key);
        singleSchemaItem.value.push(value);

        schemas[id].entity[key] = value;
    }

    function getSchemaElemet(uint256 id) public view returns (SchemaMapping[] memory) {
        return schemaMappings[id];
    }
    
}

Upvotes: 1

Related Questions