async Task DumpAllCoinsAndStats()
        {
            List <Coin> allCoinList = exchangeMonitor.allCoins.ToList();

            List <string[]> results = new List <string[]>();
            AboutCoin       headers = new AboutCoin();

            headers.PopulateWithColumnNames();
            results.Add(headers.ToArray());

            for (int i = 0; i < allCoinList.Count; i++)
            {
                Coin coin = allCoinList[i];
                if (coin.coinMarketCapData == null ||
                    coin.coinMarketCapData.marketCapUsd == null ||
                    coin.coinMarketCapData.marketCapUsd.Value < minCap)
                {
                    continue;
                }

                AboutCoin about = DescribeCoin(coin.fullName);
                if (about != null)
                {
                    results.Add(about.ToArray());
                }
            }

            for (int i = 0; i < 100; i++)
            { // Clear some old coins
                results.Add(new AboutCoin().ToArray());
            }

            await sheet.Write(dataDumpTab, "A1", results);
        }
        AboutCoin DescribeCoin(
            object coinName)
        {
            AboutCoin about = new AboutCoin();

            Coin coin = Coin.FromName((string)coinName);

            if (coin == null)
            {
                return(about);
            }

            if (coin.hasValidTradingPairs == false) //&& coin.coinMarketCapData == null)
            {
                return(null);
            }

            about.columns[(int)Column.CoinName] = coin.fullName;

            TradingPair bestBtcBid = coin.FindBestOffer(Coin.bitcoin, OrderType.Sell);

            if (bestBtcBid != null)
            {
                about.columns[(int)Column.BestBidBTC] = bestBtcBid.bidPriceOrOfferYouCanSell.ToString();
                about.columns[(int)Column.BestBidBTCExchange]
                    = bestBtcBid.exchange.exchangeName.ToString();
            }
            TradingPair bestBtcAsk = coin.FindBestOffer(Coin.bitcoin, OrderType.Buy);

            if (bestBtcAsk != null)
            {
                about.columns[(int)Column.BestAskBTC]         = bestBtcAsk.askPriceOrOfferYouCanBuy.ToString();
                about.columns[(int)Column.BestAskBTCExchange] = bestBtcAsk.exchange.exchangeName.ToString();
            }

            if (coin.coinMarketCapData != null)
            {
                about.columns[(int)Column.MarketCapUSD] = coin.coinMarketCapData.marketCapUsd?.ToString() ?? "?";
            }

            return(about);
        }