public async Task <ActionResult> Create(string selectCurrency) { var userId = User.FindFirstValue(ClaimTypes.NameIdentifier); if (!string.IsNullOrEmpty(userId)) { // create new income blockchain address(incomeWallet) string address = _walletService.GetNewAddress(selectCurrency, userId); if (address == null) { return(RedirectToAction("Index")); } await _eventsRepository.CreateEventAsync(new EventTableModel() { UserId = userId, Type = (int)EventTypeEnum.CreateAddress, Comment = $"Create address {selectCurrency}: {address}", WhenDate = DateTime.Now, CurrencyAcronim = selectCurrency }); IncomeWalletTableModel incomeWallet = new IncomeWalletTableModel() { UserId = userId, CurrencyAcronim = selectCurrency, Address = address, AddressLabel = userId }; var wallet = await _walletsRepository.GetUserWalletAsync(userId, selectCurrency); // create new inner platform wallet if (wallet == null) { wallet = await _walletsRepository.CreateUserWalletAsync(new WalletTableModel() { UserId = userId, CurrencyAcronim = selectCurrency, Value = 0, Address = _walletService.GetNewAddress(selectCurrency, userId) }); await _eventsRepository.CreateEventAsync(new EventTableModel() { UserId = wallet.UserId, Type = (int)EventTypeEnum.CreateWallet, Comment = $"Create wallet {wallet.CurrencyAcronim}", WhenDate = DateTime.Now, CurrencyAcronim = wallet.CurrencyAcronim }); } await _walletsRepository.CreateUserIncomeWalletAsync(incomeWallet); return(RedirectToAction("Index")); } else { return(Redirect("/Identity/Account/Login")); } }
public async Task <IActionResult> Coins(SendCoinsViewModel sendCoinsModel) { if (ModelState.IsValid) { try { var userId = User.FindFirstValue(ClaimTypes.NameIdentifier); string sendToUserId = await _userRepository.FindUserIdForSendPageAsync(sendCoinsModel.InputTextIdentifier); if (string.IsNullOrEmpty(sendToUserId)) { sendCoinsModel.Status = "Error. User does not exist."; return(View(sendCoinsModel)); } var walletFrom = await _walletsRepository.GetUserWalletAsync(userId, sendCoinsModel.Currency); var walletTo = await _walletsRepository.GetUserWalletAsync(sendToUserId, sendCoinsModel.Currency); decimal?_amount = sendCoinsModel.Amount.ConvertToDecimal(); if (walletFrom != null && _amount.Value > 0 && _amount.Value <= walletFrom.Value) { if (walletTo == null) { walletTo = await _walletsRepository.CreateUserWalletAsync(new WalletTableModel() { UserId = sendToUserId, CurrencyAcronim = walletFrom.CurrencyAcronim, Value = 0, Address = _walletService.GetNewAddress(walletFrom.CurrencyAcronim, sendToUserId) }); await _eventsRepository.CreateEventAsync(new EventTableModel() { UserId = userId, Type = (int)EventTypeEnum.CreateWallet, Comment = $"Create wallet {walletTo.CurrencyAcronim}", WhenDate = DateTime.Now, CurrencyAcronim = walletTo.CurrencyAcronim }); } var resultBalance = await _balanceProvider.Send(_amount.Value, walletFrom, walletTo); SendCoinsModel sendRecieve = new() { SenderUserId = userId, ReceiverUserId = sendToUserId, TypeSender = (int)EventTypeEnum.Send, TypeRecieve = (int)EventTypeEnum.Recieve, Comment = sendCoinsModel.Comment, CurrencyAcronim = sendCoinsModel.Currency, Value = _amount.Value, PlatformCommission = resultBalance.Commission, StartBalanceSender = resultBalance.StartBalanceSender, ResultBalanceSender = resultBalance.ResultBalanceSender, StartBalanceReceiver = resultBalance.StartBalanceReceiver.Value, ResultBalanceReceiver = resultBalance.ResultBalanceReceiver.Value, SenderWalletId = walletFrom.Id, ReceiverWalletId = walletTo.Id, }; sendRecieve.Hash = GenerateHash.ComputeHash(sendCoinsModel.Currency, sendRecieve.SenderWalletId, sendRecieve.ReceiverWalletId, sendRecieve.Value, DateTime.Now, sendRecieve.Comment); await _walletsRepository.SendCoinsAsync(sendRecieve); sendCoinsModel.Status = "Success"; } else { sendCoinsModel.Status = "Not enough coins"; } } catch { sendCoinsModel.Status = "Error"; return(View(sendCoinsModel)); } } return(View(sendCoinsModel)); }