コード例 #1
0
        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"));
            }
        }
コード例 #2
0
        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));
        }