2018-01-12 11:49:53 -08:00
|
|
|
package auth
|
|
|
|
|
|
|
|
import (
|
2018-01-12 14:30:02 -08:00
|
|
|
crypto "github.com/tendermint/go-crypto"
|
|
|
|
|
|
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
2018-01-12 11:49:53 -08:00
|
|
|
)
|
|
|
|
|
2018-01-12 14:30:02 -08:00
|
|
|
// Implements sdk.AccountStore
|
2018-01-12 11:49:53 -08:00
|
|
|
type accountStore struct {
|
2018-01-12 14:30:02 -08:00
|
|
|
key sdk.SubstoreKey
|
|
|
|
codec sdk.Codec
|
2018-01-12 11:49:53 -08:00
|
|
|
}
|
|
|
|
|
2018-01-12 14:30:02 -08:00
|
|
|
func NewAccountStore(key sdk.SubstoreKey, codec sdk.Codec) accountStore {
|
2018-01-12 11:49:53 -08:00
|
|
|
return accountStore{
|
|
|
|
key: key,
|
|
|
|
codec: codec,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-12 14:30:02 -08:00
|
|
|
// Implements sdk.AccountStore
|
|
|
|
func (as accountStore) NewAccountWithAddress(ctx sdk.Context, addr crypto.Address) sdk.Account {
|
|
|
|
acc := as.codec.Prototype().(sdk.Account)
|
2018-01-12 11:49:53 -08:00
|
|
|
acc.SetAddress(addr)
|
|
|
|
return acc
|
|
|
|
}
|
|
|
|
|
2018-01-12 14:30:02 -08:00
|
|
|
// Implements sdk.AccountStore
|
|
|
|
func (as accountStore) GetAccount(ctx sdk.Context, addr crypto.Address) sdk.Account {
|
2018-01-12 11:49:53 -08:00
|
|
|
store := ctx.KVStore(as.key)
|
|
|
|
bz := store.Get(addr)
|
|
|
|
if bz == nil {
|
2018-01-12 14:30:02 -08:00
|
|
|
return nil // XXX
|
2018-01-12 11:49:53 -08:00
|
|
|
}
|
|
|
|
o, err := as.codec.Decode(bz)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2018-01-12 14:30:02 -08:00
|
|
|
return o.(sdk.Account)
|
2018-01-12 11:49:53 -08:00
|
|
|
}
|
|
|
|
|
2018-01-12 14:30:02 -08:00
|
|
|
// Implements sdk.AccountStore
|
|
|
|
func (as accountStore) SetAccount(ctx sdk.Context, acc sdk.Account) {
|
2018-01-12 11:49:53 -08:00
|
|
|
addr := acc.GetAddress()
|
|
|
|
store := ctx.KVStore(as.key)
|
|
|
|
bz, err := as.codec.Encode(acc)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
store.Set(addr, bz)
|
|
|
|
}
|