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); }
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(); }