public async Task InitializeAsync(CancellationToken cancel)
        {
            if (!IndexDownloader.IsRunning)
            {
                throw new NotSupportedException($"{nameof(IndexDownloader)} is not running.");
            }

            using (HandleFiltersLock.Lock())
                using (WalletBlocksLock.Lock())
                {
                    // Go through the filters and que to download the matches.
                    var filters = IndexDownloader.GetFiltersIncluding(IndexDownloader.StartingFilter.BlockHeight);

                    foreach (var filterModel in filters.Where(x => x.Filter != null && !WalletBlocks.ContainsValue(x.BlockHash)))             // Filter can be null if there is no bech32 tx.
                    {
                        await ProcessFilterModelAsync(filterModel, cancel);
                    }
                }
        }
        public WalletService(KeyManager keyManager, IndexDownloader indexDownloader, CcjClient chaumianClient, MemPoolService memPool, NodesGroup nodes, string blocksFolderPath)
        {
            KeyManager      = Guard.NotNull(nameof(keyManager), keyManager);
            Nodes           = Guard.NotNull(nameof(nodes), nodes);
            IndexDownloader = Guard.NotNull(nameof(indexDownloader), indexDownloader);
            ChaumianClient  = Guard.NotNull(nameof(chaumianClient), chaumianClient);
            MemPool         = Guard.NotNull(nameof(memPool), memPool);

            WalletBlocks      = new SortedDictionary <Height, uint256>();
            ProcessedBlocks   = new HashSet <uint256>();
            WalletBlocksLock  = new AsyncLock();
            HandleFiltersLock = new AsyncLock();

            Coins = new ConcurrentHashSet <SmartCoin>();

            BlocksFolderPath  = Guard.NotNullOrEmptyOrWhitespace(nameof(blocksFolderPath), blocksFolderPath, trim: true);
            BlockFolderLock   = new AsyncLock();
            BlockDownloadLock = new AsyncLock();

            AssertCleanKeysIndexed(21);

            _running = 0;

            if (Directory.Exists(BlocksFolderPath))
            {
                if (IndexDownloader.Network == Network.RegTest)
                {
                    Directory.Delete(BlocksFolderPath, true);
                    Directory.CreateDirectory(BlocksFolderPath);
                }
            }
            else
            {
                Directory.CreateDirectory(BlocksFolderPath);
            }

            IndexDownloader.NewFilter   += IndexDownloader_NewFilterAsync;
            IndexDownloader.Reorged     += IndexDownloader_ReorgedAsync;
            MemPool.TransactionReceived += MemPool_TransactionReceived;
        }
 public static FilterModel GetStartingFilter(Network network) => IndexDownloader.GetStartingFilter(network);