Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
7ad192c
Create CreateXmrTxOptionParser.java
XMRZombie Jul 23, 2025
26412f6
Create GetMarketPriceOptionParser.java
XMRZombie Jul 23, 2025
dfb179a
Create RelayXmrTxOptionParser.java
XMRZombie Jul 23, 2025
ab553d1
Create SendXmrOptionParser.java
XMRZombie Jul 23, 2025
e50a033
Delete cli/src/main/java/haveno/cli/opts/SendBtcOptionParser.java
XMRZombie Jul 23, 2025
6b1642c
Update WalletsServiceRequest.java
XMRZombie Jul 23, 2025
a04d86e
Update AbstractTradeListBuilder.java
XMRZombie Jul 23, 2025
7878b16
Update AddressBalanceTableBuilder.java
XMRZombie Jul 23, 2025
8846fcb
Update ClosedTradeTableBuilder.java
XMRZombie Jul 23, 2025
08da223
Update OfferTableBuilder.java
XMRZombie Jul 23, 2025
f9d95e2
Update TableBuilder.java
XMRZombie Jul 23, 2025
bd08f8c
Update TableBuilderConstants.java
XMRZombie Jul 23, 2025
3c15b0a
Update TableType.java
XMRZombie Jul 23, 2025
83af488
Update TradeTableColumnSupplier.java
XMRZombie Jul 23, 2025
3a88d96
Update TransactionTableBuilder.java
XMRZombie Jul 23, 2025
3003bdc
Delete cli/src/main/java/haveno/cli/table/builder/BtcBalanceTableBuil…
XMRZombie Jul 23, 2025
b0c353c
Create XmrBalanceTableBuilder.java
XMRZombie Jul 23, 2025
a1e6fb5
Update MixedTradeFeeColumn.java
XMRZombie Jul 23, 2025
f42b096
Create PiconeroColumn.java
XMRZombie Jul 23, 2025
be13fa2
Create XmrColumn.java
XMRZombie Jul 23, 2025
f62a243
Delete cli/src/main/java/haveno/cli/table/column/BtcColumn.java
XMRZombie Jul 23, 2025
4312725
Delete cli/src/main/java/haveno/cli/table/column/SatoshiColumn.java
XMRZombie Jul 23, 2025
6d94b24
Update CliMain.java
XMRZombie Jul 23, 2025
423857b
Update ColumnHeaderConstants.java
XMRZombie Jul 23, 2025
cc9c678
Update CurrencyFormat.java
XMRZombie Jul 23, 2025
d125276
Update GrpcClient.java
XMRZombie Jul 23, 2025
51fba1d
Update Method.java
XMRZombie Jul 23, 2025
75af925
Update Method.java
XMRZombie Jul 23, 2025
d6bbf37
Update CliMain.java
XMRZombie Aug 6, 2025
cd7467b
Update GrpcClient.java
XMRZombie Aug 6, 2025
4b8b5a4
Update WalletsServiceRequest.java
XMRZombie Aug 6, 2025
a838cfd
Delete cli/src/main/java/haveno/cli/opts/RelayXmrTxOptionParser.java
XMRZombie Aug 6, 2025
3117bcd
Create RelayXmrTxsOptionParser.java
XMRZombie Aug 6, 2025
553b788
Update Method.java
XMRZombie Aug 6, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
406 changes: 225 additions & 181 deletions cli/src/main/java/haveno/cli/CliMain.java

Large diffs are not rendered by default.

