Esempio n. 1
0
        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;
        }
Esempio n. 2
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);
            }
        }