Beispiel #1
0
        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();
            }
        }