private async Task SyncPerformanceAsync( IGraphClient graphClient, IFundPerformanceRepository repository, IStakeSettings stake, DateTimeOffset startDate, DateTimeOffset endDate, CancellationToken cancellationToken) { var start = new DateTimeOffset(startDate.Date, TimeSpan.Zero); while (!cancellationToken.IsCancellationRequested) { if (start >= DateTimeOffset.UtcNow) { break; } var end = start.AddDays(MaxDays).Round(); Console.WriteLine($"[{stake.ContractAddress}] Processing Batch: {start} -> {end}"); var uniswapPrices = await graphClient .ListUniswapTokenPerformanceAsync(stake.ContractAddress, start, end) .ToListAsync(cancellationToken); foreach (var priceData in uniswapPrices) { var perf = new DataFundPerformance() { Address = stake.ContractAddress, Date = priceData.Date, Nav = priceData.Price, Price = priceData.Price, MarketCap = priceData.MarketCap, Volume = priceData.Volume }; await repository.UploadItemsAsync(perf); } Console.WriteLine($"[{stake.ContractAddress}] Finished Batch: {start} -> {end}"); if (end >= endDate) { break; } else { start = end; } } }
private async Task SyncPerformanceAsync( ICoinGeckoClient coinGeckoClient, IInvictusClient invictusClient, IFundPerformanceRepository repository, IFundSettings fund, DateTimeOffset startDate, DateTimeOffset endDate, CancellationToken cancellationToken) { var start = new DateTimeOffset(startDate.Date, TimeSpan.Zero); while (!cancellationToken.IsCancellationRequested) { if (start >= DateTimeOffset.UtcNow) { break; } var end = start.AddDays(MaxDays).Round(); Console.WriteLine($"[{fund.ContractAddress}] Processing Batch: {start} -> {end}"); var invictusNavs = await invictusClient .ListPerformanceAsync(fund.Symbol, start, end) .ToListAsync(cancellationToken); if (invictusNavs.Any()) { var marketPrices = fund.Tradable ? await coinGeckoClient .ListCoinPerformanceAsync(fund.CoinGeckoId, start.AddDays(-1), end.AddDays(1)) .ToListAsync(cancellationToken) : new List <CoinGeckoCoinPerformance>(); foreach (var nav in invictusNavs) { var closestPrice = marketPrices .OrderBy(i => Math.Abs(i.Date.ToUnixTimeSeconds() - new DateTimeOffset(nav.Date, TimeSpan.Zero).ToUnixTimeSeconds())) .FirstOrDefault(); var perf = new DataFundPerformance() { Address = fund.ContractAddress, Date = nav.Date, Nav = nav.NetAssetValuePerToken, Price = closestPrice?.Price ?? -1, MarketCap = closestPrice?.MarketCap ?? -1, Volume = closestPrice?.Volume ?? -1 }; await repository.UploadItemsAsync(perf); } } Console.WriteLine($"[{fund.ContractAddress}] Finished Batch: {start} -> {end}"); if (end >= endDate) { break; } else { start = end; } } }