package auth import ( "errors" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" "github.com/tendermint/tendermint/crypto" ) // Account is a standard account using a sequence number for replay protection // and a pubkey for authentication. type Account interface { GetAddress() sdk.AccAddress SetAddress(sdk.AccAddress) error // errors if already set. GetPubKey() crypto.PubKey // can return nil. SetPubKey(crypto.PubKey) error GetAccountNumber() int64 SetAccountNumber(int64) error GetSequence() int64 SetSequence(int64) error GetCoins() sdk.Coins SetCoins(sdk.Coins) error } // AccountDecoder unmarshals account bytes type AccountDecoder func(accountBytes []byte) (Account, error) //----------------------------------------------------------- // BaseAccount var _ Account = (*BaseAccount)(nil) // BaseAccount - base account structure. // Extend this by embedding this in your AppAccount. // See the examples/basecoin/types/account.go for an example. type BaseAccount struct { Address sdk.AccAddress `json:"address"` Coins sdk.Coins `json:"coins"` PubKey crypto.PubKey `json:"public_key"` AccountNumber int64 `json:"account_number"` Sequence int64 `json:"sequence"` } // Prototype function for BaseAccount func ProtoBaseAccount() Account { return &BaseAccount{} } func NewBaseAccountWithAddress(addr sdk.AccAddress) BaseAccount { return BaseAccount{ Address: addr, } } // Implements sdk.Account. func (acc BaseAccount) GetAddress() sdk.AccAddress { return acc.Address } // Implements sdk.Account. func (acc *BaseAccount) SetAddress(addr sdk.AccAddress) error { if len(acc.Address) != 0 { return errors.New("cannot override BaseAccount address") } acc.Address = addr return nil } // Implements sdk.Account. func (acc BaseAccount) GetPubKey() crypto.PubKey { return acc.PubKey } // Implements sdk.Account. func (acc *BaseAccount) SetPubKey(pubKey crypto.PubKey) error { acc.PubKey = pubKey return nil } // Implements sdk.Account. func (acc *BaseAccount) GetCoins() sdk.Coins { return acc.Coins } // Implements sdk.Account. func (acc *BaseAccount) SetCoins(coins sdk.Coins) error { acc.Coins = coins return nil } // Implements Account func (acc *BaseAccount) GetAccountNumber() int64 { return acc.AccountNumber } // Implements Account func (acc *BaseAccount) SetAccountNumber(accNumber int64) error { acc.AccountNumber = accNumber return nil } // Implements sdk.Account. func (acc *BaseAccount) GetSequence() int64 { return acc.Sequence } // Implements sdk.Account. func (acc *BaseAccount) SetSequence(seq int64) error { acc.Sequence = seq return nil } //---------------------------------------- // Wire // Most users shouldn't use this, but this comes handy for tests. func RegisterBaseAccount(cdc *wire.Codec) { cdc.RegisterInterface((*Account)(nil), nil) cdc.RegisterConcrete(&BaseAccount{}, "cosmos-sdk/BaseAccount", nil) wire.RegisterCrypto(cdc) }