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 }