public async Task <IEnumerable <IExchangeEntity> > GetExchangesAsync(StatsOrderBy orderBy, decimal minEthLiquidityAmount = 0)
        {
            var exchanges = (await _exchangeRepository.GetAsync(minEthLiquidityAmount)).ToList();

            switch (orderBy)
            {
            case StatsOrderBy.Liquidity:
                return(exchanges);

            case StatsOrderBy.Volume:
                var events     = (await _exchangeEventsRepository.GetForLastDayAsync()).ToList();
                var ethVolumes = new Dictionary <string, decimal>();
                foreach (var exchange in exchanges)
                {
                    ethVolumes[exchange.Id] = 0;
                }

                foreach (var groupedAndOrderedEvent in events.OrderBy(e => e.BlockNumber).ThenBy(e => e.LogIndex)
                         .GroupBy(e => e.ExchangeAddress))
                {
                    ethVolumes[groupedAndOrderedEvent.Key] = groupedAndOrderedEvent.Sum(e => e.EthAmount);
                }

                exchanges.Sort((x, y) => - ethVolumes[x.Id].CompareTo(ethVolumes[y.Id]));
                return(exchanges);

            default:
                throw new ArgumentOutOfRangeException(nameof(orderBy), orderBy, null);
            }
        }
Esempio n. 2
0
        public async Task <IActionResult> GetAllDirectoriesAsync(
            [FromQuery] decimal minEthLiquidity = 0,
            [FromQuery] StatsOrderBy orderBy    = StatsOrderBy.Liquidity
            )
        {
            var directories = await _statsService.GetExchangesAsync(orderBy, minEthLiquidity);

            return(Ok(_mapper.Map <List <IExchangeEntity>, DirectoriesDto>(directories.ToList())));
        }
Esempio n. 3
0
        public async Task <IActionResult> GetStats([FromQuery] StatsOrderBy orderBy = StatsOrderBy.Liquidity)
        {
            var exchanges = await _statsService.GetExchangesAsync(orderBy);

            return(Ok(_mapper.Map <List <IExchangeEntity>, StatsExchangesDto>(exchanges.ToList())));
        }