Exemple #1
0
 public ReferralHotelsService(
     IStakeService stakeService,
     ICustomerProfileClient customerProfileClient,
     ICurrencyConvertorClient currencyConverterClient,
     ICampaignClient campaignClient,
     IPartnerManagementClient partnerManagementClient,
     IRabbitPublisher <HotelReferralUsedEvent> rabbitPublisher,
     INotificationPublisherService notificationPublisherService,
     IReferralHotelsRepository referralHotelsRepository,
     ISettingsService settingsService,
     IHashingManager hashingManager,
     TimeSpan referralExpirationPeriod,
     TimeSpan referralLimitPeriod,
     int referralLimit,
     IMapper mapper,
     string globalBaseCurrencyCode,
     ILogFactory logFactory)
 {
     _stakeService                 = stakeService;
     _customerProfileClient        = customerProfileClient;
     _currencyConverterClient      = currencyConverterClient;
     _campaignClient               = campaignClient;
     _partnerManagementClient      = partnerManagementClient;
     _rabbitPublisher              = rabbitPublisher;
     _notificationPublisherService = notificationPublisherService;
     _referralHotelsRepository     = referralHotelsRepository;
     _settingsService              = settingsService;
     _hashingManager               = hashingManager;
     _referralExpirationPeriod     = referralExpirationPeriod;
     _referralLimitPeriod          = referralLimitPeriod;
     _referralLimit                = referralLimit;
     _mapper = mapper;
     _globalBaseCurrencyCode = globalBaseCurrencyCode;
     _log = logFactory.CreateLog(this);
 }
Exemple #2
0
 public ReferralLeadService(
     IStakeService stakeService,
     IMAVNPropertyIntegrationClient propertyIntegrationClient,
     IRabbitPublisher <PropertyLeadApprovedReferralEvent> propertyLeadApprovedReferralPublisher,
     IReferralLeadRepository referralLeadRepository,
     INotificationPublisherService notificationPublisherService,
     ISettingsService settingsService,
     IHashingManager hashingManager,
     IAgentManagementClient agentManagementClient,
     ICustomerProfileClient customerProfileClient,
     IDictionariesClient dictionariesClient,
     IPropertyPurchaseRepository propertyPurchaseRepository,
     IRabbitPublisher <LeadStateChangedEvent> leadStateChangedPublisher,
     IMapper mapper,
     ILogFactory logFactory)
 {
     _stakeService = stakeService;
     _propertyIntegrationClient             = propertyIntegrationClient;
     _propertyLeadApprovedReferralPublisher = propertyLeadApprovedReferralPublisher;
     _referralLeadRepository       = referralLeadRepository;
     _notificationPublisherService = notificationPublisherService;
     _settingsService            = settingsService;
     _hashingManager             = hashingManager;
     _agentManagementClient      = agentManagementClient;
     _customerProfileClient      = customerProfileClient;
     _dictionariesClient         = dictionariesClient;
     _propertyPurchaseRepository = propertyPurchaseRepository;
     _leadStateChangedPublisher  = leadStateChangedPublisher
                                   ?? throw new ArgumentNullException(nameof(propertyLeadApprovedReferralPublisher));
     _mapper = mapper;
     _log    = logFactory.CreateLog(this);
 }
Exemple #3
0
 public StakeController(
     IOptions <AppSettings> appSettings,
     IStakeService stakeService,
     IScopedCancellationToken scopedCancellationToken)
     : base(appSettings)
 {
     this.stakeService            = stakeService;
     this.scopedCancellationToken = scopedCancellationToken;
 }
 public PropertyPurchaseService(
     IReferralLeadRepository referralLeadRepository,
     IPropertyPurchaseRepository propertyPurchaseRepository,
     IStakeService stakeService,
     CommissionManager commissionManager)
 {
     _referralLeadRepository     = referralLeadRepository;
     _propertyPurchaseRepository = propertyPurchaseRepository;
     _stakeService      = stakeService;
     _commissionManager = commissionManager;
 }
Exemple #5
0
 public AddressController(
     IOptions <AppSettings> appSettings,
     IFundService fundService,
     IStakeService stakeService,
     IInvestmentService investmentService,
     IScopedCancellationToken scopedCancellationToken)
     : base(appSettings)
 {
     this.fundService             = fundService;
     this.stakeService            = stakeService;
     this.investmentService       = investmentService;
     this.scopedCancellationToken = scopedCancellationToken;
 }
Exemple #6
0
 public InvestmentService(
     IOptions <AppSettings> appSettings,
     IFundService fundService,
     IStakeService stakeService,
     IQuantityProviderFactory quantityProviderFactory,
     ICurrencyConverter currencyConverter,
     ITransactionRepository transactionRepository,
     IOperationRepository operationRepository,
     IHttpContextAccessor httpContextAccessor,
     IScopedCancellationToken scopedCancellationToken)
     : base(appSettings, currencyConverter, transactionRepository, operationRepository, httpContextAccessor, scopedCancellationToken)
 {
     this.fundService             = fundService;
     this.stakeService            = stakeService;
     this.quantityProviderFactory = quantityProviderFactory;
 }
