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
相关产品推荐
相关产品推荐

