This PR begins improving the godocs for the auth module, and begins cleaning up the Ante handler. Additionally we previously calculated if the fee was sufficient for the tx on every single signer. This is now refactored to be more efficient, and have a better logical flow. No changelog entry as this is new to this release.
133 lines
3.3 KiB
Go
133 lines
3.3 KiB
Go
package auth
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"github.com/cosmos/cosmos-sdk/codec"
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
"github.com/tendermint/tendermint/crypto"
|
|
)
|
|
|
|
// Account is an interface used to store coins at a given address within state.
|
|
// It presumes a notion of sequence numbers for replay protection,
|
|
// a notion of account numbers for replay protection for previously pruned accounts,
|
|
// and a pubkey for authentication purposes.
|
|
//
|
|
// Many complex conditions can be used in the concrete struct which implements Account.
|
|
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 - a base account structure.
|
|
// This can be extended by embedding within in your AppAccount.
|
|
// There are examples of this in: examples/basecoin/types/account.go.
|
|
// However one doesn't have to use BaseAccount as long as your struct
|
|
// implements Account.
|
|
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 in handy for tests.
|
|
func RegisterBaseAccount(cdc *codec.Codec) {
|
|
cdc.RegisterInterface((*Account)(nil), nil)
|
|
cdc.RegisterConcrete(&BaseAccount{}, "cosmos-sdk/BaseAccount", nil)
|
|
codec.RegisterCrypto(cdc)
|
|
}
|