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

     1  package keeper
     2  
     3  import (
     4  	"bytes"
     5  	"strconv"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/mpt"
    10  
    11  	types2 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec/types"
    12  	authexported "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/exported"
    13  
    14  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
    15  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store"
    16  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    17  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth"
    18  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/bank"
    19  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/crisis"
    20  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/supply"
    21  	abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types"
    22  	"github.com/fibonacci-chain/fbc/libs/tendermint/crypto"
    23  	"github.com/fibonacci-chain/fbc/libs/tendermint/crypto/ed25519"
    24  	"github.com/fibonacci-chain/fbc/libs/tendermint/libs/log"
    25  	tmtypes "github.com/fibonacci-chain/fbc/libs/tendermint/types"
    26  	dbm "github.com/fibonacci-chain/fbc/libs/tm-db"
    27  	"github.com/stretchr/testify/require"
    28  
    29  	"github.com/fibonacci-chain/fbc/x/gov/types"
    30  	"github.com/fibonacci-chain/fbc/x/params"
    31  	"github.com/fibonacci-chain/fbc/x/staking"
    32  )
    33  
    34  var (
    35  	// Addrs store generated addresses for test
    36  	Addrs = createTestAddrs(500)
    37  
    38  	DefaultMSD = sdk.NewDecWithPrec(1, 3)
    39  )
    40  
    41  var (
    42  	pubkeys = []crypto.PubKey{
    43  		ed25519.GenPrivKey().PubKey(), ed25519.GenPrivKey().PubKey(),
    44  		ed25519.GenPrivKey().PubKey(), ed25519.GenPrivKey().PubKey(),
    45  	}
    46  
    47  	testDescription = staking.NewDescription("T", "E", "S", "T")
    48  )
    49  
    50  // nolint: unparam
    51  func createTestAddrs(numAddrs int) []sdk.AccAddress {
    52  	var addresses []sdk.AccAddress
    53  	var buffer bytes.Buffer
    54  
    55  	// start at 100 so we can make up to 999 test addresses with valid test addresses
    56  	for i := 100; i < (numAddrs + 100); i++ {
    57  		numString := strconv.Itoa(i)
    58  		_, err := buffer.WriteString("A58856F0FD53BF058B4909A21AEC019107BA6") //base address string
    59  		if err != nil {
    60  			panic(err)
    61  		}
    62  
    63  		_, err = buffer.WriteString(numString) //adding on final two digits to make addresses unique
    64  		if err != nil {
    65  			panic(err)
    66  		}
    67  		res, err := sdk.AccAddressFromHex(buffer.String())
    68  		if err != nil {
    69  			panic(err)
    70  		}
    71  		addresses = append(addresses, res)
    72  		buffer.Reset()
    73  	}
    74  	return addresses
    75  }
    76  
    77  // CreateValidators creates validators according to arguments
    78  func CreateValidators(
    79  	t *testing.T, stakingHandler sdk.Handler, ctx sdk.Context, addrs []sdk.ValAddress, powerAmt []int64,
    80  ) {
    81  	require.True(t, len(addrs) <= len(pubkeys), "Not enough pubkeys specified at top of file.")
    82  
    83  	for i := 0; i < len(addrs); i++ {
    84  		valCreateMsg := staking.NewMsgCreateValidator(
    85  			addrs[i], pubkeys[i],
    86  			testDescription,
    87  			sdk.NewDecCoinFromDec(sdk.DefaultBondDenom, DefaultMSD),
    88  		)
    89  
    90  		_, err := stakingHandler(ctx, valCreateMsg)
    91  		require.Nil(t, err)
    92  	}
    93  }
    94  
    95  // CreateTestInput returns keepers for test
    96  func CreateTestInput(
    97  	t *testing.T, isCheckTx bool, initBalance int64,
    98  ) (sdk.Context, auth.AccountKeeper, Keeper, staking.Keeper, crisis.Keeper) {
    99  	stakingSk := sdk.NewKVStoreKey(staking.StoreKey)
   100  
   101  	stakingTkSk := sdk.NewTransientStoreKey(staking.TStoreKey)
   102  
   103  	keyAcc := sdk.NewKVStoreKey(auth.StoreKey)
   104  	keyMpt := sdk.NewKVStoreKey(mpt.StoreKey)
   105  	keyParams := sdk.NewKVStoreKey(params.StoreKey)
   106  	tkeyParams := sdk.NewTransientStoreKey(params.TStoreKey)
   107  	keySupply := sdk.NewKVStoreKey(supply.StoreKey)
   108  	keyGov := sdk.NewKVStoreKey(types.StoreKey)
   109  
   110  	db := dbm.NewMemDB()
   111  	ms := store.NewCommitMultiStore(db)
   112  	ms.MountStoreWithDB(stakingTkSk, sdk.StoreTypeTransient, nil)
   113  	ms.MountStoreWithDB(stakingSk, sdk.StoreTypeIAVL, db)
   114  
   115  	ms.MountStoreWithDB(keyAcc, sdk.StoreTypeIAVL, db)
   116  	ms.MountStoreWithDB(keyMpt, sdk.StoreTypeMPT, db)
   117  	ms.MountStoreWithDB(keyParams, sdk.StoreTypeIAVL, db)
   118  	ms.MountStoreWithDB(tkeyParams, sdk.StoreTypeTransient, db)
   119  	ms.MountStoreWithDB(keySupply, sdk.StoreTypeIAVL, db)
   120  	ms.MountStoreWithDB(keyGov, sdk.StoreTypeIAVL, db)
   121  	err := ms.LoadLatestVersion()
   122  	require.Nil(t, err)
   123  
   124  	ctx := sdk.NewContext(ms, abci.Header{ChainID: "fbexchain"}, isCheckTx, log.NewNopLogger())
   125  	ctx.SetConsensusParams(
   126  		&abci.ConsensusParams{
   127  			Validator: &abci.ValidatorParams{
   128  				PubKeyTypes: []string{tmtypes.ABCIPubKeyTypeEd25519},
   129  			},
   130  		},
   131  	)
   132  	cdc := MakeTestCodec()
   133  	reg := types2.NewInterfaceRegistry()
   134  	cc := codec.NewProtoCodec(reg)
   135  	pro := codec.NewCodecProxy(cc, cdc)
   136  
   137  	feeCollectorAcc := supply.NewEmptyModuleAccount(auth.FeeCollectorName)
   138  	notBondedPool := supply.NewEmptyModuleAccount(staking.NotBondedPoolName, supply.Staking)
   139  	bondPool := supply.NewEmptyModuleAccount(staking.BondedPoolName, supply.Staking)
   140  	govAcc := supply.NewEmptyModuleAccount(types.ModuleName, supply.Staking)
   141  
   142  	blacklistedAddrs := make(map[string]bool)
   143  	blacklistedAddrs[feeCollectorAcc.String()] = true
   144  	blacklistedAddrs[notBondedPool.String()] = true
   145  	blacklistedAddrs[bondPool.String()] = true
   146  
   147  	pk := params.NewKeeper(cdc, keyParams, tkeyParams, ctx.Logger())
   148  	pk.SetParams(ctx, params.DefaultParams())
   149  
   150  	accountKeeper := auth.NewAccountKeeper(
   151  		cdc,    // amino codec
   152  		keyAcc, // target store
   153  		keyMpt,
   154  		pk.Subspace(auth.DefaultParamspace),
   155  		auth.ProtoBaseAccount, // prototype
   156  	)
   157  
   158  	bk := bank.NewBaseKeeper(
   159  		accountKeeper,
   160  		pk.Subspace(bank.DefaultParamspace),
   161  		blacklistedAddrs,
   162  	)
   163  	pk.SetBankKeeper(bk)
   164  
   165  	maccPerms := map[string][]string{
   166  		auth.FeeCollectorName:     nil,
   167  		staking.NotBondedPoolName: {supply.Staking},
   168  		staking.BondedPoolName:    {supply.Staking},
   169  		types.ModuleName:          nil,
   170  	}
   171  	supplyKeeper := supply.NewKeeper(cdc, keySupply, accountKeeper, bank.NewBankKeeperAdapter(bk), maccPerms)
   172  
   173  	initCoins := sdk.NewCoins(sdk.NewInt64DecCoin(sdk.DefaultBondDenom, initBalance))
   174  	totalSupply := sdk.NewCoins(sdk.NewInt64DecCoin(sdk.DefaultBondDenom, initBalance*(int64(len(Addrs)))))
   175  
   176  	supplyKeeper.SetSupply(ctx, supply.NewSupply(totalSupply))
   177  
   178  	// for staking/distr rollback to cosmos-sdk
   179  	stakingKeeper := staking.NewKeeper(pro, stakingSk, supplyKeeper,
   180  		pk.Subspace(staking.DefaultParamspace))
   181  
   182  	stakingKeeper.SetParams(ctx, staking.DefaultParams())
   183  	pk.SetStakingKeeper(stakingKeeper)
   184  
   185  	// set module accounts
   186  	err = notBondedPool.SetCoins(totalSupply)
   187  	require.NoError(t, err)
   188  
   189  	supplyKeeper.SetModuleAccount(ctx, feeCollectorAcc)
   190  	supplyKeeper.SetModuleAccount(ctx, bondPool)
   191  	supplyKeeper.SetModuleAccount(ctx, notBondedPool)
   192  	supplyKeeper.SetModuleAccount(ctx, govAcc)
   193  
   194  	// fill all the addresses with some coins, set the loose pool tokens simultaneously
   195  	for _, addr := range Addrs {
   196  		_, err := bk.AddCoins(ctx, addr, initCoins)
   197  		if err != nil {
   198  			panic(err)
   199  		}
   200  	}
   201  
   202  	govSubspace := pk.Subspace(types.DefaultParamspace)
   203  	govRouter := NewRouter()
   204  	govRouter.AddRoute(types.RouterKey, types.ProposalHandler).
   205  		AddRoute(params.RouterKey, params.NewParamChangeProposalHandler(&pk))
   206  	govProposalHandlerRouter := NewProposalHandlerRouter()
   207  	govProposalHandlerRouter.AddRoute(params.RouterKey, pk)
   208  	keeper := NewKeeper(cdc, keyGov, pk, govSubspace, supplyKeeper, stakingKeeper,
   209  		types.DefaultCodespace, govRouter, bk, govProposalHandlerRouter, auth.FeeCollectorName)
   210  	pk.SetGovKeeper(keeper)
   211  
   212  	minDeposit := sdk.NewDecCoinsFromDec(sdk.DefaultBondDenom, sdk.NewDec(100))
   213  	depositParams := types.DepositParams{
   214  		MinDeposit:       minDeposit,
   215  		MaxDepositPeriod: time.Hour * 24,
   216  	}
   217  	votingParams := types.VotingParams{
   218  		VotingPeriod: time.Hour * 72,
   219  	}
   220  	tallyParams := types.TallyParams{
   221  		Quorum:          sdk.NewDecWithPrec(334, 3),
   222  		Threshold:       sdk.NewDecWithPrec(5, 1),
   223  		Veto:            sdk.NewDecWithPrec(334, 3),
   224  		YesInVotePeriod: sdk.NewDecWithPrec(667, 3),
   225  	}
   226  	keeper.SetProposalID(ctx, 1)
   227  	keeper.SetDepositParams(ctx, depositParams)
   228  	keeper.SetVotingParams(ctx, votingParams)
   229  	keeper.SetTallyParams(ctx, tallyParams)
   230  
   231  	crisisKeeper := crisis.NewKeeper(pk.Subspace(crisis.DefaultParamspace), 0,
   232  		supplyKeeper, auth.FeeCollectorName)
   233  	return ctx, accountKeeper, keeper, stakingKeeper, crisisKeeper
   234  }
   235  
   236  // MakeTestCodec creates a codec used only for testing
   237  func MakeTestCodec() *codec.Codec {
   238  	var cdc = codec.New()
   239  
   240  	// Register Msgs
   241  	cdc.RegisterInterface((*sdk.Msg)(nil), nil)
   242  	cdc.RegisterConcrete(types.MsgSubmitProposal{}, "test/gov/MsgSubmitProposal", nil)
   243  	cdc.RegisterConcrete(types.MsgDeposit{}, "test/gov/MsgDeposit", nil)
   244  	cdc.RegisterConcrete(types.MsgVote{}, "test/gov/MsgVote", nil)
   245  
   246  	cdc.RegisterInterface((*types.Content)(nil), nil)
   247  	cdc.RegisterConcrete(types.TextProposal{}, "test/gov/TextProposal", nil)
   248  	cdc.RegisterConcrete(params.ParameterChangeProposal{}, "test/params/ParameterChangeProposal", nil)
   249  	cdc.RegisterConcrete(types.Proposal{}, "test/gov/Proposal", nil)
   250  
   251  	// Register AppAccount
   252  	cdc.RegisterInterface((*authexported.Account)(nil), nil)
   253  	cdc.RegisterConcrete(&auth.BaseAccount{}, "test/gov/BaseAccount", nil)
   254  	supply.RegisterCodec(cdc)
   255  	codec.RegisterCrypto(cdc)
   256  
   257  	return cdc
   258  }