public static AssetCoinholdersViewModel Create(AssetViewModel asset,
                                                       IBalanceSummary balanceSummary,
                                                       int?atBlockHeight,
                                                       IDictionary <string, double> addressChanges,
                                                       IEnumerable <IBalanceBlock> blocksWithChanges,
                                                       IBlockHeader currentBlock,
                                                       IBlockHeader atBlockInfo)
        {
            var total            = balanceSummary.AddressSummaries.Sum(p => p.Balance);
            var addressSummaries = balanceSummary.AddressSummaries
                                   .Select(
                p =>
                BalanceAddressSummary.Create(p, total, asset.Divisibility,
                                             addressChanges.ContainsKey(p.Address) ? addressChanges[p.Address] : 0))
                                   .Where(p => p.Balance != 0 || p.ChangeAtBlock != 0)
                                   .OrderByDescending(p => p.Balance)
                                   .ToList();

            return(new AssetCoinholdersViewModel
            {
                Asset = asset,
                AddressSummaries = addressSummaries,
                Total = BitcoinUtils.CalculateColoredAssetQuantity(total, asset.Divisibility),
                Pagination = BlockPagination.Create(blocksWithChanges.Select(p => p.Height), atBlockHeight ?? currentBlock?.Height, currentBlock),
                CoinholdersCount = addressSummaries.Count,
                AtBlockDateTime = (atBlockInfo ?? currentBlock)?.Time.ToUniversalTime()
            });
        }
            public static BlockPagination Create(IEnumerable <int> changedAtHeights, int?atBlock, IBlockHeader currentBlock)
            {
                var ordered = changedAtHeights.OrderBy(p => p).ToList();
                var at      = atBlock ?? ordered.LastOrDefault();

                if (currentBlock != null)
                {
                    ordered.Add(currentBlock.Height);
                }


                var result = new BlockPagination
                {
                    ChangedAtHeights = ordered.Distinct().ToList(),
                    AtBlock          = at,
                    ShowCurrentBlock = atBlock != null
                };

                return(result);
            }