public IActionResult GetAddressesBalances(string addresses, int minConfirmations)
        {
            try
            {
                string[] addressesArray = addresses.Split(',');

                this.logger.LogDebug($"Asking data for {addressesArray.Length} addresses.");

                var model = new AddressBalancesModel();
                foreach (string address in addressesArray)
                {
                    Money balance = this.addressIndexer.GetAddressBalance(address, minConfirmations);

                    if (balance == null)
                    {
                        balance = new Money(0);
                    }

                    model.Balances.Add(new AddressBalanceModel(address, balance));
                }

                this.logger.LogDebug("Sending {0} entries.", model.Balances.Count);

                return(this.Json(model));
            }
            catch (Exception e)
            {
                this.logger.LogError("Exception occurred: {0}", e.ToString());
                return(ErrorHelpers.BuildErrorResponse(HttpStatusCode.BadRequest, e.Message, e.ToString()));
            }
        }
        private async Task <bool> UpdateCollateralInfoAsync(CancellationToken cancellation = default(CancellationToken))
        {
            List <string> addressesToCheck;

            lock (this.locker)
            {
                addressesToCheck = this.depositsByAddress.Keys.ToList();
            }

            if (addressesToCheck.Count == 0)
            {
                this.logger.LogTrace("(-)[NOTHING_TO_CHECK]:true");
                return(true);
            }

            this.logger.LogDebug("Addresses to check {0}.", addressesToCheck.Count);

            AddressBalancesModel collateral = await this.blockStoreClient.GetAddressBalancesAsync(addressesToCheck, RequiredConfirmations, cancellation).ConfigureAwait(false);

            if (collateral == null)
            {
                this.logger.LogWarning("Failed to fetch address balances from counter chain node!");
                this.logger.LogTrace("(-)[FAILED]:false");
                return(false);
            }

            this.logger.LogDebug("Addresses received {0}.", collateral.Balances.Count);

            if (collateral.Balances.Count != addressesToCheck.Count)
            {
                this.logger.LogDebug("Expected {0} data entries but received {1}.", addressesToCheck.Count, collateral.Balances.Count);

                this.logger.LogTrace("(-)[INCONSISTENT_DATA]:false");
                return(false);
            }

            lock (this.locker)
            {
                foreach (AddressBalanceModel addressMoney in collateral.Balances)
                {
                    this.logger.LogDebug("Updating federated member {0} with amount {1}.", addressMoney.Address, addressMoney.Balance);
                    this.depositsByAddress[addressMoney.Address] = addressMoney.Balance;
                }
            }

            return(true);
        }
Exemple #3
0
        public async Task CanInitializeAndCheckCollateralAsync()
        {
            var blockStoreClientMock = new Mock <IBlockStoreClient>();

            var collateralData = new AddressBalancesModel()
            {
                Balances = new List <AddressBalanceModel>()
                {
                    new AddressBalanceModel(this.collateralFederationMembers[0].CollateralMainchainAddress, this.collateralFederationMembers[0].CollateralAmount),
                    new AddressBalanceModel(this.collateralFederationMembers[1].CollateralMainchainAddress, this.collateralFederationMembers[1].CollateralAmount + 10),
                    new AddressBalanceModel(this.collateralFederationMembers[2].CollateralMainchainAddress, this.collateralFederationMembers[2].CollateralAmount - 10)
                }
            };

            blockStoreClientMock.Setup(x => x.GetAddressBalancesAsync(It.IsAny <IEnumerable <string> >(), It.IsAny <int>(), It.IsAny <CancellationToken>())).ReturnsAsync(collateralData);

            this.collateralChecker.SetPrivateVariableValue("blockStoreClient", blockStoreClientMock.Object);

            await this.collateralChecker.InitializeAsync();

            Assert.True(this.collateralChecker.CheckCollateral(this.collateralFederationMembers[0]));
            Assert.True(this.collateralChecker.CheckCollateral(this.collateralFederationMembers[1]));
            Assert.False(this.collateralChecker.CheckCollateral(this.collateralFederationMembers[2]));

            // Now change what the client returns and make sure collateral check fails after update.
            AddressBalanceModel updated = collateralData.Balances.First(b => b.Address == this.collateralFederationMembers[0].CollateralMainchainAddress);

            updated.Balance = this.collateralFederationMembers[0].CollateralAmount - 1;

            // Wait CollateralUpdateIntervalSeconds + 1 seconds

            await Task.Delay(21_000);

            Assert.False(this.collateralChecker.CheckCollateral(this.collateralFederationMembers[0]));

            this.collateralChecker.Dispose();
        }