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  }