Exemple #7
0
        private async Task SyncStakingPowerAsync(
            IFundService fundService,
            IStakeService stakeService,
            IStakingPowerRepository stakingRepository,
            IStakeSettings stake,
            DateTimeOffset startDate,
            DateTimeOffset endDate,
            CancellationToken cancellationToken)
        {
            var currentDate      = GetHourlyDate(startDate.UtcDateTime).UtcDateTime;
            var lastStakingPower = await stakingRepository.GetStakingPowerAsync(stake.ContractAddress, currentDate.AddHours(-1));

            var stakingEvents = await stakeService.ListStakeEventsAsync(stake.Symbol, startDate.UtcDateTime, endDate.UtcDateTime)
                                .ToListAsync(cancellationToken);

            var hourlyGroups = stakingEvents
                               .OrderBy(x => x.ConfirmedAt)
                               .GroupBy(x => GetHourlyDate(x.ConfirmedAt))
                               .ToList();

            do
            {
                try
                {
                    var fundPowers   = new List <DataStakingPowerFund>();
                    var hourlyEvents = hourlyGroups.SingleOrDefault(g => g.Key == currentDate)
                                       ?? Enumerable.Empty <IStakeEvent>();

                    foreach (var symbol in stake.FundMultipliers.Keys)
                    {
                        var fund = AppSettings.Funds
                                   .Cast <IFundSettings>()
                                   .Single(x => x.Symbol == symbol);

                        var events = lastStakingPower?.Breakdown.SingleOrDefault(x =>
                                                                                 x.ContractAddress.Equals(fund.ContractAddress.Address, StringComparison.OrdinalIgnoreCase))
                                     ?.Events.ToList()
                                     ?? new List <DataStakingEvent>();

                        events.AddRange(hourlyEvents
                                        .Where(e =>
                                               e.ContractAddress == fund.ContractAddress &&
                                               e.Type == StakeEventType.Lockup)
                                        .Select(e => new DataStakingEvent()
                        {
                            UserAddress  = e.UserAddress,
                            StakedAt     = e.ConfirmedAt,
                            Quantity     = e.Change,
                            ExpiresAt    = e.Lock.ExpiresAt,
                            TimeModifier = stake.TimeMultipliers
                                           .SingleOrDefault(tm =>
                                                            tm.RangeMin <= e.Lock.Duration.Days &&
                                                            tm.RangeMax >= e.Lock.Duration.Days)
                                           ?.Multiplier ?? 1
                        }));

                        foreach (var releaseEvent in hourlyEvents
                                 .Where(e =>
                                        e.ContractAddress == fund.ContractAddress &&
                                        e.Type != StakeEventType.Lockup))
                        {
                            var approximateQuantity = releaseEvent.Release.Quantity + (releaseEvent.Release.FeeQuantity ?? decimal.Zero);
                            var userStakes          = events
                                                      .Where(e => e.UserAddress.Equals(releaseEvent.UserAddress.Address, StringComparison.OrdinalIgnoreCase))
                                                      .ToList();

                            var lockUp = userStakes.Count > 0
                                ? userStakes.Count == 1
                                    ? userStakes.Single()
                                    : userStakes
                                         .OrderBy(x => x.StakedAt)
                                         .FirstOrDefault(e => Math.Abs(e.Quantity - approximateQuantity) <= Precision)
                                : null;

                            if (lockUp != null)
                            {
                                events.Remove(lockUp);
                            }
                        }

                        if (events.Any())
                        {
                            var prices = await fundService.ListPerformanceAsync(
                                symbol,
                                PriceMode.Raw,
                                currentDate.Date.AddDays(-1),
                                currentDate.Date.AddDays(2),
                                CurrencyCode.USD)
                                         .ToListAsync(cancellationToken);

                            var closestPrice = prices
                                               .OrderBy(i => Math.Abs(
                                                            new DateTimeOffset(i.Date, TimeSpan.Zero).ToUnixTimeSeconds() -
                                                            new DateTimeOffset(currentDate, TimeSpan.Zero).ToUnixTimeSeconds()))
                                               .FirstOrDefault()
                                               ?? throw new PermanentException($"No Price data could be found for date {currentDate}");

                            fundPowers.Add(new DataStakingPowerFund()
                            {
                                ContractAddress = fund.ContractAddress,
                                FundModifier    = stake.FundMultipliers[symbol],
                                PricePerToken   = closestPrice.NetAssetValuePerToken,
                                Events          = events
                            });
                        }
                    }

                    lastStakingPower = new DataStakingPower()
                    {
                        Address   = stake.ContractAddress,
                        Date      = currentDate.AddHours(1),
                        Power     = fundPowers.Sum(fp => fp.PricePerToken * fp.Events.Sum(fpe => fpe.Quantity * fpe.TimeModifier * fp.FundModifier)),
                        Breakdown = fundPowers,
                        Summary   = fundPowers
                                    .Select(fp => new DataStakingPowerSummary()
                        {
                            ContractAddress = fp.ContractAddress,
                            Power           = fp.PricePerToken * fp.Events.Sum(fpe => fpe.Quantity * fpe.TimeModifier * fp.FundModifier)
                        })
                                    .ToList()
                    };

                    await stakingRepository.UploadItemsAsync(lastStakingPower);
                }
                finally
                {
                    currentDate = currentDate.AddHours(1);
                }
            }while (!cancellationToken.IsCancellationRequested && currentDate < endDate.Round());
        }