github.com/Finschia/finschia-sdk@v0.48.1/x/bank/simulation/genesis.go (about) 1 package simulation 2 3 // DONTCOVER 4 5 import ( 6 "encoding/json" 7 "fmt" 8 "math/rand" 9 10 sdk "github.com/Finschia/finschia-sdk/types" 11 "github.com/Finschia/finschia-sdk/types/module" 12 "github.com/Finschia/finschia-sdk/x/bank/types" 13 ) 14 15 // RandomGenesisDefaultSendParam computes randomized allow all send transfers param for the bank module 16 func RandomGenesisDefaultSendParam(r *rand.Rand) bool { 17 // 90% chance of transfers being enable or P(a) = 0.9 for success 18 return r.Int63n(101) <= 90 19 } 20 21 // RandomGenesisSendParams randomized Parameters for the bank module 22 func RandomGenesisSendParams(r *rand.Rand) types.SendEnabledParams { 23 params := types.DefaultParams() 24 // 90% chance of transfers being DefaultSendEnabled=true or P(a) = 0.9 for success 25 // 50% of the time add an additional denom specific record (P(b) = 0.475 = 0.5 * 0.95) 26 if r.Int63n(101) <= 50 { 27 // set send enabled 95% of the time 28 bondEnabled := r.Int63n(101) <= 95 29 params = params.SetSendEnabledParam( 30 sdk.DefaultBondDenom, 31 bondEnabled) 32 } 33 34 // overall probability of enabled for bond denom is 94.75% (P(a)+P(b) - P(a)*P(b)) 35 return params.SendEnabled 36 } 37 38 // RandomGenesisBalances returns a slice of account balances. Each account has 39 // a balance of simState.InitialStake for sdk.DefaultBondDenom. 40 func RandomGenesisBalances(simState *module.SimulationState) []types.Balance { 41 genesisBalances := []types.Balance{} 42 43 for _, acc := range simState.Accounts { 44 genesisBalances = append(genesisBalances, types.Balance{ 45 Address: acc.Address.String(), 46 Coins: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(simState.InitialStake))), 47 }) 48 } 49 50 return genesisBalances 51 } 52 53 // RandomizedGenState generates a random GenesisState for bank 54 func RandomizedGenState(simState *module.SimulationState) { 55 var sendEnabledParams types.SendEnabledParams 56 simState.AppParams.GetOrGenerate( 57 simState.Cdc, string(types.KeySendEnabled), &sendEnabledParams, simState.Rand, 58 func(r *rand.Rand) { sendEnabledParams = RandomGenesisSendParams(r) }, 59 ) 60 61 var defaultSendEnabledParam bool 62 simState.AppParams.GetOrGenerate( 63 simState.Cdc, string(types.KeyDefaultSendEnabled), &defaultSendEnabledParam, simState.Rand, 64 func(r *rand.Rand) { defaultSendEnabledParam = RandomGenesisDefaultSendParam(r) }, 65 ) 66 67 numAccs := int64(len(simState.Accounts)) 68 totalSupply := sdk.NewInt(simState.InitialStake * (numAccs + simState.NumBonded)) 69 supply := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, totalSupply)) 70 71 bankGenesis := types.GenesisState{ 72 Params: types.Params{ 73 SendEnabled: sendEnabledParams, 74 DefaultSendEnabled: defaultSendEnabledParam, 75 }, 76 Balances: RandomGenesisBalances(simState), 77 Supply: supply, 78 } 79 80 paramsBytes, err := json.MarshalIndent(&bankGenesis.Params, "", " ") 81 if err != nil { 82 panic(err) 83 } 84 fmt.Printf("Selected randomly generated bank parameters:\n%s\n", paramsBytes) 85 simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(&bankGenesis) 86 }