# Accounts ### auth.Account ```go // Account is a standard account using a sequence number for replay protection // and a pubkey for authentication. type Account interface { GetAddress() sdk.Address SetAddress(sdk.Address) 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 } ``` Accounts are the standard way for an application to keep track of addresses and their associated balances. ### auth.BaseAccount ```go // 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.Address `json:"address"` Coins sdk.Coins `json:"coins"` PubKey crypto.PubKey `json:"public_key"` AccountNumber int64 `json:"account_number"` Sequence int64 `json:"sequence"` } ``` The `auth.BaseAccount` struct provides a standard implementation of the Account interface with replay protection. BaseAccount can be extended by embedding it in your own Account struct. ### auth.AccountMapper ```go // This AccountMapper encodes/decodes accounts using the // go-amino (binary) encoding/decoding library. type AccountMapper struct { // The (unexposed) key used to access the store from the Context. key sdk.StoreKey // The prototypical Account concrete type. proto Account // The wire codec for binary encoding/decoding of accounts. cdc *wire.Codec } ``` The AccountMapper is responsible for managing and storing the state of all accounts in the application. Example Initialization: ```go // File: examples/basecoin/app/app.go // Define the accountMapper. app.accountMapper = auth.NewAccountMapper( cdc, app.keyAccount, // target store &types.AppAccount{}, // prototype ) ``` The accountMapper allows you to retrieve the current account state by `GetAccount(ctx Context, addr auth.Address)` and change the state by `SetAccount(ctx Context, acc Account)`. Note: To update an account you will first have to get the account, update the appropriate fields with its associated setter method, and then call `SetAccount(ctx Context, acc updatedAccount)`. Updating accounts is made easier by using the `Keeper` struct in the `x/bank` module. Example Initialization: ```go // File: examples/basecoin/app/app.go app.coinKeeper = bank.NewKeeper(app.accountMapper) ``` Example Usage: ```go // Finds account with addr in accountmapper // Adds coins to account's coin array // Sets updated account in accountmapper app.coinKeeper.AddCoins(ctx, addr, coins) ```