Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: errors with EIP712 signature #68

Merged
merged 3 commits into from
Dec 20, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 34 additions & 3 deletions x/auth/tx/eip712.go
Original file line number Diff line number Diff line change
Expand Up @@ -323,17 +323,28 @@ func traverseFields(
fieldType := t.Field(i).Type
fieldName := jsonNameFromTag(t.Field(i).Tag)

// TODO will add another limitation: only if the type is anyOf.
if fieldName == "" {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add some comments here as well, thanks.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Find and summary the current structure that do not have fieldName .

fieldName = t.Field(i).Name
anyWrapper := &cosmosAnyWrapper{
Type: fmt.Sprint(reflect.TypeOf(field.Interface())),
Value: field.Interface(),
}
field = reflect.ValueOf(anyWrapper)
fieldType = reflect.TypeOf(anyWrapper)
}

if fieldType == cosmosAnyType {
any, ok := field.Interface().(*codectypes.Any)
typeAny, ok := field.Interface().(*codectypes.Any)
if !ok {
return errors.Wrapf(sdkerrors.ErrPackAny, "%T", field.Interface())
}

anyWrapper := &cosmosAnyWrapper{
Type: any.TypeUrl,
Type: typeAny.TypeUrl,
}

if err := cdc.UnpackAny(any, &anyWrapper.Value); err != nil {
if err := cdc.UnpackAny(typeAny, &anyWrapper.Value); err != nil {
return errors.Wrap(err, "failed to unpack Any in msg struct")
}

Expand Down Expand Up @@ -384,6 +395,26 @@ func traverseFields(

fieldType = fieldType.Elem()
field = field.Index(0)
// Unpack the field into cosmosAnyWrapper rather than the Any type
if fieldType == cosmosAnyType {
typeAny, ok := field.Interface().(*codectypes.Any)
if !ok {
return errors.Wrapf(sdkerrors.ErrPackAny, "%T", field.Interface())
}

anyWrapper := &cosmosAnyWrapper{
Type: typeAny.TypeUrl,
}

if err := cdc.UnpackAny(typeAny, &anyWrapper.Value); err != nil {
return errors.Wrap(err, "failed to unpack Any in msg struct")
}

fieldType = reflect.TypeOf(anyWrapper.Value)
field = reflect.ValueOf(anyWrapper.Value)

// then continue as normal
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggest add comments above if condition to explain how we deal with type any, no this comment.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, more comments for others to understand this part.

}
isCollection = true
}

Expand Down
4 changes: 2 additions & 2 deletions x/auth/tx/eip712_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ func TestEIP712Handler(t *testing.T) {
txBuilder := txConfig.NewTxBuilder()

chainID := "ethermint_9000"
memo := "some test memo"
testMemo := "some test memo"
msgs := []sdk.Msg{banktypes.NewMsgSend(addr, addr, sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdkmath.NewInt(1))))}
accNum, accSeq := uint64(1), uint64(2) // Arbitrary account number/sequence

Expand All @@ -52,7 +52,7 @@ func TestEIP712Handler(t *testing.T) {

err := txBuilder.SetMsgs(msgs...)
require.NoError(t, err)
txBuilder.SetMemo(memo)
txBuilder.SetMemo(testMemo)
txBuilder.SetFeeAmount(fee.Amount)
txBuilder.SetFeePayer(feePayerAddr)
txBuilder.SetGasLimit(fee.GasLimit)
Expand Down