private async Task<bool> IsTxValid(TransactionMessage msg, ICampaignSettings settings, decimal soldTokensAmount) { var preSalePhase = settings.IsPreSale(msg.CreatedUtc); var crowdSalePhase = settings.IsCrowdSale(msg.CreatedUtc); var amountInvestedUsd = await GetInvestedUsdAmount(); if (!preSalePhase && !crowdSalePhase) { await _log.WriteInfoAsync(nameof(Process), $"msg: {msg}, settings: {settings.ToJson()}", $"Transaction is out of campaign dates"); await _investorRefundRepository.SaveAsync(msg.Email, InvestorRefundReason.OutOfDates, msg.ToJson()); return false; } if (preSalePhase && soldTokensAmount > settings.PreSaleTotalTokensAmount) { await _log.WriteInfoAsync(nameof(Process), $"soldTokensAmount: {soldTokensAmount}, settings: {settings.ToJson()}, msg: {msg.ToJson()}", $"All presale tokens were sold out"); await _investorRefundRepository.SaveAsync(msg.Email, InvestorRefundReason.PreSaleTokensSoldOut, msg.ToJson()); return false; } if (crowdSalePhase && soldTokensAmount > settings.GetTotalTokensAmount()) { await _log.WriteInfoAsync(nameof(Process), $"soldTokensAmount: {soldTokensAmount}, totalTokensAmount: {settings.GetTotalTokensAmount()}, " + $"settings: {settings.ToJson()}, msg: {msg.ToJson()}", $"All tokens were sold out"); await _investorRefundRepository.SaveAsync(msg.Email, InvestorRefundReason.TokensSoldOut, msg.ToJson()); return false; } if (crowdSalePhase && amountInvestedUsd > settings.HardCapUsd) { await _log.WriteInfoAsync(nameof(Process), $"amountInvestedUsd: {amountInvestedUsd}, hardCapUsd: {settings.HardCapUsd}, " + $"settings: {settings.ToJson()}, msg: {msg.ToJson()}", $"HardCapUsd was exceeded"); await _investorRefundRepository.SaveAsync(msg.Email, InvestorRefundReason.HardCapUsdExceeded, msg.ToJson()); return false; } return true; }
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); } }