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 }); }
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; } }