2020-04-22 19:26:01 +00:00
|
|
|
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"
|
2020-05-07 15:58:13 +00:00
|
|
|
authclient "github.com/cosmos/cosmos-sdk/x/auth/client"
|
2020-04-22 19:26:01 +00:00
|
|
|
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
|
|
|
|
|
2020-05-07 15:58:13 +00:00
|
|
|
// since auth client doesn't use the ethermint account type, we need to set
|
|
|
|
// our codec instead.
|
|
|
|
authclient.Codec = NewAppCodec(cdc)
|
|
|
|
|
2020-04-22 19:26:01 +00:00
|
|
|
return cdc
|
|
|
|
}
|