diff --git a/cli/src/main/java/bisq/cli/CliMain.java b/cli/src/main/java/bisq/cli/CliMain.java index e8a0cad7bcc..a9b6659b20f 100644 --- a/cli/src/main/java/bisq/cli/CliMain.java +++ b/cli/src/main/java/bisq/cli/CliMain.java @@ -67,6 +67,7 @@ import bisq.cli.opts.GetAvgBsqPriceOptionParser; import bisq.cli.opts.GetBTCMarketPriceOptionParser; import bisq.cli.opts.GetBalanceOptionParser; +import bisq.cli.opts.GetFundingAddressesOptionParser; import bisq.cli.opts.GetOffersOptionParser; import bisq.cli.opts.GetPaymentAcctFormOptionParser; import bisq.cli.opts.GetTradeOptionParser; @@ -249,11 +250,14 @@ public static void run(String[] args) { return; } case getfundingaddresses: { - if (new SimpleMethodOptionParser(args).parse().isForHelp()) { + var opts = new GetFundingAddressesOptionParser(args).parse(); + if (opts.isForHelp()) { out.println(client.getMethodHelp(method)); return; } - var fundingAddresses = client.getFundingAddresses(); + var onlyFunded = opts.getIsOnlyFunded(); + + var fundingAddresses = client.getFundingAddresses(onlyFunded); new TableBuilder(ADDRESS_BALANCE_TBL, fundingAddresses).build().print(out); return; } @@ -897,6 +901,7 @@ private static void printHelp(OptionParser parser, @SuppressWarnings("SameParame stream.format(rowFormat, getbtcprice.name(), "--currency-code=", "Get current market btc price"); stream.println(); stream.format(rowFormat, getfundingaddresses.name(), "", "Get BTC funding addresses"); + stream.format(rowFormat, "", "[--only-funded=]", ""); stream.println(); stream.format(rowFormat, getunusedbsqaddress.name(), "", "Get unused BSQ address"); stream.println(); diff --git a/cli/src/main/java/bisq/cli/GrpcClient.java b/cli/src/main/java/bisq/cli/GrpcClient.java index 14dbcd785ff..aed190d71d9 100644 --- a/cli/src/main/java/bisq/cli/GrpcClient.java +++ b/cli/src/main/java/bisq/cli/GrpcClient.java @@ -115,8 +115,8 @@ public double getBtcPrice(String currencyCode) { return walletsServiceRequest.getBtcPrice(currencyCode); } - public List getFundingAddresses() { - return walletsServiceRequest.getFundingAddresses(); + public List getFundingAddresses(boolean onlyFunded) { + return walletsServiceRequest.getFundingAddresses(onlyFunded); } public String getUnusedBsqAddress() { diff --git a/cli/src/main/java/bisq/cli/opts/GetFundingAddressesOptionParser.java b/cli/src/main/java/bisq/cli/opts/GetFundingAddressesOptionParser.java new file mode 100644 index 00000000000..17796f7631d --- /dev/null +++ b/cli/src/main/java/bisq/cli/opts/GetFundingAddressesOptionParser.java @@ -0,0 +1,26 @@ +package bisq.cli.opts; + +import joptsimple.OptionSpec; + +import static bisq.cli.opts.OptLabel.OPT_ONLY_FUNDED; + +public class GetFundingAddressesOptionParser extends AbstractMethodOptionParser implements MethodOpts { + final OptionSpec onlyFundedOpt = parser.accepts(OPT_ONLY_FUNDED, "only funded addresses") + .withOptionalArg() + .ofType(boolean.class) + .defaultsTo(Boolean.FALSE); + + public GetFundingAddressesOptionParser(String[] args) { + super(args); + } + + public GetFundingAddressesOptionParser parse() { + super.parse(); + + return this; + } + + public boolean getIsOnlyFunded() { + return options.valueOf(onlyFundedOpt); + } +} diff --git a/cli/src/main/java/bisq/cli/opts/OptLabel.java b/cli/src/main/java/bisq/cli/opts/OptLabel.java index a30294dd5dd..f37651491aa 100644 --- a/cli/src/main/java/bisq/cli/opts/OptLabel.java +++ b/cli/src/main/java/bisq/cli/opts/OptLabel.java @@ -38,6 +38,7 @@ public class OptLabel { public final static String OPT_MKT_PRICE_MARGIN = "market-price-margin"; public final static String OPT_MIN_AMOUNT = "min-amount"; public final static String OPT_OFFER_ID = "offer-id"; + public final static String OPT_ONLY_FUNDED = "only-funded"; public final static String OPT_PASSWORD = "password"; public final static String OPT_PAYMENT_ACCOUNT_ID = "payment-account-id"; public final static String OPT_PAYMENT_ACCOUNT_FORM = "payment-account-form"; diff --git a/cli/src/main/java/bisq/cli/request/WalletsServiceRequest.java b/cli/src/main/java/bisq/cli/request/WalletsServiceRequest.java index c880e1148d0..87d1a7ab294 100644 --- a/cli/src/main/java/bisq/cli/request/WalletsServiceRequest.java +++ b/cli/src/main/java/bisq/cli/request/WalletsServiceRequest.java @@ -99,9 +99,12 @@ public double getBtcPrice(String currencyCode) { return grpcStubs.priceService.getMarketPrice(request).getPrice(); } - public List getFundingAddresses() { - var request = GetFundingAddressesRequest.newBuilder().build(); - return grpcStubs.walletsService.getFundingAddresses(request).getAddressBalanceInfoList(); + public List getFundingAddresses(boolean onlyFunded) { + var request = GetFundingAddressesRequest.newBuilder() + .setOnlyFunded(onlyFunded) + .build(); + return grpcStubs.walletsService.getFundingAddresses(request) + .getAddressBalanceInfoList(); } public String getUnusedBsqAddress() { diff --git a/cli/src/test/java/bisq/cli/table/AddressCliOutputDiffTest.java b/cli/src/test/java/bisq/cli/table/AddressCliOutputDiffTest.java index be5fd9de87e..cf2b2c2a68c 100644 --- a/cli/src/test/java/bisq/cli/table/AddressCliOutputDiffTest.java +++ b/cli/src/test/java/bisq/cli/table/AddressCliOutputDiffTest.java @@ -27,7 +27,7 @@ public AddressCliOutputDiffTest() { } private void getFundingAddresses() { - var fundingAddresses = aliceClient.getFundingAddresses(); + var fundingAddresses = aliceClient.getFundingAddresses(false); if (fundingAddresses.size() > 0) { // TableFormat class had been deprecated, then deleted on 17-Feb-2022, but // these diff tests can be useful for testing changes to the current tbl formatting api. @@ -42,7 +42,7 @@ private void getFundingAddresses() { } private void getAddressBalance() { - List addresses = aliceClient.getFundingAddresses(); + List addresses = aliceClient.getFundingAddresses(false); int numAddresses = addresses.size(); // Check output for last 2 addresses. for (int i = numAddresses - 2; i < addresses.size(); i++) { diff --git a/core/src/main/java/bisq/core/api/CoreApi.java b/core/src/main/java/bisq/core/api/CoreApi.java index 8557cb22a80..3e985fc09bf 100644 --- a/core/src/main/java/bisq/core/api/CoreApi.java +++ b/core/src/main/java/bisq/core/api/CoreApi.java @@ -392,8 +392,8 @@ public AddressBalanceInfo getAddressBalanceInfo(String addressString) { return walletsService.getAddressBalanceInfo(addressString); } - public List getFundingAddresses() { - return walletsService.getFundingAddresses(); + public List getFundingAddresses(boolean onlyFunded) { + return walletsService.getFundingAddresses(onlyFunded); } public String getUnusedBsqAddress() { diff --git a/core/src/main/java/bisq/core/api/CoreWalletsService.java b/core/src/main/java/bisq/core/api/CoreWalletsService.java index 02446b5d708..2794cef6e9c 100644 --- a/core/src/main/java/bisq/core/api/CoreWalletsService.java +++ b/core/src/main/java/bisq/core/api/CoreWalletsService.java @@ -78,6 +78,7 @@ import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; +import java.util.stream.Stream; import lombok.extern.slf4j.Slf4j; @@ -201,7 +202,7 @@ AddressBalanceInfo getAddressBalanceInfo(String addressString) { btcWalletService.isAddressUnused(address)); } - List getFundingAddresses() { + List getFundingAddresses(boolean onlyFunded) { verifyWalletsAreAvailable(); verifyEncryptedWalletIsUnlocked(); @@ -231,7 +232,12 @@ List getFundingAddresses() { addressStrings.add(newZeroBalanceAddress.getAddressString()); } - return addressStrings.stream().map(address -> + Stream resultStream = addressStrings.stream(); + if (onlyFunded) { + resultStream = resultStream.filter(address -> balances.getUnchecked(address) > 0); + } + + return resultStream.map(address -> new AddressBalanceInfo(address, balances.getUnchecked(address), getNumConfirmationsForMostRecentTransaction(address), diff --git a/core/src/main/resources/help/getfundingaddresses-help.txt b/core/src/main/resources/help/getfundingaddresses-help.txt index 0d3e7ea6292..b1e40bc20a7 100644 --- a/core/src/main/resources/help/getfundingaddresses-help.txt +++ b/core/src/main/resources/help/getfundingaddresses-help.txt @@ -7,11 +7,18 @@ getfundingaddresses - list BTC receiving address SYNOPSIS -------- getfundingaddresses + [--only-funded=] DESCRIPTION ----------- Returns a list of receiving BTC addresses. +OPTIONS +------- +--only-funded + If true, only addresses with a positive balance will be included. + Useful for filtering out empty addresses. + EXAMPLES -------- $ ./bisq-cli --password=xyz --port=9998 getfundingaddresses diff --git a/daemon/src/main/java/bisq/daemon/grpc/GrpcWalletsService.java b/daemon/src/main/java/bisq/daemon/grpc/GrpcWalletsService.java index 0b31b2ecdd0..88646f6c7c8 100644 --- a/daemon/src/main/java/bisq/daemon/grpc/GrpcWalletsService.java +++ b/daemon/src/main/java/bisq/daemon/grpc/GrpcWalletsService.java @@ -161,7 +161,8 @@ public void getAddressBalance(GetAddressBalanceRequest req, public void getFundingAddresses(GetFundingAddressesRequest req, StreamObserver responseObserver) { try { - List balanceInfo = coreApi.getFundingAddresses(); + boolean onlyFunded = req.getOnlyFunded(); + List balanceInfo = coreApi.getFundingAddresses(onlyFunded); var reply = GetFundingAddressesReply.newBuilder() .addAllAddressBalanceInfo( balanceInfo.stream() diff --git a/proto/src/main/proto/grpc.proto b/proto/src/main/proto/grpc.proto index 51692d055e4..0e58a87818f 100644 --- a/proto/src/main/proto/grpc.proto +++ b/proto/src/main/proto/grpc.proto @@ -927,6 +927,7 @@ message GetTransactionReply { } message GetFundingAddressesRequest { + optional bool only_funded = 1; // Return only addresses with positive balance. } message GetFundingAddressesReply {