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

     1  package keeper
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/mpt"
    10  
    11  	"github.com/fibonacci-chain/fbc/x/staking"
    12  
    13  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
    14  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store"
    15  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    16  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth"
    17  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/bank"
    18  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/supply"
    19  	abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types"
    20  	"github.com/fibonacci-chain/fbc/libs/tendermint/crypto/ed25519"
    21  	"github.com/fibonacci-chain/fbc/libs/tendermint/libs/log"
    22  	dbm "github.com/fibonacci-chain/fbc/libs/tm-db"
    23  	"github.com/fibonacci-chain/fbc/x/params"
    24  	"github.com/stretchr/testify/require"
    25  
    26  	"github.com/fibonacci-chain/fbc/x/common"
    27  	"github.com/fibonacci-chain/fbc/x/dex/types"
    28  	"github.com/fibonacci-chain/fbc/x/gov"
    29  	"github.com/fibonacci-chain/fbc/x/token"
    30  )
    31  
    32  type testInput struct {
    33  	Ctx       sdk.Context
    34  	Cdc       *codec.Codec
    35  	TestAddrs []sdk.AccAddress
    36  
    37  	DexKeeper Keeper
    38  }
    39  
    40  // create a codec used only for testing
    41  func makeTestCodec() *codec.Codec {
    42  	var cdc = codec.New()
    43  	bank.RegisterCodec(cdc)
    44  	auth.RegisterCodec(cdc)
    45  	supply.RegisterCodec(cdc)
    46  	sdk.RegisterCodec(cdc)
    47  	codec.RegisterCrypto(cdc)
    48  
    49  	types.RegisterCodec(cdc) // dex
    50  	return cdc
    51  }
    52  
    53  func createTestInputWithBalance(t *testing.T, numAddrs, initQuantity int64) testInput {
    54  	db := dbm.NewMemDB()
    55  
    56  	keyAcc := sdk.NewKVStoreKey(auth.StoreKey)
    57  	keyMpt := sdk.NewKVStoreKey(mpt.StoreKey)
    58  	keySupply := sdk.NewKVStoreKey(supply.StoreKey)
    59  	keyParams := sdk.NewKVStoreKey(params.StoreKey)
    60  	tkeyParams := sdk.NewTransientStoreKey(params.TStoreKey)
    61  
    62  	// token module
    63  	keyToken := sdk.NewKVStoreKey(token.StoreKey)
    64  	keyLock := sdk.NewKVStoreKey(token.KeyLock)
    65  	//keyTokenPair := sdk.NewKVStoreKey(token.KeyTokenPair)
    66  
    67  	keyStaking := sdk.NewKVStoreKey(staking.StoreKey)
    68  
    69  	// dex module
    70  	storeKey := sdk.NewKVStoreKey(types.StoreKey)
    71  	keyTokenPair := sdk.NewKVStoreKey(types.TokenPairStoreKey)
    72  
    73  	ms := store.NewCommitMultiStore(db)
    74  	ms.MountStoreWithDB(keyAcc, sdk.StoreTypeIAVL, db)
    75  	ms.MountStoreWithDB(keyMpt, sdk.StoreTypeMPT, db)
    76  	ms.MountStoreWithDB(keySupply, sdk.StoreTypeIAVL, db)
    77  	ms.MountStoreWithDB(keyParams, sdk.StoreTypeIAVL, db)
    78  	ms.MountStoreWithDB(tkeyParams, sdk.StoreTypeTransient, db)
    79  
    80  	ms.MountStoreWithDB(keyStaking, sdk.StoreTypeIAVL, db)
    81  
    82  	ms.MountStoreWithDB(keyToken, sdk.StoreTypeIAVL, db)
    83  	ms.MountStoreWithDB(keyLock, sdk.StoreTypeIAVL, db)
    84  	ms.MountStoreWithDB(storeKey, sdk.StoreTypeIAVL, db)
    85  	ms.MountStoreWithDB(keyTokenPair, sdk.StoreTypeIAVL, db)
    86  
    87  	err := ms.LoadLatestVersion()
    88  	require.Nil(t, err)
    89  
    90  	ctx := sdk.NewContext(ms, abci.Header{Time: time.Unix(0, 0)}, false, log.NewTMLogger(os.Stdout))
    91  	cdc := makeTestCodec()
    92  
    93  	feeCollectorAcc := supply.NewEmptyModuleAccount(auth.FeeCollectorName)
    94  
    95  	blacklistedAddrs := make(map[string]bool)
    96  	blacklistedAddrs[feeCollectorAcc.String()] = true
    97  
    98  	paramsKeeper := params.NewKeeper(cdc, keyParams, tkeyParams, ctx.Logger())
    99  	accountKeeper := auth.NewAccountKeeper(cdc, keyAcc, keyMpt,
   100  		paramsKeeper.Subspace(auth.DefaultParamspace), auth.ProtoBaseAccount)
   101  	bankKeeper := bank.NewBaseKeeper(accountKeeper, paramsKeeper.Subspace(bank.DefaultParamspace),
   102  		blacklistedAddrs)
   103  	maccPerms := map[string][]string{
   104  		auth.FeeCollectorName: nil,
   105  		token.ModuleName:      {supply.Minter, supply.Burner},
   106  		types.ModuleName:      nil,
   107  		gov.ModuleName:        nil,
   108  	}
   109  	supplyKeeper := supply.NewKeeper(cdc, keySupply, accountKeeper, bank.NewBankKeeperAdapter(bankKeeper), maccPerms)
   110  	supplyKeeper.SetSupply(ctx, supply.NewSupply(sdk.Coins{}))
   111  
   112  	// set module accounts
   113  	supplyKeeper.SetModuleAccount(ctx, feeCollectorAcc)
   114  
   115  	// token keeper
   116  	tokenKeepr := token.NewKeeper(bankKeeper,
   117  		paramsKeeper.Subspace(token.DefaultParamspace), auth.FeeCollectorName, supplyKeeper,
   118  		keyToken, keyLock, cdc, true, accountKeeper)
   119  
   120  	paramsSubspace := paramsKeeper.Subspace(types.DefaultParamspace)
   121  
   122  	mockStakingKeeper := &mockStakingKeeper{true}
   123  	mockBankKeeper := mockBankKeeper{}
   124  
   125  	// dex keeper
   126  	dexKeeper := NewKeeper(auth.FeeCollectorName, supplyKeeper, paramsSubspace, tokenKeepr, mockStakingKeeper, mockBankKeeper, storeKey, keyTokenPair, cdc)
   127  
   128  	// init account tokens
   129  	decCoins, err := sdk.ParseDecCoins(fmt.Sprintf("%d%s,%d%s",
   130  		initQuantity, common.NativeToken, initQuantity, common.TestToken))
   131  	if err != nil {
   132  		panic(err)
   133  	}
   134  
   135  	var testAddrs []sdk.AccAddress
   136  	for i := int64(0); i < numAddrs; i++ {
   137  		pk := ed25519.GenPrivKey().PubKey()
   138  		addr := sdk.AccAddress(pk.Address())
   139  		testAddrs = append(testAddrs, addr)
   140  		err := dexKeeper.supplyKeeper.MintCoins(ctx, token.ModuleName, decCoins)
   141  		require.Nil(t, err)
   142  		err = dexKeeper.supplyKeeper.SendCoinsFromModuleToAccount(ctx, token.ModuleName, addr, decCoins)
   143  		require.Nil(t, err)
   144  	}
   145  
   146  	return testInput{ctx, cdc, testAddrs, dexKeeper}
   147  }
   148  
   149  // nolint
   150  func createTestInput(t *testing.T) testInput {
   151  	return createTestInputWithBalance(t, 2, 100)
   152  }
   153  
   154  type mockStakingKeeper struct {
   155  	getFakeValidator bool
   156  }
   157  
   158  func (m *mockStakingKeeper) IsValidator(ctx sdk.Context, addr sdk.AccAddress) bool {
   159  	return m.getFakeValidator
   160  }
   161  
   162  func (m *mockStakingKeeper) SetFakeValidator(fakeValidator bool) {
   163  	m.getFakeValidator = fakeValidator
   164  }
   165  
   166  type mockBankKeeper struct{}
   167  
   168  // GetCoins returns coins for test
   169  func (keeper mockBankKeeper) GetCoins(ctx sdk.Context, addr sdk.AccAddress) sdk.Coins {
   170  	return sdk.NewDecCoinsFromDec(common.NativeToken, sdk.NewDec(2500))
   171  }
   172  
   173  // GetBuiltInTokenPair returns built in token pair for test
   174  func GetBuiltInTokenPair() *types.TokenPair {
   175  
   176  	common.InitConfig()
   177  	addr, err := sdk.AccAddressFromBech32(types.TestTokenPairOwner)
   178  	if err != nil {
   179  		panic(err)
   180  	}
   181  	return &types.TokenPair{
   182  		ID:               1,
   183  		BaseAssetSymbol:  common.TestToken,
   184  		QuoteAssetSymbol: sdk.DefaultBondDenom,
   185  		InitPrice:        sdk.MustNewDecFromStr("10.0"),
   186  		MaxPriceDigit:    8,
   187  		MaxQuantityDigit: 8,
   188  		MinQuantity:      sdk.MustNewDecFromStr("0"),
   189  		Owner:            addr,
   190  		Deposits:         sdk.NewDecCoin(sdk.DefaultBondDenom, sdk.NewInt(0)),
   191  	}
   192  }