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  }