accounts/abi: handle tuple arrays in ParseSelector (#24587)
Closes #24571
This commit is contained in:
parent
92e3c56e7b
commit
bf5cacfb8f
@ -86,6 +86,9 @@ func parseCompositeType(unescapedSelector string) ([]interface{}, string, error)
|
|||||||
if len(rest) == 0 || rest[0] != ')' {
|
if len(rest) == 0 || rest[0] != ')' {
|
||||||
return nil, "", fmt.Errorf("expected ')', got '%s'", rest)
|
return nil, "", fmt.Errorf("expected ')', got '%s'", rest)
|
||||||
}
|
}
|
||||||
|
if len(rest) >= 3 && rest[1] == '[' && rest[2] == ']' {
|
||||||
|
return append(result, "[]"), rest[3:], nil
|
||||||
|
}
|
||||||
return result, rest[1:], nil
|
return result, rest[1:], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -112,7 +115,12 @@ func assembleArgs(args []interface{}) ([]ArgumentMarshaling, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to assemble components: %v", err)
|
return nil, fmt.Errorf("failed to assemble components: %v", err)
|
||||||
}
|
}
|
||||||
arguments = append(arguments, ArgumentMarshaling{name, "tuple", "tuple", subArgs, false})
|
tupleType := "tuple"
|
||||||
|
if len(subArgs) != 0 && subArgs[len(subArgs)-1].Type == "[]" {
|
||||||
|
subArgs = subArgs[:len(subArgs)-1]
|
||||||
|
tupleType = "tuple[]"
|
||||||
|
}
|
||||||
|
arguments = append(arguments, ArgumentMarshaling{name, tupleType, tupleType, subArgs, false})
|
||||||
} else {
|
} else {
|
||||||
return nil, fmt.Errorf("failed to assemble args: unexpected type %T", arg)
|
return nil, fmt.Errorf("failed to assemble args: unexpected type %T", arg)
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,8 @@ func TestParseSelector(t *testing.T) {
|
|||||||
result = append(result, ArgumentMarshaling{name, typeName, typeName, nil, false})
|
result = append(result, ArgumentMarshaling{name, typeName, typeName, nil, false})
|
||||||
} else if components, ok := typeOrComponents.([]ArgumentMarshaling); ok {
|
} else if components, ok := typeOrComponents.([]ArgumentMarshaling); ok {
|
||||||
result = append(result, ArgumentMarshaling{name, "tuple", "tuple", components, false})
|
result = append(result, ArgumentMarshaling{name, "tuple", "tuple", components, false})
|
||||||
|
} else if components, ok := typeOrComponents.([][]ArgumentMarshaling); ok {
|
||||||
|
result = append(result, ArgumentMarshaling{name, "tuple[]", "tuple[]", components[0], false})
|
||||||
} else {
|
} else {
|
||||||
log.Fatalf("unexpected type %T", typeOrComponents)
|
log.Fatalf("unexpected type %T", typeOrComponents)
|
||||||
}
|
}
|
||||||
@ -34,6 +36,13 @@ func TestParseSelector(t *testing.T) {
|
|||||||
{"singleNest(bytes32,uint8,(uint256,uint256),address)", "singleNest", mkType("bytes32", "uint8", mkType("uint256", "uint256"), "address")},
|
{"singleNest(bytes32,uint8,(uint256,uint256),address)", "singleNest", mkType("bytes32", "uint8", mkType("uint256", "uint256"), "address")},
|
||||||
{"multiNest(address,(uint256[],uint256),((address,bytes32),uint256))", "multiNest",
|
{"multiNest(address,(uint256[],uint256),((address,bytes32),uint256))", "multiNest",
|
||||||
mkType("address", mkType("uint256[]", "uint256"), mkType(mkType("address", "bytes32"), "uint256"))},
|
mkType("address", mkType("uint256[]", "uint256"), mkType(mkType("address", "bytes32"), "uint256"))},
|
||||||
|
{"arrayNest((uint256,uint256)[],bytes32)", "arrayNest", mkType([][]ArgumentMarshaling{mkType("uint256", "uint256")}, "bytes32")},
|
||||||
|
{"multiArrayNest((uint256,uint256)[],(uint256,uint256)[])", "multiArrayNest",
|
||||||
|
mkType([][]ArgumentMarshaling{mkType("uint256", "uint256")}, [][]ArgumentMarshaling{mkType("uint256", "uint256")})},
|
||||||
|
{"singleArrayNestAndArray((uint256,uint256)[],bytes32[])", "singleArrayNestAndArray",
|
||||||
|
mkType([][]ArgumentMarshaling{mkType("uint256", "uint256")}, "bytes32[]")},
|
||||||
|
{"singleArrayNestWithArrayAndArray((uint256[],address[2],uint8[4][][5])[],bytes32[])", "singleArrayNestWithArrayAndArray",
|
||||||
|
mkType([][]ArgumentMarshaling{mkType("uint256[]", "address[2]", "uint8[4][][5]")}, "bytes32[]")},
|
||||||
}
|
}
|
||||||
for i, tt := range tests {
|
for i, tt := range tests {
|
||||||
selector, err := ParseSelector(tt.input)
|
selector, err := ParseSelector(tt.input)
|
||||||
|
Loading…
Reference in New Issue
Block a user