调用super.owner()。transfer(msg.value)给出错误

时间:2019-05-15 17:42:57

标签: ethereum solidity open-zeppelin

我有一个合同是从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);

感谢您的帮助。

1 个答案:

答案 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