github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/distribution/keeper/test_common.go (about)

     1  package keeper
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/mpt"
     7  
     8  	types2 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec/types"
     9  
    10  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
    11  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store"
    12  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    13  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth"
    14  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/bank"
    15  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/supply"
    16  	abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types"
    17  	"github.com/fibonacci-chain/fbc/libs/tendermint/crypto"
    18  	"github.com/fibonacci-chain/fbc/libs/tendermint/crypto/ed25519"
    19  	"github.com/fibonacci-chain/fbc/libs/tendermint/libs/log"
    20  	dbm "github.com/fibonacci-chain/fbc/libs/tm-db"
    21  	"github.com/fibonacci-chain/fbc/x/distribution/types"
    22  	"github.com/fibonacci-chain/fbc/x/params"
    23  	"github.com/fibonacci-chain/fbc/x/staking"
    24  	"github.com/stretchr/testify/require"
    25  )
    26  
    27  // nolint: deadcode unused
    28  var (
    29  	delPk1   = ed25519.GenPrivKey().PubKey()
    30  	delPk2   = ed25519.GenPrivKey().PubKey()
    31  	delPk3   = ed25519.GenPrivKey().PubKey()
    32  	delPk4   = ed25519.GenPrivKey().PubKey()
    33  	delAddr1 = sdk.AccAddress(delPk1.Address())
    34  	delAddr2 = sdk.AccAddress(delPk2.Address())
    35  	delAddr3 = sdk.AccAddress(delPk3.Address())
    36  	delAddr4 = sdk.AccAddress(delPk4.Address())
    37  
    38  	proxyPk1   = ed25519.GenPrivKey().PubKey()
    39  	proxyPk2   = ed25519.GenPrivKey().PubKey()
    40  	proxyPk3   = ed25519.GenPrivKey().PubKey()
    41  	proxyPk4   = ed25519.GenPrivKey().PubKey()
    42  	proxyAddr1 = sdk.AccAddress(proxyPk1.Address())
    43  	proxyAddr2 = sdk.AccAddress(proxyPk2.Address())
    44  	proxyAddr3 = sdk.AccAddress(proxyPk3.Address())
    45  	proxyAddr4 = sdk.AccAddress(proxyPk4.Address())
    46  
    47  	valOpPk1    = ed25519.GenPrivKey().PubKey()
    48  	valOpPk2    = ed25519.GenPrivKey().PubKey()
    49  	valOpPk3    = ed25519.GenPrivKey().PubKey()
    50  	valOpPk4    = ed25519.GenPrivKey().PubKey()
    51  	valOpAddr1  = sdk.ValAddress(valOpPk1.Address())
    52  	valOpAddr2  = sdk.ValAddress(valOpPk2.Address())
    53  	valOpAddr3  = sdk.ValAddress(valOpPk3.Address())
    54  	valOpAddr4  = sdk.ValAddress(valOpPk4.Address())
    55  	valAccAddr1 = sdk.AccAddress(valOpPk1.Address()) // generate acc addresses for these validator keys too
    56  	valAccAddr2 = sdk.AccAddress(valOpPk2.Address())
    57  	valAccAddr3 = sdk.AccAddress(valOpPk3.Address())
    58  	valAccAddr4 = sdk.AccAddress(valOpPk4.Address())
    59  
    60  	valConsPk1   = ed25519.GenPrivKey().PubKey()
    61  	valConsPk2   = ed25519.GenPrivKey().PubKey()
    62  	valConsPk3   = ed25519.GenPrivKey().PubKey()
    63  	valConsPk4   = ed25519.GenPrivKey().PubKey()
    64  	valConsAddr1 = sdk.ConsAddress(valConsPk1.Address())
    65  	valConsAddr2 = sdk.ConsAddress(valConsPk2.Address())
    66  	valConsAddr3 = sdk.ConsAddress(valConsPk3.Address())
    67  	valConsAddr4 = sdk.ConsAddress(valConsPk4.Address())
    68  
    69  	// TODO move to common testing package for all modules
    70  	// test addresses
    71  	TestAddrs = []sdk.AccAddress{
    72  		delAddr1, delAddr2, delAddr3, delAddr4,
    73  		proxyAddr1, proxyAddr2, proxyAddr3, proxyAddr4,
    74  		valAccAddr1, valAccAddr2, valAccAddr3, valAccAddr4,
    75  	}
    76  	TestDelAddrs    = []sdk.AccAddress{delAddr1, delAddr2, delAddr3, delAddr4}
    77  	TestProxyAddrs  = []sdk.AccAddress{proxyAddr1, proxyAddr2, proxyAddr3, proxyAddr4}
    78  	TestValAddrs    = []sdk.ValAddress{valOpAddr1, valOpAddr2, valOpAddr3, valOpAddr4}
    79  	TestConsAddrs   = []sdk.ConsAddress{valConsAddr1, valConsAddr2, valConsAddr3, valConsAddr4}
    80  	TestValAccAddrs = []sdk.AccAddress{valAccAddr1, valAccAddr2, valAccAddr3, valAccAddr4}
    81  
    82  	distrAcc = supply.NewEmptyModuleAccount(types.ModuleName)
    83  )
    84  
    85  func ReInit() {
    86  	delPk1 = ed25519.GenPrivKey().PubKey()
    87  	delPk2 = ed25519.GenPrivKey().PubKey()
    88  	delPk3 = ed25519.GenPrivKey().PubKey()
    89  	delPk4 = ed25519.GenPrivKey().PubKey()
    90  	delAddr1 = sdk.AccAddress(delPk1.Address())
    91  	delAddr2 = sdk.AccAddress(delPk2.Address())
    92  	delAddr3 = sdk.AccAddress(delPk3.Address())
    93  	delAddr4 = sdk.AccAddress(delPk4.Address())
    94  
    95  	proxyAddr1 = sdk.AccAddress(proxyPk1.Address())
    96  	proxyAddr2 = sdk.AccAddress(proxyPk2.Address())
    97  	proxyAddr3 = sdk.AccAddress(proxyPk3.Address())
    98  	proxyAddr4 = sdk.AccAddress(proxyPk4.Address())
    99  
   100  	valOpPk1 = ed25519.GenPrivKey().PubKey()
   101  	valOpPk2 = ed25519.GenPrivKey().PubKey()
   102  	valOpPk3 = ed25519.GenPrivKey().PubKey()
   103  	valOpPk4 = ed25519.GenPrivKey().PubKey()
   104  	valOpAddr1 = sdk.ValAddress(valOpPk1.Address())
   105  	valOpAddr2 = sdk.ValAddress(valOpPk2.Address())
   106  	valOpAddr3 = sdk.ValAddress(valOpPk3.Address())
   107  	valOpAddr4 = sdk.ValAddress(valOpPk4.Address())
   108  	valAccAddr1 = sdk.AccAddress(valOpPk1.Address()) // generate acc addresses for these validator keys too
   109  	valAccAddr2 = sdk.AccAddress(valOpPk2.Address())
   110  	valAccAddr3 = sdk.AccAddress(valOpPk3.Address())
   111  	valAccAddr4 = sdk.AccAddress(valOpPk4.Address())
   112  
   113  	valConsPk1 = ed25519.GenPrivKey().PubKey()
   114  	valConsPk2 = ed25519.GenPrivKey().PubKey()
   115  	valConsPk3 = ed25519.GenPrivKey().PubKey()
   116  	valConsPk4 = ed25519.GenPrivKey().PubKey()
   117  	valConsAddr1 = sdk.ConsAddress(valConsPk1.Address())
   118  	valConsAddr2 = sdk.ConsAddress(valConsPk2.Address())
   119  	valConsAddr3 = sdk.ConsAddress(valConsPk3.Address())
   120  	valConsAddr4 = sdk.ConsAddress(valConsPk4.Address())
   121  
   122  	// TODO move to common testing package for all modules
   123  	// test addresses
   124  	TestAddrs = []sdk.AccAddress{
   125  		delAddr1, delAddr2, delAddr3, delAddr4,
   126  		valAccAddr1, valAccAddr2, valAccAddr3, valAccAddr4,
   127  	}
   128  
   129  	distrAcc = supply.NewEmptyModuleAccount(types.ModuleName)
   130  }
   131  
   132  // GetTestAddrs returns valOpAddrs, valConsPks, valConsAddrs for test
   133  func GetTestAddrs() ([]sdk.ValAddress, []crypto.PubKey, []sdk.ConsAddress) {
   134  	valOpAddrs := []sdk.ValAddress{valOpAddr1, valOpAddr2, valOpAddr3, valOpAddr4}
   135  	valConsPks := []crypto.PubKey{valConsPk1, valConsPk2, valConsPk3, valConsPk4}
   136  	valConsAddrs := []sdk.ConsAddress{valConsAddr1, valConsAddr2, valConsAddr3, valConsAddr4}
   137  	return valOpAddrs, valConsPks, valConsAddrs
   138  }
   139  
   140  // NewTestSysCoins returns dec coins
   141  func NewTestSysCoins(i int64, precison int64) sdk.SysCoins {
   142  	return sdk.SysCoins{NewTestSysCoin(i, precison)}
   143  }
   144  
   145  // NewTestSysCoin returns one dec coin
   146  func NewTestSysCoin(i int64, precison int64) sdk.SysCoin {
   147  	return sdk.NewDecCoinFromDec(sdk.DefaultBondDenom, sdk.NewDecWithPrec(i, precison))
   148  }
   149  
   150  // MakeTestCodec creates a codec used only for testing
   151  func MakeTestCodec() *codec.Codec {
   152  	var cdc = codec.New()
   153  	bank.RegisterCodec(cdc)
   154  	staking.RegisterCodec(cdc)
   155  	auth.RegisterCodec(cdc)
   156  	supply.RegisterCodec(cdc)
   157  	sdk.RegisterCodec(cdc)
   158  	codec.RegisterCrypto(cdc)
   159  	//gov.RegisterCodec(cdc)
   160  
   161  	types.RegisterCodec(cdc) // distr
   162  	return cdc
   163  }
   164  
   165  // CreateTestInputDefault test input with default values
   166  func CreateTestInputDefault(t *testing.T, isCheckTx bool, initPower int64) (
   167  	sdk.Context, auth.AccountKeeper, Keeper, staking.Keeper, types.SupplyKeeper) {
   168  	communityTax := sdk.NewDecWithPrec(2, 2)
   169  	ctx, ak, _, dk, sk, _, supplyKeeper := CreateTestInputAdvanced(t, isCheckTx, initPower, communityTax)
   170  	h := staking.NewHandler(sk)
   171  	valOpAddrs, valConsPks, _ := GetTestAddrs()
   172  	// create four validators
   173  	for i := int64(0); i < 4; i++ {
   174  		msg := staking.NewMsgCreateValidator(valOpAddrs[i], valConsPks[i],
   175  			staking.Description{}, NewTestSysCoin(i+1, 0))
   176  		// assert initial state: zero current rewards
   177  		_, e := h(ctx, msg)
   178  		require.Nil(t, e)
   179  		require.True(t, dk.GetValidatorAccumulatedCommission(ctx, valOpAddrs[i]).IsZero())
   180  	}
   181  	return ctx, ak, dk, sk, supplyKeeper
   182  }
   183  
   184  // CreateTestInputAdvanced hogpodge of all sorts of input required for testing
   185  func CreateTestInputAdvanced(t *testing.T, isCheckTx bool, initPower int64, communityTax sdk.Dec) (
   186  	sdk.Context, auth.AccountKeeper, bank.Keeper, Keeper, staking.Keeper, params.Keeper, types.SupplyKeeper) {
   187  
   188  	initTokens := sdk.TokensFromConsensusPower(initPower)
   189  
   190  	keyDistr := sdk.NewKVStoreKey(types.StoreKey)
   191  	keyStaking := sdk.NewKVStoreKey(staking.StoreKey)
   192  	tkeyStaking := sdk.NewTransientStoreKey(staking.TStoreKey)
   193  	keyAcc := sdk.NewKVStoreKey(auth.StoreKey)
   194  	keyMpt := sdk.NewKVStoreKey(mpt.StoreKey)
   195  	keySupply := sdk.NewKVStoreKey(supply.StoreKey)
   196  	keyParams := sdk.NewKVStoreKey(params.StoreKey)
   197  	tkeyParams := sdk.NewTransientStoreKey(params.TStoreKey)
   198  
   199  	db := dbm.NewMemDB()
   200  	ms := store.NewCommitMultiStore(db)
   201  
   202  	ms.MountStoreWithDB(keyDistr, sdk.StoreTypeIAVL, db)
   203  	ms.MountStoreWithDB(tkeyStaking, sdk.StoreTypeTransient, nil)
   204  	ms.MountStoreWithDB(keyStaking, sdk.StoreTypeIAVL, db)
   205  	ms.MountStoreWithDB(keySupply, sdk.StoreTypeIAVL, db)
   206  	ms.MountStoreWithDB(keyAcc, sdk.StoreTypeIAVL, db)
   207  	ms.MountStoreWithDB(keyMpt, sdk.StoreTypeMPT, db)
   208  	ms.MountStoreWithDB(keyParams, sdk.StoreTypeIAVL, db)
   209  	ms.MountStoreWithDB(tkeyParams, sdk.StoreTypeTransient, db)
   210  
   211  	err := ms.LoadLatestVersion()
   212  	require.Nil(t, err)
   213  
   214  	feeCollectorAcc := supply.NewEmptyModuleAccount(auth.FeeCollectorName)
   215  	notBondedPool := supply.NewEmptyModuleAccount(staking.NotBondedPoolName, supply.Burner, supply.Staking)
   216  	bondPool := supply.NewEmptyModuleAccount(staking.BondedPoolName, supply.Burner, supply.Staking)
   217  
   218  	blacklistedAddrs := make(map[string]bool)
   219  	blacklistedAddrs[feeCollectorAcc.GetAddress().String()] = true
   220  	blacklistedAddrs[notBondedPool.GetAddress().String()] = true
   221  	blacklistedAddrs[bondPool.GetAddress().String()] = true
   222  	blacklistedAddrs[distrAcc.GetAddress().String()] = true
   223  
   224  	cdc := MakeTestCodec()
   225  	reg := types2.NewInterfaceRegistry()
   226  	cc := codec.NewProtoCodec(reg)
   227  	pro := codec.NewCodecProxy(cc, cdc)
   228  
   229  	pk := params.NewKeeper(cdc, keyParams, tkeyParams, log.NewNopLogger())
   230  
   231  	ctx := sdk.NewContext(ms, abci.Header{ChainID: "foochainid"}, isCheckTx, log.NewNopLogger())
   232  	accountKeeper := auth.NewAccountKeeper(cdc, keyAcc, keyMpt, pk.Subspace(auth.DefaultParamspace), auth.ProtoBaseAccount)
   233  	bankKeeper := bank.NewBaseKeeper(accountKeeper, pk.Subspace(bank.DefaultParamspace),
   234  		blacklistedAddrs)
   235  	maccPerms := map[string][]string{
   236  		auth.FeeCollectorName:     nil,
   237  		types.ModuleName:          nil,
   238  		staking.NotBondedPoolName: {supply.Burner, supply.Staking},
   239  		staking.BondedPoolName:    {supply.Burner, supply.Staking},
   240  	}
   241  	supplyKeeper := supply.NewKeeper(cdc, keySupply, accountKeeper, bank.NewBankKeeperAdapter(bankKeeper), maccPerms)
   242  
   243  	sk := staking.NewKeeper(pro, keyStaking, supplyKeeper,
   244  		pk.Subspace(staking.DefaultParamspace))
   245  	sk.SetParams(ctx, staking.DefaultParams())
   246  
   247  	keeper := NewKeeper(cdc, keyDistr, pk.Subspace(types.DefaultParamspace), sk, supplyKeeper,
   248  		auth.FeeCollectorName, blacklistedAddrs)
   249  
   250  	keeper.SetWithdrawAddrEnabled(ctx, true)
   251  	initCoins := sdk.NewCoins(sdk.NewCoin(sk.BondDenom(ctx), initTokens))
   252  	totalSupply := sdk.NewCoins(sdk.NewCoin(sk.BondDenom(ctx), initTokens.MulRaw(int64(len(TestAddrs)))))
   253  	supplyKeeper.SetSupply(ctx, supply.NewSupply(totalSupply))
   254  
   255  	// fill all the addresses with some coins, set the loose pool tokens simultaneously
   256  	for _, addr := range TestAddrs {
   257  		_, err := bankKeeper.AddCoins(ctx, addr, initCoins)
   258  		require.Nil(t, err)
   259  	}
   260  
   261  	// set module accounts
   262  	keeper.supplyKeeper.SetModuleAccount(ctx, feeCollectorAcc)
   263  	keeper.supplyKeeper.SetModuleAccount(ctx, notBondedPool)
   264  	keeper.supplyKeeper.SetModuleAccount(ctx, bondPool)
   265  	keeper.supplyKeeper.SetModuleAccount(ctx, distrAcc)
   266  
   267  	// set the distribution hooks on staking
   268  	sk.SetHooks(keeper.Hooks())
   269  
   270  	// set genesis items required for distribution
   271  	keeper.SetFeePool(ctx, types.InitialFeePool())
   272  	keeper.SetCommunityTax(ctx, communityTax)
   273  
   274  	return ctx, accountKeeper, bankKeeper, keeper, sk, pk, supplyKeeper
   275  }