14 changes: 7 additions & 7 deletions cli/src/main/java/haveno/cli/ColumnHeaderConstants.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class ColumnHeaderConstants {
// expected max data string length is accounted for. In others, column header
// lengths are expected to be greater than any column value length.
static final String COL_HEADER_ADDRESS = padEnd("%-3s Address", 52, ' ');
static final String COL_HEADER_AMOUNT = "BTC(min - max)";
static final String COL_HEADER_AMOUNT = "XMR(min - max)";
static final String COL_HEADER_BALANCE = "Balance";
static final String COL_HEADER_AVAILABLE_BALANCE = "Available Balance";
static final String COL_HEADER_AVAILABLE_CONFIRMED_BALANCE = "Available Confirmed Balance";
Expand All @@ -51,8 +51,8 @@ class ColumnHeaderConstants {
static final String COL_HEADER_DIRECTION = "Buy/Sell";
static final String COL_HEADER_NAME = "Name";
static final String COL_HEADER_PAYMENT_METHOD = "Payment Method";
static final String COL_HEADER_PRICE = "Price in %-3s for 1 BTC";
static final String COL_HEADER_PRICE_OF_CRYPTO = "Price in BTC for 1 %-3s";
static final String COL_HEADER_PRICE = "Price in %-3s for 1 XMR";
static final String COL_HEADER_PRICE_OF_CRYPTO = "Price in XMR for 1 %-3s";
static final String COL_HEADER_TRADE_AMOUNT = padStart("Amount(%-3s)", 12, ' ');
static final String COL_HEADER_TRADE_BUYER_COST = padEnd("Buyer Cost(%-3s)", 15, ' ');
static final String COL_HEADER_TRADE_DEPOSIT_CONFIRMED = "Deposit Confirmed";
Expand All @@ -63,14 +63,14 @@ class ColumnHeaderConstants {
static final String COL_HEADER_TRADE_WITHDRAWN = "Withdrawn";
static final String COL_HEADER_TRADE_ROLE = "My Role";
static final String COL_HEADER_TRADE_SHORT_ID = "ID";
static final String COL_HEADER_TRADE_TX_FEE = padEnd("Tx Fee(BTC)", 12, ' ');
static final String COL_HEADER_TRADE_TX_FEE = padEnd("Tx Fee(XMR)", 12, ' ');
static final String COL_HEADER_TRADE_MAKER_FEE = padEnd("Maker Fee(%-3s)", 12, ' '); // "Maker Fee(%-3s)";
static final String COL_HEADER_TRADE_TAKER_FEE = padEnd("Taker Fee(%-3s)", 12, ' '); // "Taker Fee(%-3s)";

static final String COL_HEADER_TX_ID = "Tx ID";
static final String COL_HEADER_TX_INPUT_SUM = "Tx Inputs (BTC)";
static final String COL_HEADER_TX_OUTPUT_SUM = "Tx Outputs (BTC)";
static final String COL_HEADER_TX_FEE = "Tx Fee (BTC)";
static final String COL_HEADER_TX_INPUT_SUM = "Tx Inputs (XMR)";
static final String COL_HEADER_TX_OUTPUT_SUM = "Tx Outputs (XMR)";
static final String COL_HEADER_TX_FEE = "Tx Fee (XMR)";
static final String COL_HEADER_TX_SIZE = "Tx Size (Bytes)";
static final String COL_HEADER_TX_IS_CONFIRMED = "Is Confirmed";
static final String COL_HEADER_TX_MEMO = "Memo";
Expand Down
42 changes: 17 additions & 25 deletions cli/src/main/java/haveno/cli/CurrencyFormat.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,32 +44,24 @@ public class CurrencyFormat {
// Formats numbers for internal use, i.e., grpc request parameters.
private static final DecimalFormat INTERNAL_FIAT_DECIMAL_FORMAT = new DecimalFormat("##############0.0000");

static final BigDecimal SATOSHI_DIVISOR = new BigDecimal(100_000_000);
static final DecimalFormat SATOSHI_FORMAT = new DecimalFormat("###,##0.00000000", DECIMAL_FORMAT_SYMBOLS);
static final DecimalFormat BTC_FORMAT = new DecimalFormat("###,##0.########", DECIMAL_FORMAT_SYMBOLS);
static final DecimalFormat BTC_TX_FEE_FORMAT = new DecimalFormat("###,###,##0", DECIMAL_FORMAT_SYMBOLS);
static final BigDecimal PICONERO_DIVISOR = new BigDecimal(1_000_000_000_000L);
static final DecimalFormat PICONERO_FORMAT = new DecimalFormat("###,##0.000000000000", DECIMAL_FORMAT_SYMBOLS);
static final DecimalFormat XMR_FORMAT = new DecimalFormat("###,##0.############", DECIMAL_FORMAT_SYMBOLS);
static final DecimalFormat XMR_TX_FEE_FORMAT = new DecimalFormat("###,###,##0", DECIMAL_FORMAT_SYMBOLS);

static final BigDecimal BSQ_SATOSHI_DIVISOR = new BigDecimal(100);
static final DecimalFormat BSQ_FORMAT = new DecimalFormat("###,###,###,##0.00", DECIMAL_FORMAT_SYMBOLS);

public static String formatSatoshis(String sats) {
public static String formatPiconeros(String piconeros) {
//noinspection BigDecimalMethodWithoutRoundingCalled
return SATOSHI_FORMAT.format(new BigDecimal(sats).divide(SATOSHI_DIVISOR));
}

@SuppressWarnings("BigDecimalMethodWithoutRoundingCalled")
public static String formatSatoshis(long sats) {
return SATOSHI_FORMAT.format(new BigDecimal(sats).divide(SATOSHI_DIVISOR));
return PICONERO_FORMAT.format(new BigDecimal(piconeros).divide(PICONERO_DIVISOR));
}

@SuppressWarnings("BigDecimalMethodWithoutRoundingCalled")
public static String formatBtc(long sats) {
return BTC_FORMAT.format(new BigDecimal(sats).divide(SATOSHI_DIVISOR));
public static String formatPiconeros(long piconeros) {
return PICONERO_FORMAT.format(new BigDecimal(piconeros).divide(PICONERO_DIVISOR));
}

@SuppressWarnings("BigDecimalMethodWithoutRoundingCalled")
public static String formatBsq(long sats) {
return BSQ_FORMAT.format(new BigDecimal(sats).divide(BSQ_SATOSHI_DIVISOR));
public static String formatXmr(long piconeros) {
return XMR_FORMAT.format(new BigDecimal(piconeros).divide(PICONERO_DIVISOR));
}

public static String formatInternalFiatPrice(BigDecimal price) {
Expand Down Expand Up @@ -98,18 +90,18 @@ public static String formatFiatVolume(long volume) {
return US_LOCALE_NUMBER_FORMAT.format((double) volume / 10_000);
}

public static long toSatoshis(String btc) {
if (btc.startsWith("-"))
throw new IllegalArgumentException(format("'%s' is not a positive number", btc));
public static long toPiconeros(String xmr) {
if (xmr.startsWith("-"))
throw new IllegalArgumentException(format("'%s' is not a positive number", xmr));

try {
return new BigDecimal(btc).multiply(SATOSHI_DIVISOR).longValue();
return new BigDecimal(xmr).multiply(PICONERO_DIVISOR).longValue();
} catch (NumberFormatException e) {
throw new IllegalArgumentException(format("'%s' is not a number", btc));
throw new IllegalArgumentException(format("'%s' is not a number", xmr));
}
}

public static String formatFeeSatoshis(long sats) {
return BTC_TX_FEE_FORMAT.format(BigDecimal.valueOf(sats));
public static String formatFeePiconeros(long piconeros) {
return XMR_TX_FEE_FORMAT.format(BigDecimal.valueOf(piconeros));
}
}
44 changes: 37 additions & 7 deletions cli/src/main/java/haveno/cli/GrpcClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,16 @@
import haveno.cli.request.WalletsServiceRequest;
import haveno.proto.grpc.AddressBalanceInfo;
import haveno.proto.grpc.BalancesInfo;
import haveno.proto.grpc.BtcBalanceInfo;
import haveno.proto.grpc.GetMethodHelpRequest;
import haveno.proto.grpc.GetTradesRequest;
import haveno.proto.grpc.GetVersionRequest;
import haveno.proto.grpc.OfferInfo;
import haveno.proto.grpc.RegisterDisputeAgentRequest;
import haveno.proto.grpc.StopRequest;
import haveno.proto.grpc.TradeInfo;
import haveno.proto.grpc.XmrBalanceInfo;
import haveno.proto.grpc.XmrTx;
import haveno.proto.grpc.XmrDestination;
import lombok.extern.slf4j.Slf4j;
import protobuf.PaymentAccount;
import protobuf.PaymentMethod;
Expand Down Expand Up @@ -67,8 +69,8 @@ public BalancesInfo getBalances() {
return walletsServiceRequest.getBalances();
}

public BtcBalanceInfo getBtcBalances() {
return walletsServiceRequest.getBtcBalances();
public XmrBalanceInfo getXmrBalances() {
return walletsServiceRequest.getXmrBalances();
}

public BalancesInfo getBalances(String currencyCode) {
Expand All @@ -79,16 +81,44 @@ public AddressBalanceInfo getAddressBalance(String address) {
return walletsServiceRequest.getAddressBalance(address);
}

public double getBtcPrice(String currencyCode) {
return walletsServiceRequest.getBtcPrice(currencyCode);
public double getXmrPrice(String currencyCode) {
return walletsServiceRequest.getXmrPrice(currencyCode);
}

public List<AddressBalanceInfo> getFundingAddresses() {
return walletsServiceRequest.getFundingAddresses();
}

public String getUnusedBtcAddress() {
return walletsServiceRequest.getUnusedBtcAddress();
public String getUnusedXmrAddress() {
return walletsServiceRequest.getUnusedXmrAddress();
}

public String getXmrSeed() {
return walletsServiceRequest.getXmrSeed();
}

public String getXmrPrimaryAddress() {
return walletsServiceRequest.getXmrPrimaryAddress();
}

public String getXmrNewSubaddress() {
return walletsServiceRequest.getXmrNewSubaddress();
}

public List<XmrTx> getXmrTxs() {
return walletsServiceRequest.getXmrTxs();
}

public XmrTx createXmrTx(List<XmrDestination> destinations) {
return walletsServiceRequest.createXmrTx(destinations);
}

public List<String> relayXmrTxs(List<String> metadatas) {
return walletsServiceRequest.relayXmrTxs(metadatas);
}

public List<XmrTx> createXmrSweepTxs(String address) {
return walletsServiceRequest.createXmrSweepTxs(address);
}

public OfferInfo createFixedPricedOffer(String direction,
Expand Down
12 changes: 9 additions & 3 deletions cli/src/main/java/haveno/cli/Method.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public enum Method {
createcryptopaymentacct,
getaddressbalance,
getbalance,
getbtcprice,
getxmrprice,
getfundingaddresses,
@Deprecated // Since 27-Dec-2021.
getmyoffer, // Endpoint to be removed from future version. Use getoffer instead.
Expand All @@ -52,12 +52,18 @@ public enum Method {
lockwallet,
registerdisputeagent,
removewalletpassword,
sendbtc,
settxfeerate,
setwalletpassword,
takeoffer,
unlockwallet,
unsettxfeerate,
withdrawfunds,
stop
stop,
getunusedxmraddress,
getxmrseed,
getxmrprimaryaddress,
getxmrnewsubaddress,
getxmrtxs,
createxmrtx,
relayxmrtxs
}
39 changes: 39 additions & 0 deletions cli/src/main/java/haveno/cli/opts/CreateXmrTxOptionParser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package haveno.cli.opts;

import joptsimple.OptionParser;
import joptsimple.OptionSet;
import java.util.ArrayList;
import java.util.List;
import haveno.proto.grpc.XmrDestination;

public class CreateXmrTxOptionParser extends OptionParser {

public CreateXmrTxOptionParser(String[] args) {
accepts("destinations", "List of destinations for the XMR transaction")
.withRequiredArg()
.ofType(String.class);
}

public OptionSet parse(String[] args) {
return super.parse(args);
}

public static class CreateXmrTxOptions {
private final OptionSet options;

public CreateXmrTxOptions(OptionSet options) {
this.options = options;
}

public boolean isForHelp() {
return options.has("help");
}

public List<XmrDestination> getDestinations() {
List<XmrDestination> destinations = new ArrayList<>();
// Parse the destinations from the options and populate the list
// This is a placeholder; you need to implement the actual parsing logic
return destinations;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/*
* This file is part of Bisq.
*
* Bisq is free software: you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at
* your option) any later version.
*
* Bisq is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
* License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Bisq. If not, see <http://www.gnu.org/licenses/>.
*/

package haveno.cli.opts;


import joptsimple.OptionSpec;

import static haveno.cli.opts.OptLabel.OPT_CURRENCY_CODE;

public class GetMarketPriceOptionParser extends AbstractMethodOptionParser implements MethodOpts {

final OptionSpec<String> currencyCodeOpt = parser.accepts(OPT_CURRENCY_CODE, "currency-code")
.withRequiredArg();

public GetMarketPriceOptionParser(String[] args) {
super(args);
}

public GetMarketPriceOptionParser parse() {
super.parse();

// Short circuit opt validation if user just wants help.
if (options.has(helpOpt))
return this;

if (!options.has(currencyCodeOpt) || options.valueOf(currencyCodeOpt).isEmpty())
throw new IllegalArgumentException("no currency code specified");

return this;
}

public String getCurrencyCode() {
return options.valueOf(currencyCodeOpt);
}
}
42 changes: 42 additions & 0 deletions cli/src/main/java/haveno/cli/opts/RelayXmrTxsOptionParser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package haveno.cli.opts;

import joptsimple.OptionSet;

import java.util.List;

public class RelayXmrTxsOptionParser extends AbstractMethodOptionParser {

public RelayXmrTxsOptionParser(String[] args) {
super(args);
parser.accepts("metadatas", "Metadata for the XMR transactions")
.withRequiredArg()
.ofType(String.class)
.withValuesSeparatedBy(',');
}

@Override
public RelayXmrTxsOptionParser parse() {
super.parse();
return this;
}

public RelayXmrTxsOptions getRelayXmrTxsOptions() {
return new RelayXmrTxsOptions(options);
}

public static class RelayXmrTxsOptions {
private final OptionSet options;

public RelayXmrTxsOptions(OptionSet options) {
this.options = options;
}

public boolean isForHelp() {
return options.has("help");
}

public List<String> getMetadatas() {
return (List<String>) options.valuesOf("metadatas");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,27 +26,27 @@
import static haveno.cli.opts.OptLabel.OPT_TX_FEE_RATE;
import static joptsimple.internal.Strings.EMPTY;

public class SendBtcOptionParser extends AbstractMethodOptionParser implements MethodOpts {
public class SendXmrOptionParser extends AbstractMethodOptionParser implements MethodOpts {

final OptionSpec<String> addressOpt = parser.accepts(OPT_ADDRESS, "destination btc address")
final OptionSpec<String> addressOpt = parser.accepts(OPT_ADDRESS, "destination xmr address")
.withRequiredArg();

final OptionSpec<String> amountOpt = parser.accepts(OPT_AMOUNT, "amount of btc to send")
final OptionSpec<String> amountOpt = parser.accepts(OPT_AMOUNT, "amount of xmr to send")
.withRequiredArg();

final OptionSpec<String> feeRateOpt = parser.accepts(OPT_TX_FEE_RATE, "optional tx fee rate (sats/byte)")
final OptionSpec<String> feeRateOpt = parser.accepts(OPT_TX_FEE_RATE, "optional tx fee rate (piconero/byte)")
.withOptionalArg()
.defaultsTo(EMPTY);

final OptionSpec<String> memoOpt = parser.accepts(OPT_MEMO, "optional tx memo")
.withOptionalArg()
.defaultsTo(EMPTY);

public SendBtcOptionParser(String[] args) {
public SendXmrOptionParser(String[] args) {
super(args);
}

public SendBtcOptionParser parse() {
public SendXmrOptionParser parse() {
super.parse();

// Short circuit opt validation if user just wants help.
Expand Down
Loading
Loading