github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/farm/keeper/test_common.go (about) 1 package keeper 2 3 import ( 4 "bytes" 5 "fmt" 6 "strconv" 7 "testing" 8 "time" 9 10 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec" 11 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store" 12 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/mpt" 13 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 14 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth" 15 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/bank" 16 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/staking" 17 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/supply" 18 abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types" 19 "github.com/fibonacci-chain/fbc/libs/tendermint/libs/log" 20 tmtypes "github.com/fibonacci-chain/fbc/libs/tendermint/types" 21 dbm "github.com/fibonacci-chain/fbc/libs/tm-db" 22 swap "github.com/fibonacci-chain/fbc/x/ammswap" 23 swaptypes "github.com/fibonacci-chain/fbc/x/ammswap/types" 24 evm "github.com/fibonacci-chain/fbc/x/evm/keeper" 25 evmtypes "github.com/fibonacci-chain/fbc/x/evm/types" 26 "github.com/fibonacci-chain/fbc/x/farm/types" 27 "github.com/fibonacci-chain/fbc/x/gov" 28 govkeeper "github.com/fibonacci-chain/fbc/x/gov/keeper" 29 govtypes "github.com/fibonacci-chain/fbc/x/gov/types" 30 "github.com/fibonacci-chain/fbc/x/params" 31 "github.com/fibonacci-chain/fbc/x/token" 32 "github.com/stretchr/testify/require" 33 ) 34 35 const ( 36 TestChainID = "fbexchain" 37 ) 38 39 var ( 40 Addrs = createTestAddrs(10) 41 ) 42 43 type MockFarmKeeper struct { 44 Keeper 45 StoreKey sdk.StoreKey 46 SupplyKeeper supply.Keeper 47 MountedStore store.MultiStore 48 AccKeeper auth.AccountKeeper 49 BankKeeper bank.Keeper 50 TokenKeeper token.Keeper 51 SwapKeeper swap.Keeper 52 ObserverKeeper *MockObserverKeeper 53 } 54 55 type MockObserverKeeper struct { 56 ObserverData MockObserverData 57 } 58 59 func (ok *MockObserverKeeper) OnFarmClaim(ctx sdk.Context, address sdk.AccAddress, poolName string, claimedCoins sdk.SysCoins) { 60 ok.ObserverData = MockObserverData{ 61 Address: address, 62 PoolName: poolName, 63 ClaimedCoins: claimedCoins, 64 } 65 } 66 67 type MockObserverData struct { 68 Address sdk.AccAddress 69 PoolName string 70 ClaimedCoins sdk.SysCoins 71 } 72 73 func NewMockFarmKeeper( 74 k Keeper, keyStoreKey sdk.StoreKey, sKeeper supply.Keeper, 75 ms store.MultiStore, accKeeper auth.AccountKeeper, bankKeeper bank.Keeper, 76 tokenKeeper token.Keeper, swapKeeper swap.Keeper, observerKeeper *MockObserverKeeper, 77 ) MockFarmKeeper { 78 return MockFarmKeeper{ 79 k, 80 keyStoreKey, 81 sKeeper, 82 ms, 83 accKeeper, 84 bankKeeper, 85 tokenKeeper, 86 swapKeeper, 87 observerKeeper, 88 } 89 } 90 91 func GetKeeper(t *testing.T) (sdk.Context, MockFarmKeeper) { 92 // 0.1 init store key 93 keyFarm := sdk.NewKVStoreKey(types.StoreKey) 94 tkeyFarm := sdk.NewTransientStoreKey(types.TStoreKey) 95 keyAcc := sdk.NewKVStoreKey(auth.StoreKey) 96 keyMpt := sdk.NewKVStoreKey(mpt.StoreKey) 97 keyParams := sdk.NewKVStoreKey(params.StoreKey) 98 tkeyParams := sdk.NewTransientStoreKey(params.TStoreKey) 99 keySupply := sdk.NewKVStoreKey(supply.StoreKey) 100 keyToken := sdk.NewKVStoreKey(token.StoreKey) 101 keyLock := sdk.NewKVStoreKey(token.KeyLock) 102 keySwap := sdk.NewKVStoreKey(swaptypes.StoreKey) 103 keyEvm := sdk.NewKVStoreKey(evmtypes.StoreKey) 104 keyGov := sdk.NewKVStoreKey(govtypes.StoreKey) 105 keyStaking := sdk.NewKVStoreKey(types.StoreKey) 106 107 // 0.2 init db 108 db := dbm.NewMemDB() 109 ms := store.NewCommitMultiStore(db) 110 ms.MountStoreWithDB(tkeyFarm, sdk.StoreTypeTransient, nil) 111 ms.MountStoreWithDB(keyFarm, sdk.StoreTypeIAVL, db) 112 ms.MountStoreWithDB(keyAcc, sdk.StoreTypeIAVL, db) 113 ms.MountStoreWithDB(keyMpt, sdk.StoreTypeMPT, db) 114 ms.MountStoreWithDB(keyParams, sdk.StoreTypeIAVL, db) 115 ms.MountStoreWithDB(tkeyParams, sdk.StoreTypeTransient, db) 116 ms.MountStoreWithDB(keySupply, sdk.StoreTypeIAVL, db) 117 ms.MountStoreWithDB(keyToken, sdk.StoreTypeIAVL, db) 118 ms.MountStoreWithDB(keySwap, sdk.StoreTypeIAVL, db) 119 ms.MountStoreWithDB(keyGov, sdk.StoreTypeIAVL, db) 120 err := ms.LoadLatestVersion() 121 require.Nil(t, err) 122 123 // 0.3 init context 124 ctx := sdk.NewContext(ms, abci.Header{ChainID: TestChainID}, false, log.NewNopLogger()) 125 ctx.SetConsensusParams( 126 &abci.ConsensusParams{ 127 Validator: &abci.ValidatorParams{ 128 PubKeyTypes: []string{tmtypes.ABCIPubKeyTypeEd25519}, 129 }, 130 }, 131 ) 132 133 // 0.4 init codec 134 cdc := codec.New() 135 types.RegisterCodec(cdc) 136 supply.RegisterCodec(cdc) 137 bank.RegisterCodec(cdc) 138 token.RegisterCodec(cdc) 139 auth.RegisterCodec(cdc) 140 params.RegisterCodec(cdc) 141 swaptypes.RegisterCodec(cdc) 142 codec.RegisterCrypto(cdc) 143 144 // 1.1 init param keeper 145 pk := params.NewKeeper(cdc, keyParams, tkeyParams, ctx.Logger()) 146 147 // 1.2 init account keeper 148 ak := auth.NewAccountKeeper(cdc, keyAcc, keyMpt, pk.Subspace(auth.DefaultParamspace), auth.ProtoBaseAccount) 149 150 // 1.3 init bank keeper 151 feeCollectorAcc := supply.NewEmptyModuleAccount(auth.FeeCollectorName) 152 farmAcc := supply.NewEmptyModuleAccount(types.ModuleName, supply.Burner, supply.Minter) 153 yieldFarmingAccount := supply.NewEmptyModuleAccount(types.YieldFarmingAccount, supply.Burner, supply.Minter) 154 mintFarmingAccount := supply.NewEmptyModuleAccount(types.MintFarmingAccount, supply.Burner, supply.Minter) 155 swapModuleAccount := supply.NewEmptyModuleAccount(swap.ModuleName, supply.Burner, supply.Minter) 156 157 blacklistedAddrs := make(map[string]bool) 158 blacklistedAddrs[feeCollectorAcc.String()] = true 159 blacklistedAddrs[farmAcc.String()] = true 160 161 bk := bank.NewBaseKeeper(ak, pk.Subspace(bank.DefaultParamspace), blacklistedAddrs) 162 // fill all the addresses with some coins 163 initCoins := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(1000))) 164 for _, addr := range Addrs { 165 _, err := bk.AddCoins(ctx, addr, initCoins) 166 if err != nil { 167 panic(err) 168 } 169 } 170 171 // 1.4 init supply keeper 172 maccPerms := map[string][]string{ 173 auth.FeeCollectorName: nil, 174 types.ModuleName: nil, 175 types.YieldFarmingAccount: nil, 176 types.MintFarmingAccount: nil, 177 swap.ModuleName: {supply.Burner, supply.Minter}, 178 govtypes.ModuleName: nil, 179 } 180 sk := supply.NewKeeper(cdc, keySupply, ak, bank.NewBankKeeperAdapter(bk), maccPerms) 181 sk.SetSupply(ctx, supply.NewSupply(sdk.NewDecCoinsFromDec(sdk.DefaultBondDenom, sdk.NewDec(1000000000)))) 182 sk.SetModuleAccount(ctx, feeCollectorAcc) 183 sk.SetModuleAccount(ctx, farmAcc) 184 sk.SetModuleAccount(ctx, yieldFarmingAccount) 185 sk.SetModuleAccount(ctx, mintFarmingAccount) 186 sk.SetModuleAccount(ctx, swapModuleAccount) 187 188 stk := staking.NewKeeper(cdc, keyStaking, sk, pk.Subspace(staking.DefaultParamspace)) 189 190 // 1.5 init token keeper 191 tk := token.NewKeeper(bk, pk.Subspace(token.DefaultParamspace), auth.FeeCollectorName, sk, keyToken, keyLock, cdc, false, ak) 192 193 // 1.6 init swap keeper 194 swapKeeper := swap.NewKeeper(sk, tk, cdc, keySwap, pk.Subspace(swaptypes.DefaultParamspace)) 195 evmKeeper := evm.NewKeeper(cdc, keyEvm, pk.Subspace(evmtypes.DefaultParamspace), &ak, sk, bk, stk, log.NewNopLogger()) 196 197 // 1.7 init farm keeper 198 fk := NewKeeper(auth.FeeCollectorName, sk, tk, swapKeeper, *evmKeeper, pk.Subspace(types.DefaultParamspace), keyFarm, cdc) 199 200 fk.SetParams(ctx, types.DefaultParams()) 201 202 // 1.8 init gov keeper 203 govSubspace := pk.Subspace(govtypes.DefaultParamspace) 204 govProposalHandlerRouter := govkeeper.NewProposalHandlerRouter() 205 govProposalHandlerRouter.AddRoute(params.RouterKey, pk) 206 govKeeper := gov.NewKeeper(cdc, keyGov, pk, govSubspace, sk, nil, 207 types.DefaultCodespace, gov.NewRouter(), bk, govProposalHandlerRouter, auth.FeeCollectorName) 208 minDeposit := sdk.NewDecCoinsFromDec(sdk.DefaultBondDenom, sdk.NewDec(100)) 209 depositParams := govtypes.DepositParams{ 210 MinDeposit: minDeposit, 211 MaxDepositPeriod: time.Hour * 24, 212 } 213 votingParams := govtypes.VotingParams{ 214 VotingPeriod: time.Hour * 72, 215 } 216 tallyParams := govtypes.TallyParams{ 217 Quorum: sdk.NewDecWithPrec(334, 3), 218 Threshold: sdk.NewDecWithPrec(5, 1), 219 Veto: sdk.NewDecWithPrec(334, 3), 220 YesInVotePeriod: sdk.NewDecWithPrec(667, 3), 221 } 222 govKeeper.SetDepositParams(ctx, depositParams) 223 govKeeper.SetVotingParams(ctx, votingParams) 224 govKeeper.SetTallyParams(ctx, tallyParams) 225 226 fk.SetGovKeeper(govKeeper) 227 228 observerKeeper := &MockObserverKeeper{} 229 fk.SetObserverKeeper(observerKeeper) 230 // 2. init mock keeper 231 mk := NewMockFarmKeeper(fk, keyFarm, sk, ms, ak, bk, tk, swapKeeper, observerKeeper) 232 233 //// 3. init mockApp 234 //mApp := mock.NewApp() 235 //mApp.Router().AddRoute(types.RouterKey, NewHandler(fk)) 236 // 237 //require.NoError(t, mApp.CompleteSetup(mk.StoreKey)) 238 return ctx, mk 239 } 240 241 func createTestAddrs(numAddrs int) []sdk.AccAddress { 242 var addresses []sdk.AccAddress 243 var buffer bytes.Buffer 244 245 // start at 100 so we can make up to 999 test addresses with valid test addresses 246 for i := 100; i < (numAddrs + 100); i++ { 247 numString := strconv.Itoa(i) 248 buffer.WriteString("A58856F0FD53BF058B4909A21AEC019107BA6") //base address string 249 250 buffer.WriteString(numString) //adding on final two digits to make addresses unique 251 res, err := sdk.AccAddressFromHex(buffer.String()) 252 if err != nil { 253 fmt.Print("error") 254 } 255 bech := res.String() 256 addresses = append(addresses, testAddr(buffer.String(), bech)) 257 buffer.Reset() 258 } 259 return addresses 260 } 261 262 // TestAddr is designed for incode address generation 263 func testAddr(addr string, bech string) sdk.AccAddress { 264 265 res, err := sdk.AccAddressFromHex(addr) 266 if err != nil { 267 panic(err) 268 } 269 bechexpected := res.String() 270 if bech != bechexpected { 271 panic("Bech encoding doesn't match reference") 272 } 273 274 bechres, err := sdk.AccAddressFromBech32(bech) 275 if err != nil { 276 panic(err) 277 } 278 if !bytes.Equal(bechres, res) { 279 panic("Bech decode and hex decode don't match") 280 } 281 282 return res 283 } 284 285 func initPoolsAndLockInfos( 286 t *testing.T, ctx sdk.Context, mockKeeper MockFarmKeeper, 287 ) (pools types.FarmPools, lockInfos []types.LockInfo) { 288 pool1Name := "pool1" 289 pool2Name := "pool2" 290 291 pool1LockedAmount := sdk.NewDecCoin("xxb", sdk.NewInt(100)) 292 pool2LockedAmount := sdk.NewDecCoin("yyb", sdk.NewInt(100)) 293 294 lockInfos = []types.LockInfo{ 295 types.NewLockInfo(Addrs[0], pool1Name, pool1LockedAmount, 80, 1), 296 types.NewLockInfo(Addrs[1], pool1Name, pool1LockedAmount, 90, 2), 297 types.NewLockInfo(Addrs[0], pool2Name, pool2LockedAmount, 80, 1), 298 types.NewLockInfo(Addrs[1], pool2Name, pool2LockedAmount, 90, 2), 299 } 300 301 for _, lockInfo := range lockInfos { 302 mockKeeper.Keeper.SetLockInfo(ctx, lockInfo) 303 mockKeeper.Keeper.SetAddressInFarmPool(ctx, lockInfo.PoolName, lockInfo.Owner) 304 } 305 306 yieldAmount := sdk.NewDecCoin("wwb", sdk.NewInt(1000)) 307 poolYieldedInfos := types.YieldedTokenInfos{ 308 types.NewYieldedTokenInfo(yieldAmount, 100, sdk.NewDec(10)), 309 } 310 pools = types.FarmPools{ 311 types.NewFarmPool( 312 Addrs[2], pool1Name, sdk.NewDecCoinFromDec(pool1LockedAmount.Denom, sdk.ZeroDec()), 313 sdk.NewDecCoin(sdk.DefaultBondDenom, sdk.NewInt(100)), 314 pool1LockedAmount.Add(pool1LockedAmount), poolYieldedInfos, sdk.SysCoins(nil), 315 ), 316 types.NewFarmPool( 317 Addrs[3], pool2Name, sdk.NewDecCoinFromDec(pool2LockedAmount.Denom, sdk.ZeroDec()), 318 sdk.NewDecCoin(sdk.DefaultBondDenom, sdk.NewInt(200)), 319 pool2LockedAmount.Add(pool2LockedAmount), poolYieldedInfos, sdk.SysCoins(nil), 320 ), 321 } 322 for _, pool := range pools { 323 mockKeeper.Keeper.SetFarmPool(ctx, pool) 324 mockKeeper.Keeper.SetPoolHistoricalRewards( 325 ctx, pool.Name, 1, types.NewPoolHistoricalRewards(sdk.SysCoins{}, 1), 326 ) 327 mockKeeper.Keeper.SetPoolHistoricalRewards( 328 ctx, pool.Name, 2, types.NewPoolHistoricalRewards(sdk.SysCoins{}, 2), 329 ) 330 mockKeeper.Keeper.SetPoolCurrentRewards( 331 ctx, pool.Name, types.NewPoolCurrentRewards(90, 3, sdk.SysCoins{}), 332 ) 333 334 moduleAcc := mockKeeper.supplyKeeper.GetModuleAccount(ctx, types.ModuleName) 335 err := moduleAcc.SetCoins( 336 moduleAcc.GetCoins().Add2(sdk.SysCoins{pool.DepositAmount}).Add2(sdk.SysCoins{pool.TotalValueLocked}), 337 ) 338 require.Nil(t, err) 339 mockKeeper.supplyKeeper.SetModuleAccount(ctx, moduleAcc) 340 341 yieldAcc := mockKeeper.supplyKeeper.GetModuleAccount(ctx, types.YieldFarmingAccount) 342 err = yieldAcc.SetCoins( 343 yieldAcc.GetCoins().Add2(sdk.SysCoins{pool.YieldedTokenInfos[0].RemainingAmount}). 344 Add2(pool.TotalAccumulatedRewards), 345 ) 346 require.Nil(t, err) 347 mockKeeper.supplyKeeper.SetModuleAccount(ctx, yieldAcc) 348 } 349 mockKeeper.Keeper.SetWhitelist(ctx, pools[0].Name) 350 return 351 } 352 353 var _ govtypes.Content = MockContent{} 354 355 type MockContent struct{} 356 357 func (m MockContent) GetTitle() string { 358 return "" 359 } 360 361 func (m MockContent) GetDescription() string { 362 return "" 363 } 364 365 func (m MockContent) ProposalRoute() string { 366 return "" 367 } 368 369 func (m MockContent) ProposalType() string { 370 return "" 371 } 372 373 func (m MockContent) ValidateBasic() sdk.Error { 374 return nil 375 } 376 377 func (m MockContent) String() string { 378 return "" 379 } 380 381 func SetSwapTokenPair(ctx sdk.Context, k Keeper, token0Symbol, token1Symbol string) { 382 pairName := swaptypes.GetSwapTokenPairName(token0Symbol, token1Symbol) 383 tokenPair := swaptypes.NewSwapPair(token0Symbol, token1Symbol) 384 k.swapKeeper.SetSwapTokenPair(ctx, pairName, tokenPair) 385 }