Implement InitGenesis for x/stake (closes #737)

This commit is contained in:
Christopher Goes 2018-04-02 15:48:10 +02:00
parent d88026244d
commit 8fad09a659
No known key found for this signature in database
GPG Key ID: E828D98232D328D3
3 changed files with 53 additions and 26 deletions

View File

@ -2,6 +2,8 @@ package stake
import (
"bytes"
"encoding/json"
"errors"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/wire"
@ -28,6 +30,17 @@ func NewKeeper(ctx sdk.Context, cdc *wire.Codec, key sdk.StoreKey, ck bank.CoinK
return keeper
}
// InitGenesis - store genesis parameters
func (k Keeper) InitGenesis(ctx sdk.Context, data json.RawMessage) error {
var state GenesisState
if err := json.Unmarshal(data, &state); err != nil {
return err
}
k.setPool(ctx, state.Pool)
k.setParams(ctx, state.Params)
return nil
}
//_________________________________________________________________________
// get a single candidate
@ -343,8 +356,7 @@ func (k Keeper) GetParams(ctx sdk.Context) (params Params) {
store := ctx.KVStore(k.storeKey)
b := store.Get(ParamKey)
if b == nil {
k.params = defaultParams()
return k.params
panic(errors.New("Stored params should not have been nil"))
}
err := k.cdc.UnmarshalBinary(b, &params)
@ -374,7 +386,7 @@ func (k Keeper) GetPool(ctx sdk.Context) (gs Pool) {
store := ctx.KVStore(k.storeKey)
b := store.Get(PoolKey)
if b == nil {
return initialPool()
panic(errors.New("Stored pool should not have been nil"))
}
err := k.cdc.UnmarshalBinary(b, &gs)
if err != nil {

View File

@ -2,6 +2,7 @@ package stake
import (
"encoding/hex"
"encoding/json"
"testing"
"github.com/stretchr/testify/require"
@ -52,6 +53,31 @@ var (
emptyPubkey crypto.PubKey
)
// default params for testing
func defaultParams() Params {
return Params{
InflationRateChange: sdk.NewRat(13, 100),
InflationMax: sdk.NewRat(20, 100),
InflationMin: sdk.NewRat(7, 100),
GoalBonded: sdk.NewRat(67, 100),
MaxValidators: 100,
BondDenom: "fermion",
}
}
// initial pool for testing
func initialPool() Pool {
return Pool{
TotalSupply: 0,
BondedShares: sdk.ZeroRat,
UnbondedShares: sdk.ZeroRat,
BondedPool: 0,
UnbondedPool: 0,
InflationLastTime: 0,
Inflation: sdk.NewRat(7, 100),
}
}
// XXX reference the common declaration of this function
func subspace(prefix []byte) (start, end []byte) {
end = make([]byte, len(prefix))
@ -123,6 +149,13 @@ func createTestInput(t *testing.T, sender sdk.Address, isCheckTx bool, initCoins
)
ck := bank.NewCoinKeeper(accountMapper)
keeper := NewKeeper(ctx, cdc, keyStake, ck)
encoded, err := json.Marshal(GenesisState{initialPool(), defaultParams()})
if err != nil {
panic(err)
}
if err = keeper.InitGenesis(ctx, encoded); err != nil {
panic(err)
}
// fill all the addresses with some coins
for _, addr := range addrs {

View File

@ -16,19 +16,6 @@ type Params struct {
BondDenom string `json:"bond_denom"` // bondable coin denomination
}
// XXX do we want to allow for default params even or do we want to enforce that you
// need to be explicit about defining all params in genesis?
func defaultParams() Params {
return Params{
InflationRateChange: sdk.NewRat(13, 100),
InflationMax: sdk.NewRat(20, 100),
InflationMin: sdk.NewRat(7, 100),
GoalBonded: sdk.NewRat(67, 100),
MaxValidators: 100,
BondDenom: "fermion",
}
}
//_________________________________________________________________________
// Pool - dynamic parameters of the current state
@ -42,16 +29,11 @@ type Pool struct {
Inflation sdk.Rat `json:"inflation"` // current annual inflation rate
}
func initialPool() Pool {
return Pool{
TotalSupply: 0,
BondedShares: sdk.ZeroRat,
UnbondedShares: sdk.ZeroRat,
BondedPool: 0,
UnbondedPool: 0,
InflationLastTime: 0,
Inflation: sdk.NewRat(7, 100),
}
// GenesisState - all staking state that must be provided at genesis
type GenesisState struct {
Pool Pool `json:"pool"`
Params Params `json:"params"`
}
//_______________________________________________________________________________________________________