diff --git a/core/src/main/java/bisq/core/grpc/CoreWalletsService.java b/core/src/main/java/bisq/core/grpc/CoreWalletsService.java index 26a64e50696..93110315ceb 100644 --- a/core/src/main/java/bisq/core/grpc/CoreWalletsService.java +++ b/core/src/main/java/bisq/core/grpc/CoreWalletsService.java @@ -5,14 +5,16 @@ import bisq.core.btc.wallet.BtcWalletService; import bisq.core.btc.wallet.WalletsManager; -import bisq.common.util.Tuple3; - import org.bitcoinj.core.Address; import org.bitcoinj.core.TransactionConfidence; import org.bitcoinj.crypto.KeyCrypterScrypt; import javax.inject.Inject; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; + import org.spongycastle.crypto.params.KeyParameter; import java.text.DecimalFormat; @@ -30,10 +32,6 @@ import javax.annotation.Nullable; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.LoadingCache; - import static java.lang.String.format; import static java.util.concurrent.TimeUnit.SECONDS; @@ -56,6 +54,7 @@ class CoreWalletsService { private final Function formatSatoshis = (sats) -> btcFormat.format(BigDecimal.valueOf(sats).divide(satoshiDivisor)); + @Inject public CoreWalletsService(Balances balances, WalletsManager walletsManager, @@ -92,19 +91,6 @@ public String getAddressBalanceInfo(String addressString) { + ((numConfirmations > 0) ? (" confirmations: " + format("%6d", numConfirmations)) : ""); } - /** - * Memoization stores the results of expensive function calls and returns - * the cached result when the same input occurs again. - * - * Resulting LoadingCache is used by calling `.get(input I)` or - * `.getUnchecked(input I)`, depending on whether or not `f` can return null. - * That's because CacheLoader throws an exception on null output from `f`. - */ - private static LoadingCache memoize(Function f) { - // f::apply is used, because Guava 20.0 Function doesn't yet extend - // Java Function. - return CacheBuilder.newBuilder().build(CacheLoader.from(f::apply)); - } public String getFundingAddresses() { if (!walletsManager.areWalletsAvailable()) @@ -117,11 +103,11 @@ public String getFundingAddresses() { btcWalletService.getFreshAddressEntry(); List addressStrings = - btcWalletService - .getAvailableAddressEntries() - .stream() - .map(addressEntry -> addressEntry.getAddressString()) - .collect(Collectors.toList()); + btcWalletService + .getAvailableAddressEntries() + .stream() + .map(AddressEntry::getAddressString) + .collect(Collectors.toList()); // getAddressBalance is memoized, because we'll map it over addresses twice. // To get the balances, we'll be using .getUnchecked, because we know that @@ -129,30 +115,25 @@ public String getFundingAddresses() { var balances = memoize(this::getAddressBalance); boolean noAddressHasZeroBalance = - addressStrings.stream() - .allMatch(addressString -> balances.getUnchecked(addressString) != 0); + addressStrings.stream() + .allMatch(addressString -> balances.getUnchecked(addressString) != 0); if (noAddressHasZeroBalance) { var newZeroBalanceAddress = btcWalletService.getFreshAddressEntry(); addressStrings.add(newZeroBalanceAddress.getAddressString()); } - String fundingAddressTable = - addressStrings.stream() - .map(addressString -> { - var balance = balances.getUnchecked(addressString); - var stringFormattedBalance = formatSatoshis.apply(balance); - var numConfirmations = - getNumConfirmationsForMostRecentTransaction(addressString); - String addressInfo = - "" + addressString - + " balance: " + format("%13s", stringFormattedBalance) - + ((balance > 0) ? (" confirmations: " + format("%6d", numConfirmations)) : ""); - return addressInfo; - }) - .collect(Collectors.joining("\n")); - - return fundingAddressTable; + return addressStrings.stream() + .map(addressString -> { + var balance = balances.getUnchecked(addressString); + var stringFormattedBalance = formatSatoshis.apply(balance); + var numConfirmations = + getNumConfirmationsForMostRecentTransaction(addressString); + return "" + addressString + + " balance: " + format("%13s", stringFormattedBalance) + + ((balance > 0) ? (" confirmations: " + format("%6d", numConfirmations)) : ""); + }) + .collect(Collectors.joining("\n")); } public int getNumConfirmationsForMostRecentTransaction(String addressString) { @@ -285,4 +266,18 @@ private AddressEntry getAddressEntry(String addressString) { return addressEntry.get(); } + + /** + * Memoization stores the results of expensive function calls and returns + * the cached result when the same input occurs again. + * + * Resulting LoadingCache is used by calling `.get(input I)` or + * `.getUnchecked(input I)`, depending on whether or not `f` can return null. + * That's because CacheLoader throws an exception on null output from `f`. + */ + private static LoadingCache memoize(Function f) { + // f::apply is used, because Guava 20.0 Function doesn't yet extend + // Java Function. + return CacheBuilder.newBuilder().build(CacheLoader.from(f::apply)); + } }