From b571b39790a28d246b476b8d82678b3f3912e99b Mon Sep 17 00:00:00 2001 From: woodser Date: Wed, 15 Jan 2025 09:44:24 -0500 Subject: [PATCH 1/2] support --xmrBlockchainPath startup flag for local Monero node --- .../java/haveno/common/config/Config.java | 20 ++++++++++++++----- .../java/haveno/core/api/XmrLocalNode.java | 15 ++++++++++---- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/common/src/main/java/haveno/common/config/Config.java b/common/src/main/java/haveno/common/config/Config.java index 897a795a2b..b162e211b4 100644 --- a/common/src/main/java/haveno/common/config/Config.java +++ b/common/src/main/java/haveno/common/config/Config.java @@ -118,6 +118,7 @@ public class Config { public static final String BYPASS_MEMPOOL_VALIDATION = "bypassMempoolValidation"; public static final String PASSWORD_REQUIRED = "passwordRequired"; public static final String UPDATE_XMR_BINARIES = "updateXmrBinaries"; + public static final String XMR_BLOCKCHAIN_PATH = "xmrBlockchainPath"; // Default values for certain options public static final int UNSPECIFIED_PORT = -1; @@ -206,6 +207,7 @@ public class Config { public final boolean bypassMempoolValidation; public final boolean passwordRequired; public final boolean updateXmrBinaries; + public final String xmrBlockchainPath; // Properties derived from options but not exposed as options themselves public final File torDir; @@ -630,6 +632,13 @@ public class Config { .ofType(boolean.class) .defaultsTo(true); + ArgumentAcceptingOptionSpec xmrBlockchainPathOpt = + parser.accepts(XMR_BLOCKCHAIN_PATH, + "Path to Monero blockchain when using local Monero node") + .withRequiredArg() + .ofType(String.class) + .defaultsTo(""); + try { CompositeOptionSet options = new CompositeOptionSet(); @@ -743,6 +752,7 @@ public class Config { this.bypassMempoolValidation = options.valueOf(bypassMempoolValidationOpt); this.passwordRequired = options.valueOf(passwordRequiredOpt); this.updateXmrBinaries = options.valueOf(updateXmrBinariesOpt); + this.xmrBlockchainPath = options.valueOf(xmrBlockchainPathOpt); } catch (OptionException ex) { throw new ConfigException("problem parsing option '%s': %s", ex.options().get(0), @@ -752,11 +762,11 @@ public class Config { } // Create all appDataDir subdirectories and assign to their respective properties - File btcNetworkDir = mkdir(appDataDir, baseCurrencyNetwork.name().toLowerCase()); - this.keyStorageDir = mkdir(btcNetworkDir, "keys"); - this.storageDir = mkdir(btcNetworkDir, "db"); - this.torDir = mkdir(btcNetworkDir, "tor"); - this.walletDir = mkdir(btcNetworkDir, "wallet"); + File xmrNetworkDir = mkdir(appDataDir, baseCurrencyNetwork.name().toLowerCase()); + this.keyStorageDir = mkdir(xmrNetworkDir, "keys"); + this.storageDir = mkdir(xmrNetworkDir, "db"); + this.torDir = mkdir(xmrNetworkDir, "tor"); + this.walletDir = mkdir(xmrNetworkDir, "wallet"); // Assign values to special-case static fields APP_DATA_DIR_VALUE = appDataDir; diff --git a/core/src/main/java/haveno/core/api/XmrLocalNode.java b/core/src/main/java/haveno/core/api/XmrLocalNode.java index cd5ed266f1..5a424dad38 100644 --- a/core/src/main/java/haveno/core/api/XmrLocalNode.java +++ b/core/src/main/java/haveno/core/api/XmrLocalNode.java @@ -166,11 +166,18 @@ public class XmrLocalNode { var args = new ArrayList<>(MONEROD_ARGS); - var dataDir = settings.getBlockchainPath(); - if (dataDir == null || dataDir.isEmpty()) { - dataDir = MONEROD_DATADIR; + var dataDir = ""; + if (config.xmrBlockchainPath == null || config.xmrBlockchainPath.isEmpty()) { + dataDir = settings.getBlockchainPath(); + if (dataDir == null || dataDir.isEmpty()) { + dataDir = MONEROD_DATADIR; + } + } else { + dataDir = config.xmrBlockchainPath; // startup config overrides settings + } + if (dataDir != null && !dataDir.isEmpty()) { + args.add("--data-dir=" + dataDir); } - if (dataDir != null) args.add("--data-dir=" + dataDir); var bootstrapUrl = settings.getBootstrapUrl(); if (bootstrapUrl != null && !bootstrapUrl.isEmpty()) { From 130a45c99a1ae812d3c6d6d8603005a79d2cfc19 Mon Sep 17 00:00:00 2001 From: woodser Date: Fri, 17 Jan 2025 07:28:27 -0500 Subject: [PATCH 2/2] serialize payment account form lists to comma delimited string --- .../src/main/java/haveno/core/payment/PaymentAccount.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/haveno/core/payment/PaymentAccount.java b/core/src/main/java/haveno/core/payment/PaymentAccount.java index a9e03d8016..8dda8fdedd 100644 --- a/core/src/main/java/haveno/core/payment/PaymentAccount.java +++ b/core/src/main/java/haveno/core/payment/PaymentAccount.java @@ -378,6 +378,7 @@ public abstract class PaymentAccount implements PersistablePayload { @NonNull public abstract List getInputFieldIds(); + @SuppressWarnings("unchecked") public PaymentAccountForm toForm() { // convert to json map @@ -387,7 +388,12 @@ public abstract class PaymentAccount implements PersistablePayload { PaymentAccountForm form = new PaymentAccountForm(PaymentAccountForm.FormId.valueOf(paymentMethod.getId())); for (PaymentAccountFormField.FieldId fieldId : getInputFieldIds()) { PaymentAccountFormField field = getEmptyFormField(fieldId); - field.setValue((String) jsonMap.get(HavenoUtils.toCamelCase(field.getId().toString()))); + Object value = jsonMap.get(HavenoUtils.toCamelCase(field.getId().toString())); + if (value instanceof List) { // TODO: list should already be serialized to comma delimited string in PaymentAccount.toJson() (PaymentAccountTypeAdapter?) + field.setValue(String.join(",", (List) value)); + } else { + field.setValue((String) value); + } form.getFields().add(field); } return form;