github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/order/match/periodicauction/fill_test.go (about)

     1  //go:build ignore
     2  
     3  package periodicauction
     4  
     5  import (
     6  	"testing"
     7  
     8  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     9  	"github.com/stretchr/testify/require"
    10  
    11  	"github.com/fibonacci-chain/fbc/x/common"
    12  	"github.com/fibonacci-chain/fbc/x/dex"
    13  	orderkeeper "github.com/fibonacci-chain/fbc/x/order/keeper"
    14  	"github.com/fibonacci-chain/fbc/x/order/types"
    15  )
    16  
    17  var mockOrder = types.MockOrder
    18  
    19  func TestFillDepthBook(t *testing.T) {
    20  	common.InitConfig()
    21  	testInput := orderkeeper.CreateTestInput(t)
    22  	keeper := testInput.OrderKeeper
    23  	ctx := testInput.Ctx
    24  	feeParams := types.DefaultTestParams()
    25  
    26  	tokenPair := dex.GetBuiltInTokenPair()
    27  	err := testInput.DexKeeper.SaveTokenPair(ctx, tokenPair)
    28  	require.Nil(t, err)
    29  	testInput.DexKeeper.SetOperator(ctx, dex.DEXOperator{
    30  		Address:            tokenPair.Owner,
    31  		HandlingFeeAddress: tokenPair.Owner,
    32  	})
    33  
    34  	// mock orders, DepthBook, and orderIDsMap
    35  	keeper.ResetCache(ctx)
    36  	orders := []*types.Order{
    37  		mockOrder("", types.TestTokenPair, types.BuyOrder, "9.9", "1.0"),
    38  		mockOrder("", types.TestTokenPair, types.BuyOrder, "10.0", "1.0"),
    39  		mockOrder("", types.TestTokenPair, types.SellOrder, "10.0", "1.1"),
    40  		mockOrder("", types.TestTokenPair, types.SellOrder, "10.1", "1.1"),
    41  	}
    42  	orders[0].Sender = testInput.TestAddrs[0]
    43  	orders[1].Sender = testInput.TestAddrs[0]
    44  	orders[2].Sender = testInput.TestAddrs[1]
    45  	orders[3].Sender = testInput.TestAddrs[1]
    46  
    47  	for i := 0; i < 4; i++ {
    48  		err := keeper.PlaceOrder(ctx, orders[i])
    49  		require.NoError(t, err)
    50  	}
    51  	// check account balance
    52  	acc0 := testInput.AccountKeeper.GetAccount(ctx, testInput.TestAddrs[0])
    53  	acc1 := testInput.AccountKeeper.GetAccount(ctx, testInput.TestAddrs[1])
    54  	expectCoins0 := sdk.SysCoins{
    55  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.MustNewDecFromStr("79.5816")),
    56  		sdk.NewDecCoinFromDec(common.TestToken, sdk.MustNewDecFromStr("100")),
    57  	}
    58  	expectCoins1 := sdk.SysCoins{
    59  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.MustNewDecFromStr("99.4816")),
    60  		sdk.NewDecCoinFromDec(common.TestToken, sdk.MustNewDecFromStr("97.8")),
    61  	}
    62  	require.EqualValues(t, expectCoins0, acc0.GetCoins())
    63  	require.EqualValues(t, expectCoins1, acc1.GetCoins())
    64  
    65  	// call fillDepthBook
    66  	buyExecuted := sdk.ZeroDec()
    67  	sellExecuted := sdk.ZeroDec()
    68  	remainDeals := int64(1000)
    69  	deals, _ := fillDepthBook(ctx, keeper, types.TestTokenPair,
    70  		sdk.MustNewDecFromStr("10.0"), sdk.MustNewDecFromStr("1.0"),
    71  		&buyExecuted, &sellExecuted, remainDeals, &feeParams)
    72  	depthBook := keeper.GetDepthBookCopy(types.TestTokenPair)
    73  
    74  	// check depthBook
    75  	expectDepthBook := types.DepthBook{
    76  		Items: []types.DepthBookItem{
    77  			{Price: sdk.MustNewDecFromStr("10.1"), BuyQuantity: sdk.ZeroDec(), SellQuantity: sdk.MustNewDecFromStr("1.1")},
    78  			{Price: sdk.MustNewDecFromStr("10.0"), BuyQuantity: sdk.ZeroDec(), SellQuantity: sdk.MustNewDecFromStr("0.1")},
    79  			{Price: sdk.MustNewDecFromStr("9.9"), BuyQuantity: sdk.MustNewDecFromStr("1.0"), SellQuantity: sdk.ZeroDec()},
    80  		},
    81  	}
    82  	//require.EqualValues(t, expectDepthBook, *depthBook)
    83  	require.EqualValues(t, 3, len(depthBook.Items))
    84  	for i := 0; i < 3; i++ {
    85  		require.Equal(t, expectDepthBook.Items[i].Price.String(), depthBook.Items[i].Price.String())
    86  		require.Equal(t, expectDepthBook.Items[i].BuyQuantity.String(),
    87  			depthBook.Items[i].BuyQuantity.String())
    88  		require.Equal(t, expectDepthBook.Items[i].SellQuantity.String(),
    89  			depthBook.Items[i].SellQuantity.String())
    90  	}
    91  
    92  	// check deals
    93  	require.EqualValues(t, 2, len(deals))
    94  	require.EqualValues(t, sdk.MustNewDecFromStr("1.0"), deals[0].Quantity)
    95  
    96  	// check orderIDsMap
    97  	keys := [4]string{}
    98  	for i, order := range orders {
    99  		keys[i] = types.FormatOrderIDsKey(order.Product, order.Price, order.Side)
   100  	}
   101  	orderIDsMap := keeper.GetDiskCache().GetOrderIDsMapCopy()
   102  	require.EqualValues(t, orders[0].OrderID, orderIDsMap.Data[keys[0]][0])
   103  	require.EqualValues(t, 0, len(orderIDsMap.Data[keys[1]]))
   104  	require.EqualValues(t, orders[2].OrderID, orderIDsMap.Data[keys[2]][0])
   105  	require.EqualValues(t, orders[3].OrderID, orderIDsMap.Data[keys[3]][0])
   106  
   107  	// check order status
   108  	order := keeper.GetOrder(ctx, orders[1].OrderID)
   109  	require.EqualValues(t, types.OrderStatusFilled, order.Status)
   110  
   111  	// check account balance
   112  	acc0 = testInput.AccountKeeper.GetAccount(ctx, testInput.TestAddrs[0])
   113  	acc1 = testInput.AccountKeeper.GetAccount(ctx, testInput.TestAddrs[1])
   114  	expectCoins0 = sdk.SysCoins{
   115  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.MustNewDecFromStr("79.8408")),
   116  		sdk.NewDecCoinFromDec(common.TestToken, sdk.MustNewDecFromStr("100.999")), // 100 + 1 * (1 - 0.001)
   117  	}
   118  	expectCoins1 = sdk.SysCoins{
   119  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.MustNewDecFromStr("109.4716")), // 100 + 10 * (1 - 0.001) - 0.004
   120  		sdk.NewDecCoinFromDec(common.TestToken, sdk.MustNewDecFromStr("97.8")),       // no change
   121  	}
   122  	require.EqualValues(t, expectCoins0, acc0.GetCoins())
   123  	require.EqualValues(t, expectCoins1, acc1.GetCoins())
   124  }
   125  
   126  func TestFillDepthBookSecondCase(t *testing.T) {
   127  	testInput := orderkeeper.CreateTestInput(t)
   128  	keeper := testInput.OrderKeeper
   129  	ctx := testInput.Ctx
   130  	feeParams := types.DefaultTestParams()
   131  
   132  	tokenPair := dex.GetBuiltInTokenPair()
   133  	err := testInput.DexKeeper.SaveTokenPair(ctx, tokenPair)
   134  	require.Nil(t, err)
   135  	testInput.DexKeeper.SetOperator(ctx, dex.DEXOperator{
   136  		Address:            tokenPair.Owner,
   137  		HandlingFeeAddress: tokenPair.Owner,
   138  	})
   139  
   140  	// mock orders, DepthBook, and orderIDsMap
   141  	orders := []*types.Order{
   142  		mockOrder("", types.TestTokenPair, types.BuyOrder, "9.8", "1.0"),
   143  		mockOrder("", types.TestTokenPair, types.BuyOrder, "10.1", "1.0"),
   144  		mockOrder("", types.TestTokenPair, types.SellOrder, "9.9", "1.0"),
   145  		mockOrder("", types.TestTokenPair, types.SellOrder, "10.2", "1.1"),
   146  	}
   147  	orders[0].Sender = testInput.TestAddrs[0]
   148  	orders[1].Sender = testInput.TestAddrs[0]
   149  	orders[2].Sender = testInput.TestAddrs[1]
   150  	orders[3].Sender = testInput.TestAddrs[1]
   151  	depthBook := &types.DepthBook{}
   152  
   153  	for i := 0; i < 4; i++ {
   154  		err := keeper.PlaceOrder(ctx, orders[i])
   155  		require.NoError(t, err)
   156  		depthBook.InsertOrder(orders[i])
   157  	}
   158  	// check account balance
   159  	acc0 := testInput.AccountKeeper.GetAccount(ctx, testInput.TestAddrs[0])
   160  	acc1 := testInput.AccountKeeper.GetAccount(ctx, testInput.TestAddrs[1])
   161  	expectCoins0 := sdk.SysCoins{
   162  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.MustNewDecFromStr("79.5816")),
   163  		sdk.NewDecCoinFromDec(common.TestToken, sdk.MustNewDecFromStr("100")),
   164  	}
   165  	expectCoins1 := sdk.SysCoins{
   166  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.MustNewDecFromStr("99.4816")),
   167  		sdk.NewDecCoinFromDec(common.TestToken, sdk.MustNewDecFromStr("97.9")),
   168  	}
   169  	require.EqualValues(t, expectCoins0.String(), acc0.GetCoins().String())
   170  	require.EqualValues(t, expectCoins1.String(), acc1.GetCoins().String())
   171  
   172  	buyExecuted := sdk.ZeroDec()
   173  	sellExecuted := sdk.ZeroDec()
   174  	remainDeals := int64(1000)
   175  	deals, _ := fillDepthBook(ctx, keeper, types.TestTokenPair,
   176  		sdk.MustNewDecFromStr("10.0"), sdk.MustNewDecFromStr("1.0"),
   177  		&buyExecuted, &sellExecuted, remainDeals, &feeParams)
   178  	depthBook = keeper.GetDepthBookCopy(types.TestTokenPair)
   179  
   180  	// check depthBook
   181  	expectDepthBook := types.DepthBook{
   182  		Items: []types.DepthBookItem{
   183  			{Price: sdk.MustNewDecFromStr("10.2"), BuyQuantity: sdk.ZeroDec(), SellQuantity: sdk.MustNewDecFromStr("1.1")},
   184  			{Price: sdk.MustNewDecFromStr("9.8"), BuyQuantity: sdk.MustNewDecFromStr("1.0"), SellQuantity: sdk.ZeroDec()},
   185  		},
   186  	}
   187  	//require.EqualValues(t, expectDepthBook, *depthBook)
   188  	require.EqualValues(t, 2, len(depthBook.Items))
   189  	for i := 0; i < 2; i++ {
   190  		require.True(t, expectDepthBook.Items[i].Price.Equal(depthBook.Items[i].Price))
   191  		require.True(t, expectDepthBook.Items[i].BuyQuantity.Equal(depthBook.Items[i].BuyQuantity))
   192  		require.True(t,
   193  			expectDepthBook.Items[i].SellQuantity.Equal(depthBook.Items[i].SellQuantity))
   194  	}
   195  
   196  	// check deals
   197  	require.EqualValues(t, 2, len(deals))
   198  	require.EqualValues(t, sdk.MustNewDecFromStr("1.0"), deals[0].Quantity)
   199  
   200  	// check orderIDsMap
   201  	keys := [4]string{}
   202  	for i, order := range orders {
   203  		keys[i] = types.FormatOrderIDsKey(order.Product, order.Price, order.Side)
   204  	}
   205  	// call fillDepthBook
   206  	newOrderIDsMap := keeper.GetDiskCache().GetOrderIDsMapCopy()
   207  
   208  	// OrderIDsMap will remove empty keys(10.1-BUY, 9.9-SELL) immediately, not by the end of endblock
   209  	require.EqualValues(t, 2, len(newOrderIDsMap.Data))
   210  	require.EqualValues(t, 0, len(newOrderIDsMap.Data[keys[1]]))
   211  	require.EqualValues(t, 0, len(newOrderIDsMap.Data[keys[2]]))
   212  
   213  	// check order status
   214  	order := keeper.GetOrder(ctx, orders[1].OrderID)
   215  	require.EqualValues(t, types.OrderStatusFilled, order.Status)
   216  
   217  	// check account balance
   218  	acc0 = testInput.AccountKeeper.GetAccount(ctx, testInput.TestAddrs[0])
   219  	acc1 = testInput.AccountKeeper.GetAccount(ctx, testInput.TestAddrs[1])
   220  	expectCoins0 = sdk.SysCoins{
   221  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.MustNewDecFromStr("79.9408")), // 80.1 + 0.1 - 0.004
   222  		sdk.NewDecCoinFromDec(common.TestToken, sdk.MustNewDecFromStr("100.999")),   // 100 + 1 * (1 - 0.001)
   223  	}
   224  	expectCoins1 = sdk.SysCoins{
   225  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.MustNewDecFromStr("109.7308")), // 100 + 10 * (1 - 0.001) - 0.004
   226  		sdk.NewDecCoinFromDec(common.TestToken, sdk.MustNewDecFromStr("97.9")),       // no change
   227  	}
   228  	require.EqualValues(t, expectCoins0.String(), acc0.GetCoins().String())
   229  	require.EqualValues(t, expectCoins1.String(), acc1.GetCoins().String())
   230  }
   231  
   232  func TestPartialFillDepthBook(t *testing.T) {
   233  	testInput := orderkeeper.CreateTestInput(t)
   234  	keeper := testInput.OrderKeeper
   235  	ctx := testInput.Ctx
   236  	feeParams := types.DefaultTestParams()
   237  
   238  	tokenPair := dex.GetBuiltInTokenPair()
   239  	err := testInput.DexKeeper.SaveTokenPair(ctx, tokenPair)
   240  	require.Nil(t, err)
   241  	testInput.DexKeeper.SetOperator(ctx, dex.DEXOperator{
   242  		Address:            tokenPair.Owner,
   243  		HandlingFeeAddress: tokenPair.Owner,
   244  	})
   245  
   246  	// mock orders, DepthBook, and orderIDsMap
   247  	orders := []*types.Order{
   248  		mockOrder("", types.TestTokenPair, types.BuyOrder, "10.1", "1.0"),
   249  		mockOrder("", types.TestTokenPair, types.BuyOrder, "10.1", "2.0"),
   250  		mockOrder("", types.TestTokenPair, types.SellOrder, "9.9", "3.0"),
   251  		mockOrder("", types.TestTokenPair, types.SellOrder, "10.2", "1.0"),
   252  	}
   253  	orders[0].Sender = testInput.TestAddrs[0]
   254  	orders[1].Sender = testInput.TestAddrs[0]
   255  	orders[2].Sender = testInput.TestAddrs[1]
   256  	orders[3].Sender = testInput.TestAddrs[1]
   257  	depthBook := &types.DepthBook{}
   258  
   259  	for i := 0; i < 4; i++ {
   260  		err := keeper.PlaceOrder(ctx, orders[i])
   261  		require.NoError(t, err)
   262  		depthBook.InsertOrder(orders[i])
   263  	}
   264  	// check account balance
   265  	acc0 := testInput.AccountKeeper.GetAccount(ctx, testInput.TestAddrs[0])
   266  	acc1 := testInput.AccountKeeper.GetAccount(ctx, testInput.TestAddrs[1])
   267  	expectCoins0 := sdk.SysCoins{
   268  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.MustNewDecFromStr("69.1816")),
   269  		sdk.NewDecCoinFromDec(common.TestToken, sdk.MustNewDecFromStr("100")),
   270  	}
   271  	expectCoins1 := sdk.SysCoins{
   272  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.MustNewDecFromStr("99.4816")),
   273  		sdk.NewDecCoinFromDec(common.TestToken, sdk.MustNewDecFromStr("96")),
   274  	}
   275  	require.EqualValues(t, expectCoins0.String(), acc0.GetCoins().String())
   276  	require.EqualValues(t, expectCoins1.String(), acc1.GetCoins().String())
   277  
   278  	// call fillDepthBook
   279  	buyExecuted := sdk.ZeroDec()
   280  	sellExecuted := sdk.ZeroDec()
   281  	remainDeals := int64(1)
   282  	// only fill orders[0]
   283  	deals, remainDeals := fillDepthBook(ctx, keeper, types.TestTokenPair,
   284  		sdk.MustNewDecFromStr("10.0"), sdk.MustNewDecFromStr("3.0"),
   285  		&buyExecuted, &sellExecuted, remainDeals, &feeParams)
   286  	depthBook = keeper.GetDepthBookCopy(types.TestTokenPair)
   287  
   288  	// check result
   289  	require.EqualValues(t, 1, len(deals))
   290  	require.EqualValues(t, sdk.MustNewDecFromStr("1.0"), deals[0].Quantity)
   291  	require.EqualValues(t, orders[0].OrderID, deals[0].OrderID)
   292  	require.EqualValues(t, sdk.MustNewDecFromStr("1.0"), buyExecuted)
   293  	require.EqualValues(t, sdk.ZeroDec(), sellExecuted)
   294  	require.EqualValues(t, 0, remainDeals)
   295  
   296  	// check depthBook
   297  	expectDepthBook := types.DepthBook{
   298  		Items: []types.DepthBookItem{
   299  			{Price: sdk.MustNewDecFromStr("10.2"), BuyQuantity: sdk.ZeroDec(), SellQuantity: sdk.MustNewDecFromStr("1.0")},
   300  			{Price: sdk.MustNewDecFromStr("10.1"), BuyQuantity: sdk.MustNewDecFromStr("2.0"), SellQuantity: sdk.ZeroDec()},
   301  			{Price: sdk.MustNewDecFromStr("9.9"), BuyQuantity: sdk.ZeroDec(), SellQuantity: sdk.MustNewDecFromStr("3.0")},
   302  		},
   303  	}
   304  	//require.EqualValues(t, expectDepthBook, *depthBook)
   305  	require.EqualValues(t, 3, len(depthBook.Items))
   306  	for i := 0; i < 3; i++ {
   307  		require.True(t, expectDepthBook.Items[i].Price.Equal(depthBook.Items[i].Price))
   308  		require.True(t, expectDepthBook.Items[i].BuyQuantity.Equal(depthBook.Items[i].BuyQuantity))
   309  		require.True(t,
   310  			expectDepthBook.Items[i].SellQuantity.Equal(depthBook.Items[i].SellQuantity))
   311  	}
   312  
   313  	// check order status
   314  	order1 := keeper.GetOrder(ctx, orders[0].OrderID)
   315  	require.EqualValues(t, types.OrderStatusFilled, order1.Status)
   316  	order2 := keeper.GetOrder(ctx, orders[1].OrderID)
   317  	require.EqualValues(t, types.OrderStatusOpen, order2.Status)
   318  
   319  	// check account balance
   320  	acc0 = testInput.AccountKeeper.GetAccount(ctx, testInput.TestAddrs[0])
   321  	acc1 = testInput.AccountKeeper.GetAccount(ctx, testInput.TestAddrs[1])
   322  	expectCoins0 = sdk.SysCoins{
   323  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.MustNewDecFromStr("69.5408")), // 69.7 + 0.1 - 0.004
   324  		sdk.NewDecCoinFromDec(common.TestToken, sdk.MustNewDecFromStr("100.999")),   // 100 + 1 * (1 - 0.001)
   325  	}
   326  	expectCoins1 = sdk.SysCoins{
   327  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.MustNewDecFromStr("99.4816")), // no change
   328  		sdk.NewDecCoinFromDec(common.TestToken, sdk.MustNewDecFromStr("96")),        // no change
   329  	}
   330  	require.EqualValues(t, expectCoins0.String(), acc0.GetCoins().String())
   331  	require.EqualValues(t, expectCoins1.String(), acc1.GetCoins().String())
   332  
   333  	// fill orders[1] & orders[2]
   334  	remainDeals = int64(1000)
   335  	deals, remainDeals = fillDepthBook(ctx, keeper, types.TestTokenPair,
   336  		sdk.MustNewDecFromStr("10.0"), sdk.MustNewDecFromStr("3.0"),
   337  		&buyExecuted, &sellExecuted, remainDeals, &feeParams)
   338  
   339  	require.EqualValues(t, 2, len(deals))
   340  	require.EqualValues(t, sdk.MustNewDecFromStr("3.0"), buyExecuted)
   341  	require.EqualValues(t, sdk.MustNewDecFromStr("3.0"), sellExecuted)
   342  	require.EqualValues(t, 998, remainDeals)
   343  
   344  	// check account balance
   345  	acc0 = testInput.AccountKeeper.GetAccount(ctx, testInput.TestAddrs[0])
   346  	acc1 = testInput.AccountKeeper.GetAccount(ctx, testInput.TestAddrs[1])
   347  	expectCoins0 = sdk.SysCoins{
   348  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.MustNewDecFromStr("70")),    // 69.7 + (0.1 - 0.004) * 3
   349  		sdk.NewDecCoinFromDec(common.TestToken, sdk.MustNewDecFromStr("102.997")), // 100.999 + 2 * (1 - 0.001)
   350  	}
   351  	expectCoins1 = sdk.SysCoins{
   352  		sdk.NewDecCoinFromDec(common.NativeToken, sdk.MustNewDecFromStr("129.7108")), // 99.4816 + 0.2592 + 30 * (1 - 0.001)
   353  		sdk.NewDecCoinFromDec(common.TestToken, sdk.MustNewDecFromStr("96")),         // no change
   354  	}
   355  	require.EqualValues(t, expectCoins0.String(), acc0.GetCoins().String())
   356  	require.EqualValues(t, expectCoins1.String(), acc1.GetCoins().String())
   357  }
   358  
   359  func TestFillDepthBookByZeroMaxExecution(t *testing.T) {
   360  	testInput := orderkeeper.CreateTestInput(t)
   361  	keeper := testInput.OrderKeeper
   362  	ctx := testInput.Ctx
   363  	feeParams := types.DefaultTestParams()
   364  
   365  	tokenPair := dex.GetBuiltInTokenPair()
   366  	err := testInput.DexKeeper.SaveTokenPair(ctx, tokenPair)
   367  	require.Nil(t, err)
   368  
   369  	// mock orders, DepthBook, and orderIDsMap
   370  	keeper.ResetCache(ctx)
   371  	orders := []*types.Order{
   372  		mockOrder("", types.TestTokenPair, types.BuyOrder, "9.9", "1.0"),
   373  		mockOrder("", types.TestTokenPair, types.BuyOrder, "10.0", "1.0"),
   374  		mockOrder("", types.TestTokenPair, types.SellOrder, "10.0", "1.1"),
   375  		mockOrder("", types.TestTokenPair, types.SellOrder, "10.1", "1.1"),
   376  	}
   377  	orders[0].Sender = testInput.TestAddrs[0]
   378  	orders[1].Sender = testInput.TestAddrs[0]
   379  	orders[2].Sender = testInput.TestAddrs[1]
   380  	orders[3].Sender = testInput.TestAddrs[1]
   381  
   382  	for i := 0; i < 4; i++ {
   383  		err := keeper.PlaceOrder(ctx, orders[i])
   384  		require.NoError(t, err)
   385  	}
   386  
   387  	buyExecuted := sdk.ZeroDec()
   388  	sellExecuted := sdk.ZeroDec()
   389  	remainDeals := int64(1000)
   390  	deals, remainDeals := fillDepthBook(ctx, keeper, types.TestTokenPair,
   391  		sdk.NewDec(10), sdk.NewDec(0),
   392  		&buyExecuted, &sellExecuted, remainDeals, &feeParams)
   393  
   394  	require.EqualValues(t, remainDeals, int64(1000))
   395  	require.EqualValues(t, 0, len(deals))
   396  }
   397  
   398  func TestFillBuyOrders(t *testing.T) {
   399  	testInput := orderkeeper.CreateTestInput(t)
   400  	keeper := testInput.OrderKeeper
   401  	ctx := testInput.Ctx
   402  	tokenPair := dex.GetBuiltInTokenPair()
   403  	err := testInput.DexKeeper.SaveTokenPair(ctx, tokenPair)
   404  	require.Nil(t, err)
   405  	testInput.DexKeeper.SetOperator(ctx, dex.DEXOperator{
   406  		Address:            tokenPair.Owner,
   407  		HandlingFeeAddress: tokenPair.Owner,
   408  	})
   409  
   410  	// mock orders, DepthBook, and orderIDsMap
   411  	orders := []*types.Order{
   412  		mockOrder("", types.TestTokenPair, types.BuyOrder, "10.1", "1.0"),
   413  		mockOrder("", types.TestTokenPair, types.BuyOrder, "10.1", "2.0"),
   414  		mockOrder("", types.TestTokenPair, types.SellOrder, "9.9", "3.0"),
   415  		mockOrder("", types.TestTokenPair, types.SellOrder, "10.2", "1.0"),
   416  	}
   417  	orders[0].Sender = testInput.TestAddrs[0]
   418  	orders[1].Sender = testInput.TestAddrs[0]
   419  	orders[2].Sender = testInput.TestAddrs[1]
   420  	orders[3].Sender = testInput.TestAddrs[1]
   421  	depthBook := &types.DepthBook{}
   422  
   423  	for i := 0; i < 4; i++ {
   424  		err := keeper.PlaceOrder(ctx, orders[i])
   425  		require.NoError(t, err)
   426  		depthBook.InsertOrder(orders[i])
   427  	}
   428  
   429  	maxExecution := sdk.NewDec(100.0)
   430  	buyExecution := sdk.ZeroDec()
   431  	bestPrice := sdk.NewDec(10.0)
   432  	blockRemainDeals := int64(1000)
   433  	feeParams := types.DefaultTestParams()
   434  
   435  	buyDeals, blockRemainDeals := fillBuyOrders(ctx, keeper, types.TestTokenPair,
   436  		bestPrice, maxExecution, &buyExecution, blockRemainDeals, &feeParams)
   437  
   438  	require.EqualValues(t, 2, len(buyDeals))
   439  	require.EqualValues(t, int64(998), blockRemainDeals)
   440  }
   441  
   442  func TestFillSellOrders(t *testing.T) {
   443  	testInput := orderkeeper.CreateTestInput(t)
   444  	keeper := testInput.OrderKeeper
   445  	ctx := testInput.Ctx
   446  	tokenPair := dex.GetBuiltInTokenPair()
   447  	err := testInput.DexKeeper.SaveTokenPair(ctx, tokenPair)
   448  	require.Nil(t, err)
   449  	testInput.DexKeeper.SetOperator(ctx, dex.DEXOperator{
   450  		Address:            tokenPair.Owner,
   451  		HandlingFeeAddress: tokenPair.Owner,
   452  	})
   453  
   454  	// mock orders, DepthBook, and orderIDsMap
   455  	orders := []*types.Order{
   456  		mockOrder("", types.TestTokenPair, types.BuyOrder, "10.1", "1.0"),
   457  		mockOrder("", types.TestTokenPair, types.BuyOrder, "10.1", "2.0"),
   458  		mockOrder("", types.TestTokenPair, types.SellOrder, "9.9", "3.0"),
   459  		mockOrder("", types.TestTokenPair, types.SellOrder, "10.2", "1.0"),
   460  	}
   461  	orders[0].Sender = testInput.TestAddrs[0]
   462  	orders[1].Sender = testInput.TestAddrs[0]
   463  	orders[2].Sender = testInput.TestAddrs[1]
   464  	orders[3].Sender = testInput.TestAddrs[1]
   465  	depthBook := &types.DepthBook{}
   466  
   467  	for i := 0; i < 4; i++ {
   468  		err := keeper.PlaceOrder(ctx, orders[i])
   469  		require.NoError(t, err)
   470  		depthBook.InsertOrder(orders[i])
   471  	}
   472  
   473  	maxExecution := sdk.NewDec(100.0)
   474  	sellExecution := sdk.ZeroDec()
   475  	bestPrice := sdk.NewDec(10.0)
   476  	blockRemainDeals := int64(1000)
   477  	feeParams := types.DefaultTestParams()
   478  
   479  	sellDeals, blockRemainDeals := fillSellOrders(ctx, keeper, types.TestTokenPair,
   480  		bestPrice, maxExecution, &sellExecution, blockRemainDeals, &feeParams)
   481  
   482  	require.EqualValues(t, 1, len(sellDeals))
   483  	require.EqualValues(t, int64(999), blockRemainDeals)
   484  }
   485  
   486  func TestFillSellOrdersByLimitedMaxDeals(t *testing.T) {
   487  	testInput := orderkeeper.CreateTestInput(t)
   488  	keeper := testInput.OrderKeeper
   489  	ctx := testInput.Ctx
   490  	tokenPair := dex.GetBuiltInTokenPair()
   491  	err := testInput.DexKeeper.SaveTokenPair(ctx, tokenPair)
   492  	require.Nil(t, err)
   493  
   494  	// mock orders, DepthBook, and orderIDsMap
   495  	orders := []*types.Order{
   496  		mockOrder("", types.TestTokenPair, types.BuyOrder, "10.1", "1.0"),
   497  		mockOrder("", types.TestTokenPair, types.BuyOrder, "10.1", "2.0"),
   498  		mockOrder("", types.TestTokenPair, types.SellOrder, "9.9", "3.0"),
   499  		mockOrder("", types.TestTokenPair, types.SellOrder, "10.2", "1.0"),
   500  	}
   501  	orders[0].Sender = testInput.TestAddrs[0]
   502  	orders[1].Sender = testInput.TestAddrs[0]
   503  	orders[2].Sender = testInput.TestAddrs[1]
   504  	orders[3].Sender = testInput.TestAddrs[1]
   505  	depthBook := &types.DepthBook{}
   506  
   507  	for i := 0; i < 4; i++ {
   508  		err := keeper.PlaceOrder(ctx, orders[i])
   509  		require.NoError(t, err)
   510  		depthBook.InsertOrder(orders[i])
   511  	}
   512  
   513  	maxExecution := sdk.NewDec(100.0)
   514  	sellExecution := sdk.ZeroDec()
   515  	bestPrice := sdk.NewDec(10.0)
   516  	blockRemainDeals := int64(1)
   517  	feeParams := types.DefaultTestParams()
   518  
   519  	_, blockRemainDeals = fillSellOrders(ctx, keeper, types.TestTokenPair,
   520  		bestPrice, maxExecution, &sellExecution, blockRemainDeals, &feeParams)
   521  
   522  	require.EqualValues(t, 0, blockRemainDeals)
   523  }
   524  
   525  func TestFillOrderByKey(t *testing.T) {
   526  	testInput := orderkeeper.CreateTestInput(t)
   527  	keeper := testInput.OrderKeeper
   528  	ctx := testInput.Ctx
   529  	tokenPair := dex.GetBuiltInTokenPair()
   530  	err := testInput.DexKeeper.SaveTokenPair(ctx, tokenPair)
   531  	require.Nil(t, err)
   532  	testInput.DexKeeper.SetOperator(ctx, dex.DEXOperator{
   533  		Address:            tokenPair.Owner,
   534  		HandlingFeeAddress: tokenPair.Owner,
   535  	})
   536  
   537  	// mock orders, DepthBook, and orderIDsMap
   538  	orders := []*types.Order{
   539  		mockOrder("", types.TestTokenPair, types.BuyOrder, "10.1", "1.0"),
   540  		mockOrder("", types.TestTokenPair, types.BuyOrder, "10.1", "2.0"),
   541  		mockOrder("", types.TestTokenPair, types.SellOrder, "9.9", "3.0"),
   542  		mockOrder("", types.TestTokenPair, types.SellOrder, "10.2", "1.0"),
   543  	}
   544  	orders[0].Sender = testInput.TestAddrs[0]
   545  	orders[1].Sender = testInput.TestAddrs[0]
   546  	orders[2].Sender = testInput.TestAddrs[1]
   547  	orders[3].Sender = testInput.TestAddrs[1]
   548  
   549  	for i := 0; i < 4; i++ {
   550  		err := keeper.PlaceOrder(ctx, orders[i])
   551  		require.EqualValues(t, nil, err)
   552  	}
   553  
   554  	fillPrice := sdk.NewDec(10.0)
   555  	needFillAmount := sdk.NewDec(3.0)
   556  	feeParams := types.DefaultTestParams()
   557  	remainDeals := int64(1000)
   558  	key := types.FormatOrderIDsKey(types.TestTokenPair, orders[0].Price, types.BuyOrder)
   559  
   560  	deals, filledAmount, filledDealsCnt := fillOrderByKey(ctx, keeper, key, needFillAmount, fillPrice, &feeParams,
   561  		remainDeals)
   562  
   563  	require.EqualValues(t, 2, len(deals))
   564  	require.EqualValues(t, sdk.NewDec(3), filledAmount)
   565  	require.EqualValues(t, 2, filledDealsCnt)
   566  }
   567  
   568  func TestFillOrderByKeyByNotExistKey(t *testing.T) {
   569  	testInput := orderkeeper.CreateTestInput(t)
   570  	keeper := testInput.OrderKeeper
   571  	ctx := testInput.Ctx
   572  	tokenPair := dex.GetBuiltInTokenPair()
   573  	err := testInput.DexKeeper.SaveTokenPair(ctx, tokenPair)
   574  	require.Nil(t, err)
   575  	testInput.DexKeeper.SetOperator(ctx, dex.DEXOperator{
   576  		Address:            tokenPair.Owner,
   577  		HandlingFeeAddress: tokenPair.Owner,
   578  	})
   579  
   580  	// mock orders, DepthBook, and orderIDsMap
   581  	orders := []*types.Order{
   582  		mockOrder("", types.TestTokenPair, types.BuyOrder, "10.1", "1.0"),
   583  		mockOrder("", types.TestTokenPair, types.BuyOrder, "10.1", "2.0"),
   584  		mockOrder("", types.TestTokenPair, types.SellOrder, "9.9", "3.0"),
   585  		mockOrder("", types.TestTokenPair, types.SellOrder, "10.2", "1.0"),
   586  	}
   587  	orders[0].Sender = testInput.TestAddrs[0]
   588  	orders[1].Sender = testInput.TestAddrs[0]
   589  	orders[2].Sender = testInput.TestAddrs[1]
   590  	orders[3].Sender = testInput.TestAddrs[1]
   591  
   592  	for i := 0; i < 4; i++ {
   593  		err := keeper.PlaceOrder(ctx, orders[i])
   594  		require.EqualValues(t, nil, err)
   595  	}
   596  
   597  	fillPrice := sdk.NewDec(10.0)
   598  	needFillAmount := sdk.NewDec(3.0)
   599  	feeParams := types.DefaultTestParams()
   600  	remainDeals := int64(1000)
   601  	key := types.FormatOrderIDsKey(types.TestTokenPair+"_test", orders[0].Price, types.BuyOrder)
   602  
   603  	deals, filledAmount, filledDealsCnt := fillOrderByKey(ctx, keeper, key, needFillAmount, fillPrice, &feeParams,
   604  		remainDeals)
   605  	require.EqualValues(t, 0, len(deals))
   606  	require.EqualValues(t, filledAmount, sdk.ZeroDec())
   607  	require.EqualValues(t, filledDealsCnt, int64(0))
   608  }
   609  
   610  func TestFillOrder(t *testing.T) {
   611  	testInput := orderkeeper.CreateTestInput(t)
   612  	keeper := testInput.OrderKeeper
   613  	ctx := testInput.Ctx
   614  	tokenPair := dex.GetBuiltInTokenPair()
   615  	err := testInput.DexKeeper.SaveTokenPair(ctx, tokenPair)
   616  	require.Nil(t, err)
   617  	testInput.DexKeeper.SetOperator(ctx, dex.DEXOperator{
   618  		Address:            tokenPair.Owner,
   619  		HandlingFeeAddress: tokenPair.Owner,
   620  	})
   621  
   622  	// mock orders, DepthBook, and orderIDsMap
   623  	orders := []*types.Order{
   624  		mockOrder("", types.TestTokenPair, types.BuyOrder, "10.1", "1.0"),
   625  		mockOrder("", types.TestTokenPair, types.BuyOrder, "10.1", "2.0"),
   626  		mockOrder("", types.TestTokenPair, types.SellOrder, "9.9", "3.0"),
   627  		mockOrder("", types.TestTokenPair, types.SellOrder, "10.2", "1.0"),
   628  	}
   629  	orders[0].Sender = testInput.TestAddrs[0]
   630  	orders[1].Sender = testInput.TestAddrs[0]
   631  	orders[2].Sender = testInput.TestAddrs[1]
   632  	orders[3].Sender = testInput.TestAddrs[1]
   633  
   634  	for i := 0; i < 4; i++ {
   635  		err := keeper.PlaceOrder(ctx, orders[i])
   636  		require.EqualValues(t, nil, err)
   637  	}
   638  
   639  	fillPrice := sdk.NewDec(10.0)
   640  	fillQuantity := sdk.NewDec(1.0)
   641  	feeParams := types.DefaultTestParams()
   642  
   643  	for _, order := range orders {
   644  		retDeals := fillOrder(order, ctx, keeper, fillPrice, fillQuantity, &feeParams)
   645  		require.NotEmpty(t, retDeals)
   646  	}
   647  }
   648  
   649  func TestTransferTokens(t *testing.T) {
   650  	testInput := orderkeeper.CreateTestInput(t)
   651  	keeper := testInput.OrderKeeper
   652  	ctx := testInput.Ctx
   653  	tokenPair := dex.GetBuiltInTokenPair()
   654  	err := testInput.DexKeeper.SaveTokenPair(ctx, tokenPair)
   655  	require.Nil(t, err)
   656  
   657  	// mock orders, DepthBook, and orderIDsMap
   658  	orders := []*types.Order{
   659  		mockOrder("", types.TestTokenPair, types.BuyOrder, "10.1", "1.0"),
   660  		mockOrder("", types.TestTokenPair, types.BuyOrder, "10.1", "2.0"),
   661  		mockOrder("", types.TestTokenPair, types.SellOrder, "9.9", "3.0"),
   662  		mockOrder("", types.TestTokenPair, types.SellOrder, "10.2", "1.0"),
   663  	}
   664  	orders[0].Sender = testInput.TestAddrs[0]
   665  	orders[1].Sender = testInput.TestAddrs[0]
   666  	orders[2].Sender = testInput.TestAddrs[1]
   667  	orders[3].Sender = testInput.TestAddrs[1]
   668  
   669  	for i := 0; i < 4; i++ {
   670  		err := keeper.PlaceOrder(ctx, orders[i])
   671  		require.EqualValues(t, nil, err)
   672  	}
   673  
   674  	fillPrice := sdk.NewDec(10.0)
   675  	fillQuantity := sdk.NewDec(1.0)
   676  	for _, order := range orders {
   677  		balanceAccount(order, ctx, keeper, fillPrice, fillQuantity)
   678  	}
   679  }
   680  
   681  func TestChargeFee(t *testing.T) {
   682  	testInput := orderkeeper.CreateTestInput(t)
   683  	keeper := testInput.OrderKeeper
   684  	ctx := testInput.Ctx
   685  	tokenPair := dex.GetBuiltInTokenPair()
   686  	err := testInput.DexKeeper.SaveTokenPair(ctx, tokenPair)
   687  	require.Nil(t, err)
   688  	testInput.DexKeeper.SetOperator(ctx, dex.DEXOperator{
   689  		Address:            tokenPair.Owner,
   690  		HandlingFeeAddress: tokenPair.Owner,
   691  	})
   692  
   693  	keeper.ResetCache(ctx)
   694  	orders := []*types.Order{
   695  		mockOrder("", types.TestTokenPair, types.BuyOrder, "9.9", "1.0"),
   696  		mockOrder("", types.TestTokenPair, types.BuyOrder, "10.0", "1.0"),
   697  		mockOrder("", types.TestTokenPair, types.SellOrder, "10.0", "1.1"),
   698  		mockOrder("", types.TestTokenPair, types.SellOrder, "10.1", "1.1"),
   699  	}
   700  	orders[0].Sender = testInput.TestAddrs[0]
   701  	orders[1].Sender = testInput.TestAddrs[0]
   702  	orders[1].Status = types.OrderStatusFilled
   703  	orders[2].Sender = testInput.TestAddrs[1]
   704  	orders[2].Status = types.OrderStatusFilled
   705  	orders[3].Sender = testInput.TestAddrs[1]
   706  
   707  	fillQuantity := sdk.NewDec(1.0)
   708  	feeParams := types.DefaultTestParams()
   709  
   710  	for _, order := range orders {
   711  		retFee, feeReceiver := chargeFee(order, ctx, keeper, fillQuantity, &feeParams)
   712  		require.NotEmpty(t, retFee)
   713  		require.NotEmpty(t, feeReceiver)
   714  	}
   715  }