Skip to content

Commit bf5cacf

Browse files
authored
accounts/abi: handle tuple arrays in ParseSelector (ethereum#24587)
Closes ethereum#24571
1 parent 92e3c56 commit bf5cacf

File tree

2 files changed

+18
-1
lines changed

2 files changed

+18
-1
lines changed

accounts/abi/selector_parser.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,9 @@ func parseCompositeType(unescapedSelector string) ([]interface{}, string, error)
8686
if len(rest) == 0 || rest[0] != ')' {
8787
return nil, "", fmt.Errorf("expected ')', got '%s'", rest)
8888
}
89+
if len(rest) >= 3 && rest[1] == '[' && rest[2] == ']' {
90+
return append(result, "[]"), rest[3:], nil
91+
}
8992
return result, rest[1:], nil
9093
}
9194

@@ -112,7 +115,12 @@ func assembleArgs(args []interface{}) ([]ArgumentMarshaling, error) {
112115
if err != nil {
113116
return nil, fmt.Errorf("failed to assemble components: %v", err)
114117
}
115-
arguments = append(arguments, ArgumentMarshaling{name, "tuple", "tuple", subArgs, false})
118+
tupleType := "tuple"
119+
if len(subArgs) != 0 && subArgs[len(subArgs)-1].Type == "[]" {
120+
subArgs = subArgs[:len(subArgs)-1]
121+
tupleType = "tuple[]"
122+
}
123+
arguments = append(arguments, ArgumentMarshaling{name, tupleType, tupleType, subArgs, false})
116124
} else {
117125
return nil, fmt.Errorf("failed to assemble args: unexpected type %T", arg)
118126
}

accounts/abi/selector_parser_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ func TestParseSelector(t *testing.T) {
1616
result = append(result, ArgumentMarshaling{name, typeName, typeName, nil, false})
1717
} else if components, ok := typeOrComponents.([]ArgumentMarshaling); ok {
1818
result = append(result, ArgumentMarshaling{name, "tuple", "tuple", components, false})
19+
} else if components, ok := typeOrComponents.([][]ArgumentMarshaling); ok {
20+
result = append(result, ArgumentMarshaling{name, "tuple[]", "tuple[]", components[0], false})
1921
} else {
2022
log.Fatalf("unexpected type %T", typeOrComponents)
2123
}
@@ -34,6 +36,13 @@ func TestParseSelector(t *testing.T) {
3436
{"singleNest(bytes32,uint8,(uint256,uint256),address)", "singleNest", mkType("bytes32", "uint8", mkType("uint256", "uint256"), "address")},
3537
{"multiNest(address,(uint256[],uint256),((address,bytes32),uint256))", "multiNest",
3638
mkType("address", mkType("uint256[]", "uint256"), mkType(mkType("address", "bytes32"), "uint256"))},
39+
{"arrayNest((uint256,uint256)[],bytes32)", "arrayNest", mkType([][]ArgumentMarshaling{mkType("uint256", "uint256")}, "bytes32")},
40+
{"multiArrayNest((uint256,uint256)[],(uint256,uint256)[])", "multiArrayNest",
41+
mkType([][]ArgumentMarshaling{mkType("uint256", "uint256")}, [][]ArgumentMarshaling{mkType("uint256", "uint256")})},
42+
{"singleArrayNestAndArray((uint256,uint256)[],bytes32[])", "singleArrayNestAndArray",
43+
mkType([][]ArgumentMarshaling{mkType("uint256", "uint256")}, "bytes32[]")},
44+
{"singleArrayNestWithArrayAndArray((uint256[],address[2],uint8[4][][5])[],bytes32[])", "singleArrayNestWithArrayAndArray",
45+
mkType([][]ArgumentMarshaling{mkType("uint256[]", "address[2]", "uint8[4][][5]")}, "bytes32[]")},
3746
}
3847
for i, tt := range tests {
3948
selector, err := ParseSelector(tt.input)

0 commit comments

Comments
 (0)