public async Task GenerateOrdinaryCashOut(string clientId, string address, double amount, string assetId, string privateKey) { var asset = await _assetsRepository.GetAssetAsync(assetId); if (asset == null) { return; } CashOutContextData contextData = null; try { var walletCredentials = await _walletCredentialsRepository.GetAsync(clientId); var cashOpId = await _cashOperationsRepository.RegisterAsync(new CashInOutOperation { Id = Guid.NewGuid().ToString("N"), ClientId = clientId, Multisig = walletCredentials.MultiSig, AssetId = assetId, Amount = -Math.Abs(amount), DateTime = DateTime.UtcNow, AddressFrom = walletCredentials.MultiSig, AddressTo = address }); var transactionId = Guid.NewGuid().ToString("N"); contextData = CashOutContextData.Create(clientId, assetId, address, amount, cashOpId); await _bitCoinTransactionsRepository.CreateAsync(transactionId, BitCoinCommands.OrdinaryCashOut, contextData); await _matchingEngineConnector.CashInOutBalanceAsync(contextData.ClientId, contextData.AssetId, -Math.Abs(amount), false, cashOpId); string request; if (_baseSettings.UsePushPrivateKeyService) { await _srvBlockchainHelper.PushPrivateKey(privateKey); request = await _bitCoinCommandProducer.ProduceOrdinaryCashOutCommand(transactionId, walletCredentials.MultiSig, amount, asset.BlockChainId, address); } else //ToDo: Temporary. Remove, when will be ready in ME { request = await _bitCoinCommandProducer.ObsoleteProduceOrdinaryCashOutCommand(transactionId, walletCredentials.MultiSig, amount, asset.BlockChainId, privateKey, address); } await _bitCoinTransactionsRepository.UpdateRequestAsync(transactionId, request); } catch (Exception ex) { await _log.WriteErrorAsync("SrvBitcoinCommandProducer", "OrdinaryCashOut", contextData?.ToJson(), ex); } }
private async Task <bool> ProcessDestroy(IBitcoinTransaction transaction, CashInOutQueueMessage msg) { var amount = msg.Amount.ParseAnyDouble(); //Get uncolor context data var context = await _bitcoinTransactionService.GetTransactionContext <UncolorContextData>(transaction.TransactionId); //Register cash operation var cashOperationId = await _cashOperationsRepository .RegisterAsync(new CashInOutOperation { Id = Guid.NewGuid().ToString("N"), ClientId = msg.ClientId, Multisig = context.AddressFrom, AssetId = msg.AssetId, Amount = -Math.Abs(amount), DateTime = DateTime.UtcNow, AddressFrom = context.AddressFrom, AddressTo = context.AddressTo, TransactionId = msg.Id }); //Update context data context.CashOperationId = cashOperationId; var contextJson = context.ToJson(); var cmd = new DestroyCommand { Context = contextJson, Amount = Math.Abs(amount), AssetId = msg.AssetId, Address = context.AddressFrom, TransactionId = Guid.Parse(msg.Id) }; await _bitcoinTransactionsRepository.UpdateAsync(transaction.TransactionId, cmd.ToJson(), null, ""); await _bitcoinTransactionService.SetTransactionContext(transaction.TransactionId, context); //Send to bitcoin await _bitcoinCommandSender.SendCommand(cmd); return(true); }
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); } }