Error encoding arguments: Error: types/values length mismatch
Error encoding arguments: Error: types/values length mismatch
似乎无法理解此错误的原因。我有以下结构:
enum RecordType {ONE, TWO, THREE}
struct Record {
address recordmaker;
uint256[] recordIds;
RecordType recordType;
}
struct Book {
Record[] records;
address bookmaker;
uint256 salt;
}
基本上,有一个 Book
结构可以容纳多个 Record
结构。现在,我需要创建一个新的哈希 Book
,为此我使用以下代码:
bytes32 constant BOOK_TYPEHASH = keccak256(
"Book(Record[] records,address bookmaker,uint256 salt)"
);
function hashBook(Book calldata book) external pure returns (bytes32) {
return keccak256(abi.encode(
BOOK_TYPEHASH,
book.records,
book.bookmaker,
book.salt
));
}
为了测试哈希,我将以下内容传递给函数:
([0xD7ACd2a9FD159E69Bb102A1ca21C9a3e3A5F771B, [5, 55, 125], 0], 0xd9145CCE52D386f254917e481eB44e9943F39138, 123456)
或预览:
(
[
0xD7ACd2a9FD159E69Bb102A1ca21C9a3e3A5F771B,
[
5,
55,
125
],
0
],
0xd9145CCE52D386f254917e481eB44e9943F39138,
123456
)
调用函数时,我得到:transact to BookContract.hashBook errored. Error encoding arguments: Error: types/values length mismatch (count={"types":1,"values":3}, value={"types":["tuple(tuple(address,uint256[],uint8)[],address,uint256)"],"values":["([0xD7ACd2a9FD159E69Bb102A1ca21C9a3e3A5F771B, [5,",", 125], 0],",", 123456)"]}, code=INVALID_ARGUMENT, version=abi/5.0.7)
我做错了什么?
您的表达式中几乎没有语法错误。你应该:
- 使用方括号
[
而不是常规括号 (
来包装结构
- 也将
Record
结构包裹在方括号 [
中
- 将地址用引号引起来
"
[[["0xD7ACd2a9FD159E69Bb102A1ca21C9a3e3A5F771B", [5, 55, 125], 0]], "0xd9145CCE52D386f254917e481eB44e9943F39138", 123456]
预览:
[ // start of `Book` struct
[ // start of `records[]` array
[ // start of `Record` struct
"0xD7ACd2a9FD159E69Bb102A1ca21C9a3e3A5F771B",
[
5,
55,
125
],
0
]
],
"0xd9145CCE52D386f254917e481eB44e9943F39138",
123456
]
似乎无法理解此错误的原因。我有以下结构:
enum RecordType {ONE, TWO, THREE}
struct Record {
address recordmaker;
uint256[] recordIds;
RecordType recordType;
}
struct Book {
Record[] records;
address bookmaker;
uint256 salt;
}
基本上,有一个 Book
结构可以容纳多个 Record
结构。现在,我需要创建一个新的哈希 Book
,为此我使用以下代码:
bytes32 constant BOOK_TYPEHASH = keccak256(
"Book(Record[] records,address bookmaker,uint256 salt)"
);
function hashBook(Book calldata book) external pure returns (bytes32) {
return keccak256(abi.encode(
BOOK_TYPEHASH,
book.records,
book.bookmaker,
book.salt
));
}
为了测试哈希,我将以下内容传递给函数:
([0xD7ACd2a9FD159E69Bb102A1ca21C9a3e3A5F771B, [5, 55, 125], 0], 0xd9145CCE52D386f254917e481eB44e9943F39138, 123456)
或预览:
(
[
0xD7ACd2a9FD159E69Bb102A1ca21C9a3e3A5F771B,
[
5,
55,
125
],
0
],
0xd9145CCE52D386f254917e481eB44e9943F39138,
123456
)
调用函数时,我得到:transact to BookContract.hashBook errored. Error encoding arguments: Error: types/values length mismatch (count={"types":1,"values":3}, value={"types":["tuple(tuple(address,uint256[],uint8)[],address,uint256)"],"values":["([0xD7ACd2a9FD159E69Bb102A1ca21C9a3e3A5F771B, [5,",", 125], 0],",", 123456)"]}, code=INVALID_ARGUMENT, version=abi/5.0.7)
我做错了什么?
您的表达式中几乎没有语法错误。你应该:
- 使用方括号
[
而不是常规括号(
来包装结构 - 也将
Record
结构包裹在方括号[
中 - 将地址用引号引起来
"
[[["0xD7ACd2a9FD159E69Bb102A1ca21C9a3e3A5F771B", [5, 55, 125], 0]], "0xd9145CCE52D386f254917e481eB44e9943F39138", 123456]
预览:
[ // start of `Book` struct
[ // start of `records[]` array
[ // start of `Record` struct
"0xD7ACd2a9FD159E69Bb102A1ca21C9a3e3A5F771B",
[
5,
55,
125
],
0
]
],
"0xd9145CCE52D386f254917e481eB44e9943F39138",
123456
]