public void ProcessOrders() { // if tripwire tripped cancel if (!_tripwire.TradingEnabled() || !_tripwire.WithdrawalsEnabled()) { _logger.LogError("Tripwire tripped, exiting ProcessOrders()"); return; } // get lock - ensure that this function ends before it is started again lock (lockObj) { _logger.LogInformation("Process Orders - Broker"); var date = DateTimeOffset.Now.ToUnixTimeSeconds(); // process created orders var orders = _context.BrokerOrders.Where(o => o.Status == BrokerOrderStatus.Ready.ToString() || o.Status == BrokerOrderStatus.Incomming.ToString() || o.Status == BrokerOrderStatus.Confirmed.ToString() || o.Status == BrokerOrderStatus.PayoutWait.ToString()).ToList(); foreach (var order in orders) { if (_walletProvider.IsChain(order.AssetSend)) { ProcessOrderChain(order); } else { ProcessOrderFiat(order); } // we should save changes here because calls to the exchange backend could potentially throw exceptions // which this would leave the backend and frontend in conflicting state (if we save after the loop finishes) // I just eagerly load 'orders' using ToList() at the end of the linq statement to make sure that doesnt get invalidated or anything _context.SaveChanges(); } // expire orders var ordersToExpire = _context.BrokerOrders.Where(o => o.Status == BrokerOrderStatus.Created.ToString() || o.Status == BrokerOrderStatus.Ready.ToString()); foreach (var order in ordersToExpire) { if (date > order.Expiry + _apiSettings.Broker.TimeLimitGracePeriod) { order.Status = BrokerOrderStatus.Expired.ToString(); _context.BrokerOrders.Update(order); } } _context.SaveChanges(); } }