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 }