Solidity工厂合约创建可支付合约报错问题求助
问题分析与解决方案
嘿,这个问题我遇过,马上给你捋清楚!核心问题出在创建新合约时没有传递ETH,导致MyContract的构造函数校验直接失败。
核心问题拆解
- 你的
Factory合约createContract函数是payable的,也做了msg.value ≥ money的校验,这一步没问题,用户确实把ETH转到了Factory合约里。 - 但执行
new MyContract(money)时,默认不会给新合约的构造函数传递任何ETH,此时MyContract构造函数里的msg.value是0,直接触发了require(msg.value > ...)的校验规则,导致合约创建交易直接回滚。
修正后的完整代码
Factory合约(关键改动点)
要在创建合约时通过.value()语法传递指定金额的ETH:
pragma solidity ^0.4.16; contract Factory { uint public contractCount; mapping(uint => MyContract) public myContracts; function createContract(uint money) external payable { require(msg.value >= money, "Insufficient ETH sent to Factory"); contractCount++; // 重点:添加.value(money)将ETH传递给MyContract构造函数 myContracts[contractCount] = new MyContract.value(money)(money); } }
MyContract合约(示例完整逻辑)
假设你的构造函数校验逻辑是这样的,修正后就能正常通过:
pragma solidity ^0.4.16; contract MyContract { uint public requiredMoney; constructor(uint _money) payable public { // 现在msg.value等于Factory传递的money,满足校验 require(msg.value == _money, "ETH amount does not match required value"); requiredMoney = _money; } }
关键改动说明
在Solidity 0.4.x版本中,给新创建的合约传递ETH需要使用.value(amount)的语法,放在合约名称和构造函数参数之间。这样MyContract构造函数中的msg.value就会等于你指定的money,刚好满足构造函数的校验条件,合约就能成功创建了。
内容的提问来源于stack exchange,提问作者3tbraden
相关产品推荐
相关产品推荐

