github.com/Finschia/finschia-sdk@v0.48.1/x/feegrant/simulation/operations.go (about)

     1  package simulation
     2  
     3  import (
     4  	"math/rand"
     5  
     6  	"github.com/Finschia/finschia-sdk/baseapp"
     7  	"github.com/Finschia/finschia-sdk/codec"
     8  	simappparams "github.com/Finschia/finschia-sdk/simapp/params"
     9  	sdk "github.com/Finschia/finschia-sdk/types"
    10  	simtypes "github.com/Finschia/finschia-sdk/types/simulation"
    11  	"github.com/Finschia/finschia-sdk/x/feegrant"
    12  	"github.com/Finschia/finschia-sdk/x/feegrant/keeper"
    13  	"github.com/Finschia/finschia-sdk/x/simulation"
    14  )
    15  
    16  // nolint:gosec
    17  // Simulation operation weights constants
    18  //
    19  //nolint:gosec
    20  const (
    21  	OpWeightMsgGrantAllowance  = "op_weight_msg_grant_fee_allowance"
    22  	OpWeightMsgRevokeAllowance = "op_weight_msg_grant_revoke_allowance"
    23  )
    24  
    25  var (
    26  	TypeMsgGrantAllowance  = sdk.MsgTypeURL(&feegrant.MsgGrantAllowance{})
    27  	TypeMsgRevokeAllowance = sdk.MsgTypeURL(&feegrant.MsgRevokeAllowance{})
    28  )
    29  
    30  func WeightedOperations(
    31  	appParams simtypes.AppParams, cdc codec.JSONCodec,
    32  	ak feegrant.AccountKeeper, bk feegrant.BankKeeper, k keeper.Keeper,
    33  ) simulation.WeightedOperations {
    34  	var (
    35  		weightMsgGrantAllowance  int
    36  		weightMsgRevokeAllowance int
    37  	)
    38  
    39  	appParams.GetOrGenerate(cdc, OpWeightMsgGrantAllowance, &weightMsgGrantAllowance, nil,
    40  		func(_ *rand.Rand) {
    41  			weightMsgGrantAllowance = simappparams.DefaultWeightGrantAllowance
    42  		},
    43  	)
    44  
    45  	appParams.GetOrGenerate(cdc, OpWeightMsgRevokeAllowance, &weightMsgRevokeAllowance, nil,
    46  		func(_ *rand.Rand) {
    47  			weightMsgRevokeAllowance = simappparams.DefaultWeightRevokeAllowance
    48  		},
    49  	)
    50  
    51  	return simulation.WeightedOperations{
    52  		simulation.NewWeightedOperation(
    53  			weightMsgGrantAllowance,
    54  			SimulateMsgGrantAllowance(ak, bk, k),
    55  		),
    56  		simulation.NewWeightedOperation(
    57  			weightMsgRevokeAllowance,
    58  			SimulateMsgRevokeAllowance(ak, bk, k),
    59  		),
    60  	}
    61  }
    62  
    63  // SimulateMsgGrantAllowance generates MsgGrantAllowance with random values.
    64  func SimulateMsgGrantAllowance(ak feegrant.AccountKeeper, bk feegrant.BankKeeper, k keeper.Keeper) simtypes.Operation {
    65  	return func(
    66  		r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string,
    67  	) (simtypes.OperationMsg, []simtypes.FutureOperation, error) {
    68  		granter, _ := simtypes.RandomAcc(r, accs)
    69  		grantee, _ := simtypes.RandomAcc(r, accs)
    70  		if grantee.Address.String() == granter.Address.String() {
    71  			return simtypes.NoOpMsg(feegrant.ModuleName, TypeMsgGrantAllowance, "grantee and granter cannot be same"), nil, nil
    72  		}
    73  
    74  		if f, _ := k.GetAllowance(ctx, granter.Address, grantee.Address); f != nil {
    75  			return simtypes.NoOpMsg(feegrant.ModuleName, TypeMsgGrantAllowance, "fee allowance exists"), nil, nil
    76  		}
    77  
    78  		account := ak.GetAccount(ctx, granter.Address)
    79  
    80  		spendableCoins := bk.SpendableCoins(ctx, account.GetAddress())
    81  		if spendableCoins.Empty() {
    82  			return simtypes.NoOpMsg(feegrant.ModuleName, TypeMsgGrantAllowance, "unable to grant empty coins as SpendLimit"), nil, nil
    83  		}
    84  
    85  		oneYear := ctx.BlockTime().AddDate(1, 0, 0)
    86  		msg, err := feegrant.NewMsgGrantAllowance(&feegrant.BasicAllowance{
    87  			SpendLimit: spendableCoins,
    88  			Expiration: &oneYear,
    89  		}, granter.Address, grantee.Address)
    90  		if err != nil {
    91  			return simtypes.NoOpMsg(feegrant.ModuleName, TypeMsgGrantAllowance, err.Error()), nil, err
    92  		}
    93  
    94  		txCtx := simulation.OperationInput{
    95  			R:               r,
    96  			App:             app,
    97  			TxGen:           simappparams.MakeTestEncodingConfig().TxConfig,
    98  			Cdc:             nil,
    99  			Msg:             msg,
   100  			MsgType:         TypeMsgGrantAllowance,
   101  			Context:         ctx,
   102  			SimAccount:      granter,
   103  			AccountKeeper:   ak,
   104  			Bankkeeper:      bk,
   105  			ModuleName:      feegrant.ModuleName,
   106  			CoinsSpentInMsg: spendableCoins,
   107  		}
   108  
   109  		return simulation.GenAndDeliverTxWithRandFees(txCtx)
   110  	}
   111  }
   112  
   113  // SimulateMsgRevokeAllowance generates a MsgRevokeAllowance with random values.
   114  func SimulateMsgRevokeAllowance(ak feegrant.AccountKeeper, bk feegrant.BankKeeper, k keeper.Keeper) simtypes.Operation {
   115  	return func(
   116  		r *rand.Rand, app *baseapp.BaseApp, ctx sdk.Context, accs []simtypes.Account, chainID string,
   117  	) (simtypes.OperationMsg, []simtypes.FutureOperation, error) {
   118  		hasGrant := false
   119  		var granterAddr sdk.AccAddress
   120  		var granteeAddr sdk.AccAddress
   121  		k.IterateAllFeeAllowances(ctx, func(grant feegrant.Grant) bool {
   122  			granter := sdk.MustAccAddressFromBech32(grant.Granter)
   123  			grantee := sdk.MustAccAddressFromBech32(grant.Grantee)
   124  			granterAddr = granter
   125  			granteeAddr = grantee
   126  			hasGrant = true
   127  			return true
   128  		})
   129  
   130  		if !hasGrant {
   131  			return simtypes.NoOpMsg(feegrant.ModuleName, TypeMsgRevokeAllowance, "no grants"), nil, nil
   132  		}
   133  		granter, ok := simtypes.FindAccount(accs, granterAddr)
   134  
   135  		if !ok {
   136  			return simtypes.NoOpMsg(feegrant.ModuleName, TypeMsgRevokeAllowance, "Account not found"), nil, nil
   137  		}
   138  
   139  		account := ak.GetAccount(ctx, granter.Address)
   140  		spendableCoins := bk.SpendableCoins(ctx, account.GetAddress())
   141  
   142  		msg := feegrant.NewMsgRevokeAllowance(granterAddr, granteeAddr)
   143  
   144  		txCtx := simulation.OperationInput{
   145  			R:               r,
   146  			App:             app,
   147  			TxGen:           simappparams.MakeTestEncodingConfig().TxConfig,
   148  			Cdc:             nil,
   149  			Msg:             &msg,
   150  			MsgType:         TypeMsgRevokeAllowance,
   151  			Context:         ctx,
   152  			SimAccount:      granter,
   153  			AccountKeeper:   ak,
   154  			Bankkeeper:      bk,
   155  			ModuleName:      feegrant.ModuleName,
   156  			CoinsSpentInMsg: spendableCoins,
   157  		}
   158  
   159  		return simulation.GenAndDeliverTxWithRandFees(txCtx)
   160  	}
   161  }