You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合约B调用合约A的receive函数报ParserError,如何正确传msg.value?

Solidity合约调用receive函数报错解决方法

问题场景与报错

需求:调用合约B的fund函数时,让合约B调用合约A的payable函数并传递msg.value。编写的代码如下:

interface A {
    receive() external payable;
}

contract B {
    A a;
    constructor() {
        a = A("0xE9F920eE6F15739cc3b2Ac5Ea862C6eB9EEE529b");
    }

    function fund() public payable {
        a.receive();
    }
}

运行时触发解析错误:

ParserError: Expected identifier but got 'receive'
--> fallback/fallback.sol:12:11:
|
12 | a.receive();
| ^^^^^^^

解决方法

receive是Solidity的特殊回调函数(用于接收ETH),无法像普通函数那样直接调用。要实现向合约A传递ETH并触发receive,有两种可行方案:

方案1:使用call函数发送ETH

修改合约B的fund函数,通过call方法传递ETH并触发目标合约的receive:

function fund() public payable {
    (bool success, ) = address(a).call{value: msg.value}("");
    require(success, "ETH transfer failed");
}

这种方式是Solidity中推荐的合约间ETH转账方式:{value: msg.value}指定要传递的ETH金额,空字符串表示不调用具体函数,会自动触发合约A的receive(若存在)或fallback函数。

方案2:定义普通payable函数(合约A支持时)

如果合约A除了receive外,还提供了普通的payable函数(比如deposit),可以修改接口并调用该函数:

interface A {
    function deposit() external payable;
}

contract B {
    A a;
    constructor() {
        a = A("0xE9F920eE6F15739cc3b2Ac5Ea862C6eB9EEE529b");
    }

    function fund() public payable {
        a.deposit{value: msg.value}();
    }
}

注意:此方案要求合约A确实存在对应的payable函数,若仅存在receive,优先选择方案1。

核心原因

Solidity中的receive和fallback属于合约的默认回调逻辑,不属于可直接调用的普通函数,必须通过ETH转账操作触发。

内容的提问来源于stack exchange,提问作者Andrija Gajic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 16:24:19