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  }