public async Task <CommandHandlingResult> Handle(SaveEthInHistoryCommand command, IEventPublisher eventPublisher) { var sw = new Stopwatch(); sw.Start(); try { var cashinId = command.CashinOperationId.ToString("N"); var clientId = command.ClientId; var hash = command.TransactionHash; var amount = command.Amount; var clientAddress = command.ClientAddress; await _cashOperationsRepositoryClient.RegisterAsync(new CashInOutOperation { Id = cashinId, ClientId = clientId.ToString(), AssetId = command.AssetId, Amount = (double)amount, BlockChainHash = hash, DateTime = DateTime.UtcNow, AddressTo = clientAddress, State = TransactionStates.SettledOnchain }); ChaosKitty.Meow(); var clientAcc = await _clientAccountClient.GetByIdAsync(clientId.ToString()); var clientEmail = await _personalDataService.GetEmailAsync(clientId.ToString()); await _srvEmailsFacade.SendNoRefundDepositDoneMail(clientAcc.PartnerId, clientEmail, amount, command.AssetId); await _paymentTransactionsRepository.SetStatus(hash, PaymentStatus.NotifyProcessed); ChaosKitty.Meow(); eventPublisher.PublishEvent(new EthCashinSavedInHistoryEvent() { TransactionHash = hash }); return(CommandHandlingResult.Ok()); } catch (Exception e) { _log.Error(nameof(SaveEthInHistoryCommand), e, context: command); throw; } finally { sw.Stop(); _log.Info("Command execution time", context: new { TxHandler = new { Handler = nameof(EthereumCoreCommandHandler), Command = nameof(SaveEthInHistoryCommand), Time = sw.ElapsedMilliseconds } }); } }
public async Task HandleCashInOperation(IAsset asset, double amount, string clientId, string clientAddress, string hash) { var id = Guid.NewGuid().ToString("N"); var pt = await _paymentTransactionsRepository.TryCreateAsync(PaymentTransaction.Create(hash, CashInPaymentSystem.Ethereum, clientId, amount, asset.DisplayId ?? asset.Id, status: PaymentStatus.Processing)); if (pt == null) { await _log.WriteWarningAsync(nameof(EthereumEventsQueue), nameof(HandleCashInOperation), hash, "Transaction already handled"); //return if was handled previously return; } var result = await _matchingEngineClient.CashInOutAsync(id, clientId, asset.Id, amount); if (result == null || result.Status != MeStatusCodes.Ok) { await _log.WriteWarningAsync(nameof(EthereumEventsQueue), nameof(HandleCashInOperation), "ME error", result.ToJson()); } else { var walletCreds = await _walletCredentialsRepository.GetAsync(clientId); await _cashOperationsRepository.RegisterAsync(new CashInOutOperation { Id = id, ClientId = clientId, Multisig = walletCreds.MultiSig, AssetId = asset.Id, Amount = amount, BlockChainHash = hash, DateTime = DateTime.UtcNow, AddressTo = clientAddress, State = TransactionStates.SettledOnchain }); var clientAcc = await _clientAccountsRepository.GetByIdAsync(clientId); await _srvEmailsFacade.SendNoRefundDepositDoneMail(clientAcc.Email, amount, asset.Id); await _paymentTransactionsRepository.SetStatus(hash, PaymentStatus.NotifyProcessed); } }