signer/core/apitypes: deep convert types in slice (#26203)
This commit is contained in:
parent
8846c07d04
commit
e76813eb13
@ -23,6 +23,7 @@ import (
|
|||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/ethereum/go-ethereum/common/hexutil"
|
"github.com/ethereum/go-ethereum/common/hexutil"
|
||||||
|
"github.com/ethereum/go-ethereum/common/math"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestBytesPadding(t *testing.T) {
|
func TestBytesPadding(t *testing.T) {
|
||||||
@ -197,3 +198,38 @@ func TestParseInteger(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestConvertStringDataToSlice(t *testing.T) {
|
||||||
|
slice := []string{"a", "b", "c"}
|
||||||
|
var it interface{} = slice
|
||||||
|
_, err := convertDataToSlice(it)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestConvertUint256DataToSlice(t *testing.T) {
|
||||||
|
slice := []*math.HexOrDecimal256{
|
||||||
|
math.NewHexOrDecimal256(1),
|
||||||
|
math.NewHexOrDecimal256(2),
|
||||||
|
math.NewHexOrDecimal256(3),
|
||||||
|
}
|
||||||
|
var it interface{} = slice
|
||||||
|
_, err := convertDataToSlice(it)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestConvertAddressDataToSlice(t *testing.T) {
|
||||||
|
slice := []common.Address{
|
||||||
|
common.HexToAddress("0x0000000000000000000000000000000000000001"),
|
||||||
|
common.HexToAddress("0x0000000000000000000000000000000000000002"),
|
||||||
|
common.HexToAddress("0x0000000000000000000000000000000000000003"),
|
||||||
|
}
|
||||||
|
var it interface{} = slice
|
||||||
|
_, err := convertDataToSlice(it)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -367,8 +367,8 @@ func (typedData *TypedData) EncodeData(primaryType string, data map[string]inter
|
|||||||
encType := field.Type
|
encType := field.Type
|
||||||
encValue := data[field.Name]
|
encValue := data[field.Name]
|
||||||
if encType[len(encType)-1:] == "]" {
|
if encType[len(encType)-1:] == "]" {
|
||||||
arrayValue, ok := encValue.([]interface{})
|
arrayValue, err := convertDataToSlice(encValue)
|
||||||
if !ok {
|
if err != nil {
|
||||||
return nil, dataMismatchError(encType, encValue)
|
return nil, dataMismatchError(encType, encValue)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -573,6 +573,19 @@ func dataMismatchError(encType string, encValue interface{}) error {
|
|||||||
return fmt.Errorf("provided data '%v' doesn't match type '%s'", encValue, encType)
|
return fmt.Errorf("provided data '%v' doesn't match type '%s'", encValue, encType)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func convertDataToSlice(encValue interface{}) ([]interface{}, error) {
|
||||||
|
var outEncValue []interface{}
|
||||||
|
rv := reflect.ValueOf(encValue)
|
||||||
|
if rv.Kind() == reflect.Slice {
|
||||||
|
for i := 0; i < rv.Len(); i++ {
|
||||||
|
outEncValue = append(outEncValue, rv.Index(i).Interface())
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return outEncValue, fmt.Errorf("provided data '%v' is not slice", encValue)
|
||||||
|
}
|
||||||
|
return outEncValue, nil
|
||||||
|
}
|
||||||
|
|
||||||
// validate makes sure the types are sound
|
// validate makes sure the types are sound
|
||||||
func (typedData *TypedData) validate() error {
|
func (typedData *TypedData) validate() error {
|
||||||
if err := typedData.Types.validate(); err != nil {
|
if err := typedData.Types.validate(); err != nil {
|
||||||
@ -632,7 +645,7 @@ func (typedData *TypedData) formatData(primaryType string, data map[string]inter
|
|||||||
Typ: field.Type,
|
Typ: field.Type,
|
||||||
}
|
}
|
||||||
if field.isArray() {
|
if field.isArray() {
|
||||||
arrayValue, _ := encValue.([]interface{})
|
arrayValue, _ := convertDataToSlice(encValue)
|
||||||
parsedType := field.typeName()
|
parsedType := field.typeName()
|
||||||
for _, v := range arrayValue {
|
for _, v := range arrayValue {
|
||||||
if typedData.Types[parsedType] != nil {
|
if typedData.Types[parsedType] != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user