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  }