github.com/Finschia/finschia-sdk@v0.48.1/x/staking/simulation/genesis.go (about) 1 package simulation 2 3 // DONTCOVER 4 5 import ( 6 "encoding/json" 7 "fmt" 8 "math/rand" 9 "time" 10 11 sdk "github.com/Finschia/finschia-sdk/types" 12 "github.com/Finschia/finschia-sdk/types/module" 13 "github.com/Finschia/finschia-sdk/types/simulation" 14 "github.com/Finschia/finschia-sdk/x/staking/types" 15 ) 16 17 // Simulation parameter constants 18 const ( 19 unbondingTime = "unbonding_time" 20 maxValidators = "max_validators" 21 historicalEntries = "historical_entries" 22 ) 23 24 // genUnbondingTime returns randomized UnbondingTime 25 func genUnbondingTime(r *rand.Rand) (ubdTime time.Duration) { 26 return time.Duration(simulation.RandIntBetween(r, 60, 60*60*24*3*2)) * time.Second 27 } 28 29 // genMaxValidators returns randomized MaxValidators 30 func genMaxValidators(r *rand.Rand) (maxValidators uint32) { 31 return uint32(r.Intn(250) + 1) 32 } 33 34 // getHistEntries returns randomized HistoricalEntries between 0-100. 35 func getHistEntries(r *rand.Rand) uint32 { 36 return uint32(r.Intn(int(types.DefaultHistoricalEntries + 1))) 37 } 38 39 // RandomizedGenState generates a random GenesisState for staking 40 func RandomizedGenState(simState *module.SimulationState) { 41 // params 42 var ( 43 unbondTime time.Duration 44 maxVals uint32 45 histEntries uint32 46 ) 47 48 simState.AppParams.GetOrGenerate( 49 simState.Cdc, unbondingTime, &unbondTime, simState.Rand, 50 func(r *rand.Rand) { unbondTime = genUnbondingTime(r) }, 51 ) 52 53 simState.AppParams.GetOrGenerate( 54 simState.Cdc, maxValidators, &maxVals, simState.Rand, 55 func(r *rand.Rand) { maxVals = genMaxValidators(r) }, 56 ) 57 58 simState.AppParams.GetOrGenerate( 59 simState.Cdc, historicalEntries, &histEntries, simState.Rand, 60 func(r *rand.Rand) { histEntries = getHistEntries(r) }, 61 ) 62 63 // NOTE: the slashing module need to be defined after the staking module on the 64 // NewSimulationManager constructor for this to work 65 simState.UnbondTime = unbondTime 66 params := types.NewParams(simState.UnbondTime, maxVals, 7, histEntries, sdk.DefaultBondDenom) 67 68 // validators & delegations 69 var ( 70 validators []types.Validator 71 delegations []types.Delegation 72 ) 73 74 valAddrs := make([]sdk.ValAddress, simState.NumBonded) 75 76 for i := 0; i < int(simState.NumBonded); i++ { 77 valAddr := sdk.ValAddress(simState.Accounts[i].Address) 78 valAddrs[i] = valAddr 79 80 maxCommission := sdk.NewDecWithPrec(int64(simulation.RandIntBetween(simState.Rand, 1, 100)), 2) 81 commission := types.NewCommission( 82 simulation.RandomDecAmount(simState.Rand, maxCommission), 83 maxCommission, 84 simulation.RandomDecAmount(simState.Rand, maxCommission), 85 ) 86 87 validator, err := types.NewValidator(valAddr, simState.Accounts[i].ConsKey.PubKey(), types.Description{}) 88 if err != nil { 89 panic(err) 90 } 91 validator.Tokens = sdk.NewInt(simState.InitialStake) 92 validator.DelegatorShares = sdk.NewDec(simState.InitialStake) 93 validator.Commission = commission 94 95 delegation := types.NewDelegation(simState.Accounts[i].Address, valAddr, sdk.NewDec(simState.InitialStake)) 96 97 validators = append(validators, validator) 98 delegations = append(delegations, delegation) 99 } 100 101 stakingGenesis := types.NewGenesisState(params, validators, delegations) 102 103 bz, err := json.MarshalIndent(&stakingGenesis.Params, "", " ") 104 if err != nil { 105 panic(err) 106 } 107 fmt.Printf("Selected randomly generated staking parameters:\n%s\n", bz) 108 simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(stakingGenesis) 109 }