1

我有一个继承自 Open 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);

任何帮助表示赞赏。谢谢。

4

1 回答 1

3

假设Ownable您使用的合同类似于https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/ownership/Ownable.sol,问题是owner()返回一个address,但从 Solidity 0.5 开始,您只能将 ether 转移到address payable.

您可以通过uint160先转换来转换,如下所示:

address(uint160(_owner)).transfer(msg.value);

请注意,您可以直接使用_owner或调用owner(). super.owner()除非您owner在合同中被覆盖并且需要确保调用父合同,否则无需调用。

于 2019-05-15T21:53:22.170 回答