github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/distribution/keeper/allocation_distr_proposal_test.go (about) 1 package keeper 2 3 import ( 4 "testing" 5 6 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec" 7 types2 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec/types" 8 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store" 9 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/mpt" 10 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 11 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth" 12 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/bank" 13 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/supply" 14 abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types" 15 "github.com/fibonacci-chain/fbc/libs/tendermint/libs/log" 16 tmtypes "github.com/fibonacci-chain/fbc/libs/tendermint/types" 17 dbm "github.com/fibonacci-chain/fbc/libs/tm-db" 18 "github.com/fibonacci-chain/fbc/x/distribution/types" 19 "github.com/fibonacci-chain/fbc/x/params" 20 "github.com/fibonacci-chain/fbc/x/staking" 21 "github.com/stretchr/testify/require" 22 ) 23 24 // CreateTestInputDefaultForBenchmark test input with default values 25 func CreateTestInputDefaultForBenchmark(b *testing.B, isCheckTx bool, initPower int64, newVersion bool) ( 26 sdk.Context, auth.AccountKeeper, Keeper, staking.Keeper, types.SupplyKeeper) { 27 ctx, ak, _, dk, sk, _, supplyKeeper := CreateTestInputAdvancedForBenchmark(b, isCheckTx, initPower) 28 h := staking.NewHandler(sk) 29 valOpAddrs, valConsPks, _ := GetTestAddrs() 30 31 if newVersion { 32 tmtypes.UnittestOnlySetMilestoneVenus2Height(-1) 33 dk.SetInitExistedValidatorFlag(ctx, true) 34 dk.SetDistributionType(ctx, types.DistributionTypeOnChain) 35 } 36 37 // create four validators 38 for i := int64(0); i < 4; i++ { 39 msg := staking.NewMsgCreateValidator(valOpAddrs[i], valConsPks[i], 40 staking.Description{}, NewTestSysCoin(i+1, 0)) 41 // assert initial state: zero current rewards 42 _, e := h(ctx, msg) 43 require.Nil(b, e) 44 require.True(b, dk.GetValidatorAccumulatedCommission(ctx, valOpAddrs[i]).IsZero()) 45 } 46 return ctx, ak, dk, sk, supplyKeeper 47 } 48 49 // CreateTestInputAdvancedForBenchmark hogpodge of all sorts of input required for testing 50 func CreateTestInputAdvancedForBenchmark(b *testing.B, isCheckTx bool, initPower int64) ( 51 sdk.Context, auth.AccountKeeper, bank.Keeper, Keeper, staking.Keeper, params.Keeper, types.SupplyKeeper) { 52 initTokens := sdk.TokensFromConsensusPower(initPower) 53 54 keyDistr := sdk.NewKVStoreKey(types.StoreKey) 55 keyStaking := sdk.NewKVStoreKey(staking.StoreKey) 56 tkeyStaking := sdk.NewTransientStoreKey(staking.TStoreKey) 57 keyAcc := sdk.NewKVStoreKey(auth.StoreKey) 58 keyMpt := sdk.NewKVStoreKey(mpt.StoreKey) 59 keySupply := sdk.NewKVStoreKey(supply.StoreKey) 60 keyParams := sdk.NewKVStoreKey(params.StoreKey) 61 tkeyParams := sdk.NewTransientStoreKey(params.TStoreKey) 62 63 db := dbm.NewMemDB() 64 ms := store.NewCommitMultiStore(db) 65 66 ms.MountStoreWithDB(keyDistr, sdk.StoreTypeIAVL, db) 67 ms.MountStoreWithDB(tkeyStaking, sdk.StoreTypeTransient, nil) 68 ms.MountStoreWithDB(keyStaking, sdk.StoreTypeIAVL, db) 69 ms.MountStoreWithDB(keySupply, sdk.StoreTypeIAVL, db) 70 ms.MountStoreWithDB(keyAcc, sdk.StoreTypeIAVL, db) 71 ms.MountStoreWithDB(keyMpt, sdk.StoreTypeMPT, db) 72 ms.MountStoreWithDB(keyParams, sdk.StoreTypeIAVL, db) 73 ms.MountStoreWithDB(tkeyParams, sdk.StoreTypeTransient, db) 74 75 err := ms.LoadLatestVersion() 76 require.Nil(b, err) 77 78 cdc := MakeTestCodec() 79 reg := types2.NewInterfaceRegistry() 80 cc := codec.NewProtoCodec(reg) 81 pro := codec.NewCodecProxy(cc, cdc) 82 83 pk := params.NewKeeper(cdc, keyParams, tkeyParams, log.NewNopLogger()) 84 ctx := sdk.NewContext(ms, abci.Header{ChainID: "foochainid"}, isCheckTx, log.NewNopLogger()) 85 accountKeeper := auth.NewAccountKeeper(cdc, keyAcc, keyMpt, pk.Subspace(auth.DefaultParamspace), auth.ProtoBaseAccount) 86 bankKeeper := bank.NewBaseKeeper(accountKeeper, pk.Subspace(bank.DefaultParamspace), nil) 87 maccPerms := map[string][]string{ 88 auth.FeeCollectorName: nil, 89 types.ModuleName: nil, 90 staking.NotBondedPoolName: {supply.Burner, supply.Staking}, 91 staking.BondedPoolName: {supply.Burner, supply.Staking}, 92 } 93 supplyKeeper := supply.NewKeeper(cdc, keySupply, accountKeeper, bank.NewBankKeeperAdapter(bankKeeper), maccPerms) 94 sk := staking.NewKeeper(pro, keyStaking, supplyKeeper, pk.Subspace(staking.DefaultParamspace)) 95 sk.SetParams(ctx, staking.DefaultParams()) 96 keeper := NewKeeper(cdc, keyDistr, pk.Subspace(types.DefaultParamspace), sk, supplyKeeper, auth.FeeCollectorName, nil) 97 98 initCoins := sdk.NewCoins(sdk.NewCoin(sk.BondDenom(ctx), initTokens)) 99 totalSupply := sdk.NewCoins(sdk.NewCoin(sk.BondDenom(ctx), initTokens.MulRaw(int64(len(TestAddrs))))) 100 supplyKeeper.SetSupply(ctx, supply.NewSupply(totalSupply)) 101 102 // fill all the addresses with some coins, set the loose pool tokens simultaneously 103 for _, addr := range TestAddrs { 104 _, err := bankKeeper.AddCoins(ctx, addr, initCoins) 105 require.Nil(b, err) 106 } 107 108 // set the distribution hooks on staking 109 sk.SetHooks(keeper.Hooks()) 110 return ctx, accountKeeper, bankKeeper, keeper, sk, pk, supplyKeeper 111 } 112 113 func BenchmarkAllocateTokensBefore(b *testing.B) { 114 //start test 115 ctx, _, k, sk, _ := CreateTestInputDefaultForBenchmark(b, false, 1000, false) 116 val := sk.Validator(ctx, valOpAddr1) 117 118 // allocate tokens 119 tokens := NewTestSysCoins(123, 2) 120 121 //reset benchmark timer 122 b.ResetTimer() 123 for n := 0; n < b.N; n++ { 124 k.AllocateTokensToValidator(ctx, val, tokens) 125 } 126 127 require.Equal(b, tokens.MulDec(sdk.NewDec(int64(b.N))), k.GetValidatorAccumulatedCommission(ctx, val.GetOperator())) 128 } 129 130 func BenchmarkAllocateTokensAfter(b *testing.B) { 131 //start test 132 ctx, _, k, sk, _ := CreateTestInputDefaultForBenchmark(b, false, 1000, true) 133 134 validator, found := sk.GetValidator(ctx, valOpAddr1) 135 require.True(b, found) 136 newRate, _ := sdk.NewDecFromStr("0.5") 137 validator.Commission.Rate = newRate 138 sk.SetValidator(ctx, validator) 139 140 val := sk.Validator(ctx, valOpAddr1) 141 // allocate tokens 142 tokens := NewTestSysCoins(123, 2) 143 144 //reset benchmark timer 145 b.ResetTimer() 146 for n := 0; n < b.N; n++ { 147 k.AllocateTokensToValidator(ctx, val, tokens) 148 } 149 require.Equal(b, tokens.MulDec(sdk.NewDec(int64(b.N))).QuoDec(sdk.NewDec(int64(2))), k.GetValidatorAccumulatedCommission(ctx, val.GetOperator())) 150 }