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 }