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