public async Task <bool> ProcessMessage(CashInOutQueueMessage queueMessage)
        {
            var transaction = await _bitcoinTransactionsRepository.FindByTransactionIdAsync(queueMessage.Id);

            if (transaction == null)
            {
                // external cashin
                if (_cashOperationsRepository.GetAsync(queueMessage.ClientId, queueMessage.Id) != null)
                {
                    return(await ProcessExternalCashin(queueMessage));
                }

                await _log.WriteWarningAsync(nameof(CashInOutQueue), nameof(ProcessMessage), queueMessage.ToJson(), "unkown transaction");

                return(false);
            }

            try
            {
                switch (transaction.CommandType)
                {
                case BitCoinCommands.Issue:
                    return(await ProcessIssue(transaction, queueMessage));

                case BitCoinCommands.CashOut:
                    return(await ProcessCashOut(transaction, queueMessage));

                case BitCoinCommands.Destroy:
                    return(await ProcessDestroy(transaction, queueMessage));

                case BitCoinCommands.ManualUpdate:
                    return(await ProcessManualOperation(transaction, queueMessage));

                default:
                    await _log.WriteWarningAsync(nameof(CashInOutQueue), nameof(ProcessMessage), queueMessage.ToJson(), $"Unknown command type (value = [{transaction.CommandType}])");

                    return(false);
                }
            }
            catch (Exception ex)
            {
                await _log.WriteErrorAsync(nameof(CashInOutQueue), nameof(ProcessMessage), queueMessage.ToJson(), ex);

                return(false);
            }
        }
        public async Task <List <HistoryEntry> > GetHistory(string clientId)
        {
            var records = new List <HistoryEntry>();

            HistoryEntry[] cashOperations                  = null;
            HistoryEntry[] tradeOperations                 = null;
            HistoryEntry[] transferOperations              = null;
            HistoryEntry[] cashOutAttemptOperations        = null;
            HistoryEntry[] limitTradeEvents                = null;
            Dictionary <string, IMarketOrder> marketOrders = null;

            var cashOperationsRead     = _cashOperationsRepository.GetAsync(clientId);
            var tradeOperationsRead    = _clientTradesRepository.GetAsync(clientId);
            var transferOperationsRead = _transferEventsRepository.GetAsync(clientId);
            var cashOutAttemptsRead    = _cashOutAttemptRepository.GetRequestsAsync(clientId);
            var limiTradeEventsRead    = _limitTradeEventsRepository.GetEventsAsync(clientId);
            var marketOrdersRead       = _marketOrdersRepository.GetOrdersAsync(clientId);

            await Task.WhenAll(
                cashOperationsRead.ContinueWith(t => cashOperations   = t.Result.Select(RepoMapper.MapFrom).ToArray()),
                tradeOperationsRead.ContinueWith(t => tradeOperations = t.Result.Select(RepoMapper.MapFrom).ToArray()),
                transferOperationsRead.ContinueWith(t =>
                                                    transferOperations = t.Result.Select(RepoMapper.MapFrom).ToArray()),
                cashOutAttemptsRead.ContinueWith(t =>
                                                 cashOutAttemptOperations = t.Result.Select(RepoMapper.MapFrom).ToArray()),
                limiTradeEventsRead.ContinueWith(t => limitTradeEvents    = t.Result.Select(RepoMapper.MapFrom).ToArray()),
                marketOrdersRead.ContinueWith(t => marketOrders           = t.Result.Where(x => !string.IsNullOrEmpty(x.Id)).ToDictionary(x => x.Id))
                );

            records.AddRange(cashOperations);
            records.AddRange(tradeOperations);
            records.AddRange(transferOperations);
            records.AddRange(cashOutAttemptOperations);
            records.AddRange(limitTradeEvents);

            await AddMarketOrdersInfo(records, marketOrders);

            return(records);
        }