我有一个合同是从Zeppelin的Ownable合同继承的。我的合同中有一个payFees()方法,有望将资金转移给合同的所有者。 payFees的定义如下
function payFees() public payable {
require(students.has(msg.sender), "DOES NOT HAVE STUDENT ROLE");
if(this.areFeesEnough(msg.value))
{
super.owner().transfer(msg.value);
studentFees[msg.sender] = true;
}
}
我希望给定super.owner()的调用返回合同所有者,因为owner()
是返回所有者的父Ownable
合同中的公共视图函数。不幸的是,代码因错误而失败。
TypeError: Member "transfer" not found or not visible after argument-dependent lookup in address.
super.owner().transfer(msg.value);
感谢您的帮助。
答案 0 :(得分:2)
假设您使用的Ownable
合同类似于https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/ownership/Ownable.sol,则问题是owner()
返回address
,但是从Solidity 0.5开始,您只能将醚转移到address payable
。
您可以通过先转换uint160
来进行转换,如下所示:
address(uint160(_owner)).transfer(msg.value);
请注意,您可以直接使用_owner
或致电owner()
。除非您在合同中覆盖了super.owner()
,并且需要确保调用父合同,否则无需调用owner
。