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

Solidity跨合约调用传递value时报function call failed to execute错误如何解决

问题排查与解决方案

你的IDefiAdapter接口定义完全符合要求,不需要调整接口,也不需要额外添加导入,调用失败和接口定义无关,问题出在转账逻辑的前置条件不满足。

核心原因

你在调用IDefiAdapter(defiAdapterAddress).deposit{value: amount}()时,value字段指定的金额是从Contract1的合约余额中扣除,再转给Contract2的,不是直接从用户发起的交易中直接扣。如果Contract1没有足够的ETH余额,转账就会直接失败抛出你遇到的报错。
你调用Contract1的deposit(uint256 amount)方法时,交易附带的ETH(也就是本次交易的msg.value)必须至少等于你传入的amount参数,否则Contract1没有足够的ETH转给Contract2,调用必然失败。

修复方案

你可以在Contract1的deposit方法中增加校验逻辑,避免余额不足的问题,参考代码如下:

function deposit(uint256 amount) payable public {
    // 校验用户发送的ETH足够覆盖要划转的金额
    require(msg.value >= amount, "Insufficient ETH sent to contract");
    // 可选校验:确认目标适配器地址是有效合约地址
    require(defiAdapterAddress.code.length > 0, "Invalid DefiAdapter address");
    
    IDefiAdapter(defiAdapterAddress).deposit{value: amount}();
    
    // 可选逻辑:多余的ETH原路退回给调用者
    if (msg.value > amount) {
        payable(msg.sender).transfer(msg.value - amount);
    }
}

其他排查方向

如果修复后还是报错,可以检查以下两点:

  • Contract2的deposit实现中是否有额外的msg.value校验规则,比如限制了固定金额,或者和其他参数绑定的校验
  • defiAdapterAddress是否填错为非合约地址或者零地址

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 12:54:03