diff --git a/CHANGELOG.md b/CHANGELOG.md index a3ed44ccb7..6573e7e7bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ recompute eth tx hashes in JSON-RPC APIs to fix old blocks. * (deps) [#1168](https://github.com/evmos/ethermint/pull/1168) Upgrade cosmos-sdk to v0.46. * (feemarket) [#1194](https://github.com/evmos/ethermint/pull/1194) Apply feemarket to native cosmos tx. +* (eth) [#1305](https://github.com/evmos/ethermint/pull/1305) Added support for optional params, basic types arrays and `time` type on eip712. ### API Breaking diff --git a/ethereum/eip712/eip712.go b/ethereum/eip712/eip712.go index f8895f04a3..8f27a721e1 100644 --- a/ethereum/eip712/eip712.go +++ b/ethereum/eip712/eip712.go @@ -7,6 +7,7 @@ import ( "math/big" "reflect" "strings" + "time" sdkmath "cosmossdk.io/math" "golang.org/x/text/cases" @@ -232,6 +233,11 @@ func traverseFields( // then continue as normal } + // If its a nil pointer, do not include in types + if fieldType.Kind() == reflect.Ptr && field.IsNil() { + continue + } + for { if fieldType.Kind() == reflect.Ptr { fieldType = fieldType.Elem() @@ -296,6 +302,11 @@ func traverseFields( ethTyp := typToEth(fieldType) if len(ethTyp) > 0 { + // Support array of uint64 + if isCollection && fieldType.Kind() != reflect.Slice && fieldType.Kind() != reflect.Array { + ethTyp += "[]" + } + if prefix == typeDefPrefix { typeMap[rootType] = append(typeMap[rootType], apitypes.Type{ Name: fieldName, @@ -381,6 +392,7 @@ var ( bigIntType = reflect.TypeOf(big.Int{}) cosmIntType = reflect.TypeOf(sdkmath.Int{}) cosmosAnyType = reflect.TypeOf(&codectypes.Any{}) + timeType = reflect.TypeOf(time.Time{}) ) // typToEth supports only basic types and arrays of basic types. @@ -425,6 +437,7 @@ func typToEth(typ reflect.Type) string { } case reflect.Ptr: if typ.Elem().ConvertibleTo(bigIntType) || + typ.Elem().ConvertibleTo(timeType) || typ.Elem().ConvertibleTo(cosmIntType) { return str } @@ -432,6 +445,7 @@ func typToEth(typ reflect.Type) string { if typ.ConvertibleTo(hashType) || typ.ConvertibleTo(addressType) || typ.ConvertibleTo(bigIntType) || + typ.ConvertibleTo(timeType) || typ.ConvertibleTo(cosmIntType) { return str }