Merge pull request #772 from cosmos/cwgoes/staking-initgenesis
Implement InitGenesis for staking
This commit is contained in:
commit
9fc9db00fb
|
@ -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 {
|
||||
|
|
|
@ -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())
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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"`
|
||||
}
|
||||
|
||||
//_______________________________________________________________________________________________________
|
||||
|
|
Loading…
Reference in New Issue