github.com/gravity-devs/liquidity@v1.5.3/x/liquidity/simulation/operations_utils.go (about) 1 package simulation 2 3 // DONTCOVER 4 5 import ( 6 "math/rand" 7 "strings" 8 9 sdk "github.com/cosmos/cosmos-sdk/types" 10 simtypes "github.com/cosmos/cosmos-sdk/types/simulation" 11 12 "github.com/gravity-devs/liquidity/x/liquidity/keeper" 13 "github.com/gravity-devs/liquidity/x/liquidity/types" 14 ) 15 16 var ( 17 // create simulated accounts due to gas usage overflow issue. 18 // Read this issue: https://github.com/tendermint/liquidity/issues/349 19 randomAccounts []simtypes.Account 20 ) 21 22 // mintCoins mints and send coins to the simulated account. 23 func mintCoins(ctx sdk.Context, r *rand.Rand, bk types.BankKeeper, acc simtypes.Account, denoms []string) error { 24 var mintCoins, sendCoins sdk.Coins 25 for _, denom := range denoms { 26 mintAmt := sdk.NewInt(int64(simtypes.RandIntBetween(r, 1e15, 1e16))) 27 sendAmt := sdk.NewInt(int64(simtypes.RandIntBetween(r, 1e13, 1e14))) 28 mintCoins = mintCoins.Add(sdk.NewCoin(denom, mintAmt)) 29 sendCoins = sendCoins.Add(sdk.NewCoin(denom, sendAmt)) 30 } 31 32 feeCoin := int64(simtypes.RandIntBetween(r, 1e13, 1e14)) 33 mintCoins = mintCoins.Add(sdk.NewInt64Coin(sdk.DefaultBondDenom, feeCoin)) 34 sendCoins = sendCoins.Add(sdk.NewInt64Coin(sdk.DefaultBondDenom, feeCoin)) 35 36 err := bk.MintCoins(ctx, types.ModuleName, mintCoins) 37 if err != nil { 38 return err 39 } 40 41 err = bk.SendCoinsFromModuleToAccount(ctx, types.ModuleName, acc.Address, sendCoins) 42 if err != nil { 43 return err 44 } 45 46 return nil 47 } 48 49 // randomLiquidity returns a random liquidity pool. 50 func randomLiquidity(r *rand.Rand, k keeper.Keeper, ctx sdk.Context) (pool types.Pool, ok bool) { 51 pools := k.GetAllPools(ctx) 52 if len(pools) == 0 { 53 return types.Pool{}, false 54 } 55 56 i := r.Intn(len(pools)) 57 58 return pools[i], true 59 } 60 61 // randomDepositCoin returns deposit amount between more than minimum deposit amount and less than 1e9. 62 func randomDepositCoin(r *rand.Rand, minInitDepositAmount sdk.Int, denom string) sdk.Coin { 63 amount := int64(simtypes.RandIntBetween(r, int(minInitDepositAmount.Int64()+1), 1e8)) 64 return sdk.NewInt64Coin(denom, amount) 65 } 66 67 // randomWithdrawCoin returns random withdraw amount. 68 func randomWithdrawCoin(r *rand.Rand, denom string, balance sdk.Int) sdk.Coin { 69 // prevent panic from RandIntBetween 70 if balance.Quo(sdk.NewInt(10)).Int64() <= 1 { 71 return sdk.NewInt64Coin(denom, 1) 72 } 73 74 amount := int64(simtypes.RandIntBetween(r, 1, int(balance.Quo(sdk.NewInt(10)).Int64()))) 75 return sdk.NewInt64Coin(denom, amount) 76 } 77 78 // randomOfferCoin returns random offer amount of coin. 79 func randomOfferCoin(r *rand.Rand, k keeper.Keeper, ctx sdk.Context, pool types.Pool, denom string) sdk.Coin { 80 params := k.GetParams(ctx) 81 reserveCoinAmt := k.GetReserveCoins(ctx, pool).AmountOf(denom) 82 maximumOrderableAmt := reserveCoinAmt.ToDec().Mul(params.MaxOrderAmountRatio).TruncateInt() 83 amt := int64(simtypes.RandIntBetween(r, 1, int(maximumOrderableAmt.Int64()))) 84 return sdk.NewInt64Coin(denom, amt) 85 } 86 87 // randomOrderPrice returns random order price that is sufficient for matchable swap. 88 func randomOrderPrice(r *rand.Rand) sdk.Dec { 89 return sdk.NewDecWithPrec(int64(simtypes.RandIntBetween(r, 1, 1e2)), 2) 90 } 91 92 // randomFees returns a random amount of bond denom fee and 93 // if the user doesn't have enough funds for paying fees, it returns empty coins. 94 func randomFees(r *rand.Rand, spendableCoins sdk.Coins) (sdk.Coins, error) { 95 if spendableCoins.Empty() { 96 return nil, nil 97 } 98 99 if spendableCoins.AmountOf(sdk.DefaultBondDenom).Equal(sdk.ZeroInt()) { 100 return nil, nil 101 } 102 103 amt, err := simtypes.RandPositiveInt(r, spendableCoins.AmountOf(sdk.DefaultBondDenom)) 104 if err != nil { 105 return nil, err 106 } 107 108 fees := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, amt)) 109 110 return fees, nil 111 } 112 113 // randomDenoms returns randomly generated two different denoms that has a length anywhere between 4 and 6. 114 func randomDenoms(r *rand.Rand) (string, string) { 115 denomA := simtypes.RandStringOfLength(r, simtypes.RandIntBetween(r, 4, 6)) 116 denomB := simtypes.RandStringOfLength(r, simtypes.RandIntBetween(r, 4, 6)) 117 denomA, denomB = types.AlphabeticalDenomPair(strings.ToLower(denomA), strings.ToLower(denomB)) 118 return denomA, denomB 119 }