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); }
public Offer GetProcessedOffer(string hash) { return(ProcessedOffers.FindAll(o => o.HashStr == hash).FirstOrDefault()); }
public List <Offer> GetProcessedOffers(string wallet) { return(ProcessedOffers.FindAll(o => o.Wallet == wallet).ToList()); }
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); } }