Пример #1
0
        private async Task HandleDetectedTransaction(string address, IBlockchainTransaction tx, IBalanceChangeTransaction balanceChangeTx)
        {
            var internalOperation = await _internalOperationsRepository.GetAsync(tx.Hash);

            if (internalOperation?.CommandType == BitCoinCommands.Transfer ||
                IsExternalCashIn(address, tx, internalOperation) ||
                IsOtherClientsCashOut(address, tx, internalOperation))
            {
                var processTransactionCommand = new ProcessTransactionCommand
                {
                    TransactionHash = balanceChangeTx.Hash
                };

                _cqrsEngine.SendCommand(processTransactionCommand, "transactions", "transactions");
            }
        }
Пример #2
0
 public TransactionProcessingResult ProcessTransaction(ProcessTransactionCommand command)
 {
     try
     {
         var transaction = _deps.Transactions.SurelyFind(command.TransactionId);
         var operation   = _deps.BankOperations.Find(command.OperationId);
         var events      = _deps.CentralProcessor.Process(new TransactionProcessorCommand(Operation.Id, transaction, operation));
         Commit();
         var transactionModel = transaction.ToModel <TransactionModel>();
         return(new TransactionProcessingResult(transactionModel, events));
     }
     catch (Exception ex)
     {
         throw new ServiceException("Can't process transaction.", ex);
     }
 }
Пример #3
0
        // entry point
        public async Task <CommandHandlingResult> Handle(ProcessTransactionCommand command, IEventPublisher eventPublisher)
        {
            var confirmations = (await _qBitNinjaApiCaller.GetTransaction(command.TransactionHash))?.Block?.Confirmations;

            var isConfirmed = confirmations >= _settings.TxDetectorConfirmationsLimit;

            if (!isConfirmed)
            {
                //put back if not confirmed yet
                return(new CommandHandlingResult {
                    Retry = true, RetryDelay = (long)RetryTimeoutForTransactionConfirmations.TotalMilliseconds
                });
            }

            ChaosKitty.Meow();

            var hash = command.TransactionHash;
            var balanceChangeTransactions = await _balanceChangeTransactionsRepository.GetAsync(hash);

            foreach (var tx in balanceChangeTransactions)
            {
                var alreadyProcessed = !await _confirmedTransactionsRepository.SaveConfirmedIfNotExist(hash, tx.ClientId);

                if (alreadyProcessed)
                {
                    _log.WriteInfo(nameof(ProcessTransactionCommand), command,
                                   $"Transaction with hash {hash} for client {tx.ClientId} is already processed; ignoring it.");
                    continue;
                }

                eventPublisher.PublishEvent(new ConfirmationSavedEvent {
                    TransactionHash = hash, ClientId = tx.ClientId, Multisig = tx.Multisig
                });
            }
            return(CommandHandlingResult.Ok());
        }