以下为合约示例:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
struct Param {
uint256 stakedTokens; //准入token数量
bytes32 topic; //投票主题
address tokenAddr; //token合约地址
address[] voters; //所有可参与的投票人
}
contract TestStructParam {
uint256 public stakedTokens; //准入token数量
bytes32 public topic; //投票主题
address public tokenAddr; //token合约地址
address[] public voters; //所有可参与的投票人
constructor(Param memory _param) {
stakedTokens = _param.stakedTokens;
topic = _param.topic;
tokenAddr = _param.tokenAddr;
voters = _param.voters;
}
}
在Remix中,struct作为一个参数传入时是一个tuple,需要使用中括号[]引起所有参数
部署上面合约时需要传递struct参数,正确传递参数值为
[10,"0x68656c6c6f000000000000000000000000000000000000000000000000000000","0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",["0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0"]]
注:参数中 bytes32类型与address类型需要加双引号,测试如下图所示:
以下为错误写法,bytes32类型与address类型没有加双引号,会报错:
[10,0x68656c6c6f000000000000000000000000000000000000000000000000000000,0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266,[0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0]]
报错信息
creation of TestStructParam errored: Error encoding arguments: Error: types/values length mismatch (count={"types":1,"values":2}, value={"types":["tuple(uint256,bytes32,address,address[])"],"values":["[10,",",0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266,[0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0]]"]}, code=INVALID_ARGUMENT, version=abi/5.5.0)
如下图所示: