github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/order/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/common"
    12  
    13  	"github.com/fibonacci-chain/fbc/x/common/monitor"
    14  
    15  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
    16  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store"
    17  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    18  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth"
    19  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/bank"
    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/ed25519"
    23  	"github.com/fibonacci-chain/fbc/libs/tendermint/libs/log"
    24  	dbm "github.com/fibonacci-chain/fbc/libs/tm-db"
    25  	"github.com/fibonacci-chain/fbc/x/params"
    26  	"github.com/stretchr/testify/require"
    27  
    28  	"github.com/fibonacci-chain/fbc/x/dex"
    29  	"github.com/fibonacci-chain/fbc/x/order/types"
    30  	"github.com/fibonacci-chain/fbc/x/token"
    31  )
    32  
    33  var mockOrder = types.MockOrder
    34  
    35  // TestInput stores some variables for testing
    36  type TestInput struct {
    37  	Ctx       sdk.Context
    38  	Cdc       *codec.Codec
    39  	TestAddrs []sdk.AccAddress
    40  
    41  	OrderKeeper   Keeper
    42  	TokenKeeper   token.Keeper
    43  	AccountKeeper auth.AccountKeeper
    44  	SupplyKeeper  supply.Keeper
    45  	DexKeeper     dex.Keeper
    46  }
    47  
    48  // MakeTestCodec creates a codec used only for testing
    49  func MakeTestCodec() *codec.Codec {
    50  	var cdc = codec.New()
    51  	bank.RegisterCodec(cdc)
    52  	auth.RegisterCodec(cdc)
    53  	supply.RegisterCodec(cdc)
    54  	sdk.RegisterCodec(cdc)
    55  	dex.RegisterCodec(cdc)
    56  	codec.RegisterCrypto(cdc)
    57  
    58  	types.RegisterCodec(cdc) // order
    59  	token.RegisterCodec(cdc) // token
    60  	return cdc
    61  }
    62  
    63  // CreateTestInputWithBalance creates TestInput with the number of account and the quantity
    64  func CreateTestInputWithBalance(t *testing.T, numAddrs, initQuantity int64) TestInput {
    65  
    66  	db := dbm.NewMemDB()
    67  
    68  	keyAcc := sdk.NewKVStoreKey(auth.StoreKey)
    69  	keyMpt := sdk.NewKVStoreKey(mpt.StoreKey)
    70  	keySupply := sdk.NewKVStoreKey(supply.StoreKey)
    71  	keyParams := sdk.NewKVStoreKey(params.StoreKey)
    72  	tkeyParams := sdk.NewTransientStoreKey(params.TStoreKey)
    73  
    74  	// order module
    75  	keyOrder := sdk.NewKVStoreKey(types.OrderStoreKey)
    76  
    77  	// token module
    78  	keyToken := sdk.NewKVStoreKey(token.StoreKey)
    79  	keyLock := sdk.NewKVStoreKey(token.KeyLock)
    80  	//keyTokenPair := sdk.NewKVStoreKey(token.KeyTokenPair)
    81  
    82  	// dex module
    83  	storeKey := sdk.NewKVStoreKey(dex.StoreKey)
    84  	keyTokenPair := sdk.NewKVStoreKey(dex.TokenPairStoreKey)
    85  
    86  	ms := store.NewCommitMultiStore(db)
    87  	ms.MountStoreWithDB(keyAcc, sdk.StoreTypeIAVL, db)
    88  	ms.MountStoreWithDB(keyMpt, sdk.StoreTypeMPT, db)
    89  	ms.MountStoreWithDB(keySupply, sdk.StoreTypeIAVL, db)
    90  	ms.MountStoreWithDB(keyParams, sdk.StoreTypeIAVL, db)
    91  	ms.MountStoreWithDB(tkeyParams, sdk.StoreTypeTransient, db)
    92  
    93  	ms.MountStoreWithDB(keyOrder, sdk.StoreTypeIAVL, db)
    94  
    95  	ms.MountStoreWithDB(keyToken, sdk.StoreTypeIAVL, db)
    96  	ms.MountStoreWithDB(keyLock, sdk.StoreTypeIAVL, db)
    97  	ms.MountStoreWithDB(storeKey, sdk.StoreTypeIAVL, db)
    98  	ms.MountStoreWithDB(keyTokenPair, sdk.StoreTypeIAVL, db)
    99  
   100  	err := ms.LoadLatestVersion()
   101  	require.Nil(t, err)
   102  
   103  	ctx := sdk.NewContext(ms, abci.Header{Time: time.Unix(0, 0)}, false, log.NewTMLogger(os.Stdout))
   104  	cdc := MakeTestCodec()
   105  
   106  	feeCollectorAcc := supply.NewEmptyModuleAccount(auth.FeeCollectorName)
   107  
   108  	blacklistedAddrs := make(map[string]bool)
   109  	blacklistedAddrs[feeCollectorAcc.String()] = true
   110  
   111  	paramsKeeper := params.NewKeeper(cdc, keyParams, tkeyParams, ctx.Logger())
   112  	accountKeeper := auth.NewAccountKeeper(cdc, keyAcc, keyMpt,
   113  		paramsKeeper.Subspace(auth.DefaultParamspace), auth.ProtoBaseAccount)
   114  	bankKeeper := bank.NewBaseKeeper(accountKeeper, paramsKeeper.Subspace(bank.DefaultParamspace),
   115  		blacklistedAddrs)
   116  	maccPerms := map[string][]string{
   117  		auth.FeeCollectorName: nil,
   118  		token.ModuleName:      {supply.Minter, supply.Burner},
   119  	}
   120  	supplyKeeper := supply.NewKeeper(cdc, keySupply, accountKeeper, bank.NewBankKeeperAdapter(bankKeeper), maccPerms)
   121  	supplyKeeper.SetSupply(ctx, supply.NewSupply(sdk.Coins{}))
   122  
   123  	// set module accounts
   124  	supplyKeeper.SetModuleAccount(ctx, feeCollectorAcc)
   125  
   126  	// token keeper
   127  	tokenKeepr := token.NewKeeper(bankKeeper, paramsKeeper.Subspace(token.DefaultParamspace),
   128  		auth.FeeCollectorName, supplyKeeper, keyToken, keyLock, cdc, true, accountKeeper)
   129  
   130  	// dex keeper
   131  	paramsSubspace := paramsKeeper.Subspace(dex.DefaultParamspace)
   132  	dexKeeper := dex.NewKeeper(auth.FeeCollectorName, supplyKeeper, paramsSubspace, tokenKeepr, nil, bankKeeper, storeKey, keyTokenPair, cdc)
   133  
   134  	// order keeper
   135  	orderKeeper := NewKeeper(tokenKeepr, supplyKeeper, dexKeeper,
   136  		paramsKeeper.Subspace(types.DefaultParamspace), auth.FeeCollectorName, keyOrder,
   137  		cdc, true, monitor.NopOrderMetrics())
   138  
   139  	defaultParams := types.DefaultTestParams()
   140  	orderKeeper.SetParams(ctx, &defaultParams)
   141  
   142  	// init account tokens
   143  	decCoins, err := sdk.ParseDecCoins(fmt.Sprintf("%d%s,%d%s",
   144  		initQuantity, common.NativeToken, initQuantity, common.TestToken))
   145  	require.Nil(t, err)
   146  
   147  	initCoins := decCoins
   148  
   149  	var testAddrs []sdk.AccAddress
   150  	for i := int64(0); i < numAddrs; i++ {
   151  		pk := ed25519.GenPrivKey().PubKey()
   152  		addr := sdk.AccAddress(pk.Address())
   153  		testAddrs = append(testAddrs, addr)
   154  		//_, err := bankKeeper.AddCoins(ctx, addr, initCoins)
   155  		err := orderKeeper.supplyKeeper.MintCoins(ctx, token.ModuleName, initCoins)
   156  		require.Nil(t, err)
   157  		err = orderKeeper.supplyKeeper.SendCoinsFromModuleToAccount(ctx, token.ModuleName, addr, initCoins)
   158  		require.Nil(t, err)
   159  	}
   160  
   161  	return TestInput{ctx, cdc, testAddrs, orderKeeper, tokenKeepr, accountKeeper, supplyKeeper, dexKeeper}
   162  }
   163  
   164  // CreateTestInput creates TestInput with default params
   165  func CreateTestInput(t *testing.T) TestInput {
   166  	return CreateTestInputWithBalance(t, 2, 100)
   167  }