private async Task UpdatePairs()
        {
            var response =
                await _client.GetAsync(
                    $"https://api.blocklytics.org/uniswap/v1/exchanges?key={_blocklyticsApiKey}");

            var dtoString = await response.Content.ReadAsStringAsync();

            var blocklyticsPairs = JsonConvert.DeserializeObject <List <BlocklyticsUniswapPairsDTO> >(dtoString);

            _pairs = blocklyticsPairs
                     .Where(pair => pair.Price != null && pair.Price.ToString() != "0")
                     .Select(pair =>
            {
                var uniswapPair = new UniswapPair
                {
                    Timestamp      = pair.Timestamp.ToUnixTimeMilliseconds(),
                    Pair           = $"{pair.TokenSymbol}/ETH",
                    Price          = (1 / (double)pair.Price).ToString(DecimalFormatter),
                    EthLiquidity   = pair.EthLiquidity.ToString(DecimalFormatter),
                    TokenLiquidity = pair.TokenLiquidity.ToString(DecimalFormatter),
                    Volume24HrEth  = pair.EthVolume.ToString(DecimalFormatter)
                };

                if (pair.TokenSymbol.Equals("hex", StringComparison.CurrentCultureIgnoreCase))
                {
                    uniswapPair = UpdateHexUniswapPair(uniswapPair).Result;
                }

                return(uniswapPair);
            })
                     .Where(IsActive);
            _lastUpdated = DateTime.UtcNow;
        }
        public void Test1()
        {
            // Arrange
            var pair = new UniswapPair
            {
                EthLiquidity   = "49.82815291",
                TokenLiquidity = "48745.233764732"
            };
            var orderBook = _factory.CreateOrderBook(pair);

            // Act
            Console.WriteLine("EthLiquidity: 10ETH");
            Console.WriteLine("TokenLiquidity: 100TOKEN");

            Console.WriteLine("Asks:");
            orderBook.Asks.Reverse();
            orderBook.Asks.ForEach(ask => Console.WriteLine($"{ask.PriceEth}\t\t{ask.TokenAmount}TOKEN"));

            Console.WriteLine("Bids:");
            orderBook.Bids.ForEach(bid => Console.WriteLine($"{bid.PriceEth}\t\t{bid.EthAmount}ETH"));

            // Assert
        }
        // Temp fix for blocklytics liquidity pool flakiness
        private async Task <UniswapPair> UpdateHexUniswapPair(UniswapPair hexPair)
        {
            var heartBalanceResponse = await _hexContract.GetFunction("balanceOf").CallDecodingToDefaultAsync(HexUniswapAddress);

            var heartBalance = (BigInteger)heartBalanceResponse.First().Result;
            var hexBalance   = (decimal) new BigDecimal(heartBalance, 8 * -1);

            var ethBalanceResponse = await _web3.Eth.GetBalance.SendRequestAsync(HexUniswapAddress);

            var ethBalance = Web3.Convert.FromWei(ethBalanceResponse.Value);

            if (ethBalance.Equals(0) || hexBalance.Equals(0))
            {
                return(hexPair);
            }

            hexPair.Timestamp      = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
            hexPair.Price          = (ethBalance / hexBalance).ToString(DecimalFormatter);
            hexPair.EthLiquidity   = ethBalance.ToString(DecimalFormatter);
            hexPair.TokenLiquidity = hexBalance.ToString(DecimalFormatter);

            return(hexPair);
        }
 private static bool IsActive(UniswapPair pair) => pair.Price != "0" && pair.EthLiquidity != "0" &&
 pair.TokenLiquidity != "0" && pair.Volume24HrEth != "0";