package codec import ( "github.com/cosmos/cosmos-sdk/codec" codecstd "github.com/cosmos/cosmos-sdk/codec/std" "github.com/cosmos/cosmos-sdk/crypto/keyring" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/x/auth" authclient "github.com/cosmos/cosmos-sdk/x/auth/client" authexported "github.com/cosmos/cosmos-sdk/x/auth/exported" "github.com/cosmos/cosmos-sdk/x/auth/vesting" emintcrypto "github.com/cosmos/ethermint/crypto" eminttypes "github.com/cosmos/ethermint/types" ) var ( _ auth.Codec = (*Codec)(nil) ) // Codec is a wrapper of the SDK standard Codec. It extends the Account interface // by adding the EthAccount type for ethereum accounts. type Codec struct { *codecstd.Codec } func NewAppCodec(amino *codec.Codec) *Codec { return &Codec{codecstd.NewAppCodec(amino)} } // MarshalAccount marshals an Account interface. If the given type implements // the Marshaler interface, it is treated as a Proto-defined message and // serialized that way. Otherwise, it falls back on the internal Amino codec. func (c *Codec) MarshalAccount(accI authexported.Account) ([]byte, error) { acc := &Account{} if err := acc.SetAccount(accI); err != nil { return nil, err } return c.Marshaler.MarshalBinaryBare(acc) } // UnmarshalAccount returns an Account interface from raw encoded account bytes // of a Proto-based Account type. An error is returned upon decoding failure. func (c *Codec) UnmarshalAccount(bz []byte) (authexported.Account, error) { acc := &Account{} if err := c.Marshaler.UnmarshalBinaryBare(bz, acc); err != nil { return nil, err } return acc.GetAccount(), nil } // MarshalAccountJSON JSON encodes an account object implementing the Account // interface. func (c *Codec) MarshalAccountJSON(acc authexported.Account) ([]byte, error) { return c.Marshaler.MarshalJSON(acc) } // UnmarshalAccountJSON returns an Account from JSON encoded bytes. func (c *Codec) UnmarshalAccountJSON(bz []byte) (authexported.Account, error) { acc := &Account{} if err := c.Marshaler.UnmarshalJSON(bz, acc); err != nil { return nil, err } return acc.GetAccount(), nil } // MakeCodec registers the necessary types and interfaces for an sdk.App. This // codec is provided to all the modules the application depends on. // // NOTE: This codec will be deprecated in favor of AppCodec once all modules are // migrated. func MakeCodec(bm module.BasicManager) *codec.Codec { cdc := codec.New() bm.RegisterCodec(cdc) vesting.RegisterCodec(cdc) sdk.RegisterCodec(cdc) emintcrypto.RegisterCodec(cdc) codec.RegisterCrypto(cdc) eminttypes.RegisterCodec(cdc) keyring.RegisterCodec(cdc) // temporary. Used to register keyring.Info // since auth client doesn't use the ethermint account type, we need to set // our codec instead. authclient.Codec = NewAppCodec(cdc) return cdc }