合约中的 solidity payable constructor
solidity payable constructor from contract
我有以下代码,该代码出现故障,无法从另一个合同创建应付合同。
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;
}
}
我正在使用 Remix IDE。我可以毫无问题地创建 Factory 实例,但是,当我尝试 createContract(money) 时,它无法创建新的 MyContract 实例。我怀疑这是因为调用 new MyContract()
的方法没有传递任何值,因此 MyContract
构造函数中的 require(msg.value >= _money) 失败了。
那么如何从合约创建一个 payable 构造函数的实例?
首先你需要让你的构造函数支付才能工作。
I suspect it is because the way to call new MyContract() is not transferring any value and thus fails the require(msg.value >= _money) in MyContract constructor.
你是对的。 Solidity 这样做的语法有些不寻常。查看文档的 this 部分。
child = (new B).value(10)(); //construct a new B with 10 wei
如果构造函数接受参数,它们将放在附加到新表达式的最后一个括号中。
在您的示例中,它看起来像这样:
myContracts[contractCount] = (new MyContract).value(msg.value)(money);
致那些仍在寻求解决此问题的人。 .value
已被弃用,使用新语法的示例如下所示:
myContracts[contractCount] = (new MyContract){value: msg.value}(money);
我有以下代码,该代码出现故障,无法从另一个合同创建应付合同。
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;
}
}
我正在使用 Remix IDE。我可以毫无问题地创建 Factory 实例,但是,当我尝试 createContract(money) 时,它无法创建新的 MyContract 实例。我怀疑这是因为调用 new MyContract()
的方法没有传递任何值,因此 MyContract
构造函数中的 require(msg.value >= _money) 失败了。
那么如何从合约创建一个 payable 构造函数的实例?
首先你需要让你的构造函数支付才能工作。
I suspect it is because the way to call new MyContract() is not transferring any value and thus fails the require(msg.value >= _money) in MyContract constructor.
你是对的。 Solidity 这样做的语法有些不寻常。查看文档的 this 部分。
child = (new B).value(10)(); //construct a new B with 10 wei
如果构造函数接受参数,它们将放在附加到新表达式的最后一个括号中。
在您的示例中,它看起来像这样:
myContracts[contractCount] = (new MyContract).value(msg.value)(money);
致那些仍在寻求解决此问题的人。 .value
已被弃用,使用新语法的示例如下所示:
myContracts[contractCount] = (new MyContract){value: msg.value}(money);