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

如何解决Solidity Sender合约调用Deposit函数无交易value的问题?

Sender合约调用Bank存款无value传入问题分析与解决

问题描述

现有Bank存款合约,在Remix中直接调用deposit函数并输入value可正常完成存款。但编写Sender合约通过接口调用时,调用sendDeposit函数后交易中无value值,无法完成存款操作。

Bank合约代码

pragma solidity ^0.8.0;

contract bank {
    uint256 public amountIn;
    function deposit() external payable returns(uint256) {
        amountIn = msg.value ;
        return amountIn;
    }
}

原始Sender合约代码

pragma solidity ^0.8.0;

interface Receiver {
    function deposit() external payable returns(uint256);
}

contract sender {
    Receiver private receiver = Receiver(0x0fC5022f7B5c4Df39A836);

    function sendDeposit(uint256 _amount) public payable {
        receiver.deposit{value: _amount}();
    }

    receive() external payable {
         require(msg.value > 0, "You cannot send 0 ether");
    }
}

问题根源

  1. 合约余额不足:调用receiver.deposit{value: _amount}()时,Sender合约自身必须持有至少_amount的ETH才能转出。如果合约余额为0或不足,即使指定了value参数,交易也无法携带ETH。
  2. payable函数的使用误区:sendDeposit的payable修饰符仅允许外部向Sender合约转入ETH,但如果调用该函数时没有在交易的value字段中转入ETH,或者转入金额小于_amount,合约没有足够资金完成转账。
  3. 参数与实际转入金额脱节:调用sendDeposit时仅传入_amount参数,但未同步在交易value中向Sender合约转入对应金额,导致合约无余额可转至Bank合约。

解决方案

方案一:直接转发调用者传入的ETH

修改sendDeposit函数,去掉_amount参数,直接使用调用该函数时传入的msg.value作为转账金额,调用者只需在交易value中填写存款金额即可完成操作:

function sendDeposit() public payable {
    require(msg.value > 0, "No ETH sent");
    receiver.deposit{value: msg.value}();
}

方案二:先充值合约再指定金额转出

保留_amount参数,添加余额检查确保合约有足够资金,使用前需先给Sender合约充值ETH:

function sendDeposit(uint256 _amount) public {
    require(address(this).balance >= _amount, "Sender contract has insufficient balance");
    receiver.deposit{value: _amount}();
}

操作步骤:

  • 调用receive函数向Sender合约转入至少_amount的ETH
  • 调用sendDeposit并传入_amount参数,合约将转出对应金额至Bank合约

方案三:使用低级调用确保转账成功

改用call低级调用,可直接检查转账是否成功,增强鲁棒性:

function sendDeposit() public payable {
    require(msg.value > 0, "Must send ETH");
    (bool success, ) = address(receiver).call{value: msg.value}(abi.encodeWithSignature("deposit()"));
    require(success, "Deposit to Bank failed");
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:01:28