【问题标题】:Send and transfer are only available for objects of type address payable , not address发送和转移仅适用于地址类型的对象,而不是地址。
【发布时间】:2022-01-21 12:04:24
【问题描述】:
function withdraw() public payable {
  msg.sender.transfer(address(this).balance);
}

我写了这段代码,我得到“错误发送和传输仅适用于地址类型的对象,而不是地址。”。

【问题讨论】:

  • 您觉得我的回答有帮助吗,还是需要更多帮助?

标签: cryptography blockchain ethereum solidity


【解决方案1】:
   address payable private owner;

然后在构造函数中设置所有者为 msg.sender:

constructor() {
    setOwner(msg.sender);
  }

这是 setOwner:

function setOwner(address newOwner) private {
    owner = payable(newOwner);
  }

这是提现功能:

 function withdraw() external onlyOwner {
     (bool success,)=owner.call{value:address(this).balance}("");
    // if it is not success, throw error
     require(success,"Transfer failed!");
   }

确保只有所有者可以调用它,所以写一个修饰符:

 modifier onlyOwner() {
    if (msg.sender != getContractOwner()) {
      revert OnlyOwner();
    }
    _;
  }

revert OnlyOwner 正在使用新版本的solidity 发送自定义消息:

/// Only owner has an access!
  error OnlyOwner();

【讨论】:

    【解决方案2】:

    来自文档:

    地址类型有两种风格,基本相同:

    • 地址:保存一个 20 字节的值(以太坊地址的大小)。
    • 应付地址:与地址相同,但有其他成员 > 转移和发送。

    您需要将其转换为 address payable 类型才能使用 sendtransfer 方法。详情请见https://docs.soliditylang.org/en/v0.8.11/types.html#address

    【讨论】:

      【解决方案3】:

      只有payable address 类型有transfer 方法。 msg.senderaddress 类型,因此您需要将其转换为 payable

      payable(msg.sender).transfer(address(this).balance);
      

      【讨论】:

        猜你喜欢
        • 2021-09-12
        • 2015-03-26
        • 1970-01-01
        • 2021-05-11
        • 2012-08-15
        • 1970-01-01
        • 2014-09-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多