如何解决错误“函数调用中的参数类型无效。从地址到请求的应付地址的隐式转换无效”

GGb*_*bro 3 javascript blockchain solidity web3js remix

我在重新混合时遇到此错误:

函数调用中参数的类型无效。从地址到请求的应付地址的隐式转换无效

它指的是msg.sender下面的第 9 行。这是我正在编写的代码:

function startProject(
        string calldata title,
        string calldata description,
        uint durationInDays,
        uint amountToRaise
    ) external {
        uint raiseUntil = block.timestamp.add(durationInDays.mul(1 days));
Project newProject = new Project(
    msg.sender,
    title,
    description,
    raiseUntil,
    amountToRaise
);
projects.push(newProject);
Run Code Online (Sandbox Code Playgroud)

为什么我会收到此错误?我该如何解决?

Pet*_*jda 6

链接的代码包含contract Project及其 的定义 constructor

constructor
(
    address payable projectStarter,
    string memory projectTitle,
    string memory projectDesc,
    uint fundRaisingDeadline,
    uint goalAmount
) public {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

它接受address payable作为第一个参数。但是,默认情况下msg.sender并非如此payable(自 Solidity 0.8.0 起)。

解决方案:将其类型转换addressaddress payable

Project newProject = new Project(
    // `msg.sender` is of type `address` - typecasting to `address payable`
    payable(msg.sender),
    title,
    description,
    raiseUntil,
    amountToRaise
);
Run Code Online (Sandbox Code Playgroud)