diff --git a/x/stake/keeper.go b/x/stake/keeper.go index 95eb85e76f..d377df21f3 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -2,6 +2,7 @@ package stake import ( "bytes" + "encoding/json" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/wire" @@ -28,6 +29,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 +355,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("Stored params should not have been nil") } err := k.cdc.UnmarshalBinary(b, ¶ms) @@ -374,7 +385,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("Stored pool should not have been nil") } err := k.cdc.UnmarshalBinary(b, &gs) if err != nil { diff --git a/x/stake/keeper_test.go b/x/stake/keeper_test.go index aa36cd5855..9a0d0f30ea 100644 --- a/x/stake/keeper_test.go +++ b/x/stake/keeper_test.go @@ -2,6 +2,7 @@ package stake import ( "bytes" + "encoding/json" "testing" sdk "github.com/cosmos/cosmos-sdk/types" @@ -573,3 +574,31 @@ func TestPool(t *testing.T) { resPool = keeper.GetPool(ctx) assert.Equal(t, expPool, resPool) } + +func TestInitGenesis(t *testing.T) { + ctx, _, keeper := createTestInput(t, nil, false, 0) + jsonStr := `{ + "params": { + "inflation_rate_change": {"num": 13, "denom": 100}, + "inflation_max": {"num": 20, "denom": 100}, + "inflation_min": {"num": 7, "denom": 100}, + "goal_bonded": {"num": 67, "denom": 100}, + "max_validators": 100, + "bond_denom": "fermion" + }, + "pool": { + "total_supply": 0, + "bonded_shares": {"num": 0, "denom": 1}, + "unbonded_shares": {"num": 0, "denom": 1}, + "bonded_pool": 0, + "unbonded_pool": 0, + "inflation_last_time": 0, + "inflation": {"num": 7, "denom": 100} + } +}` + encoded := json.RawMessage(jsonStr) + err := keeper.InitGenesis(ctx, encoded) + require.Nil(t, err) + require.Equal(t, keeper.GetPool(ctx), initialPool()) + require.Equal(t, keeper.GetParams(ctx), defaultParams()) +} diff --git a/x/stake/test_common.go b/x/stake/test_common.go index 03f9fe92cc..71b7454755 100644 --- a/x/stake/test_common.go +++ b/x/stake/test_common.go @@ -52,6 +52,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 +148,8 @@ func createTestInput(t *testing.T, sender sdk.Address, isCheckTx bool, initCoins ) ck := bank.NewCoinKeeper(accountMapper) keeper := NewKeeper(ctx, cdc, keyStake, ck) + keeper.setPool(ctx, initialPool()) + keeper.setParams(ctx, defaultParams()) // fill all the addresses with some coins for _, addr := range addrs { diff --git a/x/stake/types.go b/x/stake/types.go index 4ba7c59d0e..7e7fb9e753 100644 --- a/x/stake/types.go +++ b/x/stake/types.go @@ -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,10 @@ 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"` } //_______________________________________________________________________________________________________