예제 #1
0
 private async Task UpdateLatestTransactions(InvestorTransaction tx)
 {
     try
     {
         await _campaignInfoRepository.SaveLatestTransactionsAsync(tx.Email, tx.UniqueId);
     }
     catch (Exception ex)
     {
         await _log.WriteErrorAsync(nameof(UpdateLatestTransactions),
             $"email: {tx.Email}, uniqueId: {tx.UniqueId}",
             ex);
     }
 }
예제 #2
0
 private async Task UpdateInvestorAmounts(InvestorTransaction tx)
 {
     try
     {
         await _investorRepository.IncrementAmount(tx.Email, tx.Currency, tx.Amount, tx.AmountUsd, tx.AmountToken);
     }
     catch (Exception ex)
     {
         await _log.WriteErrorAsync(nameof(UpdateInvestorAmounts),
             $"Tx: {tx.ToJson()}",
             ex);
     }
 }
예제 #3
0
        private async Task UpdateInvestorReferralCode(InvestorTransaction tx, ICampaignSettings settings)
        {
            try
            {
                if (settings.EnableReferralProgram)
                {
                    var investor = await _investorRepository.GetAsync(tx.Email);

                    if (string.IsNullOrEmpty(investor.ReferralCode) && 
                        investor.AmountUsd >= settings.MinInvestAmountUsd)
                    {
                        if (!settings.ReferralCodeLength.HasValue)
                        {
                            throw new Exception("settings.ReferralCodeLength does not have value");
                        }

                        var code = await _referralCodeService.GetReferralCode(settings.ReferralCodeLength.Value);

                        await _investorRepository.SaveReferralCode(investor.Email, code);
                        await _investorAttributeRepository.SaveAsync(InvestorAttributeType.ReferralCode,
                            investor.Email, code);

                        await _log.WriteInfoAsync(nameof(UpdateInvestorReferralCode),
                            $"email: {investor.Email}, code: {code}",
                            $"Update investor referral code");
                    }

                    if (!string.IsNullOrEmpty(investor.ReferralCodeApplied) && 
                        investor.AmountUsd >= settings.MinInvestAmountUsd)
                    {
                        var referralOwnerEmail = await _investorAttributeRepository.GetInvestorEmailAsync(
                            InvestorAttributeType.ReferralCode, investor.ReferralCodeApplied);
                        if (referralOwnerEmail != null)
                        {
                            await _investorRepository.IncrementReferrals(referralOwnerEmail);

                            await _log.WriteInfoAsync(nameof(UpdateInvestorReferralCode),
                                $"referralEmail: {referralOwnerEmail}",
                                $"Increment referrals number");
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                await _log.WriteErrorAsync(nameof(UpdateInvestorReferralCode),
                    $"Tx: {tx.ToJson()}, settings: {settings.ToJson()}",
                    ex);
            }
        }
예제 #4
0
        private async Task SendConfirmationEmail(InvestorTransaction tx, string link, ICampaignSettings settings)
        {
            try
            {
                var investor = await _investorRepository.GetAsync(tx.Email);

                var message = new InvestorNewTransactionMessage
                {
                    EmailTo = tx.Email,
                    InvestedAmountUsd = investor.AmountUsd.RoundDown(2),
                    InvestedAmountToken = investor.AmountToken.RoundDown(4),
                    TransactionAmount = tx.Amount,
                    TransactionAmountUsd = tx.AmountUsd.RoundDown(2),
                    TransactionAmountToken = tx.AmountToken.RoundDown(4),
                    TransactionFee = tx.Fee,
                    TransactionAsset = tx.Currency.ToAssetName(),
                    LinkToSummaryPage = _siteSummaryPageUrl.Replace("{token}", investor.ConfirmationToken.Value.ToString()),
                    LinkTransactionDetails = link,
                    MinAmount = settings.MinInvestAmountUsd,
                    MoreInvestmentRequired = investor.AmountUsd < settings.MinInvestAmountUsd
                };

                if (settings.KycEnableRequestSending &&
                    investor.KycRequestedUtc == null &&
                    investor.AmountUsd >= settings.MinInvestAmountUsd)
                {
                    var kycId = await SaveInvestorKyc(investor.Email);
                    var kycLink = await _kycService.GetKycLink(tx.Email, kycId);

                    message.KycRequired = true;
                    message.KycLink = kycLink;
                }

                await _log.WriteInfoAsync(nameof(SendConfirmationEmail),
                    $"message: {message.ToJson()}",
                    $"Send transaction confirmation message to queue");

                await _investmentMailSender.SendAsync(message);
            }
            catch (Exception ex)
            {
                await _log.WriteErrorAsync(nameof(SendConfirmationEmail),
                    $"Tx: {tx.ToJson()}, TxLink: {link}",
                    ex);
            }
        }
예제 #5
0
        private async Task UpdateCampaignAmounts(InvestorTransaction tx)
        {
            if (tx.Currency == CurrencyType.Bitcoin)
            {
                await IncrementCampaignInfoParam(CampaignInfoType.AmountInvestedBtc, tx.Amount);
            }
            if (tx.Currency == CurrencyType.Ether)
            {
                await IncrementCampaignInfoParam(CampaignInfoType.AmountInvestedEth, tx.Amount);
            }
            if (tx.Currency == CurrencyType.Fiat)
            {
                await IncrementCampaignInfoParam(CampaignInfoType.AmountInvestedFiat, tx.Amount);
            }

            await IncrementCampaignInfoParam(CampaignInfoType.AmountInvestedToken, tx.AmountToken);
            await IncrementCampaignInfoParam(CampaignInfoType.AmountInvestedUsd, tx.AmountUsd);
        }
예제 #6
0
        private async Task<InvestorTransaction> SaveTransaction(TransactionMessage msg, 
            ICampaignSettings settings, decimal soldTokensAmount)
        {
            var investor = await _investorRepository.GetAsync(msg.Email);
            var exchangeRate = await GetExchangeRate(msg);
            var avgExchangeRate = Convert.ToDecimal(exchangeRate.AverageRate);
            var amountUsd = msg.Amount * avgExchangeRate;
            var tokenPriceList = TokenPrice.GetPriceList(settings, investor, msg.CreatedUtc, 
                amountUsd, soldTokensAmount);
            var amountToken = tokenPriceList.Sum(p => p.Count);
            var tokenPrice = tokenPriceList.Count == 1 ? tokenPriceList[0].Price : (amountUsd / amountToken);

            var tx = new InvestorTransaction
            {
                Email = msg.Email,
                UniqueId = msg.UniqueId,
                CreatedUtc = msg.CreatedUtc,
                Currency = msg.Currency,
                TransactionId = msg.TransactionId,
                BlockId = msg.BlockId,
                PayInAddress = msg.PayInAddress,
                Amount = msg.Amount,
                AmountUsd = amountUsd,
                AmountToken = amountToken,
                Fee = msg.Fee,
                TokenPrice = tokenPrice,
                TokenPriceContext = tokenPriceList.ToJson(),
                ExchangeRate = avgExchangeRate,
                ExchangeRateContext = exchangeRate.Rates.ToJson()
            };

            await _log.WriteInfoAsync(nameof(SaveTransaction),
                $"tx: {tx.ToJson()}", $"Save transaction");

            await _investorTransactionRepository.SaveAsync(tx);

            return tx;
        }