Exemple #1
0
        public (bool, Book) ProcessOfferCancel(Domain.OfferCancel of)
        {
            var   transact = TransactManager;
            var   dic      = Dictionary;
            Offer result   = null;

            foreach (var book in dic.Values)
            {
                var offer = book.GetOffer(of.Offer);

                if (offer != null)
                {
                    if (offer.Wallet != of.Wallet)
                    {
                        Log.Error("Invalide offer cancel, not owner");
                        return(false, this);
                    }

                    OfferBook newBook = null;
                    (newBook, result) = book.CancelOffer(of.Offer);
                    result.Status     = OfferStatus.Canceled;

                    dic = dic.SetItem(book.Asset, newBook);

                    if (offer.Type == OfferType.Bid)
                    {
                        transact = transact.ChangeBalance(offer.Wallet, "BIZ", offer.LeavesQuantity * offer.Price);
                    }
                    else
                    {
                        transact = transact.ChangeBalance(offer.Wallet, offer.Asset, offer.LeavesQuantity);
                    }

                    return(true, new Book(this, transact, dic, ProcessedOffers.Add(result), Trades));
                }
            }

            return(false, this);
        }
Exemple #2
0
 public Offer GetProcessedOffer(string hash)
 {
     return(ProcessedOffers.FindAll(o => o.HashStr == hash).FirstOrDefault());
 }
Exemple #3
0
 public List <Offer> GetProcessedOffers(string wallet)
 {
     return(ProcessedOffers.FindAll(o => o.Wallet == wallet).ToList());
 }
Exemple #4
0
        public (bool, Book) ProcessOffer(Domain.Offer of)
        {
            var transact     = TransactManager;
            var dic          = Dictionary;
            var result       = false;
            var offers       = new List <Offer>();
            var trades       = new List <Trade>();
            var resultOffers = new List <Offer>();
            var resultTrades = new List <Trade>();

            if (!dic.ContainsKey(of.Asset))
            {
                dic = dic.Add(of.Asset, new OfferBook(of.Asset));
            }


            var sourceQuantity = of.Quantity;
            var asset          = of.Asset;

            if (of.Type == OfferType.Bid)
            {
                sourceQuantity = of.Quantity * of.Price;
                asset          = "BIZ";
            }

            if (transact.HasBalance(of.Wallet, asset, sourceQuantity))
            {
                transact = transact.ChangeBalance(of.Wallet, asset, -sourceQuantity);
                var book = dic[of.Asset];

                if (of.Type == OfferType.Bid)
                {
                    (book, resultTrades, resultOffers) = book.AddBid(of);
                }
                else
                {
                    (book, resultTrades, resultOffers) = book.AddAsk(of);
                }

                dic = dic.SetItem(of.Asset, book);
                offers.AddRange(resultOffers);
                trades.AddRange(resultTrades);

                result = true;
                foreach (var trade in resultTrades)
                {
                    transact = transact.ChangeBalance(trade.BuyerWallet, trade.Asset, trade.Quantity);
                    transact = transact.ChangeBalance(trade.SellerWallet, "BIZ", trade.Quantity * trade.Price);
                }
            }
            else
            {
                Log.Error("Wallet has no balance to send offer.");
            }

            if (result)
            {
                return(true, new Book(this, transact, dic, ProcessedOffers.AddRange(offers), Trades.AddRange(trades)));
            }
            else
            {
                return(false, this);
            }
        }