/// <inheritdoc />
        public VerboseAddressBalancesResult GetAddressIndexerState(string[] addresses)
        {
            var result = new VerboseAddressBalancesResult(this.consensusManager.Tip.Height);

            if (addresses.Length == 0)
            {
                return(result);
            }

            (bool isQueryable, string reason) = this.IsQueryable();

            if (!isQueryable)
            {
                return(VerboseAddressBalancesResult.RequestFailed(reason));
            }

            lock (this.lockObject)
            {
                foreach (var address in addresses)
                {
                    AddressIndexerData indexData = this.addressIndexRepository.GetOrCreateAddress(address);

                    var copy = new AddressIndexerData()
                    {
                        Address        = indexData.Address,
                        BalanceChanges = new List <AddressBalanceChange>(indexData.BalanceChanges)
                    };

                    result.BalancesData.Add(copy);
                }
            }

            return(result);
        }
        /// <inheritdoc />
        public VerboseAddressBalancesResult GetAddressIndexerState(string[] addresses)
        {
            // If the containing feature is not initialized then wait a bit.
            this.InitializingFeature?.WaitInitialized();

            var result = new VerboseAddressBalancesResult(this.consensusManager.Tip.Height);

            if (addresses.Length == 0)
            {
                return(result);
            }

            if (!this.storeSettings.AddressIndex)
            {
                throw new NotSupportedException("Address indexing is not enabled.");
            }

            (bool isQueryable, string reason) = this.IsQueryable();

            if (!isQueryable)
            {
                return(VerboseAddressBalancesResult.RequestFailed(reason));
            }

            lock (this.lockObject)
            {
                foreach (var address in addresses)
                {
                    AddressIndexerData indexData = this.addressIndexRepository.GetOrCreateAddress(address);

                    var copy = new AddressIndexerData()
                    {
                        Address        = indexData.Address,
                        BalanceChanges = new List <AddressBalanceChange>(indexData.BalanceChanges)
                    };

                    result.BalancesData.Add(copy);
                }
            }

            return(result);
        }