首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向所有者发送应付款函数的可靠值:“发送和转移只适用于类型为‘地址应付’的对象,而不是地址。”

向所有者发送应付款函数的可靠值:“发送和转移只适用于类型为‘地址应付’的对象,而不是地址。”
EN

Ethereum用户
提问于 2021-10-28 16:54:33
回答 1查看 1.1K关注 0票数 1

简单的测试/用例,有一个应付款函数,应该直接把钱寄给所有者。我得到了错误,就像标题一样。代码:

代码语言:javascript
复制
address private owner;
    
    constructor() {
        owner = msg.sender;
    }

function makePay() public payable {
        owner.transfer(msg.value);
    } 

现在,如果我尝试声明address private payable owner;,就会得到错误Expected identifier but got payable

另外,如果我尝试address payable private owner;,然后在构造函数中得到错误type address is not implicitly convertible to expected type address payable

我怎么才能解决这个问题?我在这里缺少的基本原则是什么?新知识和新知识,谢谢。

EN

回答 1

Ethereum用户

回答已采纳

发布于 2021-10-28 17:48:52

最近版本(>0.8.0)的正确语法是:

代码语言:javascript
复制
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;

contract YourContract {
    address payable private owner;
    
    constructor() {
        owner = payable(msg.sender);
    }

    function makePay() public payable {
        owner.transfer(msg.value);
    } 
}

另外,如果我尝试地址支付私人所有者;那么在我的构造函数中,错误类型地址不能隐式转换为预期类型地址。

这是因为msg.sender的类型是地址,而不是默认的应付款地址。您必须将地址显式标记为按设计支付的地址。如本例所示,您将msg.sender变量转换为使用应付款(Your_address)的应付款地址类型。

您还可以将演员阵容推迟到实际需要的时候:

代码语言:javascript
复制
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;

contract YourContract {
    address private owner;

    constructor() {
        owner = msg.sender;
    }

    function makePay() public payable {
        payable(owner).transfer(msg.value);
    } 
}

最基本的原则是,由于您要传输有价值的令牌,所以定义语言时必须显式地允许它这样做。

票数 2
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/112430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档