определение базы должно предшествовать определению производного контракта

У меня есть два разных файла: Project1.sol и Project2.sol.

Project2.sol похож на:

import "./Project1.sol";
        
contract Project2{
    address newProject1Address =address(new Project1());
}

Project1.sol похож на:

import "./Project2.sol";

contract Project1 is Project2{

}

Я развернул Project1 внутри файла Project2.sol. А также я использовал структуру, которая находится в Project2 из файла Project1.sol.

Я получил ошибку: определение базы должно предшествовать определению производного контракта. для этой строки: contract Project1 is Project2{

После того, как я проверил ошибку в Интернете, были решения для двух контрактов и одного файла. Однако у меня было два файла.

Я объединил эти два контракта в файл.

Вот что я сделал:

pragma solidity >=0.7.0 <0.9.0;

contract Project2{

        Apple[] public applepies;
        
        struct Apple{
             string name;
             mapping (address => bool) applepie;
        }

        function createProject() external{
            
             address newProject1Address =address(new Project1(msg.sender));

             uint idx = applepies.length;
             applepies.push();
             Apple storage newProject = applepies[idx];
        }

        

    }


contract Project1 is Project2{
        address public creator;

        constructor (address creator1){
            
             creator= creator1;
        }

        function getDetails(uint index) public{
             Apple storage newv= applepies[index];
             //require(newv.applepie = msg.sender);
        }
}

Тогда я не смог развернуть Project1 из Project2. Когда я это делаю, это ошибка, которую я получил, циклическая ссылка для создания контракта (невозможно создать экземпляр производного или того же контракта) в этой части address newProject1Address =address(new Project1());

Что я должен делать? Ваши предложения?


person jazz kek    schedule 04.05.2021    source источник
comment
Не могли бы вы прояснить, что вы имеете в виду, говоря, что я развернул Project1 внутри файла Project2.sol? ... В этом нет особого смысла: 1) Контракт развертывается в сети, а не в файле. 2) Сообщение об ошибке и Project1 внутри Project2.sol предполагают, что у вас есть оба контракта, определенные в одном файле, но ваши примеры кода явно определяют два файла - Project1.sol и Project2.sol.   -  person Petr Hejda    schedule 04.05.2021
comment
@PetrHejda 1) Я исправил часть того, что я пытался сказать в посте 2) И добавил части, которые вы сказали. Не могли бы вы проверить это еще раз? Надеюсь, сейчас это более ясно. Извините за мой английский.   -  person jazz kek    schedule 04.05.2021
comment
Еще несколько вещей: 1) Какую версию Solidity вы используете? 2) function createProject{ выдает синтаксическую ошибку. Это действительно либо в какой-то очень старой версии, либо вы неправильно скопировали скобку (старая версия Solidity) и модификатор видимости (public, external, ...). Вы тоже можете это исправить?   -  person Petr Hejda    schedule 04.05.2021


Ответы (1)


Вы создаете экземпляр контракта внутри другого контракта, который наследует вызываемого объекта. Своего рода циркулярная ссылка.

Когда вы наследуете контракт (Project1) от базового контракта (Project 2), наследующий (Project1) должен быть тем, который выполняет вызовы. Ваш (Project2) контракт действует как базовый контракт. Наследующий контракт (Project1) может при необходимости вызывать или переопределять все функции в базовом контракте. Итак, вот мои предложения (это один из многих способов решить вашу проблему). См. ниже. Я скомпилировал и развернул, и он работает. Не забудьте указать адрес при развертывании. Надеюсь, это поможет. Если у вас есть другие вопросы, обращайтесь ко мне.

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
pragma experimental ABIEncoderV2;

contract Project2{

       
        
        struct Apple{
             string name;
             bool applepie;
             //mapping (address => bool) applepie;
        }
        
        Apple[] public applepies;
        Apple public newProject;
        
        constructor() {
            
             //address newProject1Address = address(new Project1(msg.sender));

             //uint idx = applepies.length;
             newProject = Apple("superApple", true);
             applepies.push(newProject);
        }

         function getNewProject() public view returns(string memory){
             return newProject.name;
        }

    }


contract Project1 is Project2{
        address public creator;

        constructor (address creator1){
            
             creator= creator1;
        }

        function getDetails(uint index) public view returns (string memory){
             Apple storage newv= applepies[index];
             //require(newv.applepie = msg.sender);
             return newv.name;
        }
}
person Abdoul Dia    schedule 07.05.2021