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

Remix调用EtherSplitter合约splitEther函数参数编码报错原因排查

问题

我在Remix IDE中编写了如下Solidity合约:

pragma solidity 0.8.0;

//A contract with a customizable fee
contract EtherSplitter {
    function splitEther(address payable[] memory recipients, uint fee) public payable {
        
        recipients[0].transfer(msg.value * fee / 100);
        recipients[1].transfer(msg.value * (100 - fee) / 100);
    }
        receive() external payable {
    }
}

调用该合约的splitEther函数时,设置的参数如下:

  • recipients: [0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C, 0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB]
  • fee: 10
  • value: 10 Ether

点击“Transact”后出现如下报错:

transact to EtherSplitter.splitEther errored: Error encoding arguments: Error: expected array value (argument=null, value="[0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C, 0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB]", code=INVALID_ARGUMENT, version=abi/5.5.0)

我怀疑是fee的设置存在问题,请问该错误的原因是什么?

错误原因及解决方法

这个错误和fee参数无关,问题出在recipients数组的输入格式上。

Remix IDE对数组类型参数的输入要求是直接用逗号分隔元素,不需要包裹方括号。你输入的[0x..., 0x...]会被解析成一个完整的字符串,而不是地址数组,导致ABI编码时无法识别为数组类型,从而抛出"expected array value"的错误。

解决方法:

  • 去掉recipients参数的方括号,直接输入两个地址并用逗号分隔,比如:
    0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C,0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB
    
  • 也可以在Remix的参数输入框中,点击数组参数右侧的"+"按钮,逐个添加地址元素,这种方式更不容易出错。

确认fee参数设置为10是合理的,它会将10%的ETH转给第一个地址,90%转给第二个地址,逻辑上没有问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 15:54:14