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 }