void ProcessOrderChain(BrokerOrder order) { // check wallet has been updated var time = _walletProvider.LastBlockchainWalletUpdate(order.AssetSend); if (time < DateTimeOffset.Now.AddMinutes(-(_apiSettings.Broker.TimeLimitGracePeriod / 2))) { _logger.LogWarning($"Not processing broker order ({order.Token}) as the wallet ({order.AssetSend}) was not updated since {time}"); return; } // get broker user var brokerUser = _userManager.FindByNameAsync(_apiSettings.Broker.BrokerTag).GetAwaiter().GetResult(); if (brokerUser == null) { _logger.LogError("Failed to find broker user"); return; } // get order user var user = _userManager.FindByIdAsync(order.ApplicationUserId).GetAwaiter().GetResult(); if (user == null) { _logger.LogError($"Failed to find order user ('{order.ApplicationUserId}')"); return; } if (order.Status == BrokerOrderStatus.Ready.ToString() || order.Status == BrokerOrderStatus.Incomming.ToString()) { CheckTxs(brokerUser, user, order); } else if (order.Status == BrokerOrderStatus.Confirmed.ToString()) { if (FiatWithdrawToCustomer(brokerUser, order)) { order.Status = BrokerOrderStatus.PayoutWait.ToString(); _context.BrokerOrders.Update(order); _logger.LogError($"Sent fiat for order ('{order.Token}')"); } else { _logger.LogError($"failed to send fiat for order ({order.Token})"); } } else if (order.Status == BrokerOrderStatus.PayoutWait.ToString()) { var bow = _context.BrokerOrderFiatWithdrawals.SingleOrDefault(o => o.BrokerOrderId == order.Id); if (bow == null) { _logger.LogWarning($"broker order withdrawal not found ({order.Token})"); return; } // check fiat withdrawal is completed var wallet = _walletProvider.GetFiat(order.AssetReceive); var fiatTx = wallet.GetTx(bow.DepositCode); if (fiatTx != null && fiatTx.BankTx != null) { order.Status = BrokerOrderStatus.Sent.ToString(); _context.BrokerOrders.Update(order); _logger.LogInformation($"Payout confirmed for order {order.Token}"); // send email var sendWallet = _walletProvider.GetChain(order.AssetSend); var receiveWallet = _walletProvider.GetFiat(order.AssetReceive); _emailSender.SendEmailBrokerSentOutgoingFunds(user.Email, order.AssetSend, sendWallet.AmountToString(order.AmountSend), order.AssetReceive, receiveWallet.AmountToString(order.AmountReceive), order.InvoiceId).GetAwaiter().GetResult(); _logger.LogInformation($"Sent email to {user.Email}"); } } }