类工厂智能合约的构造函数不断恢复

Constructor of factory-like smart contract keeps reverting

我正在使用 2 个合同,一个管理用户对特定足球比赛的投注,另一个(工厂风格)生成这些单独的合同以单独管理。

Generator 合约是这样的:

pragma solidity ^0.8.0;

contract Generator {
    address immutable public owner;
    string public matchGenerated;
    Management[] public bettingHistory;

    constructor(string memory _league, string memory _match) {
        owner = msg.sender;
        matchGenerated = string(abi.encodePacked(_league, "_", _match));
        Management newBetContract = new Management(address(this));
        bettingHistory.push(newBetContract);
    }
}

管理合约从生成器接收数据以定义管理器和匹配值,如下(简短版本):

contract Management {
    address payable immutable public manager;

    string public matchDispute;
    
    Generator generator;

    constructor(address _contract) {
        generator = Generator(_contract);
        manager = payable(generator.owner());
        matchDispute = generator.matchGenerated();
    }

一旦我尝试在 Remix 中部署 Generator 合约,它就会导致恢复错误。如果我删除管理合同中的生成器实例并在两个合同中重复构造函数参数,它会起作用,但我想避免冗余并自动获取已存储在生成器变量中的值。

要使用接口实现上述内容,您的解决方案如下:

Generator.sol 文件

pragma solidity ^0.8.0;

contract Generator {
    address immutable public owner;
    string public matchGenerated;
    Management[] public bettingHistory;

    constructor(string memory _league, string memory _match) {
        owner = msg.sender;
        matchGenerated = string(abi.encodePacked(_league, "_", _match));
        Management newBetContract = new Management(address(this));
        bettingHistory.push(newBetContract);
    }
}

我Generator.sol 文件

 pragma solidity ^0.8.0;
 interface IGenerator{
     function owner() external view returns (address);
     function matchGenerated() external view returns (string)
 }

Management.sol 文件

pragma solidity ^0.8.0;

import "IGenerator.sol";

contract Management {
address payable immutable public manager;

string public matchDispute;

constructor(address _contract) {
    manager = payable(IGenerator(_contract).owner());
    matchDispute = IGenerator(_contract).matchGenerated();
}

如你所见,我把管理需要的Generator的所有功能都暴露出来了,并且把两者的定义分开了。尝试一下,看看它是否有效,如果无效,让我们知道新的错误消息是什么。