github.com/Finschia/finschia-sdk@v0.48.1/x/params/simulation/operations.go (about) 1 package simulation 2 3 import ( 4 "fmt" 5 "math/rand" 6 7 sdk "github.com/Finschia/finschia-sdk/types" 8 "github.com/Finschia/finschia-sdk/types/simulation" 9 "github.com/Finschia/finschia-sdk/x/params/types/proposal" 10 ) 11 12 func min(a int, b int) int { 13 if a <= b { 14 return a 15 } 16 return b 17 } 18 19 // SimulateParamChangeProposalContent returns random parameter change content. 20 // It will generate a ParameterChangeProposal object with anywhere between 1 and 21 // the total amount of defined parameters changes, all of which have random valid values. 22 func SimulateParamChangeProposalContent(paramChangePool []simulation.ParamChange) simulation.ContentSimulatorFn { 23 numProposals := 0 24 // Bound the maximum number of simultaneous parameter changes 25 maxSimultaneousParamChanges := min(len(paramChangePool), 1000) 26 if maxSimultaneousParamChanges == 0 { 27 panic("param changes array is empty") 28 } 29 30 return func(r *rand.Rand, _ sdk.Context, _ []simulation.Account) simulation.Content { 31 numChanges := simulation.RandIntBetween(r, 1, maxSimultaneousParamChanges) 32 paramChanges := make([]proposal.ParamChange, numChanges) 33 34 // perm here takes at most len(paramChangePool) calls to random 35 paramChoices := r.Perm(len(paramChangePool)) 36 37 for i := 0; i < numChanges; i++ { 38 spc := paramChangePool[paramChoices[i]] 39 // add a new distinct parameter to the set of changes 40 paramChanges[i] = proposal.NewParamChange(spc.Subspace(), spc.Key(), spc.SimValue()(r)) 41 } 42 43 title := fmt.Sprintf("title from SimulateParamChangeProposalContent-%d", numProposals) 44 desc := fmt.Sprintf("desc from SimulateParamChangeProposalContent-%d. Random short desc: %s", 45 numProposals, simulation.RandStringOfLength(r, 20)) 46 numProposals++ 47 return proposal.NewParameterChangeProposal( 48 title, // title 49 desc, // description 50 paramChanges, // set of changes 51 ) 52 } 53 }