Beispiel #1
0
        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);
            }
        }