示例#1
0
 private async Task SaveUserHistory(string adapterAddress, string amount, string userAddress, string toAddress, string trHash, string note)
 {
     await _userPaymentHistoryRepository.SaveAsync(new UserPaymentHistory()
     {
         AdapterAddress  = adapterAddress,
         Amount          = amount,
         ToAddress       = toAddress,
         CreatedDate     = DateTime.UtcNow,
         Note            = note,
         TransactionHash = trHash,
         UserAddress     = userAddress
     });
 }
示例#2
0
        public async Task TransferToCoinContract(TransferContractTransaction contractTransferTr)
        {
            try
            {
                var contractEntity = await _transferContractRepository.GetAsync(contractTransferTr.ContractAddress);

                var balance = await _transferContractService.GetBalance(contractTransferTr.ContractAddress);

                if (balance == 0)
                {
                    await UpdateUserTransferWallet(contractTransferTr);

                    await _logger.WriteInfoAsync("TransferContractTransactionService", "TransferToCoinContract", "",
                                                 $"Can't cashin: there is no funds on the transfer contract {contractTransferTr.ContractAddress}", DateTime.UtcNow);

                    return;
                }

                var userAddress = await _transferContractService.GetUserAddressForTransferContract(contractTransferTr.ContractAddress);

                if (string.IsNullOrEmpty(userAddress) || userAddress == Constants.EmptyEthereumAddress)
                {
                    await UpdateUserTransferWallet(contractTransferTr);

                    await _logger.WriteInfoAsync("TransferContractTransactionService", "TransferToCoinContract", "",
                                                 $"Can't cashin: there is no user assigned to the transfer contract {contractTransferTr.ContractAddress}", DateTime.UtcNow);

                    return;
                }

                var opId            = $"InternalOperation-{Guid.NewGuid().ToString()}";
                var transactionHash = await _transferContractService.RecievePaymentFromTransferContract(contractEntity.ContractAddress, contractEntity.CoinAdapterAddress);

                await _coinEventService.PublishEvent(new CoinEvent(opId,
                                                                   transactionHash, contractTransferTr.ContractAddress, contractTransferTr.UserAddress,
                                                                   balance.ToString(), CoinEventType.CashinStarted, contractEntity.CoinAdapterAddress));

                await _eventTraceRepository.InsertAsync(new EventTrace()
                {
                    Note        = $"First Cashin appearance {transactionHash} put in {Constants.TransactionMonitoringQueue}",
                    OperationId = opId,
                    TraceDate   = DateTime.UtcNow
                });

                await _userPaymentHistoryRepository.SaveAsync(new UserPaymentHistory()
                {
                    Amount          = balance.ToString(),
                    ToAddress       = contractEntity.ContractAddress,
                    AdapterAddress  = contractEntity.CoinAdapterAddress,
                    CreatedDate     = DateTime.UtcNow,
                    Note            = $"Cashin from transfer contract {contractEntity.ContractAddress}",
                    TransactionHash = transactionHash,
                    UserAddress     = contractTransferTr.UserAddress
                });

                //await UpdateUserTransferWallet(contractTransferTr);
                await _logger.WriteInfoAsync("ContractTransferTransactionService", "TransferToCoinContract", "",
                                             $"Transfered {balance} from transfer contract to \"{contractTransferTr.CoinAdapterAddress}\" by transaction \"{transactionHash}\". Receiver = {contractEntity.UserAddress}");
            }
            catch (Exception e)
            {
                await _logger.WriteErrorAsync("TransferContractTransactionService", "TransferToCoinContract",
                                              $"{contractTransferTr.ContractAddress} - {contractTransferTr.CoinAdapterAddress} - {contractTransferTr.Amount}", e);

                throw;
            }
        }
        public async Task TransferToCoinContract(Erc20DepositContractTransaction contractTransferTr)
        {
            try
            {
                var userAddress = contractTransferTr.UserAddress;

                if (string.IsNullOrEmpty(userAddress) || userAddress == Constants.EmptyEthereumAddress)
                {
                    await UpdateUserTransferWallet(contractTransferTr);

                    await _logger.WriteInfoAsync("TransferContractTransactionService", "TransferToCoinContract", "",
                                                 $"Can't cashin: there is no user assigned to the transfer contract {contractTransferTr.ContractAddress}", DateTime.UtcNow);

                    return;
                }

                var tokenAddress    = contractTransferTr.TokenAddress;
                var contractAddress = await _erc20DepositContractService.GetContractAddress(contractTransferTr.UserAddress);

                var balance = await _ercInterfaceService.GetBalanceForExternalTokenAsync(contractTransferTr.ContractAddress, contractTransferTr.TokenAddress);

                if (balance == 0)
                {
                    await UpdateUserTransferWallet(contractTransferTr);

                    await _logger.WriteInfoAsync("TransferContractTransactionService", "TransferToCoinContract", "",
                                                 $"Can't cashin: there is no funds on the transfer contract {contractTransferTr.ContractAddress}", DateTime.UtcNow);

                    return;
                }

                var    opId            = $"HotWalletCashin-{Guid.NewGuid().ToString()}";
                string transactionHash = null;

                try
                {
                    transactionHash = await _hotWalletService.StartCashinAsync(new HotWalletOperation()
                    {
                        Amount        = balance,
                        FromAddress   = contractAddress,
                        OperationId   = opId,
                        ToAddress     = _hotWalletAddress,
                        TokenAddress  = tokenAddress,
                        OperationType = HotWalletOperationType.Cashin,
                    });
                }
                catch (Exception exc)
                {
                    await UpdateUserTransferWallet(contractTransferTr);

                    return;
                }

                await _userPaymentHistoryRepository.SaveAsync(new UserPaymentHistory()
                {
                    Amount          = balance.ToString(),
                    ToAddress       = contractAddress,
                    AdapterAddress  = $"HotWallet-Token-{tokenAddress}",
                    CreatedDate     = DateTime.UtcNow,
                    Note            = $"Cashin from erc20 deposit contract {contractAddress}",
                    TransactionHash = transactionHash,
                    UserAddress     = contractTransferTr.UserAddress
                });

                //await UpdateUserTransferWallet(contractTransferTr);
                await _logger.WriteInfoAsync(nameof(Erc20DepositTransactionService), nameof(TransferToCoinContract), "",
                                             $"Transfered {balance} from erc 20 deposit contract to {_hotWalletAddress} by transaction {transactionHash}. " +
                                             $"Receiver = {userAddress}");
            }
            catch (Exception e)
            {
                await _logger.WriteErrorAsync(nameof(Erc20DepositTransactionService), nameof(TransferToCoinContract),
                                              $"{contractTransferTr.ContractAddress} - erc20 - {contractTransferTr.TokenAddress} - {contractTransferTr.Amount}", e);

                throw;
            }
        }
        public async Task TransferToCoinContract(Erc20DepositContractTransaction contractTransferTr)
        {
            try
            {
                var tokenAddress    = contractTransferTr.TokenAddress;
                var contractAddress = contractTransferTr.ContractAddress;
                var userAddress     = contractTransferTr.UserAddress;

                if (string.IsNullOrEmpty(userAddress) || userAddress == Constants.EmptyEthereumAddress)
                {
                    await UpdateUserTransferWallet(contractTransferTr);

                    await _logger.WriteInfoAsync("TransferContractTransactionService", "TransferToCoinContract", "",
                                                 $"Can't cashin: there is no user assigned to the transfer contract {contractTransferTr.ContractAddress}", DateTime.UtcNow);

                    return;
                }

                if (string.IsNullOrEmpty(contractAddress) || contractAddress == Constants.EmptyEthereumAddress)
                {
                    await UpdateUserTransferWallet(contractTransferTr);

                    await _logger.WriteInfoAsync("TransferContractTransactionService", "TransferToCoinContract", "",
                                                 $"Can't cashin: there is no contract address in message{contractTransferTr?.ToJson()}", DateTime.UtcNow);

                    return;
                }

                var balance = await _ercInterfaceService.GetBalanceForExternalTokenAsync(contractAddress, contractTransferTr.TokenAddress);

                if (balance == 0)
                {
                    await UpdateUserTransferWallet(contractTransferTr);

                    await _logger.WriteInfoAsync("TransferContractTransactionService", "TransferToCoinContract", "",
                                                 $"Can't cashin: there is no funds on the transfer contract {contractAddress}", DateTime.UtcNow);

                    return;
                }

                var    opId            = $"HotWalletCashin-{Guid.NewGuid().ToString()}";
                string transactionHash = null;

                try
                {
                    transactionHash = await _hotWalletService.StartCashinAsync(new HotWalletOperation()
                    {
                        Amount        = balance,
                        FromAddress   = contractAddress,
                        OperationId   = opId,
                        ToAddress     = _hotWalletAddress,
                        TokenAddress  = tokenAddress,
                        OperationType = HotWalletOperationType.Cashin,
                    });

                    await _cointTransactionQueue.PutRawMessageAsync(JsonConvert.SerializeObject(new CoinTransactionMessage()
                    {
                        TransactionHash = transactionHash
                    }));
                }
                catch (ClientSideException clientSideExc)
                {
                    var context = new
                    {
                        obj = contractTransferTr.ToJson(),
                        exc = $"{clientSideExc.ExceptionType} {clientSideExc.Message} {clientSideExc.StackTrace}"
                    }.ToJson();
                    await _logger.WriteInfoAsync(nameof(Erc20DepositTransactionService), nameof(TransferToCoinContract),
                                                 $"{context}");
                    await UpdateUserTransferWallet(contractTransferTr);

                    //Redirect issues to dedicated slack channel
                    await _slackNotifier.ErrorAsync($"{nameof(Erc20DepositTransactionService)} can't start cashin {context}");

                    return;
                }
                catch (Exception exc)
                {
                    await _logger.WriteErrorAsync(nameof(Erc20DepositTransactionService), nameof(TransferToCoinContract),
                                                  $"{contractTransferTr.ToJson()}", exc);
                    await UpdateUserTransferWallet(contractTransferTr);

                    return;
                }

                await _userPaymentHistoryRepository.SaveAsync(new UserPaymentHistory()
                {
                    Amount          = balance.ToString(),
                    ToAddress       = contractAddress,
                    AdapterAddress  = $"HotWallet-Token-{tokenAddress}",
                    CreatedDate     = DateTime.UtcNow,
                    Note            = $"Cashin from erc20 deposit contract {contractAddress}",
                    TransactionHash = transactionHash,
                    UserAddress     = contractTransferTr.UserAddress
                });

                //await UpdateUserTransferWallet(contractTransferTr);
                await _logger.WriteInfoAsync(nameof(Erc20DepositTransactionService), nameof(TransferToCoinContract), "",
                                             $"Transfered {balance} from erc 20 deposit contract to {_hotWalletAddress} by transaction {transactionHash}. " +
                                             $"Receiver = {userAddress}");
            }
            catch (Exception e)
            {
                await _logger.WriteErrorAsync(nameof(Erc20DepositTransactionService), nameof(TransferToCoinContract),
                                              $"{contractTransferTr.ContractAddress} - erc20 - {contractTransferTr.TokenAddress} - {contractTransferTr.Amount}", e);

                throw;
            }
        }