Skip to content

Commit

Permalink
add eip191 signmode support
Browse files Browse the repository at this point in the history
  • Loading branch information
beer-1 committed Dec 7, 2023
1 parent b763508 commit 392af57
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 0 deletions.
64 changes: 64 additions & 0 deletions x/auth/tx/eip191.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package tx

import (
"fmt"
"strconv"

sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing"
"github.com/cosmos/cosmos-sdk/x/auth/migrations/legacytx"
"github.com/cosmos/cosmos-sdk/x/auth/signing"
)

const EIP191MessagePrefix = "\x19Ethereum Signed Message:\n"

const eip191NonCriticalFieldsError = "protobuf transaction contains unknown non-critical fields. This is a transaction malleability issue and SIGN_MODE_EIP_191 cannot be used."

// SignModeEIP191Handler defines the SIGN_MODE_DIRECT SignModeHandler
type SignModeEIP191Handler struct{}

var _ signing.SignModeHandler = SignModeEIP191Handler{}

// DefaultMode implements SignModeHandler.DefaultMode
func (SignModeEIP191Handler) DefaultMode() signingtypes.SignMode {
return signingtypes.SignMode_SIGN_MODE_EIP_191
}

// Modes implements SignModeHandler.Modes
func (SignModeEIP191Handler) Modes() []signingtypes.SignMode {
return []signingtypes.SignMode{signingtypes.SignMode_SIGN_MODE_EIP_191}
}

// GetSignBytes implements SignModeHandler.GetSignBytes
func (SignModeEIP191Handler) GetSignBytes(mode signingtypes.SignMode, data signing.SignerData, tx sdk.Tx) ([]byte, error) {
if mode != signingtypes.SignMode_SIGN_MODE_EIP_191 {
return nil, fmt.Errorf("expected %s, got %s", signingtypes.SignMode_SIGN_MODE_EIP_191, mode)
}

protoTx, ok := tx.(*wrapper)
if !ok {
return nil, fmt.Errorf("can only handle a protobuf Tx, got %T", tx)
}

if protoTx.txBodyHasUnknownNonCriticals {
return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, eip191NonCriticalFieldsError)
}

body := protoTx.tx.Body

if len(body.ExtensionOptions) != 0 || len(body.NonCriticalExtensionOptions) != 0 {
return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "SignMode_SIGN_MODE_EIP_191 does not support protobuf extension options.")
}

aminoJSONBz := legacytx.StdSignBytes(
data.ChainID, data.AccountNumber, data.Sequence, protoTx.GetTimeoutHeight(),
legacytx.StdFee{Amount: protoTx.GetFee(), Gas: protoTx.GetGas()},
tx.GetMsgs(), protoTx.GetMemo(), protoTx.GetTip(),
)

return append(append(
[]byte(EIP191MessagePrefix),
[]byte(strconv.Itoa(len(aminoJSONBz)))...,
), aminoJSONBz...), nil
}
3 changes: 3 additions & 0 deletions x/auth/tx/mode_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ var DefaultSignModes = []signingtypes.SignMode{
signingtypes.SignMode_SIGN_MODE_DIRECT,
signingtypes.SignMode_SIGN_MODE_DIRECT_AUX,
signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON,
signingtypes.SignMode_SIGN_MODE_EIP_191,
}

// makeSignModeHandler returns the default protobuf SignModeHandler supporting
Expand All @@ -31,6 +32,8 @@ func makeSignModeHandler(modes []signingtypes.SignMode) signing.SignModeHandler
handlers[i] = signModeLegacyAminoJSONHandler{}
case signingtypes.SignMode_SIGN_MODE_DIRECT_AUX:
handlers[i] = signModeDirectAuxHandler{}
case signingtypes.SignMode_SIGN_MODE_EIP_191:
handlers[i] = SignModeEIP191Handler{}
default:
panic(fmt.Errorf("unsupported sign mode %+v", mode))
}
Expand Down

0 comments on commit 392af57

Please sign in to comment.