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"); } }
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); } }
// 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()); }