public async Task <IActionResult> GetById(int bettingId)
        {
            var bids = this.bidService.Get(x => x.BettingId == bettingId);

            string userId = (await userManager.FindByNameAsync(User.Identity.Name)).Id;

            if (bids != null)
            {
                foreach (var bid in bids)
                {
                    if (bid.UserId != userId)
                    {
                        bid.PaymentAddress = null;
                    }

                    bid.PossibleWin = BettingHelper.GetAmountPayment(
                        bid.Amount,
                        bid.Coefficient,
                        this.bettingService.GetBank(bid.BettingId, bid.Side),
                        this.bettingService.GetBank(bid.BettingId, !bid.Side));
                }

                return(Ok(new { result = true, list = bids }));
            }

            return(Ok(new { result = false }));
        }
        public void GetAmountPayment_InvalidParams_ExpectException()
        {
            var bet          = -1M;
            var coefficient  = 0M;
            var betBank      = 0M;
            var oppositeBank = 0M;

            Assert.ThrowsException <ArgumentException>(() => BettingHelper.GetAmountPayment(bet, coefficient, betBank, oppositeBank));
        }
        public void GetAmountPayment_ValidParams_ExpectWin()
        {
            var bet          = 1M;
            var coefficient  = 2M;
            var betBank      = 1M;
            var oppositeBank = 1M;

            var amount = BettingHelper.GetAmountPayment(bet, coefficient, betBank, oppositeBank);

            Assert.AreEqual(amount, 1.9M);
        }
Beispiel #4
0
        public async Task Execute(IJobExecutionContext context)
        {
            var bet = this.bettingService.Get(model => model.Status == BettingStatus.Waiting)
                      .OrderBy(model => model.FinishDate).FirstOrDefault();

            if (bet != null)
            {
                decimal?currentExchange;

                do
                {
                    currentExchange = this.bettingService.CurrentExchange;
                }while (!currentExchange.HasValue);

                var sideWin = currentExchange.Value > bet.ExchangeRate;

                // Set status and who win
                bet.Result = sideWin;
                bet.Status = BettingStatus.Done;
                await this.bettingService.Update(bet);

                var bankMore = this.bettingService.GetBank(bet.BettingId, true);
                var bankLess = this.bettingService.GetBank(bet.BettingId, false);

                var bids = this.bidService.Get(
                    model => model.BettingId == bet.BettingId && !model.Status &&
                    model.PaymentStatus == PaymentStatus.Confirmed);

                // select ids of addresses where can be coins
                var ids = bids.Select(model => model.BidId).ToList();

                // use first address as basic
                ids.Add(this.BasicAddressId);

                foreach (var bid in bids)
                {
                    if (bid.Side == sideWin)
                    {
                        var award = sideWin
                                        ? BettingHelper.GetAmountPayment(bid.Amount, bid.Coefficient, bankMore, bankLess)
                                        : BettingHelper.GetAmountPayment(bid.Amount, bid.Coefficient, bankLess, bankMore);

                        try
                        {
                            var address = this.walletService.GetById(bid.WalletId);
                            if (address != null)
                            {
                                // send to winners and send remainder sum to first address
                                this.bitcoinWalletService.Send(address.Address, award, ids, this.BasicAddressId);

                                bid.Paid = true;


                                var user = await this.userManager.FindByIdAsync(bid.UserId);

                                await this.emailSender.SendEmailAsync(
                                    user.Email,
                                    "Bitcoin app payment",
                                    "You win " + (decimal)award + " on your wallet " + bid.PaymentAddress);
                            }
                        }
                        catch (Exception e)
                        {
                            // ignored
                        }
                    }

                    bid.Status = true;

                    this.bidService.Update(bid);
                }
            }
        }