private async Task HandleBuyReceiptAsync(KyubeyContext db, ActionDataWrap data, DateTime time) { try { var token = data.data.ask.Split(' ')[1]; var order = await db.DexBuyOrders.SingleOrDefaultAsync(x => x.Id == data.data.id && x.TokenId == token); if (order != null) { db.DexBuyOrders.Remove(order); await db.SaveChangesAsync(); } order = new DexBuyOrder { Id = data.data.id, Account = data.data.account, Ask = Convert.ToDouble(data.data.ask.Split(' ')[0]), Bid = Convert.ToDouble(data.data.bid.Split(' ')[0]), UnitPrice = data.data.unit_price / 10000.0, Time = time, TokenId = token }; db.DexBuyOrders.Add(order); await db.SaveChangesAsync(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } }
static async Task DoMatchAsync(string transferHash, string account, string askSymbol, double askAmount, string bidSymbol, double bidAmount) { askAmount /= 1000000; bidAmount /= 1000000; //sell if (askSymbol == "TRX") { var price = askAmount / bidAmount; var order = new DexSellOrder { Account = account, Ask = askAmount, Bid = bidAmount, TokenId = bidSymbol, Time = DateTime.Now, UnitPrice = price }; var orders = await db.DexBuyOrders.Where(x => x.TokenId == bidSymbol) .Where(x => x.UnitPrice >= price) .ToListAsync(); var remianAmount = bidAmount; foreach (var x in orders) { if (remianAmount <= 0) { break; } //token amount var amount = x.Ask < remianAmount ? x.Ask : remianAmount; x.Ask -= amount; // 2元 x.Bid -= amount * x.UnitPrice; // 1个苹果 order.Bid -= amount; order.Ask -= amount * price; remianAmount -= amount; await TransferAsync(x.Account, amount, bidSymbol); await TransferAsync(account, amount *price, askSymbol); db.MatchReceipts.Add(new MatchReceipt { IsSellMatch = true, Asker = account, Ask = amount * x.UnitPrice, Bidder = x.Account, Bid = amount, Time = DateTime.Now, TokenId = bidSymbol, UnitPrice = x.UnitPrice }); if (x.Ask == 0 || x.Bid == 0) { db.Remove(x); } } if (order.Ask != 0 && order.Bid != 0) { db.DexSellOrders.Add(order); } await db.SaveChangesAsync(); } //buy else { double price = bidAmount / askAmount; var order = new DexBuyOrder { TransferHash = transferHash, Account = account, Ask = askAmount, Bid = bidAmount, TokenId = askSymbol, Time = DateTime.Now, UnitPrice = price }; var orders = await db.DexSellOrders.Where(x => x.TokenId == askSymbol) .Where(x => x.UnitPrice <= price) .ToListAsync(); var remianAmount = askAmount; foreach (var x in orders) { if (remianAmount <= 0) { break; } var amount = x.Bid < remianAmount ? x.Bid : remianAmount; x.Bid -= amount; // 1个苹果 x.Ask -= amount * x.UnitPrice; // 2元 order.Ask -= amount; order.Bid -= amount * x.UnitPrice; remianAmount -= amount; await TransferAsync(x.Account, amount *x.UnitPrice, bidSymbol); await TransferAsync(account, amount, askSymbol); db.MatchReceipts.Add(new MatchReceipt { IsSellMatch = false, Asker = account, Ask = amount, Bidder = x.Account, Bid = amount * x.UnitPrice, UnitPrice = price, TokenId = askSymbol, Time = DateTime.Now }); if (x.Ask == 0 || x.Bid == 0) { db.Remove(x); } } if (order.Ask != 0 && order.Bid != 0) { db.DexBuyOrders.Add(order); } await db.SaveChangesAsync(); } }