合同中应支付的坚固性建设者

tbr*_*den 1 ethereum solidity smartcontracts

我有以下代码出现故障,无法从另一个合同创建应付合同。

pragma solidity ^0.4.16;

Contract Factory {
    uint contractCount = 0;
    mapping(uint => MyContract) public myContracts;

    function createContract(uint money) external payable {
        require(msg.value >= money);
        contractCount++;
        // the following line fails
        myContracts[contractCount] = new MyContract(money);
    }
}

Contract MyContract {
    uint money;

    function MyContract(uint _money) {
        require(msg.value >= _money);
        money = _money;
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 Remix IDE。我可以毫无问题地创建 Factory 实例,但是,当我尝试 createContract(money) 时,它无法创建新的 MyContract 实例。我怀疑这是因为调用的方式new MyContract()没有传输任何值,因此MyContract构造函数中的 require(msg.value >= _money) 失败。

那么如何从合约创建一个可支付构造函数的实例呢?

小智 6

对于那些仍然想解决这个问题的人。.value已被弃用,使用新语法的示例如下所示:

myContracts[contractCount] = (new MyContract){value: msg.value}(money);
Run Code Online (Sandbox Code Playgroud)


小智 5

首先,您需要让您的构造函数付费才能使其工作。

我怀疑这是因为调用 new MyContract() 的方法没有传输任何值,因此在 MyContract 构造函数中调用 require(msg.value >= _money) 失败。

你是对的。Solidity 这样做的语法有点不寻常。查看文档的这一部分。

child = (new B).value(10)(); //construct a new B with 10 wei
Run Code Online (Sandbox Code Playgroud)

如果构造函数接受参数,它们将放在附加到新表达式的最后一个括号中。

在您的示例中,它看起来像这样:

myContracts[contractCount] = (new MyContract).value(msg.value)(money);
Run Code Online (Sandbox Code Playgroud)