diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 65ad21a8f9..7eb9a72ed2 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -161,7 +161,7 @@ - + diff --git a/build.gradle b/build.gradle index 586a1ea208..725b69d9b7 100644 --- a/build.gradle +++ b/build.gradle @@ -181,6 +181,7 @@ configure(project(':common')) { compile "com.google.protobuf:protobuf-java:$protobufVersion" compile 'com.google.code.gson:gson:2.8.5' compile "org.springframework:spring-core:$springVersion" + compile "net.sf.jopt-simple:jopt-simple:$joptVersion" compile "org.slf4j:slf4j-api:$slf4jVersion" compile "ch.qos.logback:logback-core:$logbackVersion" compile "ch.qos.logback:logback-classic:$logbackVersion" @@ -201,6 +202,7 @@ configure(project(':common')) { compile "org.apache.commons:commons-lang3:$langVersion" compileOnly "org.projectlombok:lombok:$lombokVersion" annotationProcessor "org.projectlombok:lombok:$lombokVersion" + testCompile "org.hamcrest:hamcrest-all:$hamcrestVersion" } } @@ -217,7 +219,6 @@ configure(project(':p2p')) { compile("org.apache.httpcomponents:httpclient:$httpclientVersion") { exclude(module: 'commons-logging') } - compile "net.sf.jopt-simple:jopt-simple:$joptVersion" compile "org.fxmisc.easybind:easybind:$easybindVersion" compileOnly "org.projectlombok:lombok:$lombokVersion" annotationProcessor "org.projectlombok:lombok:$lombokVersion" @@ -234,7 +235,6 @@ configure(project(':core')) { dependencies { compile project(':assets') compile project(':p2p') - compile "net.sf.jopt-simple:jopt-simple:$joptVersion" compile("network.bisq.btcd-cli4j:btcd-cli4j-core:$btcdCli4jVersion") { exclude(module: 'slf4j-api') exclude(module: 'httpclient') @@ -273,10 +273,10 @@ configure(project(':core')) { compileOnly "org.projectlombok:lombok:$lombokVersion" annotationProcessor "org.projectlombok:lombok:$lombokVersion" + testCompile "org.hamcrest:hamcrest-all:$hamcrestVersion" testCompile "org.mockito:mockito-core:$mockitoVersion" testCompile "org.springframework:spring-test:$springVersion" testCompile "com.natpryce:make-it-easy:$easyVersion" - testCompile group: 'org.hamcrest', name: 'hamcrest-all', version: "$hamcrestVersion" testCompileOnly "org.projectlombok:lombok:$lombokVersion" testAnnotationProcessor "org.projectlombok:lombok:$lombokVersion" } @@ -444,6 +444,7 @@ configure(project(':seednode')) { compileOnly "org.projectlombok:lombok:$lombokVersion" annotationProcessor "org.projectlombok:lombok:$lombokVersion" testCompile "org.springframework:spring-test:$springVersion" + testCompile "org.mockito:mockito-core:$mockitoVersion" } } diff --git a/core/src/main/java/bisq/core/exceptions/BisqException.java b/common/src/main/java/bisq/common/BisqException.java similarity index 97% rename from core/src/main/java/bisq/core/exceptions/BisqException.java rename to common/src/main/java/bisq/common/BisqException.java index c31a9e9b8b..0b14e91c68 100644 --- a/core/src/main/java/bisq/core/exceptions/BisqException.java +++ b/common/src/main/java/bisq/common/BisqException.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.exceptions; +package bisq.common; public class BisqException extends RuntimeException { public BisqException(Throwable cause) { diff --git a/common/src/main/java/bisq/common/app/AppModule.java b/common/src/main/java/bisq/common/app/AppModule.java index 55041d9fb4..b27e1df085 100644 --- a/common/src/main/java/bisq/common/app/AppModule.java +++ b/common/src/main/java/bisq/common/app/AppModule.java @@ -17,6 +17,8 @@ package bisq.common.app; +import bisq.common.config.Config; + import org.springframework.core.env.Environment; import com.google.inject.AbstractModule; @@ -28,13 +30,16 @@ import java.util.ArrayList; import java.util.List; public abstract class AppModule extends AbstractModule { + protected final Environment environment; + protected final Config config; private final List modules = new ArrayList<>(); - protected AppModule(Environment environment) { + protected AppModule(Environment environment, Config config) { Preconditions.checkNotNull(environment, "Environment must not be null"); this.environment = environment; + this.config = config; } protected void install(AppModule module) { diff --git a/core/src/main/java/bisq/core/btc/BaseCurrencyNetwork.java b/common/src/main/java/bisq/common/config/BaseCurrencyNetwork.java similarity index 93% rename from core/src/main/java/bisq/core/btc/BaseCurrencyNetwork.java rename to common/src/main/java/bisq/common/config/BaseCurrencyNetwork.java index 8981f41426..70e15d6641 100644 --- a/core/src/main/java/bisq/core/btc/BaseCurrencyNetwork.java +++ b/common/src/main/java/bisq/common/config/BaseCurrencyNetwork.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.btc; +package bisq.common.config; import org.bitcoinj.core.NetworkParameters; import org.bitcoinj.params.MainNetParams; @@ -32,6 +32,9 @@ public enum BaseCurrencyNetwork { BTC_DAO_BETANET(MainNetParams.get(), "BTC", "MAINNET", "Bitcoin"), // mainnet test genesis BTC_DAO_REGTEST(RegTestParams.get(), "BTC", "REGTEST", "Bitcoin"); // server side regtest after v0.9.5, had breaking code changes so we started over again + public static BaseCurrencyNetwork CURRENT_NETWORK = BTC_MAINNET; + public static NetworkParameters CURRENT_PARAMETERS = CURRENT_NETWORK.getParameters(); + @Getter private final NetworkParameters parameters; @Getter diff --git a/core/src/main/java/bisq/core/app/BisqHelpFormatter.java b/common/src/main/java/bisq/common/config/BisqHelpFormatter.java similarity index 99% rename from core/src/main/java/bisq/core/app/BisqHelpFormatter.java rename to common/src/main/java/bisq/common/config/BisqHelpFormatter.java index 10ab553c8e..e315dbe3f8 100644 --- a/core/src/main/java/bisq/core/app/BisqHelpFormatter.java +++ b/common/src/main/java/bisq/common/config/BisqHelpFormatter.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.app; +package bisq.common.config; import joptsimple.HelpFormatter; import joptsimple.OptionDescriptor; diff --git a/common/src/main/java/bisq/common/config/CompositeOptionSet.java b/common/src/main/java/bisq/common/config/CompositeOptionSet.java new file mode 100644 index 0000000000..0844fdf7bf --- /dev/null +++ b/common/src/main/java/bisq/common/config/CompositeOptionSet.java @@ -0,0 +1,45 @@ +package bisq.common.config; + +import joptsimple.ArgumentAcceptingOptionSpec; +import joptsimple.OptionSet; +import joptsimple.OptionSpec; + +import java.util.ArrayList; +import java.util.List; + +class CompositeOptionSet { + + private final List optionSets = new ArrayList<>(); + + public void addOptionSet(OptionSet optionSet) { + optionSets.add(optionSet); + } + + public boolean has(OptionSpec option) { + for (OptionSet optionSet : optionSets) + if (optionSet.has(option)) + return true; + + return false; + } + + public V valueOf(OptionSpec option) { + for (OptionSet optionSet : optionSets) + if (optionSet.has(option)) + return optionSet.valueOf(option); + + // None of the provided option sets specified the given option so fall back to + // the default value (if any) provided by the first specified OptionSet + return optionSets.get(0).valueOf(option); + } + + public List valuesOf(ArgumentAcceptingOptionSpec option) { + for (OptionSet optionSet : optionSets) + if (optionSet.has(option)) + return optionSet.valuesOf(option); + + // None of the provided option sets specified the given option so fall back to + // the default value (if any) provided by the first specified OptionSet + return optionSets.get(0).valuesOf(option); + } +} diff --git a/common/src/main/java/bisq/common/config/Config.java b/common/src/main/java/bisq/common/config/Config.java new file mode 100644 index 0000000000..c5c371368d --- /dev/null +++ b/common/src/main/java/bisq/common/config/Config.java @@ -0,0 +1,344 @@ +package bisq.common.config; + +import bisq.common.util.Utilities; + +import joptsimple.AbstractOptionSpec; +import joptsimple.ArgumentAcceptingOptionSpec; +import joptsimple.OptionException; +import joptsimple.OptionParser; +import joptsimple.OptionSet; +import joptsimple.OptionSpec; +import joptsimple.util.PathConverter; +import joptsimple.util.PathProperties; + +import java.nio.file.Path; +import java.nio.file.Paths; + +import java.io.File; + +import java.util.List; +import java.util.Optional; + +import ch.qos.logback.classic.Level; + +import static java.lang.String.format; +import static java.util.stream.Collectors.toList; + +public class Config { + + static final String DEFAULT_CONFIG_FILE_NAME = "bisq.properties"; + static final int DEFAULT_NODE_PORT = 9999; + + public static File CURRENT_APP_DATA_DIR; + + private final String defaultAppName; + private final File defaultUserDataDir; + private final File defaultAppDataDir; + private final File defaultConfigFile; + + private final File configFile; + private final String appName; + private final File userDataDir; + private final File appDataDir; + private final int nodePort; + private final List bannedBtcNodes; + private final List bannedPriceRelayNodes; + private final List bannedSeedNodes; + private final BaseCurrencyNetwork baseCurrencyNetwork; + private final boolean ignoreLocalBtcNode; + private final String bitcoinRegtestHost; + private final boolean daoActivated; + private final boolean fullDaoNode; + private final String logLevel; + private final Path torrcFile; + + // FIXME: Carryover from legacy BisqEnvironment; there should be no mutable state here + private boolean localBitcoinNodeIsRunning = false; + + public Config(String defaultAppName) throws HelpRequested { + this(defaultAppName, new String[]{}); + } + + public Config(String defaultAppName, String[] args) throws HelpRequested { + this.defaultAppName = defaultAppName; + this.defaultUserDataDir = getDefaultUserDataDir(); + this.defaultAppDataDir = new File(defaultUserDataDir, this.defaultAppName); + this.defaultConfigFile = new File(defaultAppDataDir, DEFAULT_CONFIG_FILE_NAME); + + OptionParser parser = new OptionParser(); + parser.allowsUnrecognizedOptions(); + + AbstractOptionSpec helpOpt = + parser.accepts("help", "Print this help text") + .forHelp(); + + ArgumentAcceptingOptionSpec configFileOpt = + parser.accepts("configFile", "Specify configuration file. " + + "Relative paths will be prefixed by appDataDir location.") + .withRequiredArg() + .ofType(String.class) + .defaultsTo(DEFAULT_CONFIG_FILE_NAME); + + ArgumentAcceptingOptionSpec userDataDirOpt = + parser.accepts("userDataDir", "User data directory") + .withRequiredArg() + .ofType(File.class) + .defaultsTo(defaultUserDataDir); + + ArgumentAcceptingOptionSpec appNameOpt = + parser.accepts("appName", "Application name") + .withRequiredArg() + .ofType(String.class) + .defaultsTo(this.defaultAppName); + + ArgumentAcceptingOptionSpec appDataDirOpt = + parser.accepts("appDataDir", "Application data directory") + .withRequiredArg() + .ofType(File.class) + .defaultsTo(defaultAppDataDir); + + ArgumentAcceptingOptionSpec nodePortOpt = + parser.accepts("nodePort", "Port to listen on") + .withRequiredArg() + .ofType(Integer.class) + .defaultsTo(DEFAULT_NODE_PORT); + + ArgumentAcceptingOptionSpec bannedBtcNodesOpt = + parser.accepts("bannedBtcNodes", "List Bitcoin nodes to ban") + .withRequiredArg() + .ofType(String.class) + .withValuesSeparatedBy(',') + .describedAs("host:port[,...]"); + + ArgumentAcceptingOptionSpec bannedPriceRelayNodesOpt = + parser.accepts("bannedPriceRelayNodes", "List Bisq price nodes to ban") + .withRequiredArg() + .ofType(String.class) + .withValuesSeparatedBy(',') + .describedAs("host:port[,...]"); + + ArgumentAcceptingOptionSpec bannedSeedNodesOpt = + parser.accepts("bannedSeedNodes", "List Bisq seed nodes to ban") + .withRequiredArg() + .ofType(String.class) + .withValuesSeparatedBy(',') + .describedAs("host:port[,...]"); + + ArgumentAcceptingOptionSpec baseCurrencyNetworkOpt = + parser.accepts("baseCurrencyNetwork", "Base currency network") + .withRequiredArg() + .ofType(BaseCurrencyNetwork.class) + .withValuesConvertedBy(new EnumValueConverter(BaseCurrencyNetwork.class)) + .defaultsTo(BaseCurrencyNetwork.BTC_MAINNET); + + ArgumentAcceptingOptionSpec ignoreLocalBtcNodeOpt = + parser.accepts("ignoreLocalBtcNode", "If set to true a Bitcoin Core node running locally will be ignored") + .withRequiredArg() + .ofType(Boolean.class) + .defaultsTo(false); + + ArgumentAcceptingOptionSpec bitcoinRegtestHostOpt = + parser.accepts("bitcoinRegtestHost", "Bitcoin Core node when using BTC_REGTEST network") + .withRequiredArg() + .ofType(String.class) + .describedAs("host[:port]") + .defaultsTo("localhost"); + + ArgumentAcceptingOptionSpec daoActivatedOpt = + parser.accepts("daoActivated", "Developer flag. If true it enables dao phase 2 features.") + .withRequiredArg() + .ofType(Boolean.class) + .defaultsTo(true); + + ArgumentAcceptingOptionSpec fullDaoNodeOpt = + parser.accepts("fullDaoNode", "If set to true the node requests the blockchain data via RPC requests " + + "from Bitcoin Core and provide the validated BSQ txs to the network. It requires that the " + + "other RPC properties are set as well.") + .withRequiredArg() + .ofType(Boolean.class) + .defaultsTo(false); + + ArgumentAcceptingOptionSpec logLevelOpt = + parser.accepts("logLevel", "Set logging level") + .withRequiredArg() + .ofType(String.class) + .describedAs("OFF|ALL|ERROR|WARN|INFO|DEBUG|TRACE") + .defaultsTo(Level.INFO.levelStr); + + ArgumentAcceptingOptionSpec torrcFileOpt = + parser.accepts("torrcFile", "An existing torrc-file to be sourced for Tor. Note that torrc-entries, " + + "which are critical to Bisq's correct operation, cannot be overwritten.") + .withRequiredArg() + .withValuesConvertedBy(new PathConverter(PathProperties.FILE_EXISTING, PathProperties.READABLE)); + + try { + OptionSet cliOpts = parser.parse(args); + + if (cliOpts.has(helpOpt)) + throw new HelpRequested(parser); + + CompositeOptionSet options = new CompositeOptionSet(); + options.addOptionSet(cliOpts); + + File configFile = null; + final boolean cliHasConfigFileOpt = cliOpts.has(configFileOpt); + boolean configFileHasBeenProcessed = false; + if (cliHasConfigFileOpt) { + configFile = new File(cliOpts.valueOf(configFileOpt)); + Optional configFileOpts = parseOptionsFrom(configFile, parser, helpOpt, configFileOpt); + if (configFileOpts.isPresent()) { + options.addOptionSet(configFileOpts.get()); + configFileHasBeenProcessed = true; + } + } + + this.appName = options.valueOf(appNameOpt); + this.userDataDir = options.valueOf(userDataDirOpt); + this.appDataDir = options.has(appDataDirOpt) ? + options.valueOf(appDataDirOpt) : + new File(this.userDataDir, this.appName); + + CURRENT_APP_DATA_DIR = appDataDir; + + if (!configFileHasBeenProcessed) { + configFile = cliHasConfigFileOpt && !configFile.isAbsolute() ? + new File(this.appDataDir, configFile.getPath()) : // TODO: test + new File(this.appDataDir, DEFAULT_CONFIG_FILE_NAME); + Optional configFileOpts = parseOptionsFrom(configFile, parser, helpOpt, configFileOpt); + configFileOpts.ifPresent(options::addOptionSet); + } + + this.configFile = configFile; + this.nodePort = options.valueOf(nodePortOpt); + this.bannedBtcNodes = options.valuesOf(bannedBtcNodesOpt); + this.bannedPriceRelayNodes = options.valuesOf(bannedPriceRelayNodesOpt); + this.bannedSeedNodes = options.valuesOf(bannedSeedNodesOpt); + this.baseCurrencyNetwork = (BaseCurrencyNetwork) options.valueOf(baseCurrencyNetworkOpt); + BaseCurrencyNetwork.CURRENT_NETWORK = baseCurrencyNetwork; + BaseCurrencyNetwork.CURRENT_PARAMETERS = baseCurrencyNetwork.getParameters(); + this.ignoreLocalBtcNode = options.valueOf(ignoreLocalBtcNodeOpt); + this.bitcoinRegtestHost = options.valueOf(bitcoinRegtestHostOpt); + this.daoActivated = options.valueOf(daoActivatedOpt) || !baseCurrencyNetwork.isMainnet(); + this.fullDaoNode = options.valueOf(fullDaoNodeOpt); + this.logLevel = options.valueOf(logLevelOpt); + this.torrcFile = options.valueOf(torrcFileOpt); + + } catch (OptionException ex) { + throw new ConfigException(format("problem parsing option '%s': %s", + ex.options().get(0), + ex.getCause() != null ? + ex.getCause().getMessage() : + ex.getMessage())); + } + } + + private Optional parseOptionsFrom(File file, OptionParser parser, OptionSpec... disallowedOpts) { + if (!file.isAbsolute() || !file.exists()) + return Optional.empty(); + + ConfigFileReader configFileReader = new ConfigFileReader(file); + String[] optionLines = configFileReader.getOptionLines().stream() + .map(o -> "--" + o) // prepend dashes expected by jopt parser below + .collect(toList()) + .toArray(new String[]{}); + + OptionSet configFileOpts = parser.parse(optionLines); + for (OptionSpec disallowedOpt : disallowedOpts) + if (configFileOpts.has(disallowedOpt)) + throw new IllegalArgumentException( + format("The '%s' option is disallowed in config files", disallowedOpt.options().get(0))); + + return Optional.of(configFileOpts); + } + + public String getDefaultAppName() { + return defaultAppName; + } + + public File getDefaultUserDataDir() { + if (Utilities.isWindows()) + return new File(System.getenv("APPDATA")); + + if (Utilities.isOSX()) + return Paths.get(System.getProperty("user.home"), "Library", "Application Support").toFile(); + + // *nix + return Paths.get(System.getProperty("user.home"), ".local", "share").toFile(); + } + + public File getDefaultAppDataDir() { + return defaultAppDataDir; + } + + public File getDefaultConfigFile() { + return defaultConfigFile; + } + + public File getConfigFile() { + return configFile; + } + + public String getAppName() { + return appName; + } + + public File getUserDataDir() { + return userDataDir; + } + + public File getAppDataDir() { + return appDataDir; + } + + public int getNodePort() { + return nodePort; + } + + public List getBannedBtcNodes() { + return bannedBtcNodes; + } + + public List getBannedPriceRelayNodes() { + return bannedPriceRelayNodes; + } + + public List getBannedSeedNodes() { + return bannedSeedNodes; + } + + public BaseCurrencyNetwork getBaseCurrencyNetwork() { + return baseCurrencyNetwork; + } + + public boolean isIgnoreLocalBtcNode() { + return ignoreLocalBtcNode; + } + + public String getBitcoinRegtestHost() { + return bitcoinRegtestHost; + } + + public boolean isDaoActivated() { + return daoActivated; + } + + public boolean isFullDaoNode() { + return fullDaoNode; + } + + public String getLogLevel() { + return logLevel; + } + + public boolean isLocalBitcoinNodeIsRunning() { + return localBitcoinNodeIsRunning; + } + + public void setLocalBitcoinNodeIsRunning(boolean value) { + this.localBitcoinNodeIsRunning = value; + } + + public Path getTorrcFile() { + return torrcFile; + } +} diff --git a/common/src/main/java/bisq/common/config/ConfigException.java b/common/src/main/java/bisq/common/config/ConfigException.java new file mode 100644 index 0000000000..42a33209fc --- /dev/null +++ b/common/src/main/java/bisq/common/config/ConfigException.java @@ -0,0 +1,8 @@ +package bisq.common.config; + +public class ConfigException extends RuntimeException { + + public ConfigException(String message) { + super(message); + } +} diff --git a/common/src/main/java/bisq/common/config/ConfigFileEditor.java b/common/src/main/java/bisq/common/config/ConfigFileEditor.java new file mode 100644 index 0000000000..f067430165 --- /dev/null +++ b/common/src/main/java/bisq/common/config/ConfigFileEditor.java @@ -0,0 +1,87 @@ +package bisq.common.config; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.UncheckedIOException; + +import java.util.List; + +import org.slf4j.LoggerFactory; + +import ch.qos.logback.classic.Logger; + +public class ConfigFileEditor { + + private static final Logger log = (Logger) LoggerFactory.getLogger(ConfigFileEditor.class); + + private final File file; + private final ConfigFileReader reader; + + public ConfigFileEditor(File file) { + this.file = file; + this.reader = new ConfigFileReader(file); + } + + public void setOption(String name) { + setOption(name, null); + } + + public void setOption(String name, String arg) { + tryCreate(file); + List lines = reader.getLines(); + try (PrintWriter writer = new PrintWriter(file)) { + boolean fileAlreadyContainsTargetOption = false; + for (String line : lines) { + if (ConfigFileOption.isOption(line)) { + ConfigFileOption existingOption = ConfigFileOption.parse(line); + if (existingOption.name.equals(name)) { + fileAlreadyContainsTargetOption = true; + if (!existingOption.arg.equals(arg)) { + ConfigFileOption newOption = new ConfigFileOption(name, arg); + writer.println(newOption); + log.warn("Overwrote existing config file option '{}' as '{}'", existingOption, newOption); + continue; + } + } + } + writer.println(line); + } + if (!fileAlreadyContainsTargetOption) + writer.println(new ConfigFileOption(name, arg)); + } catch (FileNotFoundException ex) { + throw new UncheckedIOException(ex); + } + } + + public void clearOption(String name) { + if (!file.exists()) + return; + + List lines = reader.getLines(); + try (PrintWriter writer = new PrintWriter(file)) { + for (String line : lines) { + if (ConfigFileOption.isOption(line)) { + ConfigFileOption option = ConfigFileOption.parse(line); + if (option.name.equals(name)) { + log.warn("Cleared existing config file option '{}'", option); + continue; + } + } + writer.println(line); + } + } catch (FileNotFoundException ex) { + throw new UncheckedIOException(ex); + } + } + + private void tryCreate(File file) { + try { + if (file.createNewFile()) + log.info("Created config file '{}'", file); + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } + } +} diff --git a/common/src/main/java/bisq/common/config/ConfigFileOption.java b/common/src/main/java/bisq/common/config/ConfigFileOption.java new file mode 100644 index 0000000000..58c440d8f5 --- /dev/null +++ b/common/src/main/java/bisq/common/config/ConfigFileOption.java @@ -0,0 +1,36 @@ +package bisq.common.config; + +class ConfigFileOption { + + public final String name; + public final String arg; + + public ConfigFileOption(String name, String arg) { + this.name = name; + this.arg = arg; + } + + public static boolean isOption(String line) { + return !line.isEmpty() && !line.startsWith("#"); + } + + public static ConfigFileOption parse(String option) { + if (!option.contains("=")) + return new ConfigFileOption(option, null); + + String[] tokens = clean(option).split("="); + String name = tokens[0].trim(); + String arg = tokens[1].trim(); + return new ConfigFileOption(name, arg); + } + + public String toString() { + return String.format("%s%s", name, arg != null ? ('=' + arg) : ""); + } + + public static String clean(String option) { + return option + .trim() + .replace("\\:", ":"); + } +} diff --git a/common/src/main/java/bisq/common/config/ConfigFileReader.java b/common/src/main/java/bisq/common/config/ConfigFileReader.java new file mode 100644 index 0000000000..746312cba9 --- /dev/null +++ b/common/src/main/java/bisq/common/config/ConfigFileReader.java @@ -0,0 +1,47 @@ +package bisq.common.config; + +import java.nio.file.Files; + +import java.io.File; +import java.io.IOException; +import java.io.UncheckedIOException; + +import java.util.List; + +import static java.lang.String.format; +import static java.util.stream.Collectors.toList; + +class ConfigFileReader { + + private final File file; + + public ConfigFileReader(File file) { + this.file = file; + } + + public List getLines() { + if (!file.exists()) + throw new IllegalArgumentException(format("Config file %s does not exist", file)); + + if (!file.canRead()) + throw new IllegalArgumentException(format("Config file %s is not readable", file)); + + try { + return Files.readAllLines(file.toPath()).stream() + .map(ConfigFileReader::cleanLine) + .collect(toList()); + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } + } + + public List getOptionLines() { + return getLines().stream() + .filter(ConfigFileOption::isOption) + .collect(toList()); + } + + private static String cleanLine(String line) { + return ConfigFileOption.isOption(line) ? ConfigFileOption.clean(line) : line; + } +} diff --git a/core/src/main/java/bisq/core/util/joptsimple/EnumValueConverter.java b/common/src/main/java/bisq/common/config/EnumValueConverter.java similarity index 89% rename from core/src/main/java/bisq/core/util/joptsimple/EnumValueConverter.java rename to common/src/main/java/bisq/common/config/EnumValueConverter.java index 3f3da446cc..3363b9abb4 100644 --- a/core/src/main/java/bisq/core/util/joptsimple/EnumValueConverter.java +++ b/common/src/main/java/bisq/common/config/EnumValueConverter.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package bisq.core.util.joptsimple; +package bisq.common.config; import joptsimple.ValueConverter; @@ -29,10 +29,11 @@ import static org.springframework.util.StringUtils.collectionToDelimitedString; /** * A {@link joptsimple.ValueConverter} that supports case-insensitive conversion from - * String to an enum label. Useful in conjunction with {@link joptsimple.ArgumentAcceptingOptionSpec#ofType(Class)} - * when the type in question is an enum. + * String to an enum label. Useful in conjunction with + * {@link joptsimple.ArgumentAcceptingOptionSpec#ofType(Class)} when the type in question + * is an enum. */ -public class EnumValueConverter implements ValueConverter { +class EnumValueConverter implements ValueConverter { private final Class enumType; diff --git a/common/src/main/java/bisq/common/config/HelpRequested.java b/common/src/main/java/bisq/common/config/HelpRequested.java new file mode 100644 index 0000000000..ffe20b28db --- /dev/null +++ b/common/src/main/java/bisq/common/config/HelpRequested.java @@ -0,0 +1,26 @@ +package bisq.common.config; + +import joptsimple.HelpFormatter; +import joptsimple.OptionParser; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.UncheckedIOException; + +public class HelpRequested extends RuntimeException { + + private final OptionParser parser; + + public HelpRequested(OptionParser parser) { + this.parser = parser; + } + + public void printHelp(OutputStream sink, HelpFormatter formatter) { + try { + parser.formatHelpWith(formatter); + parser.printHelpOn(sink); + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } + } +} diff --git a/common/src/main/java/bisq/common/config/TestConfig.java b/common/src/main/java/bisq/common/config/TestConfig.java new file mode 100644 index 0000000000..64cdd11fa8 --- /dev/null +++ b/common/src/main/java/bisq/common/config/TestConfig.java @@ -0,0 +1,26 @@ +package bisq.common.config; + +import java.io.File; +import java.io.IOException; +import java.io.UncheckedIOException; + +public class TestConfig extends Config { + + public TestConfig() throws HelpRequested { + super(generateTestAppName()); + } + + public TestConfig(String... args) { + super(generateTestAppName(), args); + } + + private static String generateTestAppName() { + try { + File file = File.createTempFile("Bisq", "Test"); + file.delete(); + return file.toPath().getFileName().toString(); + } catch (IOException ex) { + throw new UncheckedIOException(ex); + } + } +} diff --git a/common/src/main/java/bisq/common/crypto/CryptoUtils.java b/common/src/main/java/bisq/common/crypto/CryptoUtils.java index 83ab4317f4..18fd3d08b0 100644 --- a/common/src/main/java/bisq/common/crypto/CryptoUtils.java +++ b/common/src/main/java/bisq/common/crypto/CryptoUtils.java @@ -17,6 +17,11 @@ package bisq.common.crypto; +import bisq.common.util.Utilities; + +import javax.crypto.Cipher; + +import java.security.NoSuchAlgorithmException; import java.security.PublicKey; import java.security.SecureRandom; import java.security.spec.X509EncodedKeySpec; @@ -37,4 +42,11 @@ public class CryptoUtils { new SecureRandom().nextBytes(bytes); return bytes; } + + public static void checkCryptoPolicySetup() throws NoSuchAlgorithmException, LimitedKeyStrengthException { + if (Cipher.getMaxAllowedKeyLength("AES") > 128) + log.debug("Congratulations, you have unlimited key length support!"); + else + throw new LimitedKeyStrengthException(); + } } diff --git a/common/src/main/java/bisq/common/setup/CommonSetup.java b/common/src/main/java/bisq/common/setup/CommonSetup.java index c170c194c6..73681d2679 100644 --- a/common/src/main/java/bisq/common/setup/CommonSetup.java +++ b/common/src/main/java/bisq/common/setup/CommonSetup.java @@ -18,6 +18,7 @@ package bisq.common.setup; import bisq.common.UserThread; +import bisq.common.crypto.CryptoUtils; import bisq.common.crypto.LimitedKeyStrengthException; import bisq.common.util.Utilities; @@ -61,7 +62,7 @@ public class CommonSetup { Thread.currentThread().setUncaughtExceptionHandler(handler); try { - Utilities.checkCryptoPolicySetup(); + CryptoUtils.checkCryptoPolicySetup(); } catch (NoSuchAlgorithmException | LimitedKeyStrengthException e) { e.printStackTrace(); UserThread.execute(() -> uncaughtExceptionHandler.handleUncaughtException(e, true)); diff --git a/common/src/main/java/bisq/common/util/Utilities.java b/common/src/main/java/bisq/common/util/Utilities.java index 9d810853c7..7947157bc7 100644 --- a/common/src/main/java/bisq/common/util/Utilities.java +++ b/common/src/main/java/bisq/common/util/Utilities.java @@ -373,13 +373,6 @@ public class Utilities { } } - public static void checkCryptoPolicySetup() throws NoSuchAlgorithmException, LimitedKeyStrengthException { - if (Cipher.getMaxAllowedKeyLength("AES") > 128) - log.debug("Congratulations, you have unlimited key length support!"); - else - throw new LimitedKeyStrengthException(); - } - public static String toTruncatedString(Object message) { return toTruncatedString(message, 200, true); } diff --git a/common/src/test/java/bisq/common/config/ConfigFileEditorTests.java b/common/src/test/java/bisq/common/config/ConfigFileEditorTests.java new file mode 100644 index 0000000000..d1b0ed4f05 --- /dev/null +++ b/common/src/test/java/bisq/common/config/ConfigFileEditorTests.java @@ -0,0 +1,118 @@ +package bisq.common.config; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; + +import org.junit.Before; +import org.junit.Test; + +import static org.hamcrest.Matchers.contains; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +public class ConfigFileEditorTests { + + private File file; + private PrintWriter writer; + private ConfigFileReader reader; + private ConfigFileEditor editor; + + @Before + public void setUp() throws IOException { + file = File.createTempFile("bisq", "properties"); + reader = new ConfigFileReader(file); + editor = new ConfigFileEditor(file); + writer = new PrintWriter(file); + } + + @Test + public void whenFileDoesNotExist_thenSetOptionCreatesItAndAppendsOneLine() { + assertTrue(file.delete()); + + editor.setOption("opt1", "val1"); + + assertThat(reader.getLines(), contains("opt1=val1")); + } + + @Test + public void whenFileContainsOptionBeingSet_thenSetOptionOverwritesIt() { + writer.println("opt1=val1"); + writer.println("opt2=val2"); + writer.println("opt3=val3"); + writer.flush(); + + editor.setOption("opt2", "newval2"); + + assertThat(reader.getLines(), contains( + "opt1=val1", + "opt2=newval2", + "opt3=val3")); + } + + @Test + public void whenOptionBeingSetHasNoArg_thenSetOptionWritesItWithNoEqualsSign() { + writer.println("opt1=val1"); + writer.println("opt2=val2"); + writer.flush(); + + editor.setOption("opt3"); + + assertThat(reader.getLines(), contains( + "opt1=val1", + "opt2=val2", + "opt3")); + } + + @Test + public void whenFileHasBlankOrCommentLines_thenTheyArePreserved() { + writer.println("# Comment 1"); + writer.println("opt1=val1"); + writer.println(); + writer.println("# Comment 2"); + writer.println("opt2=val2"); + writer.flush(); + + editor.setOption("opt3=val3"); + + assertThat(reader.getLines(), contains( + "# Comment 1", + "opt1=val1", + "", + "# Comment 2", + "opt2=val2", + "opt3=val3")); + } + + @Test + public void whenFileContainsOptionBeingCleared_thenClearOptionRemovesIt() { + writer.println("opt1=val1"); + writer.println("opt2=val2"); + writer.flush(); + + editor.clearOption("opt2"); + + assertThat(reader.getLines(), contains("opt1=val1")); + } + + @Test + public void whenFileDoesNotContainOptionBeingCleared_thenClearOptionIsNoOp() { + writer.println("opt1=val1"); + writer.println("opt2=val2"); + writer.flush(); + + editor.clearOption("opt3"); + + assertThat(reader.getLines(), contains( + "opt1=val1", + "opt2=val2")); + } + + @Test + public void whenFileDoesNotExist_thenClearOptionIsNoOp() { + assertTrue(file.delete()); + editor.clearOption("opt1"); + assertFalse(file.exists()); + } +} diff --git a/common/src/test/java/bisq/common/config/ConfigFileOptionTests.java b/common/src/test/java/bisq/common/config/ConfigFileOptionTests.java new file mode 100644 index 0000000000..9de1a81fbf --- /dev/null +++ b/common/src/test/java/bisq/common/config/ConfigFileOptionTests.java @@ -0,0 +1,38 @@ +package bisq.common.config; + +import org.junit.Assert; +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; + +public class ConfigFileOptionTests { + + @Test + public void whenOptionHasWhitespaceAroundEqualsSign_thenItGetsTrimmed() { + String value = "name1 = arg1"; + ConfigFileOption option = ConfigFileOption.parse(value); + assertThat(option.name, equalTo("name1")); + assertThat(option.arg, equalTo("arg1")); + assertThat(option.toString(), equalTo("name1=arg1")); + } + + @Test + public void whenOptionHasLeadingOrTrailingWhitespace_thenItGetsTrimmed() { + String value = " name1=arg1 "; + ConfigFileOption option = ConfigFileOption.parse(value); + assertThat(option.name, equalTo("name1")); + assertThat(option.arg, equalTo("arg1")); + assertThat(option.toString(), equalTo("name1=arg1")); + } + + @Test + public void whenOptionHasEscapedColons_thenTheyGetUnescaped() { + String value = "host1=example.com\\:8080"; + ConfigFileOption option = ConfigFileOption.parse(value); + assertThat(option.name, equalTo("host1")); + assertThat(option.arg, equalTo("example.com:8080")); + assertThat(option.toString(), equalTo("host1=example.com:8080")); + } +} diff --git a/common/src/test/java/bisq/common/config/ConfigFileReaderTests.java b/common/src/test/java/bisq/common/config/ConfigFileReaderTests.java new file mode 100644 index 0000000000..23b0437d00 --- /dev/null +++ b/common/src/test/java/bisq/common/config/ConfigFileReaderTests.java @@ -0,0 +1,78 @@ +package bisq.common.config; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.containsString; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +public class ConfigFileReaderTests { + + private File file; + private PrintWriter writer; + private ConfigFileReader reader; + + @Rule + public ExpectedException exception = ExpectedException.none(); + + @Before + public void setUp() throws IOException { + file = File.createTempFile("bisq", "properties"); + reader = new ConfigFileReader(file); + writer = new PrintWriter(file); + } + + @Test + public void whenFileDoesNotExist_thenGetLinesThrows() { + assertTrue(file.delete()); + + exception.expect(IllegalArgumentException.class); + exception.expectMessage(containsString("Config file")); + exception.expectMessage(containsString("does not exist")); + + reader.getLines(); + } + + @Test + public void whenOptionHasWhitespaceAroundEqualsSign_thenGetLinesPreservesIt() { + writer.println("name1 =arg1"); + writer.println("name2= arg2"); + writer.println("name3 = arg3"); + writer.flush(); + + assertThat(reader.getLines(), contains( + "name1 =arg1", + "name2= arg2", + "name3 = arg3")); + } + + @Test + public void whenOptionHasEscapedColons_thenTheyGetUnescaped() { + writer.println("host1=example.com\\:8080"); + writer.println("host2=example.org:8080"); + writer.flush(); + + assertThat(reader.getLines(), contains( + "host1=example.com:8080", + "host2=example.org:8080")); + } + + @Test + public void whenFileContainsNonOptionLines_getOptionLinesReturnsOnlyOptionLines() { + writer.println("# Comment"); + writer.println(""); + writer.println("name1=arg1"); + writer.println("noArgOpt"); + writer.flush(); + + assertThat(reader.getOptionLines(), contains("name1=arg1", "noArgOpt")); + } +} diff --git a/common/src/test/java/bisq/common/config/ConfigTests.java b/common/src/test/java/bisq/common/config/ConfigTests.java new file mode 100644 index 0000000000..5ded1b5a54 --- /dev/null +++ b/common/src/test/java/bisq/common/config/ConfigTests.java @@ -0,0 +1,160 @@ +package bisq.common.config; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +import static bisq.common.config.Config.DEFAULT_CONFIG_FILE_NAME; +import static java.lang.String.format; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.Matchers.contains; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +public class ConfigTests { + + @Rule + public ExpectedException exceptionRule = ExpectedException.none(); + + // Note: "DataDirProperties" in the test method names below represent the group of + // configuration options that influence the location of a Bisq node's data directory. + // These options include appName, userDataDir, appDataDir, and configFile + + @Test + public void whenTestConfigNoArgCtorIsCalled_thenDefaultAppNameIsSetToRandomValue() { + Config config = new TestConfig(); + String defaultAppName = config.getDefaultAppName(); + String regex = "Bisq\\d{2,}Test"; + assertTrue(format("Test app name '%s' failed to match '%s'", defaultAppName, regex), + defaultAppName.matches(regex)); + } + + @Test + public void whenStringConstructorIsCalled_thenDefaultAppNamePropertyIsAssignedToItsValue() { + Config config = new Config("Custom-Bisq"); + assertThat(config.getDefaultAppName(), equalTo("Custom-Bisq")); + } + + @Test + public void whenAppNameOptionIsSet_thenAppNamePropertyDiffersFromDefaultAppNameProperty() { + Config config = new TestConfig("--appName=My-Bisq"); + assertThat(config.getAppName(), equalTo("My-Bisq")); + assertThat(config.getAppName(), not(equalTo(config.getDefaultAppName()))); + } + + @Test + public void whenNoOptionsAreSet_thenDataDirPropertiesEqualDefaultValues() { + Config config = new TestConfig(); + assertThat(config.getAppName(), equalTo(config.getDefaultAppName())); + assertThat(config.getUserDataDir(), equalTo(config.getDefaultUserDataDir())); + assertThat(config.getAppDataDir(), equalTo(config.getDefaultAppDataDir())); + assertThat(config.getConfigFile(), equalTo(config.getDefaultConfigFile())); + } + + @Test + public void whenAppNameOptionIsSet_thenDataDirPropertiesReflectItsValue() { + Config config = new TestConfig("--appName=My-Bisq"); + assertThat(config.getAppName(), equalTo("My-Bisq")); + assertThat(config.getUserDataDir(), equalTo(config.getDefaultUserDataDir())); + assertThat(config.getAppDataDir(), equalTo(new File(config.getUserDataDir(), "My-Bisq"))); + assertThat(config.getConfigFile(), equalTo(new File(config.getAppDataDir(), DEFAULT_CONFIG_FILE_NAME))); + } + + @Test + public void whenAppDataDirOptionIsSet_thenDataDirPropertiesReflectItsValue() { + Config config = new TestConfig("--appDataDir=/mydata/myapp"); + assertThat(config.getAppName(), equalTo(config.getDefaultAppName())); + assertThat(config.getUserDataDir(), equalTo(config.getDefaultUserDataDir())); + assertThat(config.getAppDataDir(), equalTo(new File("/mydata/myapp"))); + assertThat(config.getConfigFile(), equalTo(new File(config.getAppDataDir(), DEFAULT_CONFIG_FILE_NAME))); + } + + @Test + public void whenUserDataDirOptionIsSet_thenDataDirPropertiesReflectItsValue() { + Config config = new TestConfig("--userDataDir=/mydata"); + assertThat(config.getAppName(), equalTo(config.getDefaultAppName())); + assertThat(config.getUserDataDir(), equalTo(new File("/mydata"))); + assertThat(config.getAppDataDir(), equalTo(new File("/mydata", config.getDefaultAppName()))); + assertThat(config.getConfigFile(), equalTo(new File(config.getAppDataDir(), DEFAULT_CONFIG_FILE_NAME))); + } + + @Test + public void whenAppNameAndAppDataDirOptionsAreSet_thenDataDirPropertiesReflectTheirValues() { + Config config = new TestConfig("--appName=My-Bisq", "--appDataDir=/mydata/myapp"); + assertThat(config.getAppName(), equalTo("My-Bisq")); + assertThat(config.getUserDataDir(), equalTo(config.getDefaultUserDataDir())); + assertThat(config.getAppDataDir(), equalTo(new File("/mydata/myapp"))); + assertThat(config.getConfigFile(), equalTo(new File(config.getAppDataDir(), DEFAULT_CONFIG_FILE_NAME))); + } + + @Test + public void whenConfFileOptionIsSetToNonExistentFile_thenConfFilePropertyFallsBackToDefaultValue() { + Config config = new TestConfig("--configFile=/tmp/bogus.properties"); + assertThat(config.getConfigFile(), equalTo(new File(config.getAppDataDir(), DEFAULT_CONFIG_FILE_NAME))); + } + + @Test + public void whenOptionIsSetAtCommandLineAndInConfigFile_thenCommandLineValueTakesPrecedence() throws IOException { + File configFile = File.createTempFile("bisq", "properties"); + try (PrintWriter writer = new PrintWriter(configFile)) { + writer.println("appName=Bisq-configFileValue"); + } + Config config = new TestConfig("--appName=Bisq-commandLineValue"); + assertThat(config.getAppName(), equalTo("Bisq-commandLineValue")); + } + + @Test + public void whenOptionFileArgumentDoesNotExist_thenThrowConfigException() { + exceptionRule.expect(ConfigException.class); + exceptionRule.expectMessage("problem parsing option 'torrcFile': File [/does/not/exist] does not exist"); + new TestConfig("--torrcFile=/does/not/exist"); + } + + @Test + public void whenConfigFileOptionIsSetInConfigFile_thenDisallowedOptionExceptionisThrown() throws IOException { + File configFile = File.createTempFile("bisq", "properties"); + try (PrintWriter writer = new PrintWriter(configFile)) { + writer.println("configFile=/tmp/other.bisq.properties"); + } + exceptionRule.expect(IllegalArgumentException.class); + exceptionRule.expectMessage("The 'configFile' option is disallowed in config files"); + new TestConfig("--configFile=" + configFile.getAbsolutePath()); + } + + @Test + public void whenConfigFileOptionIsSetToExistingFile_thenConfigFilePropertyReflectsItsValue() throws IOException { + File configFile = File.createTempFile("bisq", "properties"); + Config config = new TestConfig("--configFile=" + configFile.getAbsolutePath()); + assertThat(config.getConfigFile(), equalTo(configFile)); + } + + @Test + public void whenAppNameIsSetInConfigFile_thenDataDirPropertiesReflectItsValue() throws IOException { + File configFile = File.createTempFile("bisq", "properties"); + try (PrintWriter writer = new PrintWriter(configFile)) { + writer.println("appName=My-Bisq"); + } + Config config = new TestConfig("--configFile=" + configFile.getAbsolutePath()); + assertThat(config.getAppName(), equalTo("My-Bisq")); + assertThat(config.getUserDataDir(), equalTo(config.getDefaultUserDataDir())); + assertThat(config.getAppDataDir(), equalTo(new File(config.getUserDataDir(), config.getAppName()))); + assertThat(config.getConfigFile(), equalTo(configFile)); + } + + @Test + public void whenBannedBtcNodesOptionIsSet_thenBannedBtcNodesPropertyReturnsItsValue() { + Config config = new TestConfig("--bannedBtcNodes=foo.onion:8333,bar.onion:8333"); + assertThat(config.getBannedBtcNodes(), contains("foo.onion:8333", "bar.onion:8333")); + } + + @Test + public void whenHelpOptionIsSet_thenHelpRequestedIsThrown() { + exceptionRule.expect(HelpRequested.class); + new TestConfig("--help"); + } +} diff --git a/core/src/main/java/bisq/core/alert/AlertModule.java b/core/src/main/java/bisq/core/alert/AlertModule.java index fb6fbd2f4e..88c93e88d4 100644 --- a/core/src/main/java/bisq/core/alert/AlertModule.java +++ b/core/src/main/java/bisq/core/alert/AlertModule.java @@ -20,6 +20,7 @@ package bisq.core.alert; import bisq.core.app.AppOptionKeys; import bisq.common.app.AppModule; +import bisq.common.config.Config; import org.springframework.core.env.Environment; @@ -28,8 +29,9 @@ import com.google.inject.Singleton; import static com.google.inject.name.Names.named; public class AlertModule extends AppModule { - public AlertModule(Environment environment) { - super(environment); + + public AlertModule(Environment environment, Config config) { + super(environment, config); } @Override diff --git a/core/src/main/java/bisq/core/app/AvoidStandbyModeService.java b/core/src/main/java/bisq/core/app/AvoidStandbyModeService.java index 48f7c8f4a6..69f89ba54d 100644 --- a/core/src/main/java/bisq/core/app/AvoidStandbyModeService.java +++ b/core/src/main/java/bisq/core/app/AvoidStandbyModeService.java @@ -19,6 +19,8 @@ package bisq.core.app; import bisq.core.user.Preferences; +import bisq.common.config.Config; + import javax.inject.Inject; import javax.inject.Singleton; @@ -43,12 +45,16 @@ import javax.sound.sampled.SourceDataLine; @Slf4j @Singleton public class AvoidStandbyModeService { + private final Preferences preferences; + private final Config config; + private volatile boolean isStopped; @Inject - public AvoidStandbyModeService(Preferences preferences) { + public AvoidStandbyModeService(Preferences preferences, Config config) { this.preferences = preferences; + this.config = config; preferences.getUseStandbyModeProperty().addListener((observable, oldValue, newValue) -> { if (newValue) { @@ -80,7 +86,7 @@ public class AvoidStandbyModeService { InputStream inputStream = null; try { inputStream = getClass().getClassLoader().getResourceAsStream("prevent-app-nap-silent-sound.aiff"); - File soundFile = new File(BisqEnvironment.getStaticAppDataDir(), "prevent-app-nap-silent-sound.aiff"); + File soundFile = new File(config.getAppDataDir(), "prevent-app-nap-silent-sound.aiff"); if (!soundFile.exists()) { outputStream = new FileOutputStream(soundFile); IOUtils.copy(inputStream, outputStream); diff --git a/core/src/main/java/bisq/core/app/BisqEnvironment.java b/core/src/main/java/bisq/core/app/BisqEnvironment.java index de8decf27d..ac3abeec9f 100644 --- a/core/src/main/java/bisq/core/app/BisqEnvironment.java +++ b/core/src/main/java/bisq/core/app/BisqEnvironment.java @@ -17,25 +17,21 @@ package bisq.core.app; -import bisq.core.btc.BaseCurrencyNetwork; import bisq.core.btc.BtcOptionKeys; import bisq.core.btc.UserAgent; import bisq.core.dao.DaoOptionKeys; -import bisq.core.exceptions.BisqException; -import bisq.core.filter.FilterManager; import bisq.network.NetworkOptionKeys; import bisq.network.p2p.network.ConnectionConfig; +import bisq.common.BisqException; import bisq.common.CommonOptionKeys; import bisq.common.app.Version; +import bisq.common.config.BaseCurrencyNetwork; import bisq.common.crypto.KeyStorage; import bisq.common.storage.Storage; import bisq.common.util.Utilities; -import org.bitcoinj.core.NetworkParameters; - -import org.springframework.core.env.Environment; import org.springframework.core.env.JOptCommandLinePropertySource; import org.springframework.core.env.MutablePropertySources; import org.springframework.core.env.PropertiesPropertySource; @@ -48,19 +44,13 @@ import org.springframework.core.io.support.ResourcePropertySource; import joptsimple.OptionSet; -import org.apache.commons.lang3.StringUtils; - import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; import java.util.Properties; import ch.qos.logback.classic.Level; @@ -69,8 +59,6 @@ import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; -import javax.annotation.Nullable; - import static com.google.common.base.Preconditions.checkNotNull; @Slf4j @@ -80,11 +68,7 @@ public class BisqEnvironment extends StandardEnvironment { // Static /////////////////////////////////////////////////////////////////////////////////////////// - public static void setDefaultAppName(String defaultAppName) { - DEFAULT_APP_NAME = defaultAppName; - } - - public static String DEFAULT_APP_NAME = "Bisq"; + static final String DEFAULT_APP_NAME = "Bisq"; public static final String DEFAULT_USER_DATA_DIR = defaultUserDataDir(); public static final String DEFAULT_APP_DATA_DIR = appDataDir(DEFAULT_USER_DATA_DIR, DEFAULT_APP_NAME); @@ -95,27 +79,6 @@ public class BisqEnvironment extends StandardEnvironment { public static final String BISQ_APP_DIR_PROPERTY_SOURCE_NAME = "bisqAppDirProperties"; public static final String BISQ_DEFAULT_PROPERTY_SOURCE_NAME = "bisqDefaultProperties"; - private static String staticAppDataDir; - - public static String getStaticAppDataDir() { - return staticAppDataDir; - } - - @SuppressWarnings("SameReturnValue") - public static BaseCurrencyNetwork getDefaultBaseCurrencyNetwork() { - return BaseCurrencyNetwork.BTC_MAINNET; - } - - protected static BaseCurrencyNetwork baseCurrencyNetwork = getDefaultBaseCurrencyNetwork(); - - public static NetworkParameters getParameters() { - return getBaseCurrencyNetwork().getParameters(); - } - - public static BaseCurrencyNetwork getBaseCurrencyNetwork() { - return baseCurrencyNetwork; - } - private static String defaultUserDataDir() { if (Utilities.isWindows()) return System.getenv("APPDATA"); @@ -161,14 +124,6 @@ public class BisqEnvironment extends StandardEnvironment { return Paths.get(userDataDir, appName).toString(); } - // Util to set isDaoActivated to true if either set as program argument or we run testnet or regtest. - // Can be removed once DAO is live. - public static boolean isDaoActivated(Environment environment) { - Boolean daoActivatedFromOptions = environment.getProperty(DaoOptionKeys.DAO_ACTIVATED, Boolean.class, true); - BaseCurrencyNetwork baseCurrencyNetwork = BisqEnvironment.getBaseCurrencyNetwork(); - return daoActivatedFromOptions || !baseCurrencyNetwork.isMainnet(); - } - /////////////////////////////////////////////////////////////////////////////////////////// // Instance fields @@ -185,8 +140,6 @@ public class BisqEnvironment extends StandardEnvironment { @Getter @Setter protected boolean isBitcoinLocalhostNodeRunning; - @Getter - protected List bannedSeedNodes, bannedBtcNodes, bannedPriceRelayNodes; protected final String btcNodes, seedNodes, ignoreDevMsg, useDevPrivilegeKeys, useDevMode, useTorForBtc, rpcUser, rpcPassword, rpcHost, rpcPort, rpcBlockNotificationPort, rpcBlockNotificationHost, dumpBlockchainData, fullDaoNode, @@ -215,7 +168,6 @@ public class BisqEnvironment extends StandardEnvironment { userDataDir = getProperty(commandLineProperties, AppOptionKeys.USER_DATA_DIR_KEY, DEFAULT_USER_DATA_DIR); appName = getProperty(commandLineProperties, AppOptionKeys.APP_NAME_KEY, DEFAULT_APP_NAME); appDataDir = getProperty(commandLineProperties, AppOptionKeys.APP_DATA_DIR_KEY, appDataDir(userDataDir, appName)); - staticAppDataDir = appDataDir; ignoreDevMsg = getProperty(commandLineProperties, AppOptionKeys.IGNORE_DEV_MSG_KEY, ""); useDevPrivilegeKeys = getProperty(commandLineProperties, AppOptionKeys.USE_DEV_PRIVILEGE_KEYS, ""); @@ -271,14 +223,11 @@ public class BisqEnvironment extends StandardEnvironment { try { propertySources.addLast(getAppDirProperties()); - bannedPriceRelayNodes = getListProperty(FilterManager.BANNED_PRICE_RELAY_NODES, null); - bannedSeedNodes = getListProperty(FilterManager.BANNED_SEED_NODES, new ArrayList<>()); - bannedBtcNodes = getListProperty(FilterManager.BANNED_BTC_NODES, null); + BaseCurrencyNetwork.CURRENT_NETWORK = BaseCurrencyNetwork.valueOf(getProperty(BtcOptionKeys.BASE_CURRENCY_NETWORK, + BaseCurrencyNetwork.BTC_MAINNET.name()).toUpperCase()); + BaseCurrencyNetwork.CURRENT_PARAMETERS = BaseCurrencyNetwork.CURRENT_NETWORK.getParameters(); - baseCurrencyNetwork = BaseCurrencyNetwork.valueOf(getProperty(BtcOptionKeys.BASE_CURRENCY_NETWORK, - getDefaultBaseCurrencyNetwork().name()).toUpperCase()); - - btcNetworkDir = Paths.get(appDataDir, baseCurrencyNetwork.name().toLowerCase()).toString(); + btcNetworkDir = Paths.get(appDataDir, BaseCurrencyNetwork.CURRENT_NETWORK.name().toLowerCase()).toString(); File btcNetworkDirFile = new File(btcNetworkDir); if (!btcNetworkDirFile.exists()) //noinspection ResultOfMethodCallIgnored @@ -291,58 +240,6 @@ public class BisqEnvironment extends StandardEnvironment { } } - public void saveBaseCryptoNetwork(BaseCurrencyNetwork baseCurrencyNetwork) { - BisqEnvironment.baseCurrencyNetwork = baseCurrencyNetwork; - setProperty(BtcOptionKeys.BASE_CURRENCY_NETWORK, baseCurrencyNetwork.name()); - } - - public void saveBannedSeedNodes(@Nullable List bannedNodes) { - setProperty(FilterManager.BANNED_SEED_NODES, bannedNodes == null ? "" : String.join(",", bannedNodes)); - } - - public void saveBannedBtcNodes(@Nullable List bannedNodes) { - setProperty(FilterManager.BANNED_BTC_NODES, bannedNodes == null ? "" : String.join(",", bannedNodes)); - } - - public void saveBannedPriceRelayNodes(@Nullable List bannedNodes) { - setProperty(FilterManager.BANNED_PRICE_RELAY_NODES, bannedNodes == null ? "" : String.join(",", bannedNodes)); - } - - protected void setProperty(String key, String value) { - try { - Resource resource = getAppDirPropertiesResource(); - File file = resource.getFile(); - Properties properties = new Properties(); - if (file.exists()) { - Object propertiesObject = getAppDirProperties().getSource(); - if (propertiesObject instanceof Properties) { - properties = (Properties) propertiesObject; - } else { - log.warn("propertiesObject not instance of Properties"); - } - } - - if (!value.isEmpty()) - properties.setProperty(key, value); - else - properties.remove(key); - - log.debug("properties=" + properties); - - try (FileOutputStream fileOutputStream = new FileOutputStream(file)) { - properties.store(fileOutputStream, null); - } catch (IOException e1) { - log.error(e1.toString()); - e1.printStackTrace(); - throw new RuntimeException(e1); - } - } catch (Exception e2) { - log.error(e2.toString()); - e2.printStackTrace(); - throw new RuntimeException(e2); - } - } - private Resource getAppDirPropertiesResource() { String location = String.format("file:%s/bisq.properties", appDataDir); return resourceLoader.getResource(location); @@ -361,11 +258,6 @@ public class BisqEnvironment extends StandardEnvironment { return properties.containsProperty(propertyKey) ? (String) properties.getProperty(propertyKey) : defaultValue; } - private List getListProperty(String key, List defaultValue) { - final String value = getProperty(key, ""); - return value.isEmpty() ? defaultValue : Arrays.asList(StringUtils.deleteWhitespace(value).split(",")); - } - private PropertySource defaultProperties() { return new PropertiesPropertySource(BISQ_DEFAULT_PROPERTY_SOURCE_NAME, new Properties() { { @@ -375,7 +267,7 @@ public class BisqEnvironment extends StandardEnvironment { setProperty(NetworkOptionKeys.SEED_NODES_KEY, seedNodes); setProperty(NetworkOptionKeys.BAN_LIST, banList); setProperty(NetworkOptionKeys.TOR_DIR, Paths.get(btcNetworkDir, "tor").toString()); - setProperty(NetworkOptionKeys.NETWORK_ID, String.valueOf(baseCurrencyNetwork.ordinal())); + setProperty(NetworkOptionKeys.NETWORK_ID, String.valueOf(BaseCurrencyNetwork.CURRENT_NETWORK.ordinal())); setProperty(NetworkOptionKeys.SOCKS_5_PROXY_BTC_ADDRESS, socks5ProxyBtcAddress); setProperty(NetworkOptionKeys.SOCKS_5_PROXY_HTTP_ADDRESS, socks5ProxyHttpAddress); setProperty(NetworkOptionKeys.TORRC_FILE, torRcFile); diff --git a/core/src/main/java/bisq/core/app/BisqExecutable.java b/core/src/main/java/bisq/core/app/BisqExecutable.java index 8dd905bc06..0775058f38 100644 --- a/core/src/main/java/bisq/core/app/BisqExecutable.java +++ b/core/src/main/java/bisq/core/app/BisqExecutable.java @@ -24,7 +24,6 @@ import bisq.core.btc.wallet.BsqWalletService; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.dao.DaoOptionKeys; import bisq.core.dao.DaoSetup; -import bisq.core.exceptions.BisqException; import bisq.core.offer.OpenOfferManager; import bisq.core.setup.CorePersistedDataHost; import bisq.core.setup.CoreSetup; @@ -35,10 +34,16 @@ import bisq.network.NetworkOptionKeys; import bisq.network.p2p.P2PService; import bisq.network.p2p.network.ConnectionConfig; +import bisq.common.BisqException; import bisq.common.CommonOptionKeys; import bisq.common.UserThread; import bisq.common.app.AppModule; import bisq.common.app.DevEnv; +import bisq.common.config.BaseCurrencyNetwork; +import bisq.common.config.BisqHelpFormatter; +import bisq.common.config.Config; +import bisq.common.config.ConfigException; +import bisq.common.config.HelpRequested; import bisq.common.handlers.ResultHandler; import bisq.common.proto.persistable.PersistedDataHost; import bisq.common.setup.GracefulShutDownHandler; @@ -59,70 +64,55 @@ import com.google.inject.name.Names; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; +import java.io.File; import java.io.IOException; import lombok.extern.slf4j.Slf4j; -import static bisq.core.app.BisqEnvironment.DEFAULT_APP_NAME; -import static bisq.core.app.BisqEnvironment.DEFAULT_USER_DATA_DIR; -import static bisq.core.btc.BaseCurrencyNetwork.*; +import static bisq.common.config.BaseCurrencyNetwork.*; +import static bisq.core.app.BisqEnvironment.BISQ_COMMANDLINE_PROPERTY_SOURCE_NAME; import static com.google.common.base.Preconditions.checkNotNull; import static java.lang.String.format; @Slf4j public abstract class BisqExecutable implements GracefulShutDownHandler, BisqSetup.BisqSetupListener { + private static final int EXIT_SUCCESS = 0; + private static final int EXIT_FAILURE = 1; + private static final String HELP_KEY = "help"; + private final String fullName; private final String scriptName; + private final String appName; private final String version; protected Injector injector; protected AppModule module; protected BisqEnvironment bisqEnvironment; + protected Config config; - public BisqExecutable(String fullName, String scriptName, String version) { + public BisqExecutable(String fullName, String scriptName, String appName, String version) { this.fullName = fullName; this.scriptName = scriptName; + this.appName = appName; this.version = version; } - public static boolean setupInitialOptionParser(String[] args) throws IOException { - // We don't want to do the full argument parsing here as that might easily change in update versions - // So we only handle the absolute minimum which is APP_NAME, APP_DATA_DIR_KEY and USER_DATA_DIR - OptionParser parser = new OptionParser(); - parser.allowsUnrecognizedOptions(); + public void execute(String[] args) throws Exception { - parser.accepts(AppOptionKeys.USER_DATA_DIR_KEY, - format("User data directory (default: %s)", DEFAULT_USER_DATA_DIR)) - .withRequiredArg(); - - parser.accepts(AppOptionKeys.APP_NAME_KEY, - format("Application name (default: %s)", DEFAULT_APP_NAME)) - .withRequiredArg(); - - OptionSet options; try { - options = parser.parse(args); - } catch (OptionException ex) { + config = new Config(appName, args); + } catch (HelpRequested helpRequested) { + helpRequested.printHelp(System.out, new BisqHelpFormatter(fullName, scriptName, version)); + System.exit(EXIT_SUCCESS); + } catch (ConfigException ex) { System.err.println("error: " + ex.getMessage()); System.exit(EXIT_FAILURE); - return false; } - BisqEnvironment bisqEnvironment = getBisqEnvironment(options); - // need to call that before BisqAppMain().execute(args) - BisqExecutable.initAppDir(bisqEnvironment.getProperty(AppOptionKeys.APP_DATA_DIR_KEY)); - return true; - } + initAppDir(config.getAppDataDir()); - - private static final int EXIT_SUCCESS = 0; - public static final int EXIT_FAILURE = 1; - private static final String HELP_KEY = "help"; - - public void execute(String[] args) throws Exception { OptionParser parser = new OptionParser(); parser.formatHelpWith(new BisqHelpFormatter(fullName, scriptName, version)); parser.accepts(HELP_KEY, "This help text").forHelp(); @@ -151,9 +141,10 @@ public abstract class BisqExecutable implements GracefulShutDownHandler, BisqSet /////////////////////////////////////////////////////////////////////////////////////////// protected void doExecute(OptionSet options) { - setupEnvironment(options); + bisqEnvironment = new BisqEnvironment( + new JOptCommandLinePropertySource(BISQ_COMMANDLINE_PROPERTY_SOURCE_NAME, checkNotNull(options))); configUserThread(); - configCoreSetup(options); + CoreSetup.setup(config); addCapabilities(); // If application is JavaFX application we need to wait until it is initialized @@ -162,36 +153,6 @@ public abstract class BisqExecutable implements GracefulShutDownHandler, BisqSet protected abstract void configUserThread(); - protected void setupEnvironment(OptionSet options) { - /* - * JOptSimple does support input parsing. However, doing only options = parser.parse(args) isn't enough to trigger the parsing. - * The parsing is done when the actual value is going to be retrieved, i.e. options.valueOf(attributename). - * - * In order to keep usability high, we work around the aforementioned characteristics by catching the exception below - * (valueOf is called somewhere in getBisqEnvironment), thus, neatly inform the user of an ill-formed parameter and stop execution. - * - * Might be changed when the project features more user parameters meant for the user. - */ - try { - bisqEnvironment = getBisqEnvironment(options); - } catch (OptionException e) { - // unfortunately, the OptionArgumentConversionException is not visible so we cannot catch only those. - // hence, workaround - if (e.getCause() != null) - // get something like "Error while parsing application parameter '--torrcFile': File [/path/to/file] does not exist" - System.err.println("Error while parsing application parameter '--" + e.options().get(0) + "': " + e.getCause().getMessage()); - else - System.err.println("Error while parsing application parameter '--" + e.options().get(0)); - - // we only tried to load some config until now, so no graceful shutdown is required - System.exit(1); - } - } - - protected void configCoreSetup(OptionSet options) { - CoreSetup.setup(getBisqEnvironment(options)); - } - protected void addCapabilities() { } @@ -235,7 +196,7 @@ public abstract class BisqExecutable implements GracefulShutDownHandler, BisqSet protected void setupDevEnv() { DevEnv.setDevMode(injector.getInstance(Key.get(Boolean.class, Names.named(CommonOptionKeys.USE_DEV_MODE)))); - DevEnv.setDaoActivated(BisqEnvironment.isDaoActivated(bisqEnvironment)); + DevEnv.setDaoActivated(config.isDaoActivated()); } protected void setupPersistedDataHosts(Injector injector) { @@ -474,7 +435,7 @@ public abstract class BisqExecutable implements GracefulShutDownHandler, BisqSet //BtcOptionKeys parser.accepts(BtcOptionKeys.BASE_CURRENCY_NETWORK, - format("Base currency network (default: %s)", BisqEnvironment.getDefaultBaseCurrencyNetwork().name())) + format("Base currency network (default: %s)", BTC_MAINNET.name())) .withRequiredArg() .ofType(String.class) .describedAs(format("%s|%s|%s|%s", BTC_MAINNET, BTC_TESTNET, BTC_REGTEST, BTC_DAO_TESTNET, BTC_DAO_BETANET, BTC_DAO_REGTEST)); @@ -570,12 +531,8 @@ public abstract class BisqExecutable implements GracefulShutDownHandler, BisqSet .ofType(boolean.class); } - public static BisqEnvironment getBisqEnvironment(OptionSet options) { - return new BisqEnvironment(new JOptCommandLinePropertySource(BisqEnvironment.BISQ_COMMANDLINE_PROPERTY_SOURCE_NAME, checkNotNull(options))); - } - - public static void initAppDir(String appDir) { - Path dir = Paths.get(appDir); + private void initAppDir(File appDataDir) { + Path dir = appDataDir.toPath(); if (Files.exists(dir)) { if (!Files.isWritable(dir)) throw new BisqException("Application data directory '%s' is not writeable", dir); diff --git a/core/src/main/java/bisq/core/app/BisqHeadlessAppMain.java b/core/src/main/java/bisq/core/app/BisqHeadlessAppMain.java index e3fe211572..65986914eb 100644 --- a/core/src/main/java/bisq/core/app/BisqHeadlessAppMain.java +++ b/core/src/main/java/bisq/core/app/BisqHeadlessAppMain.java @@ -36,17 +36,17 @@ public class BisqHeadlessAppMain extends BisqExecutable { protected HeadlessApp headlessApp; public BisqHeadlessAppMain() { - super("Bisq Daemon", "bisqd", Version.VERSION); + super("Bisq Daemon", "bisqd", "Bisq", Version.VERSION); } public static void main(String[] args) throws Exception { - if (BisqExecutable.setupInitialOptionParser(args)) { - // For some reason the JavaFX launch process results in us losing the thread context class loader: reset it. - // In order to work around a bug in JavaFX 8u25 and below, you must include the following code as the first line of your realMain method: - Thread.currentThread().setContextClassLoader(BisqHeadlessAppMain.class.getClassLoader()); + // For some reason the JavaFX launch process results in us losing the thread + // context class loader: reset it. In order to work around a bug in JavaFX 8u25 + // and below, you must include the following code as the first line of your + // realMain method: + Thread.currentThread().setContextClassLoader(BisqHeadlessAppMain.class.getClassLoader()); - new BisqHeadlessAppMain().execute(args); - } + new BisqHeadlessAppMain().execute(args); } @Override @@ -95,7 +95,7 @@ public class BisqHeadlessAppMain extends BisqExecutable { @Override protected AppModule getModule() { - return new CoreModule(bisqEnvironment); + return new CoreModule(bisqEnvironment, config); } @Override diff --git a/core/src/main/java/bisq/core/app/BisqSetup.java b/core/src/main/java/bisq/core/app/BisqSetup.java index aefa89e9f7..eea4457188 100644 --- a/core/src/main/java/bisq/core/app/BisqSetup.java +++ b/core/src/main/java/bisq/core/app/BisqSetup.java @@ -75,6 +75,8 @@ import bisq.common.Timer; import bisq.common.UserThread; import bisq.common.app.DevEnv; import bisq.common.app.Log; +import bisq.common.config.BaseCurrencyNetwork; +import bisq.common.config.Config; import bisq.common.crypto.CryptoException; import bisq.common.crypto.KeyRing; import bisq.common.crypto.SealedAndSigned; @@ -175,7 +177,7 @@ public class BisqSetup { private final UnconfirmedBsqChangeOutputListService unconfirmedBsqChangeOutputListService; private final EncryptionService encryptionService; private final KeyRing keyRing; - private final BisqEnvironment bisqEnvironment; + private final Config config; private final AccountAgeWitnessService accountAgeWitnessService; private final SignedWitnessService signedWitnessService; private final MobileNotificationService mobileNotificationService; @@ -265,7 +267,7 @@ public class BisqSetup { UnconfirmedBsqChangeOutputListService unconfirmedBsqChangeOutputListService, EncryptionService encryptionService, KeyRing keyRing, - BisqEnvironment bisqEnvironment, + Config config, AccountAgeWitnessService accountAgeWitnessService, SignedWitnessService signedWitnessService, MobileNotificationService mobileNotificationService, @@ -312,7 +314,7 @@ public class BisqSetup { this.unconfirmedBsqChangeOutputListService = unconfirmedBsqChangeOutputListService; this.encryptionService = encryptionService; this.keyRing = keyRing; - this.bisqEnvironment = bisqEnvironment; + this.config = config; this.accountAgeWitnessService = accountAgeWitnessService; this.signedWitnessService = signedWitnessService; this.mobileNotificationService = mobileNotificationService; @@ -481,19 +483,19 @@ public class BisqSetup { } private void checkIfLocalHostNodeIsRunning() { + BaseCurrencyNetwork baseCurrencyNetwork = config.getBaseCurrencyNetwork(); // For DAO testnet we ignore local btc node - if (BisqEnvironment.getBaseCurrencyNetwork().isDaoRegTest() || - BisqEnvironment.getBaseCurrencyNetwork().isDaoTestNet() || - bisqEnvironment.isIgnoreLocalBtcNode()) { + if (baseCurrencyNetwork.isDaoRegTest() || baseCurrencyNetwork.isDaoTestNet() || + config.isIgnoreLocalBtcNode()) { step3(); } else { new Thread(() -> { try (Socket socket = new Socket()) { socket.connect(new InetSocketAddress(InetAddresses.forString("127.0.0.1"), - BisqEnvironment.getBaseCurrencyNetwork().getParameters().getPort()), 5000); + baseCurrencyNetwork.getParameters().getPort()), 5000); log.info("Localhost Bitcoin node detected."); UserThread.execute(() -> { - bisqEnvironment.setBitcoinLocalhostNodeRunning(true); + config.setLocalBitcoinNodeIsRunning(true); step3(); }); } catch (Throwable e) { @@ -504,7 +506,7 @@ public class BisqSetup { } private void readMapsFromResources() { - SetupUtils.readFromResources(p2PService.getP2PDataStorage()).addListener((observable, oldValue, newValue) -> { + SetupUtils.readFromResources(p2PService.getP2PDataStorage(), config).addListener((observable, oldValue, newValue) -> { if (newValue) step4(); }); @@ -570,7 +572,7 @@ public class BisqSetup { // We only init wallet service here if not using Tor for bitcoinj. // When using Tor, wallet init must be deferred until Tor is ready. - if (!preferences.getUseTorForBitcoinJ() || bisqEnvironment.isBitcoinLocalhostNodeRunning()) { + if (!preferences.getUseTorForBitcoinJ() || config.isLocalBitcoinNodeIsRunning()) { initWallet(); } @@ -873,7 +875,7 @@ public class BisqSetup { } private void maybeShowLocalhostRunningInfo() { - maybeTriggerDisplayHandler("bitcoinLocalhostNode", displayLocalhostHandler, bisqEnvironment.isBitcoinLocalhostNodeRunning()); + maybeTriggerDisplayHandler("bitcoinLocalhostNode", displayLocalhostHandler, config.isLocalBitcoinNodeIsRunning()); } private void maybeShowAccountSigningStateInfo() { diff --git a/core/src/main/java/bisq/core/app/CoreModule.java b/core/src/main/java/bisq/core/app/CoreModule.java index 431dc1555e..d9c0eae60d 100644 --- a/core/src/main/java/bisq/core/app/CoreModule.java +++ b/core/src/main/java/bisq/core/app/CoreModule.java @@ -19,6 +19,9 @@ package bisq.core.app; import bisq.core.alert.AlertModule; import bisq.core.btc.BitcoinModule; + +import bisq.common.config.BaseCurrencyNetwork; +import bisq.common.config.Config; import bisq.core.dao.DaoModule; import bisq.core.filter.FilterModule; import bisq.core.network.p2p.seed.DefaultSeedNodeRepository; @@ -56,13 +59,14 @@ import static com.google.inject.name.Names.named; public class CoreModule extends AppModule { - public CoreModule(Environment environment) { - super(environment); + public CoreModule(Environment environment, Config config) { + super(environment, config); } @Override protected void configure() { bind(BisqEnvironment.class).toInstance((BisqEnvironment) environment); + bind(Config.class).toInstance(config); bind(BridgeAddressProvider.class).to(Preferences.class); @@ -71,7 +75,7 @@ public class CoreModule extends AppModule { File storageDir = new File(environment.getRequiredProperty(Storage.STORAGE_DIR)); bind(File.class).annotatedWith(named(Storage.STORAGE_DIR)).toInstance(storageDir); - CoinFormatter btcFormatter = new ImmutableCoinFormatter(BisqEnvironment.getParameters().getMonetaryFormat()); + CoinFormatter btcFormatter = new ImmutableCoinFormatter(BaseCurrencyNetwork.CURRENT_PARAMETERS.getMonetaryFormat()); bind(CoinFormatter.class).annotatedWith(named(FormattingUtils.BTC_FORMATTER_KEY)).toInstance(btcFormatter); File keyStorageDir = new File(environment.getRequiredProperty(KeyStorage.KEY_STORAGE_DIR)); @@ -91,51 +95,15 @@ public class CoreModule extends AppModule { // ordering is used for shut down sequence - install(tradeModule()); - install(encryptionServiceModule()); - install(offerModule()); - install(p2pModule()); - install(bitcoinModule()); - install(daoModule()); - install(alertModule()); - install(filterModule()); - install(corePresentationModule()); + install(new TradeModule(environment, config)); + install(new EncryptionServiceModule(environment, config)); + install(new OfferModule(environment, config)); + install(new P2PModule(environment, config)); + install(new BitcoinModule(environment, config)); + install(new DaoModule(environment, config)); + install(new AlertModule(environment, config)); + install(new FilterModule(environment, config)); + install(new CorePresentationModule(environment, config)); bind(PubKeyRing.class).toProvider(PubKeyRingProvider.class); } - - private TradeModule tradeModule() { - return new TradeModule(environment); - } - - private EncryptionServiceModule encryptionServiceModule() { - return new EncryptionServiceModule(environment); - } - - private AlertModule alertModule() { - return new AlertModule(environment); - } - - private FilterModule filterModule() { - return new FilterModule(environment); - } - - private OfferModule offerModule() { - return new OfferModule(environment); - } - - private P2PModule p2pModule() { - return new P2PModule(environment); - } - - private BitcoinModule bitcoinModule() { - return new BitcoinModule(environment); - } - - private DaoModule daoModule() { - return new DaoModule(environment); - } - - private CorePresentationModule corePresentationModule() { - return new CorePresentationModule(environment); - } } diff --git a/core/src/main/java/bisq/core/app/SetupUtils.java b/core/src/main/java/bisq/core/app/SetupUtils.java index 3d2c7edd93..69ac7af5c7 100644 --- a/core/src/main/java/bisq/core/app/SetupUtils.java +++ b/core/src/main/java/bisq/core/app/SetupUtils.java @@ -17,7 +17,7 @@ package bisq.core.app; -import bisq.core.btc.BaseCurrencyNetwork; +import bisq.common.config.BaseCurrencyNetwork; import bisq.network.crypto.DecryptedDataTuple; import bisq.network.crypto.EncryptionService; @@ -25,6 +25,7 @@ import bisq.network.p2p.peers.keepalive.messages.Ping; import bisq.network.p2p.storage.P2PDataStorage; import bisq.common.UserThread; +import bisq.common.config.Config; import bisq.common.crypto.CryptoException; import bisq.common.crypto.KeyRing; import bisq.common.crypto.SealedAndSigned; @@ -75,11 +76,11 @@ public class SetupUtils { checkCryptoThread.start(); } - public static BooleanProperty readFromResources(P2PDataStorage p2PDataStorage) { + public static BooleanProperty readFromResources(P2PDataStorage p2PDataStorage, Config config) { BooleanProperty result = new SimpleBooleanProperty(); new Thread(() -> { // Used to load different files per base currency (EntryMap_BTC_MAINNET, EntryMap_LTC,...) - final BaseCurrencyNetwork baseCurrencyNetwork = BisqEnvironment.getBaseCurrencyNetwork(); + final BaseCurrencyNetwork baseCurrencyNetwork = config.getBaseCurrencyNetwork(); final String postFix = "_" + baseCurrencyNetwork.name(); long ts = new Date().getTime(); p2PDataStorage.readFromResources(postFix); diff --git a/core/src/main/java/bisq/core/app/WalletAppSetup.java b/core/src/main/java/bisq/core/app/WalletAppSetup.java index 7d2f291b4d..2a1b6e886b 100644 --- a/core/src/main/java/bisq/core/app/WalletAppSetup.java +++ b/core/src/main/java/bisq/core/app/WalletAppSetup.java @@ -25,6 +25,8 @@ import bisq.core.locale.Res; import bisq.core.user.Preferences; import bisq.core.util.FormattingUtils; +import bisq.common.config.Config; + import org.bitcoinj.core.VersionMessage; import org.bitcoinj.store.BlockStoreException; import org.bitcoinj.store.ChainFileLockedException; @@ -55,9 +57,10 @@ import javax.annotation.Nullable; @Slf4j @Singleton public class WalletAppSetup { + private final WalletsManager walletsManager; private final WalletsSetup walletsSetup; - private final BisqEnvironment bisqEnvironment; + private final Config config; private final Preferences preferences; @SuppressWarnings("FieldCanBeLocal") @@ -81,11 +84,11 @@ public class WalletAppSetup { @Inject public WalletAppSetup(WalletsManager walletsManager, WalletsSetup walletsSetup, - BisqEnvironment bisqEnvironment, + Config config, Preferences preferences) { this.walletsManager = walletsManager; this.walletsSetup = walletsSetup; - this.bisqEnvironment = bisqEnvironment; + this.config = config; this.preferences = preferences; this.useTorForBTC.set(preferences.getUseTorForBitcoinJ()); } @@ -182,12 +185,12 @@ public class WalletAppSetup { private String getBtcNetworkAsString() { String postFix; - if (bisqEnvironment.isBitcoinLocalhostNodeRunning()) + if (config.isIgnoreLocalBtcNode()) postFix = " " + Res.get("mainView.footer.localhostBitcoinNode"); else if (preferences.getUseTorForBitcoinJ()) postFix = " " + Res.get("mainView.footer.usingTor"); else postFix = ""; - return Res.get(BisqEnvironment.getBaseCurrencyNetwork().name()) + postFix; + return Res.get(config.getBaseCurrencyNetwork().name()) + postFix; } } diff --git a/core/src/main/java/bisq/core/app/misc/AppSetup.java b/core/src/main/java/bisq/core/app/misc/AppSetup.java index 308e611098..3607c270c1 100644 --- a/core/src/main/java/bisq/core/app/misc/AppSetup.java +++ b/core/src/main/java/bisq/core/app/misc/AppSetup.java @@ -17,12 +17,12 @@ package bisq.core.app.misc; -import bisq.core.app.BisqEnvironment; import bisq.core.app.SetupUtils; import bisq.network.crypto.EncryptionService; import bisq.common.app.Version; +import bisq.common.config.Config; import bisq.common.crypto.KeyRing; import javax.inject.Inject; @@ -33,15 +33,18 @@ import lombok.extern.slf4j.Slf4j; public abstract class AppSetup { protected final EncryptionService encryptionService; protected final KeyRing keyRing; + protected final Config config; @Inject public AppSetup(EncryptionService encryptionService, - KeyRing keyRing) { + KeyRing keyRing, + Config config) { // we need to reference it so the seed node stores tradeStatistics this.encryptionService = encryptionService; this.keyRing = keyRing; + this.config = config; - Version.setBaseCryptoNetworkId(BisqEnvironment.getBaseCurrencyNetwork().ordinal()); + Version.setBaseCryptoNetworkId(this.config.getBaseCurrencyNetwork().ordinal()); Version.printVersion(); } diff --git a/core/src/main/java/bisq/core/app/misc/AppSetupWithP2P.java b/core/src/main/java/bisq/core/app/misc/AppSetupWithP2P.java index 8c9d54e20b..78d5beaf90 100644 --- a/core/src/main/java/bisq/core/app/misc/AppSetupWithP2P.java +++ b/core/src/main/java/bisq/core/app/misc/AppSetupWithP2P.java @@ -31,6 +31,7 @@ import bisq.network.p2p.network.CloseConnectionReason; import bisq.network.p2p.network.Connection; import bisq.network.p2p.network.ConnectionListener; +import bisq.common.config.Config; import bisq.common.crypto.KeyRing; import bisq.common.proto.persistable.PersistedDataHost; @@ -62,8 +63,9 @@ public class AppSetupWithP2P extends AppSetup { AccountAgeWitnessService accountAgeWitnessService, SignedWitnessService signedWitnessService, FilterManager filterManager, - TorSetup torSetup) { - super(encryptionService, keyRing); + TorSetup torSetup, + Config config) { + super(encryptionService, keyRing, config); this.p2PService = p2PService; this.tradeStatisticsManager = tradeStatisticsManager; this.accountAgeWitnessService = accountAgeWitnessService; @@ -90,7 +92,7 @@ public class AppSetupWithP2P extends AppSetup { @Override protected void initBasicServices() { - SetupUtils.readFromResources(p2PService.getP2PDataStorage()).addListener((observable, oldValue, newValue) -> { + SetupUtils.readFromResources(p2PService.getP2PDataStorage(), config).addListener((observable, oldValue, newValue) -> { if (newValue) startInitP2PNetwork(); }); diff --git a/core/src/main/java/bisq/core/app/misc/AppSetupWithP2PAndDAO.java b/core/src/main/java/bisq/core/app/misc/AppSetupWithP2PAndDAO.java index 0b0bfa36bd..8d9272ec0b 100644 --- a/core/src/main/java/bisq/core/app/misc/AppSetupWithP2PAndDAO.java +++ b/core/src/main/java/bisq/core/app/misc/AppSetupWithP2PAndDAO.java @@ -20,7 +20,6 @@ package bisq.core.app.misc; import bisq.core.account.sign.SignedWitnessService; import bisq.core.account.witness.AccountAgeWitnessService; import bisq.core.app.TorSetup; -import bisq.core.dao.DaoOptionKeys; import bisq.core.dao.DaoSetup; import bisq.core.dao.governance.ballot.BallotListService; import bisq.core.dao.governance.blindvote.MyBlindVoteListService; @@ -34,10 +33,10 @@ import bisq.core.trade.statistics.TradeStatisticsManager; import bisq.network.crypto.EncryptionService; import bisq.network.p2p.P2PService; +import bisq.common.config.Config; import bisq.common.crypto.KeyRing; import javax.inject.Inject; -import javax.inject.Named; import lombok.extern.slf4j.Slf4j; @@ -61,7 +60,7 @@ public class AppSetupWithP2PAndDAO extends AppSetupWithP2P { MyReputationListService myReputationListService, MyProofOfBurnListService myProofOfBurnListService, TorSetup torSetup, - @Named(DaoOptionKeys.DAO_ACTIVATED) boolean daoActivated) { + Config config) { super(encryptionService, keyRing, p2PService, @@ -69,12 +68,13 @@ public class AppSetupWithP2PAndDAO extends AppSetupWithP2P { accountAgeWitnessService, signedWitnessService, filterManager, - torSetup); + torSetup, + config); this.daoSetup = daoSetup; // TODO Should be refactored/removed. In the meantime keep in sync with CorePersistedDataHost - if (daoActivated) { + if (config.isDaoActivated()) { persistedDataHosts.add(myVoteListService); persistedDataHosts.add(ballotListService); persistedDataHosts.add(myBlindVoteListService); diff --git a/core/src/main/java/bisq/core/app/misc/ExecutableForAppWithP2p.java b/core/src/main/java/bisq/core/app/misc/ExecutableForAppWithP2p.java index 783440b1b7..c57a9a0ada 100644 --- a/core/src/main/java/bisq/core/app/misc/ExecutableForAppWithP2p.java +++ b/core/src/main/java/bisq/core/app/misc/ExecutableForAppWithP2p.java @@ -29,6 +29,7 @@ import bisq.core.support.dispute.arbitration.arbitrator.ArbitratorManager; import bisq.network.p2p.P2PService; import bisq.common.UserThread; +import bisq.common.config.Config; import bisq.common.handlers.ResultHandler; import bisq.common.setup.GracefulShutDownHandler; import bisq.common.setup.UncaughtExceptionHandler; @@ -55,8 +56,8 @@ public abstract class ExecutableForAppWithP2p extends BisqExecutable implements private final long startTime = System.currentTimeMillis(); private static long maxMemory = MAX_MEMORY_MB_DEFAULT; - public ExecutableForAppWithP2p(String fullName, String scriptName, String version) { - super(fullName, scriptName, version); + public ExecutableForAppWithP2p(String fullName, String scriptName, String appName, String version) { + super(fullName, scriptName, appName, version); } @Override @@ -189,12 +190,12 @@ public abstract class ExecutableForAppWithP2p extends BisqExecutable implements }); } - protected void restart(BisqEnvironment bisqEnvironment, GracefulShutDownHandler gracefulShutDownHandler) { + protected void restart(Config config, GracefulShutDownHandler gracefulShutDownHandler) { stopped = true; gracefulShutDownHandler.gracefulShutDown(() -> { //noinspection finally try { - final String[] tokens = bisqEnvironment.getAppDataDir().split("_"); + final String[] tokens = config.getAppDataDir().getPath().split("_"); String logPath = "error_" + (tokens.length > 1 ? tokens[tokens.length - 2] : "") + ".log"; RestartUtil.restartApplication(logPath); } catch (IOException e) { diff --git a/core/src/main/java/bisq/core/app/misc/ModuleForAppWithP2p.java b/core/src/main/java/bisq/core/app/misc/ModuleForAppWithP2p.java index bf9050f271..c94e638a2e 100644 --- a/core/src/main/java/bisq/core/app/misc/ModuleForAppWithP2p.java +++ b/core/src/main/java/bisq/core/app/misc/ModuleForAppWithP2p.java @@ -40,6 +40,7 @@ import bisq.network.p2p.seed.SeedNodeRepository; import bisq.common.ClockWatcher; import bisq.common.CommonOptionKeys; import bisq.common.app.AppModule; +import bisq.common.config.Config; import bisq.common.crypto.KeyRing; import bisq.common.crypto.KeyStorage; import bisq.common.crypto.PubKeyRing; @@ -59,13 +60,14 @@ import static com.google.inject.name.Names.named; public class ModuleForAppWithP2p extends AppModule { - public ModuleForAppWithP2p(Environment environment) { - super(environment); + public ModuleForAppWithP2p(Environment environment, Config config) { + super(environment, config); } @Override protected void configure() { - configEnvironment(); + bind(BisqEnvironment.class).toInstance((BisqEnvironment) environment); + bind(Config.class).toInstance(config); bind(KeyStorage.class).in(Singleton.class); bind(KeyRing.class).in(Singleton.class); @@ -95,51 +97,14 @@ public class ModuleForAppWithP2p extends AppModule { bind(String.class).annotatedWith(Names.named(AppOptionKeys.REFERRAL_ID)).toInstance(referralId); // ordering is used for shut down sequence - install(tradeModule()); - install(encryptionServiceModule()); - install(offerModule()); - install(p2pModule()); - install(bitcoinModule()); - install(daoModule()); - install(alertModule()); - install(filterModule()); + install(new TradeModule(environment, config)); + install(new EncryptionServiceModule(environment, config)); + install(new OfferModule(environment, config)); + install(new P2PModule(environment, config)); + install(new BitcoinModule(environment, config)); + install(new DaoModule(environment, config)); + install(new AlertModule(environment, config)); + install(new FilterModule(environment, config)); bind(PubKeyRing.class).toProvider(PubKeyRingProvider.class); - - } - - protected void configEnvironment() { - bind(BisqEnvironment.class).toInstance((BisqEnvironment) environment); - } - - protected TradeModule tradeModule() { - return new TradeModule(environment); - } - - protected EncryptionServiceModule encryptionServiceModule() { - return new EncryptionServiceModule(environment); - } - - protected AlertModule alertModule() { - return new AlertModule(environment); - } - - protected FilterModule filterModule() { - return new FilterModule(environment); - } - - protected OfferModule offerModule() { - return new OfferModule(environment); - } - - protected P2PModule p2pModule() { - return new P2PModule(environment); - } - - protected BitcoinModule bitcoinModule() { - return new BitcoinModule(environment); - } - - protected DaoModule daoModule() { - return new DaoModule(environment); } } diff --git a/core/src/main/java/bisq/core/btc/BitcoinModule.java b/core/src/main/java/bisq/core/btc/BitcoinModule.java index 2c1f8ce2df..e66601b2c4 100644 --- a/core/src/main/java/bisq/core/btc/BitcoinModule.java +++ b/core/src/main/java/bisq/core/btc/BitcoinModule.java @@ -18,7 +18,6 @@ package bisq.core.btc; import bisq.core.app.AppOptionKeys; -import bisq.core.app.BisqEnvironment; import bisq.core.btc.model.AddressEntryList; import bisq.core.btc.nodes.BtcNodes; import bisq.core.btc.setup.RegTestHost; @@ -35,6 +34,7 @@ import bisq.core.provider.fee.FeeService; import bisq.core.provider.price.PriceFeedService; import bisq.common.app.AppModule; +import bisq.common.config.Config; import org.springframework.core.env.Environment; @@ -48,19 +48,20 @@ import java.util.Arrays; import static com.google.inject.name.Names.named; public class BitcoinModule extends AppModule { - public BitcoinModule(Environment environment) { - super(environment); + + public BitcoinModule(Environment environment, Config config) { + super(environment, config); } @Override protected void configure() { // If we have selected BTC_DAO_REGTEST or BTC_DAO_TESTNET we use our master regtest node, // otherwise the specified host or default (localhost) - String regTestHost = environment.getProperty(BtcOptionKeys.REG_TEST_HOST, String.class, ""); + String regTestHost = config.getBitcoinRegtestHost(); if (regTestHost.isEmpty()) { - regTestHost = BisqEnvironment.getBaseCurrencyNetwork().isDaoTestNet() ? + regTestHost = config.getBaseCurrencyNetwork().isDaoTestNet() ? "104.248.31.39" : - BisqEnvironment.getBaseCurrencyNetwork().isDaoRegTest() ? + config.getBaseCurrencyNetwork().isDaoRegTest() ? "134.209.242.206" : RegTestHost.DEFAULT_HOST; } diff --git a/core/src/main/java/bisq/core/btc/model/AddressEntry.java b/core/src/main/java/bisq/core/btc/model/AddressEntry.java index 3d0acb1256..bd6ab6dc97 100644 --- a/core/src/main/java/bisq/core/btc/model/AddressEntry.java +++ b/core/src/main/java/bisq/core/btc/model/AddressEntry.java @@ -17,8 +17,7 @@ package bisq.core.btc.model; -import bisq.core.app.BisqEnvironment; - +import bisq.common.config.BaseCurrencyNetwork; import bisq.common.proto.ProtoUtil; import bisq.common.proto.persistable.PersistablePayload; import bisq.common.util.Utilities; @@ -175,7 +174,7 @@ public final class AddressEntry implements PersistablePayload { @Nullable public Address getAddress() { if (address == null && keyPair != null) - address = keyPair.toAddress(BisqEnvironment.getParameters()); + address = keyPair.toAddress(BaseCurrencyNetwork.CURRENT_PARAMETERS); return address; } diff --git a/core/src/main/java/bisq/core/btc/nodes/BtcNetworkConfig.java b/core/src/main/java/bisq/core/btc/nodes/BtcNetworkConfig.java index 7600808a32..28e711834d 100644 --- a/core/src/main/java/bisq/core/btc/nodes/BtcNetworkConfig.java +++ b/core/src/main/java/bisq/core/btc/nodes/BtcNetworkConfig.java @@ -17,11 +17,12 @@ package bisq.core.btc.nodes; -import bisq.core.app.BisqEnvironment; import bisq.core.btc.setup.WalletConfig; import bisq.network.Socks5MultiDiscovery; +import bisq.common.config.BaseCurrencyNetwork; + import org.bitcoinj.core.NetworkParameters; import org.bitcoinj.core.PeerAddress; import org.bitcoinj.params.MainNetParams; @@ -68,7 +69,7 @@ public class BtcNetworkConfig { } // SeedPeers uses hard coded stable addresses (from MainNetParams). It should be updated from time to time. delegate.setDiscovery(new Socks5MultiDiscovery(proxy, parameters, socks5DiscoverMode)); - } else if (BisqEnvironment.getBaseCurrencyNetwork().isMainnet()) { + } else if (BaseCurrencyNetwork.CURRENT_NETWORK.isMainnet()) { log.warn("You don't use tor and use the public Bitcoin network and are exposed to privacy issues " + "caused by the broken bloom filters. See https://bisq.network/blog/privacy-in-bitsquare/ " + "for more info. It is recommended to use Tor and the provided nodes."); diff --git a/core/src/main/java/bisq/core/btc/nodes/BtcNodes.java b/core/src/main/java/bisq/core/btc/nodes/BtcNodes.java index bfc7c5a57a..1d658ff319 100644 --- a/core/src/main/java/bisq/core/btc/nodes/BtcNodes.java +++ b/core/src/main/java/bisq/core/btc/nodes/BtcNodes.java @@ -17,7 +17,7 @@ package bisq.core.btc.nodes; -import bisq.core.app.BisqEnvironment; +import bisq.common.config.BaseCurrencyNetwork; import java.util.ArrayList; import java.util.Arrays; @@ -87,7 +87,7 @@ public class BtcNodes { } public boolean useProvidedBtcNodes() { - return BisqEnvironment.getBaseCurrencyNetwork().isMainnet(); + return BaseCurrencyNetwork.CURRENT_NETWORK.isMainnet(); } public static List toBtcNodesList(Collection nodes) { @@ -100,7 +100,7 @@ public class BtcNodes { @EqualsAndHashCode @Getter public static class BtcNode { - private static final int DEFAULT_PORT = BisqEnvironment.getParameters().getPort(); //8333 + private static final int DEFAULT_PORT = BaseCurrencyNetwork.CURRENT_PARAMETERS.getPort(); //8333 @Nullable private final String onionAddress; diff --git a/core/src/main/java/bisq/core/btc/setup/WalletConfig.java b/core/src/main/java/bisq/core/btc/setup/WalletConfig.java index 3fd092833b..8659f9983a 100644 --- a/core/src/main/java/bisq/core/btc/setup/WalletConfig.java +++ b/core/src/main/java/bisq/core/btc/setup/WalletConfig.java @@ -17,11 +17,12 @@ package bisq.core.btc.setup; -import bisq.core.app.BisqEnvironment; import bisq.core.btc.nodes.ProxySocketFactory; import bisq.core.btc.wallet.BisqRiskAnalysis; import bisq.common.app.Version; +import bisq.common.config.BaseCurrencyNetwork; +import bisq.common.config.Config; import org.bitcoinj.core.BlockChain; import org.bitcoinj.core.CheckpointManager; @@ -113,7 +114,7 @@ public class WalletConfig extends AbstractIdleService { private final String spvChainFileName; private final Socks5Proxy socks5Proxy; private final BisqWalletFactory walletFactory; - private final BisqEnvironment bisqEnvironment; + private final Config config; private final String userAgent; private int numConnectionForBtc; @@ -150,13 +151,13 @@ public class WalletConfig extends AbstractIdleService { public WalletConfig(NetworkParameters params, Socks5Proxy socks5Proxy, File directory, - BisqEnvironment bisqEnvironment, + Config config, String userAgent, int numConnectionForBtc, @SuppressWarnings("SameParameterValue") String btcWalletFileName, @SuppressWarnings("SameParameterValue") String bsqWalletFileName, @SuppressWarnings("SameParameterValue") String spvChainFileName) { - this.bisqEnvironment = bisqEnvironment; + this.config = config; this.userAgent = userAgent; this.numConnectionForBtc = numConnectionForBtc; this.context = new Context(params); @@ -224,7 +225,7 @@ public class WalletConfig extends AbstractIdleService { ProxySocketFactory proxySocketFactory = new ProxySocketFactory(proxy); // We don't use tor mode if we have a local node running - BlockingClientManager blockingClientManager = bisqEnvironment.isBitcoinLocalhostNodeRunning() ? + BlockingClientManager blockingClientManager = config.isIgnoreLocalBtcNode() ? new BlockingClientManager() : new BlockingClientManager(proxySocketFactory); @@ -236,9 +237,9 @@ public class WalletConfig extends AbstractIdleService { // For dao testnet (server side regtest) we prevent to connect to a localhost node to avoid confusion // if local btc node is not synced with our dao testnet master node. - if (BisqEnvironment.getBaseCurrencyNetwork().isDaoRegTest() || - BisqEnvironment.getBaseCurrencyNetwork().isDaoTestNet() || - !bisqEnvironment.isBitcoinLocalhostNodeRunning()) + if (BaseCurrencyNetwork.CURRENT_NETWORK.isDaoRegTest() || + BaseCurrencyNetwork.CURRENT_NETWORK.isDaoTestNet() || + !config.isLocalBitcoinNodeIsRunning()) peerGroup.setUseLocalhostPeerWhenPossible(false); return peerGroup; diff --git a/core/src/main/java/bisq/core/btc/setup/WalletsSetup.java b/core/src/main/java/bisq/core/btc/setup/WalletsSetup.java index 94a076e724..1f7d800594 100644 --- a/core/src/main/java/bisq/core/btc/setup/WalletsSetup.java +++ b/core/src/main/java/bisq/core/btc/setup/WalletsSetup.java @@ -17,7 +17,6 @@ package bisq.core.btc.setup; -import bisq.core.app.BisqEnvironment; import bisq.core.btc.BtcOptionKeys; import bisq.core.btc.exceptions.InvalidHostException; import bisq.core.btc.exceptions.RejectedTxException; @@ -35,6 +34,8 @@ import bisq.network.Socks5ProxyProvider; import bisq.common.Timer; import bisq.common.UserThread; +import bisq.common.config.BaseCurrencyNetwork; +import bisq.common.config.Config; import bisq.common.handlers.ExceptionHandler; import bisq.common.handlers.ResultHandler; import bisq.common.storage.FileUtil; @@ -120,7 +121,7 @@ public class WalletsSetup { private final AddressEntryList addressEntryList; private final Preferences preferences; private final Socks5ProxyProvider socks5ProxyProvider; - private final BisqEnvironment bisqEnvironment; + private final Config config; private final BtcNodes btcNodes; private final String btcWalletFileName; private final int numConnectionForBtc; @@ -147,7 +148,7 @@ public class WalletsSetup { AddressEntryList addressEntryList, Preferences preferences, Socks5ProxyProvider socks5ProxyProvider, - BisqEnvironment bisqEnvironment, + Config config, BtcNodes btcNodes, @Named(BtcOptionKeys.USER_AGENT) String userAgent, @Named(BtcOptionKeys.WALLET_DIR) File appDir, @@ -158,7 +159,7 @@ public class WalletsSetup { this.addressEntryList = addressEntryList; this.preferences = preferences; this.socks5ProxyProvider = socks5ProxyProvider; - this.bisqEnvironment = bisqEnvironment; + this.config = config; this.btcNodes = btcNodes; this.numConnectionForBtc = numConnectionForBtc != null ? Integer.parseInt(numConnectionForBtc) : DEFAULT_CONNECTIONS; this.useAllProvidedNodes = "true".equals(useAllProvidedNodes); @@ -166,8 +167,8 @@ public class WalletsSetup { this.socks5DiscoverMode = evaluateMode(socks5DiscoverModeString); - btcWalletFileName = "bisq_" + BisqEnvironment.getBaseCurrencyNetwork().getCurrencyCode() + ".wallet"; - params = BisqEnvironment.getParameters(); + btcWalletFileName = "bisq_" + config.getBaseCurrencyNetwork().getCurrencyCode() + ".wallet"; + params = BaseCurrencyNetwork.CURRENT_PARAMETERS; walletDir = new File(appDir, "wallet"); PeerGroup.setIgnoreHttpSeeds(true); } @@ -199,7 +200,7 @@ public class WalletsSetup { walletConfig = new WalletConfig(params, socks5Proxy, walletDir, - bisqEnvironment, + config, userAgent, numConnectionForBtc, btcWalletFileName, @@ -277,7 +278,7 @@ public class WalletsSetup { return; } } - } else if (bisqEnvironment.isBitcoinLocalhostNodeRunning()) { + } else if (config.isLocalBitcoinNodeIsRunning()) { walletConfig.setMinBroadcastConnections(1); walletConfig.setPeerNodesForLocalHost(); } else { @@ -494,10 +495,6 @@ public class WalletsSetup { return downloadPercentageProperty().get() == 1d; } - public boolean isBitcoinLocalhostNodeRunning() { - return bisqEnvironment.isBitcoinLocalhostNodeRunning(); - } - public Set
getAddressesByContext(@SuppressWarnings("SameParameterValue") AddressEntry.Context context) { return ImmutableList.copyOf(addressEntryList.getList()).stream() .filter(addressEntry -> addressEntry.getContext() == context) diff --git a/core/src/main/java/bisq/core/btc/wallet/Restrictions.java b/core/src/main/java/bisq/core/btc/wallet/Restrictions.java index d7a2c704b4..f3b75c245c 100644 --- a/core/src/main/java/bisq/core/btc/wallet/Restrictions.java +++ b/core/src/main/java/bisq/core/btc/wallet/Restrictions.java @@ -17,7 +17,7 @@ package bisq.core.btc.wallet; -import bisq.core.app.BisqEnvironment; +import bisq.common.config.BaseCurrencyNetwork; import org.bitcoinj.core.Coin; @@ -33,7 +33,7 @@ public class Restrictions { public static Coin getMinNonDustOutput() { if (minNonDustOutput == null) - minNonDustOutput = BisqEnvironment.getBaseCurrencyNetwork().getParameters().getMinNonDustOutput(); + minNonDustOutput = BaseCurrencyNetwork.CURRENT_NETWORK.getParameters().getMinNonDustOutput(); return minNonDustOutput; } diff --git a/core/src/main/java/bisq/core/btc/wallet/TradeWalletService.java b/core/src/main/java/bisq/core/btc/wallet/TradeWalletService.java index bb47bb95ad..eff66ac688 100644 --- a/core/src/main/java/bisq/core/btc/wallet/TradeWalletService.java +++ b/core/src/main/java/bisq/core/btc/wallet/TradeWalletService.java @@ -17,7 +17,6 @@ package bisq.core.btc.wallet; -import bisq.core.app.BisqEnvironment; import bisq.core.btc.exceptions.SigningException; import bisq.core.btc.exceptions.TransactionVerificationException; import bisq.core.btc.exceptions.WalletException; @@ -30,6 +29,8 @@ import bisq.core.btc.setup.WalletsSetup; import bisq.core.locale.Res; import bisq.core.user.Preferences; +import bisq.common.config.BaseCurrencyNetwork; + import org.bitcoinj.core.Address; import org.bitcoinj.core.AddressFormatException; import org.bitcoinj.core.Coin; @@ -92,7 +93,7 @@ public class TradeWalletService { public TradeWalletService(WalletsSetup walletsSetup, Preferences preferences) { this.walletsSetup = walletsSetup; this.preferences = preferences; - this.params = BisqEnvironment.getParameters(); + this.params = BaseCurrencyNetwork.CURRENT_PARAMETERS; walletsSetup.addSetupCompletedHandler(() -> { walletConfig = walletsSetup.getWalletConfig(); wallet = walletsSetup.getBtcWallet(); diff --git a/core/src/main/java/bisq/core/btc/wallet/WalletService.java b/core/src/main/java/bisq/core/btc/wallet/WalletService.java index 3d90c82abf..e9f33844ff 100644 --- a/core/src/main/java/bisq/core/btc/wallet/WalletService.java +++ b/core/src/main/java/bisq/core/btc/wallet/WalletService.java @@ -17,7 +17,6 @@ package bisq.core.btc.wallet; -import bisq.core.app.BisqEnvironment; import bisq.core.btc.exceptions.TransactionVerificationException; import bisq.core.btc.exceptions.WalletException; import bisq.core.btc.listeners.AddressConfidenceListener; @@ -27,6 +26,7 @@ import bisq.core.btc.setup.WalletsSetup; import bisq.core.provider.fee.FeeService; import bisq.core.user.Preferences; +import bisq.common.config.BaseCurrencyNetwork; import bisq.common.handlers.ErrorMessageHandler; import bisq.common.handlers.ResultHandler; @@ -677,13 +677,13 @@ public abstract class WalletService { @Nullable public static Address getAddressFromOutput(TransactionOutput output) { return isOutputScriptConvertibleToAddress(output) ? - output.getScriptPubKey().getToAddress(BisqEnvironment.getParameters()) : null; + output.getScriptPubKey().getToAddress(BaseCurrencyNetwork.CURRENT_PARAMETERS) : null; } @Nullable public static String getAddressStringFromOutput(TransactionOutput output) { return isOutputScriptConvertibleToAddress(output) ? - output.getScriptPubKey().getToAddress(BisqEnvironment.getParameters()).toString() : null; + output.getScriptPubKey().getToAddress(BaseCurrencyNetwork.CURRENT_PARAMETERS).toString() : null; } diff --git a/core/src/main/java/bisq/core/dao/DaoModule.java b/core/src/main/java/bisq/core/dao/DaoModule.java index 4ed2d8b451..524728087c 100644 --- a/core/src/main/java/bisq/core/dao/DaoModule.java +++ b/core/src/main/java/bisq/core/dao/DaoModule.java @@ -87,6 +87,7 @@ import bisq.core.dao.state.model.DaoState; import bisq.core.dao.state.unconfirmed.UnconfirmedBsqChangeOutputListService; import bisq.common.app.AppModule; +import bisq.common.config.Config; import org.springframework.core.env.Environment; @@ -97,8 +98,8 @@ import static com.google.inject.name.Names.named; public class DaoModule extends AppModule { - public DaoModule(Environment environment) { - super(environment); + public DaoModule(Environment environment, Config config) { + super(environment, config); } @Override @@ -236,7 +237,7 @@ public class DaoModule extends AppModule { bindConstant().annotatedWith(named(DaoOptionKeys.FULL_DAO_NODE)) .to(environment.getRequiredProperty(DaoOptionKeys.FULL_DAO_NODE)); - bind(Boolean.class).annotatedWith(Names.named(DaoOptionKeys.DAO_ACTIVATED)).toInstance(BisqEnvironment.isDaoActivated(environment)); + bind(Boolean.class).annotatedWith(Names.named(DaoOptionKeys.DAO_ACTIVATED)).toInstance(config.isDaoActivated()); } } diff --git a/core/src/main/java/bisq/core/dao/governance/blindvote/BlindVoteListService.java b/core/src/main/java/bisq/core/dao/governance/blindvote/BlindVoteListService.java index 9cc69f415b..fd46243d70 100644 --- a/core/src/main/java/bisq/core/dao/governance/blindvote/BlindVoteListService.java +++ b/core/src/main/java/bisq/core/dao/governance/blindvote/BlindVoteListService.java @@ -17,7 +17,6 @@ package bisq.core.dao.governance.blindvote; -import bisq.core.dao.DaoOptionKeys; import bisq.core.dao.DaoSetupService; import bisq.core.dao.governance.blindvote.storage.BlindVotePayload; import bisq.core.dao.governance.blindvote.storage.BlindVoteStorageService; @@ -31,8 +30,9 @@ import bisq.network.p2p.storage.payload.PersistableNetworkPayload; import bisq.network.p2p.storage.persistence.AppendOnlyDataStoreListener; import bisq.network.p2p.storage.persistence.AppendOnlyDataStoreService; +import bisq.common.config.Config; + import javax.inject.Inject; -import javax.inject.Named; import javafx.collections.FXCollections; import javafx.collections.ObservableList; @@ -68,14 +68,14 @@ public class BlindVoteListService implements AppendOnlyDataStoreListener, DaoSta BlindVoteStorageService blindVoteStorageService, AppendOnlyDataStoreService appendOnlyDataStoreService, BlindVoteValidator blindVoteValidator, - @Named(DaoOptionKeys.DAO_ACTIVATED) boolean daoActivated) { + Config config) { this.daoStateService = daoStateService; this.p2PService = p2PService; this.periodService = periodService; this.blindVoteStorageService = blindVoteStorageService; this.blindVoteValidator = blindVoteValidator; - if (daoActivated) + if (config.isDaoActivated()) appendOnlyDataStoreService.addService(blindVoteStorageService); } diff --git a/core/src/main/java/bisq/core/dao/governance/blindvote/MyBlindVoteListService.java b/core/src/main/java/bisq/core/dao/governance/blindvote/MyBlindVoteListService.java index 47e9be6167..081e3e660b 100644 --- a/core/src/main/java/bisq/core/dao/governance/blindvote/MyBlindVoteListService.java +++ b/core/src/main/java/bisq/core/dao/governance/blindvote/MyBlindVoteListService.java @@ -17,7 +17,6 @@ package bisq.core.dao.governance.blindvote; -import bisq.core.app.BisqEnvironment; import bisq.core.btc.exceptions.TransactionVerificationException; import bisq.core.btc.exceptions.TxBroadcastException; import bisq.core.btc.exceptions.WalletException; @@ -48,6 +47,7 @@ import bisq.network.p2p.P2PService; import bisq.common.UserThread; import bisq.common.app.DevEnv; +import bisq.common.config.BaseCurrencyNetwork; import bisq.common.crypto.CryptoException; import bisq.common.handlers.ErrorMessageHandler; import bisq.common.handlers.ExceptionHandler; @@ -368,9 +368,9 @@ public class MyBlindVoteListService implements PersistedDataHost, DaoStateListen // Republishing only will have effect if the payload creation date is < 5 hours as other nodes would not // accept payloads which are too old or are in future. // Only payloads received from seed nodes would ignore that date check. - int minPeers = BisqEnvironment.getBaseCurrencyNetwork().isMainnet() ? 4 : 1; + int minPeers = BaseCurrencyNetwork.CURRENT_NETWORK.isMainnet() ? 4 : 1; if ((p2PService.getNumConnectedPeers().get() >= minPeers && p2PService.isBootstrapped()) || - BisqEnvironment.getBaseCurrencyNetwork().isRegtest()) { + BaseCurrencyNetwork.CURRENT_NETWORK.isRegtest()) { myBlindVoteList.stream() .filter(blindVote -> periodService.isTxInPhaseAndCycle(blindVote.getTxId(), DaoPhase.Phase.BLIND_VOTE, diff --git a/core/src/main/java/bisq/core/dao/governance/param/Param.java b/core/src/main/java/bisq/core/dao/governance/param/Param.java index ec4c7915e9..ce34386ce1 100644 --- a/core/src/main/java/bisq/core/dao/governance/param/Param.java +++ b/core/src/main/java/bisq/core/dao/governance/param/Param.java @@ -17,9 +17,9 @@ package bisq.core.dao.governance.param; -import bisq.core.app.BisqEnvironment; import bisq.core.locale.Res; +import bisq.common.config.BaseCurrencyNetwork; import bisq.common.proto.ProtoUtil; import lombok.Getter; @@ -106,9 +106,9 @@ public enum Param { // the time locked payout tx in case the traders do not cooperate. Will be likely a donation address (Bisq, Tor,...) // but can be also a burner address if we prefer to burn the BTC @SuppressWarnings("SpellCheckingInspection") - RECIPIENT_BTC_ADDRESS(BisqEnvironment.getBaseCurrencyNetwork().isMainnet() ? "1BVxNn3T12veSK6DgqwU4Hdn7QHcDDRag7" : // mainnet - BisqEnvironment.getBaseCurrencyNetwork().isDaoBetaNet() ? "1BVxNn3T12veSK6DgqwU4Hdn7QHcDDRag7" : // daoBetaNet - BisqEnvironment.getBaseCurrencyNetwork().isTestnet() ? "2N4mVTpUZAnhm9phnxB7VrHB4aBhnWrcUrV" : // testnet + RECIPIENT_BTC_ADDRESS(BaseCurrencyNetwork.CURRENT_NETWORK.isMainnet() ? "1BVxNn3T12veSK6DgqwU4Hdn7QHcDDRag7" : // mainnet + BaseCurrencyNetwork.CURRENT_NETWORK.isDaoBetaNet() ? "1BVxNn3T12veSK6DgqwU4Hdn7QHcDDRag7" : // daoBetaNet + BaseCurrencyNetwork.CURRENT_NETWORK.isTestnet() ? "2N4mVTpUZAnhm9phnxB7VrHB4aBhnWrcUrV" : // testnet "2MzBNTJDjjXgViKBGnatDU3yWkJ8pJkEg9w", // regtest or DAO testnet (regtest) ParamType.ADDRESS), @@ -136,73 +136,73 @@ public enum Param { // For testnet we want to have a short cycle of about a week (1012 blocks) // For regtest we use very short periods PHASE_UNDEFINED("0", ParamType.BLOCK), - PHASE_PROPOSAL(BisqEnvironment.getBaseCurrencyNetwork().isMainnet() ? + PHASE_PROPOSAL(BaseCurrencyNetwork.CURRENT_NETWORK.isMainnet() ? "3601" : // mainnet; 24 days - BisqEnvironment.getBaseCurrencyNetwork().isRegtest() ? + BaseCurrencyNetwork.CURRENT_NETWORK.isRegtest() ? "4" : // regtest - BisqEnvironment.getBaseCurrencyNetwork().isDaoBetaNet() ? + BaseCurrencyNetwork.CURRENT_NETWORK.isDaoBetaNet() ? "144" : // daoBetaNet; 1 day - BisqEnvironment.getBaseCurrencyNetwork().isDaoRegTest() ? + BaseCurrencyNetwork.CURRENT_NETWORK.isDaoRegTest() ? "134" : // dao regtest; 0.93 days "380", // testnet or dao testnet (server side regtest); 2.6 days ParamType.BLOCK, 2, 2), - PHASE_BREAK1(BisqEnvironment.getBaseCurrencyNetwork().isMainnet() ? + PHASE_BREAK1(BaseCurrencyNetwork.CURRENT_NETWORK.isMainnet() ? "149" : // mainnet; 1 day - BisqEnvironment.getBaseCurrencyNetwork().isRegtest() ? + BaseCurrencyNetwork.CURRENT_NETWORK.isRegtest() ? "1" : // regtest - BisqEnvironment.getBaseCurrencyNetwork().isDaoBetaNet() ? + BaseCurrencyNetwork.CURRENT_NETWORK.isDaoBetaNet() ? "10" : // daoBetaNet - BisqEnvironment.getBaseCurrencyNetwork().isDaoRegTest() ? + BaseCurrencyNetwork.CURRENT_NETWORK.isDaoRegTest() ? "10" : // dao regtest "10", // testnet or dao testnet (server side regtest) ParamType.BLOCK, 2, 2), - PHASE_BLIND_VOTE(BisqEnvironment.getBaseCurrencyNetwork().isMainnet() ? + PHASE_BLIND_VOTE(BaseCurrencyNetwork.CURRENT_NETWORK.isMainnet() ? "451" : // mainnet; 3 days - BisqEnvironment.getBaseCurrencyNetwork().isRegtest() ? + BaseCurrencyNetwork.CURRENT_NETWORK.isRegtest() ? "2" : // regtest - BisqEnvironment.getBaseCurrencyNetwork().isDaoBetaNet() ? + BaseCurrencyNetwork.CURRENT_NETWORK.isDaoBetaNet() ? "144" : // daoBetaNet; 1 day - BisqEnvironment.getBaseCurrencyNetwork().isDaoRegTest() ? + BaseCurrencyNetwork.CURRENT_NETWORK.isDaoRegTest() ? "134" : // dao regtest; 0.93 days "300", // testnet or dao testnet (server side regtest); 2 days ParamType.BLOCK, 2, 2), - PHASE_BREAK2(BisqEnvironment.getBaseCurrencyNetwork().isMainnet() ? + PHASE_BREAK2(BaseCurrencyNetwork.CURRENT_NETWORK.isMainnet() ? "9" : // mainnet - BisqEnvironment.getBaseCurrencyNetwork().isRegtest() ? + BaseCurrencyNetwork.CURRENT_NETWORK.isRegtest() ? "1" : // regtest - BisqEnvironment.getBaseCurrencyNetwork().isDaoBetaNet() ? + BaseCurrencyNetwork.CURRENT_NETWORK.isDaoBetaNet() ? "10" : // daoBetaNet - BisqEnvironment.getBaseCurrencyNetwork().isDaoRegTest() ? + BaseCurrencyNetwork.CURRENT_NETWORK.isDaoRegTest() ? "10" : // dao regtest "10", // testnet or dao testnet (server side regtest) ParamType.BLOCK, 2, 2), - PHASE_VOTE_REVEAL(BisqEnvironment.getBaseCurrencyNetwork().isMainnet() ? + PHASE_VOTE_REVEAL(BaseCurrencyNetwork.CURRENT_NETWORK.isMainnet() ? "451" : // mainnet; 3 days - BisqEnvironment.getBaseCurrencyNetwork().isRegtest() ? + BaseCurrencyNetwork.CURRENT_NETWORK.isRegtest() ? "2" : // regtest - BisqEnvironment.getBaseCurrencyNetwork().isDaoBetaNet() ? + BaseCurrencyNetwork.CURRENT_NETWORK.isDaoBetaNet() ? "144" : // daoBetaNet; 1 day - BisqEnvironment.getBaseCurrencyNetwork().isDaoRegTest() ? + BaseCurrencyNetwork.CURRENT_NETWORK.isDaoRegTest() ? "132" : // dao regtest; 0.93 days "300", // testnet or dao testnet (server side regtest); 2 days ParamType.BLOCK, 2, 2), - PHASE_BREAK3(BisqEnvironment.getBaseCurrencyNetwork().isMainnet() ? + PHASE_BREAK3(BaseCurrencyNetwork.CURRENT_NETWORK.isMainnet() ? "9" : // mainnet - BisqEnvironment.getBaseCurrencyNetwork().isRegtest() ? + BaseCurrencyNetwork.CURRENT_NETWORK.isRegtest() ? "1" : // regtest - BisqEnvironment.getBaseCurrencyNetwork().isDaoBetaNet() ? + BaseCurrencyNetwork.CURRENT_NETWORK.isDaoBetaNet() ? "10" : // daoBetaNet - BisqEnvironment.getBaseCurrencyNetwork().isDaoRegTest() ? + BaseCurrencyNetwork.CURRENT_NETWORK.isDaoRegTest() ? "10" : // dao regtest "10", // testnet or dao testnet (server side regtest) ParamType.BLOCK, 2, 2), - PHASE_RESULT(BisqEnvironment.getBaseCurrencyNetwork().isMainnet() ? + PHASE_RESULT(BaseCurrencyNetwork.CURRENT_NETWORK.isMainnet() ? "10" : // mainnet - BisqEnvironment.getBaseCurrencyNetwork().isRegtest() ? + BaseCurrencyNetwork.CURRENT_NETWORK.isRegtest() ? "2" : // regtest - BisqEnvironment.getBaseCurrencyNetwork().isDaoBetaNet() ? + BaseCurrencyNetwork.CURRENT_NETWORK.isDaoBetaNet() ? "10" : // daoBetaNet - BisqEnvironment.getBaseCurrencyNetwork().isDaoRegTest() ? + BaseCurrencyNetwork.CURRENT_NETWORK.isDaoRegTest() ? "2" : // dao regtest "2", // testnet or dao testnet (server side regtest) ParamType.BLOCK, 2, 2); diff --git a/core/src/main/java/bisq/core/dao/governance/proposal/MyProposalListService.java b/core/src/main/java/bisq/core/dao/governance/proposal/MyProposalListService.java index bad67f0bd6..f1e3ae517e 100644 --- a/core/src/main/java/bisq/core/dao/governance/proposal/MyProposalListService.java +++ b/core/src/main/java/bisq/core/dao/governance/proposal/MyProposalListService.java @@ -17,7 +17,6 @@ package bisq.core.dao.governance.proposal; -import bisq.core.app.BisqEnvironment; import bisq.core.btc.exceptions.TxBroadcastException; import bisq.core.btc.wallet.TxBroadcaster; import bisq.core.btc.wallet.WalletsManager; @@ -32,6 +31,7 @@ import bisq.network.p2p.P2PService; import bisq.common.UserThread; import bisq.common.app.DevEnv; +import bisq.common.config.BaseCurrencyNetwork; import bisq.common.crypto.PubKeyRing; import bisq.common.handlers.ErrorMessageHandler; import bisq.common.handlers.ResultHandler; @@ -220,9 +220,9 @@ public class MyProposalListService implements PersistedDataHost, DaoStateListene private void rePublishMyProposalsOnceWellConnected() { // We republish at each startup at any block during the cycle. We filter anyway for valid blind votes // of that cycle so it is 1 blind vote getting rebroadcast at each startup to my neighbors. - int minPeers = BisqEnvironment.getBaseCurrencyNetwork().isMainnet() ? 4 : 1; + int minPeers = BaseCurrencyNetwork.CURRENT_NETWORK.isMainnet() ? 4 : 1; if ((p2PService.getNumConnectedPeers().get() >= minPeers && p2PService.isBootstrapped()) || - BisqEnvironment.getBaseCurrencyNetwork().isRegtest()) { + BaseCurrencyNetwork.CURRENT_NETWORK.isRegtest()) { myProposalList.stream() .filter(proposal -> periodService.isTxInPhaseAndCycle(proposal.getTxId(), DaoPhase.Phase.PROPOSAL, diff --git a/core/src/main/java/bisq/core/dao/governance/proposal/param/ChangeParamValidator.java b/core/src/main/java/bisq/core/dao/governance/proposal/param/ChangeParamValidator.java index 230ee8903d..752c7d9d02 100644 --- a/core/src/main/java/bisq/core/dao/governance/proposal/param/ChangeParamValidator.java +++ b/core/src/main/java/bisq/core/dao/governance/proposal/param/ChangeParamValidator.java @@ -17,7 +17,6 @@ package bisq.core.dao.governance.proposal.param; -import bisq.core.app.BisqEnvironment; import bisq.core.btc.wallet.Restrictions; import bisq.core.dao.governance.ConsensusCritical; import bisq.core.dao.governance.param.Param; @@ -32,6 +31,8 @@ import bisq.core.util.coin.BsqFormatter; import bisq.core.util.validation.BtcAddressValidator; import bisq.core.util.validation.InputValidator; +import bisq.common.config.BaseCurrencyNetwork; + import org.bitcoinj.core.Coin; import javax.inject.Inject; @@ -212,7 +213,7 @@ public class ChangeParamValidator extends ProposalValidator implements Consensus } private void validateBlockValue(int currentParamValueAsBlock, int inputValueAsBlock, Param param) throws ParamValidationException { - boolean isMainnet = BisqEnvironment.getBaseCurrencyNetwork().isMainnet(); + boolean isMainnet = BaseCurrencyNetwork.CURRENT_NETWORK.isMainnet(); switch (param) { case LOCK_TIME_TRADE_PAYOUT: break; diff --git a/core/src/main/java/bisq/core/dao/node/full/RpcService.java b/core/src/main/java/bisq/core/dao/node/full/RpcService.java index d9e2f8ee03..522890bb32 100644 --- a/core/src/main/java/bisq/core/dao/node/full/RpcService.java +++ b/core/src/main/java/bisq/core/dao/node/full/RpcService.java @@ -17,13 +17,13 @@ package bisq.core.dao.node.full; -import bisq.core.app.BisqEnvironment; import bisq.core.dao.DaoOptionKeys; import bisq.core.dao.state.model.blockchain.PubKeyScript; import bisq.core.dao.state.model.blockchain.TxInput; import bisq.core.user.Preferences; import bisq.common.UserThread; +import bisq.common.config.BaseCurrencyNetwork; import bisq.common.handlers.ResultHandler; import bisq.common.util.Utilities; @@ -102,9 +102,9 @@ public class RpcService { // mainnet is 8332, testnet 18332, regtest 18443 boolean isHostSet = rpcHost != null && !rpcHost.isEmpty(); boolean isPortSet = rpcPort != null && !rpcPort.isEmpty(); - boolean isMainnet = BisqEnvironment.getBaseCurrencyNetwork().isMainnet(); - boolean isTestnet = BisqEnvironment.getBaseCurrencyNetwork().isTestnet(); - boolean isDaoBetaNet = BisqEnvironment.getBaseCurrencyNetwork().isDaoBetaNet(); + boolean isMainnet = BaseCurrencyNetwork.CURRENT_NETWORK.isMainnet(); + boolean isTestnet = BaseCurrencyNetwork.CURRENT_NETWORK.isTestnet(); + boolean isDaoBetaNet = BaseCurrencyNetwork.CURRENT_NETWORK.isDaoBetaNet(); this.rpcHost = isHostSet ? rpcHost : "127.0.0.1"; this.rpcPort = isPortSet ? rpcPort : isMainnet || isDaoBetaNet ? "8332" : diff --git a/core/src/main/java/bisq/core/dao/node/parser/TxOutputParser.java b/core/src/main/java/bisq/core/dao/node/parser/TxOutputParser.java index 4839f48503..3096df4c9f 100644 --- a/core/src/main/java/bisq/core/dao/node/parser/TxOutputParser.java +++ b/core/src/main/java/bisq/core/dao/node/parser/TxOutputParser.java @@ -17,7 +17,6 @@ package bisq.core.dao.node.parser; -import bisq.core.app.BisqEnvironment; import bisq.core.dao.governance.bond.BondConsensus; import bisq.core.dao.governance.param.Param; import bisq.core.dao.state.DaoStateService; @@ -25,6 +24,8 @@ import bisq.core.dao.state.model.blockchain.OpReturnType; import bisq.core.dao.state.model.blockchain.TxOutput; import bisq.core.dao.state.model.blockchain.TxOutputType; +import bisq.common.config.BaseCurrencyNetwork; + import com.google.common.annotations.VisibleForTesting; import java.util.ArrayList; @@ -411,8 +412,8 @@ class TxOutputParser { } private int getActivateHardFork1Height() { - return BisqEnvironment.getBaseCurrencyNetwork().isMainnet() ? ACTIVATE_HARD_FORK_1_HEIGHT_MAINNET : - BisqEnvironment.getBaseCurrencyNetwork().isTestnet() ? ACTIVATE_HARD_FORK_1_HEIGHT_TESTNET : + return BaseCurrencyNetwork.CURRENT_NETWORK.isMainnet() ? ACTIVATE_HARD_FORK_1_HEIGHT_MAINNET : + BaseCurrencyNetwork.CURRENT_NETWORK.isTestnet() ? ACTIVATE_HARD_FORK_1_HEIGHT_TESTNET : ACTIVATE_HARD_FORK_1_HEIGHT_REGTEST; } diff --git a/core/src/main/java/bisq/core/dao/state/GenesisTxInfo.java b/core/src/main/java/bisq/core/dao/state/GenesisTxInfo.java index a7b436068c..7e44af2a2d 100644 --- a/core/src/main/java/bisq/core/dao/state/GenesisTxInfo.java +++ b/core/src/main/java/bisq/core/dao/state/GenesisTxInfo.java @@ -17,10 +17,10 @@ package bisq.core.dao.state; -import bisq.core.app.BisqEnvironment; -import bisq.core.btc.BaseCurrencyNetwork; import bisq.core.dao.DaoOptionKeys; +import bisq.common.config.BaseCurrencyNetwork; + import org.bitcoinj.core.Coin; import javax.inject.Inject; @@ -107,7 +107,7 @@ public class GenesisTxInfo { public GenesisTxInfo(@Named(DaoOptionKeys.GENESIS_TX_ID) String genesisTxId, @Named(DaoOptionKeys.GENESIS_BLOCK_HEIGHT) Integer genesisBlockHeight, @Named(DaoOptionKeys.GENESIS_TOTAL_SUPPLY) Long genesisTotalSupply) { - BaseCurrencyNetwork baseCurrencyNetwork = BisqEnvironment.getBaseCurrencyNetwork(); + BaseCurrencyNetwork baseCurrencyNetwork = BaseCurrencyNetwork.CURRENT_NETWORK; boolean isMainnet = baseCurrencyNetwork.isMainnet(); boolean isTestnet = baseCurrencyNetwork.isTestnet(); boolean isDaoTestNet = baseCurrencyNetwork.isDaoTestNet(); diff --git a/core/src/main/java/bisq/core/dao/state/model/governance/BondedRoleType.java b/core/src/main/java/bisq/core/dao/state/model/governance/BondedRoleType.java index e421153002..3bf2c32524 100644 --- a/core/src/main/java/bisq/core/dao/state/model/governance/BondedRoleType.java +++ b/core/src/main/java/bisq/core/dao/state/model/governance/BondedRoleType.java @@ -17,9 +17,10 @@ package bisq.core.dao.state.model.governance; -import bisq.core.app.BisqEnvironment; import bisq.core.locale.Res; +import bisq.common.config.BaseCurrencyNetwork; + import lombok.Getter; @@ -92,9 +93,9 @@ public enum BondedRoleType { */ BondedRoleType(long requiredBondUnit, int unlockTimeInDays, String link, boolean allowMultipleHolders) { this.requiredBondUnit = requiredBondUnit; - this.unlockTimeInBlocks = BisqEnvironment.getBaseCurrencyNetwork().isMainnet() ? + this.unlockTimeInBlocks = BaseCurrencyNetwork.CURRENT_NETWORK.isMainnet() ? unlockTimeInDays * 144 : // mainnet (144 blocks per day) - BisqEnvironment.getBaseCurrencyNetwork().isRegtest() ? + BaseCurrencyNetwork.CURRENT_NETWORK.isRegtest() ? 5 : // regtest (arbitrarily low value for dev testing) 144; // testnet (relatively short time for testing purposes) this.link = link; diff --git a/core/src/main/java/bisq/core/dao/state/model/governance/CompensationProposal.java b/core/src/main/java/bisq/core/dao/state/model/governance/CompensationProposal.java index fd5f5270a7..b4edb69547 100644 --- a/core/src/main/java/bisq/core/dao/state/model/governance/CompensationProposal.java +++ b/core/src/main/java/bisq/core/dao/state/model/governance/CompensationProposal.java @@ -17,7 +17,6 @@ package bisq.core.dao.state.model.governance; -import bisq.core.app.BisqEnvironment; import bisq.core.dao.governance.param.Param; import bisq.core.dao.governance.proposal.IssuanceProposal; import bisq.core.dao.governance.proposal.ProposalType; @@ -25,6 +24,7 @@ import bisq.core.dao.state.model.ImmutableDaoStateModel; import bisq.core.dao.state.model.blockchain.TxType; import bisq.common.app.Version; +import bisq.common.config.BaseCurrencyNetwork; import org.bitcoinj.core.Address; import org.bitcoinj.core.AddressFormatException; @@ -121,7 +121,7 @@ public final class CompensationProposal extends Proposal implements IssuanceProp public Address getAddress() throws AddressFormatException { // Remove leading 'B' String underlyingBtcAddress = bsqAddress.substring(1, bsqAddress.length()); - return Address.fromBase58(BisqEnvironment.getParameters(), underlyingBtcAddress); + return Address.fromBase58(BaseCurrencyNetwork.CURRENT_PARAMETERS, underlyingBtcAddress); } diff --git a/core/src/main/java/bisq/core/dao/state/model/governance/ReimbursementProposal.java b/core/src/main/java/bisq/core/dao/state/model/governance/ReimbursementProposal.java index 23efd4e704..bfbbab9715 100644 --- a/core/src/main/java/bisq/core/dao/state/model/governance/ReimbursementProposal.java +++ b/core/src/main/java/bisq/core/dao/state/model/governance/ReimbursementProposal.java @@ -25,6 +25,7 @@ import bisq.core.dao.state.model.ImmutableDaoStateModel; import bisq.core.dao.state.model.blockchain.TxType; import bisq.common.app.Version; +import bisq.common.config.BaseCurrencyNetwork; import org.bitcoinj.core.Address; import org.bitcoinj.core.AddressFormatException; @@ -121,7 +122,7 @@ public final class ReimbursementProposal extends Proposal implements IssuancePro public Address getAddress() throws AddressFormatException { // Remove leading 'B' String underlyingBtcAddress = bsqAddress.substring(1, bsqAddress.length()); - return Address.fromBase58(BisqEnvironment.getParameters(), underlyingBtcAddress); + return Address.fromBase58(BaseCurrencyNetwork.CURRENT_PARAMETERS, underlyingBtcAddress); } diff --git a/core/src/main/java/bisq/core/filter/FilterManager.java b/core/src/main/java/bisq/core/filter/FilterManager.java index 64ec22c9a1..5127a650de 100644 --- a/core/src/main/java/bisq/core/filter/FilterManager.java +++ b/core/src/main/java/bisq/core/filter/FilterManager.java @@ -18,7 +18,6 @@ package bisq.core.filter; import bisq.core.app.AppOptionKeys; -import bisq.core.app.BisqEnvironment; import bisq.core.btc.nodes.BtcNodes; import bisq.core.payment.payload.PaymentAccountPayload; import bisq.core.payment.payload.PaymentMethod; @@ -36,6 +35,8 @@ import bisq.network.p2p.storage.payload.ProtectedStoragePayload; import bisq.common.UserThread; import bisq.common.app.DevEnv; import bisq.common.app.Version; +import bisq.common.config.Config; +import bisq.common.config.ConfigFileEditor; import bisq.common.crypto.KeyRing; import org.bitcoinj.core.ECKey; @@ -68,6 +69,7 @@ import javax.annotation.Nullable; import static org.bitcoinj.core.Utils.HEX; public class FilterManager { + private static final Logger log = LoggerFactory.getLogger(FilterManager.class); public static final String BANNED_PRICE_RELAY_NODES = "bannedPriceRelayNodes"; @@ -87,7 +89,7 @@ public class FilterManager { private final KeyRing keyRing; private final User user; private final Preferences preferences; - private final BisqEnvironment bisqEnvironment; + private final ConfigFileEditor configFileEditor; private final ProvidersRepository providersRepository; private boolean ignoreDevMsg; private final ObjectProperty filterProperty = new SimpleObjectProperty<>(); @@ -106,7 +108,7 @@ public class FilterManager { KeyRing keyRing, User user, Preferences preferences, - BisqEnvironment bisqEnvironment, + Config config, ProvidersRepository providersRepository, @Named(AppOptionKeys.IGNORE_DEV_MSG_KEY) boolean ignoreDevMsg, @Named(AppOptionKeys.USE_DEV_PRIVILEGE_KEYS) boolean useDevPrivilegeKeys) { @@ -114,7 +116,7 @@ public class FilterManager { this.keyRing = keyRing; this.user = user; this.preferences = preferences; - this.bisqEnvironment = bisqEnvironment; + this.configFileEditor = new ConfigFileEditor(config.getConfigFile()); this.providersRepository = providersRepository; this.ignoreDevMsg = ignoreDevMsg; pubKeyAsHex = useDevPrivilegeKeys ? @@ -201,9 +203,9 @@ public class FilterManager { } private void resetFilters() { - bisqEnvironment.saveBannedBtcNodes(null); - bisqEnvironment.saveBannedSeedNodes(null); - bisqEnvironment.saveBannedPriceRelayNodes(null); + saveBannedNodes(BANNED_BTC_NODES, null); + saveBannedNodes(BANNED_SEED_NODES, null); + saveBannedNodes(BANNED_PRICE_RELAY_NODES, null); if (providersRepository.getBannedNodes() != null) providersRepository.applyBannedNodes(null); @@ -216,12 +218,12 @@ public class FilterManager { // Seed nodes are requested at startup before we get the filter so we only apply the banned // nodes at the next startup and don't update the list in the P2P network domain. // We persist it to the property file which is read before any other initialisation. - bisqEnvironment.saveBannedSeedNodes(filter.getSeedNodes()); - bisqEnvironment.saveBannedBtcNodes(filter.getBtcNodes()); + saveBannedNodes(BANNED_SEED_NODES, filter.getSeedNodes()); + saveBannedNodes(BANNED_BTC_NODES, filter.getBtcNodes()); // Banned price relay nodes we can apply at runtime final List priceRelayNodes = filter.getPriceRelayNodes(); - bisqEnvironment.saveBannedPriceRelayNodes(priceRelayNodes); + saveBannedNodes(BANNED_PRICE_RELAY_NODES, priceRelayNodes); providersRepository.applyBannedNodes(priceRelayNodes); @@ -237,6 +239,13 @@ public class FilterManager { } } + private void saveBannedNodes(String optionName, List bannedNodes) { + if (bannedNodes != null) + configFileEditor.setOption(optionName, String.join(",", bannedNodes)); + else + configFileEditor.clearOption(optionName); + } + /////////////////////////////////////////////////////////////////////////////////////////// // API diff --git a/core/src/main/java/bisq/core/filter/FilterModule.java b/core/src/main/java/bisq/core/filter/FilterModule.java index dc3d489b17..b14c773c1f 100644 --- a/core/src/main/java/bisq/core/filter/FilterModule.java +++ b/core/src/main/java/bisq/core/filter/FilterModule.java @@ -20,6 +20,7 @@ package bisq.core.filter; import bisq.core.app.AppOptionKeys; import bisq.common.app.AppModule; +import bisq.common.config.Config; import org.springframework.core.env.Environment; @@ -29,8 +30,8 @@ import static com.google.inject.name.Names.named; public class FilterModule extends AppModule { - public FilterModule(Environment environment) { - super(environment); + public FilterModule(Environment environment, Config config) { + super(environment, config); } @Override diff --git a/core/src/main/java/bisq/core/locale/CurrencyUtil.java b/core/src/main/java/bisq/core/locale/CurrencyUtil.java index 982aab5400..d5ecff8f34 100644 --- a/core/src/main/java/bisq/core/locale/CurrencyUtil.java +++ b/core/src/main/java/bisq/core/locale/CurrencyUtil.java @@ -17,8 +17,6 @@ package bisq.core.locale; -import bisq.core.app.BisqEnvironment; -import bisq.core.btc.BaseCurrencyNetwork; import bisq.core.dao.governance.asset.AssetService; import bisq.core.filter.FilterManager; @@ -29,6 +27,7 @@ import bisq.asset.Token; import bisq.asset.coins.BSQ; import bisq.common.app.DevEnv; +import bisq.common.config.BaseCurrencyNetwork; import com.google.common.base.Suppliers; @@ -55,7 +54,7 @@ import static com.google.common.base.Preconditions.checkArgument; public class CurrencyUtil { public static void setup() { - setBaseCurrencyCode(BisqEnvironment.getBaseCurrencyNetwork().getCurrencyCode()); + setBaseCurrencyCode(BaseCurrencyNetwork.CURRENT_NETWORK.getCurrencyCode()); } private static final AssetRegistry assetRegistry = new AssetRegistry(); @@ -119,8 +118,8 @@ public class CurrencyUtil { public static Stream getSortedAssetStream() { return assetRegistry.stream() .filter(CurrencyUtil::assetIsNotBaseCurrency) - .filter(asset -> isNotBsqOrBsqTradingActivated(asset, BisqEnvironment.getBaseCurrencyNetwork(), DevEnv.isDaoTradingActivated())) - .filter(asset -> assetMatchesNetworkIfMainnet(asset, BisqEnvironment.getBaseCurrencyNetwork())) + .filter(asset -> isNotBsqOrBsqTradingActivated(asset, BaseCurrencyNetwork.CURRENT_NETWORK, DevEnv.isDaoTradingActivated())) + .filter(asset -> assetMatchesNetworkIfMainnet(asset, BaseCurrencyNetwork.CURRENT_NETWORK)) .sorted(Comparator.comparing(Asset::getName)); } diff --git a/core/src/main/java/bisq/core/locale/Res.java b/core/src/main/java/bisq/core/locale/Res.java index af20876376..213f74ed18 100644 --- a/core/src/main/java/bisq/core/locale/Res.java +++ b/core/src/main/java/bisq/core/locale/Res.java @@ -17,11 +17,9 @@ package bisq.core.locale; -import bisq.core.app.BisqEnvironment; -import bisq.core.btc.BaseCurrencyNetwork; - import bisq.common.UserThread; import bisq.common.app.DevEnv; +import bisq.common.config.BaseCurrencyNetwork; import org.apache.commons.lang3.StringUtils; @@ -46,7 +44,7 @@ import org.jetbrains.annotations.NotNull; @Slf4j public class Res { public static void setup() { - BaseCurrencyNetwork baseCurrencyNetwork = BisqEnvironment.getBaseCurrencyNetwork(); + BaseCurrencyNetwork baseCurrencyNetwork = BaseCurrencyNetwork.CURRENT_NETWORK; setBaseCurrencyCode(baseCurrencyNetwork.getCurrencyCode()); setBaseCurrencyName(baseCurrencyNetwork.getCurrencyName()); } diff --git a/core/src/main/java/bisq/core/network/p2p/seed/DefaultSeedNodeRepository.java b/core/src/main/java/bisq/core/network/p2p/seed/DefaultSeedNodeRepository.java index 790bf4e454..5cc67ce90b 100644 --- a/core/src/main/java/bisq/core/network/p2p/seed/DefaultSeedNodeRepository.java +++ b/core/src/main/java/bisq/core/network/p2p/seed/DefaultSeedNodeRepository.java @@ -17,12 +17,12 @@ package bisq.core.network.p2p.seed; -import bisq.core.app.BisqEnvironment; - import bisq.network.NetworkOptionKeys; import bisq.network.p2p.NodeAddress; import bisq.network.p2p.seed.SeedNodeRepository; +import bisq.common.config.Config; + import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; @@ -50,14 +50,14 @@ public class DefaultSeedNodeRepository implements SeedNodeRepository { private static final Pattern pattern = Pattern.compile("^([a-z0-9]+\\.onion:\\d+)"); private static final String ENDING = ".seednodes"; private final Collection cache = new HashSet<>(); - private final BisqEnvironment bisqEnvironment; + private final Config config; @Nullable private final String seedNodes; @Inject - public DefaultSeedNodeRepository(BisqEnvironment environment, + public DefaultSeedNodeRepository(Config config, @Nullable @Named(NetworkOptionKeys.SEED_NODES_KEY) String seedNodes) { - bisqEnvironment = environment; + this.config = config; this.seedNodes = seedNodes; } @@ -72,7 +72,7 @@ public class DefaultSeedNodeRepository implements SeedNodeRepository { } // else, we fetch the seed nodes from our resources - InputStream fileInputStream = DefaultSeedNodeRepository.class.getClassLoader().getResourceAsStream(BisqEnvironment.getBaseCurrencyNetwork().name().toLowerCase() + ENDING); + InputStream fileInputStream = DefaultSeedNodeRepository.class.getClassLoader().getResourceAsStream(config.getBaseCurrencyNetwork().name().toLowerCase() + ENDING); BufferedReader seedNodeFile = new BufferedReader(new InputStreamReader(fileInputStream)); // only clear if we have a fresh data source (otherwise, an exception would prevent us from getting here) @@ -90,7 +90,7 @@ public class DefaultSeedNodeRepository implements SeedNodeRepository { }); // filter - cache.removeAll(bisqEnvironment.getBannedSeedNodes().stream().map(NodeAddress::new).collect(Collectors.toSet())); + cache.removeAll(config.getBannedSeedNodes().stream().map(NodeAddress::new).collect(Collectors.toSet())); log.info("Seed nodes: {}", cache); } catch (Throwable t) { diff --git a/core/src/main/java/bisq/core/offer/OfferModule.java b/core/src/main/java/bisq/core/offer/OfferModule.java index 34a80cb41b..bf04daa8f7 100644 --- a/core/src/main/java/bisq/core/offer/OfferModule.java +++ b/core/src/main/java/bisq/core/offer/OfferModule.java @@ -18,6 +18,7 @@ package bisq.core.offer; import bisq.common.app.AppModule; +import bisq.common.config.Config; import org.springframework.core.env.Environment; @@ -28,8 +29,8 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public class OfferModule extends AppModule { - public OfferModule(Environment environment) { - super(environment); + public OfferModule(Environment environment, Config config) { + super(environment, config); } @Override diff --git a/core/src/main/java/bisq/core/payment/validation/AltCoinAddressValidator.java b/core/src/main/java/bisq/core/payment/validation/AltCoinAddressValidator.java index c6028c52e6..67d447ac42 100644 --- a/core/src/main/java/bisq/core/payment/validation/AltCoinAddressValidator.java +++ b/core/src/main/java/bisq/core/payment/validation/AltCoinAddressValidator.java @@ -17,12 +17,16 @@ package bisq.core.payment.validation; -import bisq.core.app.BisqEnvironment; import bisq.core.locale.CurrencyUtil; import bisq.core.locale.Res; import bisq.core.util.validation.InputValidator; +import bisq.asset.AddressValidationResult; +import bisq.asset.Asset; +import bisq.asset.AssetRegistry; + import bisq.common.app.DevEnv; +import bisq.common.config.BaseCurrencyNetwork; import com.google.inject.Inject; @@ -30,12 +34,6 @@ import java.util.Optional; import lombok.extern.slf4j.Slf4j; - - -import bisq.asset.AddressValidationResult; -import bisq.asset.Asset; -import bisq.asset.AssetRegistry; - @Slf4j public final class AltCoinAddressValidator extends InputValidator { @@ -58,7 +56,7 @@ public final class AltCoinAddressValidator extends InputValidator { return validationResult; Optional optionalAsset = CurrencyUtil.findAsset(assetRegistry, currencyCode, - BisqEnvironment.getBaseCurrencyNetwork(), DevEnv.isDaoTradingActivated()); + BaseCurrencyNetwork.CURRENT_NETWORK, DevEnv.isDaoTradingActivated()); if (optionalAsset.isPresent()) { Asset asset = optionalAsset.get(); AddressValidationResult result = asset.validateAddress(input); diff --git a/core/src/main/java/bisq/core/presentation/CorePresentationModule.java b/core/src/main/java/bisq/core/presentation/CorePresentationModule.java index 2d0b804886..a64fd92e6e 100644 --- a/core/src/main/java/bisq/core/presentation/CorePresentationModule.java +++ b/core/src/main/java/bisq/core/presentation/CorePresentationModule.java @@ -18,14 +18,16 @@ package bisq.core.presentation; import bisq.common.app.AppModule; +import bisq.common.config.Config; import org.springframework.core.env.Environment; import com.google.inject.Singleton; public class CorePresentationModule extends AppModule { - public CorePresentationModule(Environment environment) { - super(environment); + + public CorePresentationModule(Environment environment, Config config) { + super(environment, config); } @Override diff --git a/core/src/main/java/bisq/core/provider/ProvidersRepository.java b/core/src/main/java/bisq/core/provider/ProvidersRepository.java index 0f3f2b964d..2ebe6efc71 100644 --- a/core/src/main/java/bisq/core/provider/ProvidersRepository.java +++ b/core/src/main/java/bisq/core/provider/ProvidersRepository.java @@ -18,10 +18,11 @@ package bisq.core.provider; import bisq.core.app.AppOptionKeys; -import bisq.core.app.BisqEnvironment; import bisq.network.NetworkOptionKeys; +import bisq.common.config.Config; + import com.google.inject.Inject; import javax.inject.Named; @@ -48,6 +49,7 @@ public class ProvidersRepository { "http://gztmprecgqjq64zh.onion/" // @wiz ); + private final Config config; private final String providersFromProgramArgs; private final boolean useLocalhostForP2P; @@ -65,16 +67,17 @@ public class ProvidersRepository { /////////////////////////////////////////////////////////////////////////////////////////// @Inject - public ProvidersRepository(BisqEnvironment bisqEnvironment, + public ProvidersRepository(Config config, @Named(AppOptionKeys.PROVIDERS) String providers, @Named(NetworkOptionKeys.USE_LOCALHOST_FOR_P2P) boolean useLocalhostForP2P) { + this.config = config; this.providersFromProgramArgs = providers; this.useLocalhostForP2P = useLocalhostForP2P; Collections.shuffle(DEFAULT_NODES); - applyBannedNodes(bisqEnvironment.getBannedPriceRelayNodes()); + applyBannedNodes(config.getBannedPriceRelayNodes()); } public void applyBannedNodes(@Nullable List bannedNodes) { @@ -97,7 +100,7 @@ public class ProvidersRepository { baseUrl = providerList.get(index); index++; - if (providerList.size() == 1 && BisqEnvironment.getBaseCurrencyNetwork().isMainnet()) + if (providerList.size() == 1 && config.getBaseCurrencyNetwork().isMainnet()) log.warn("We only have one provider"); } else { baseUrl = ""; diff --git a/core/src/main/java/bisq/core/provider/fee/FeeService.java b/core/src/main/java/bisq/core/provider/fee/FeeService.java index 979796a967..54de4a2cda 100644 --- a/core/src/main/java/bisq/core/provider/fee/FeeService.java +++ b/core/src/main/java/bisq/core/provider/fee/FeeService.java @@ -17,12 +17,12 @@ package bisq.core.provider.fee; -import bisq.core.app.BisqEnvironment; import bisq.core.dao.governance.param.Param; import bisq.core.dao.governance.period.PeriodService; import bisq.core.dao.state.DaoStateService; import bisq.common.UserThread; +import bisq.common.config.BaseCurrencyNetwork; import bisq.common.handlers.FaultHandler; import bisq.common.util.Tuple2; @@ -117,7 +117,7 @@ public class FeeService { /////////////////////////////////////////////////////////////////////////////////////////// public void onAllServicesInitialized() { - minFeePerByte = BisqEnvironment.getBaseCurrencyNetwork().getDefaultMinFeePerByte(); + minFeePerByte = BaseCurrencyNetwork.CURRENT_NETWORK.getDefaultMinFeePerByte(); requestFees(); diff --git a/core/src/main/java/bisq/core/setup/CoreNetworkCapabilities.java b/core/src/main/java/bisq/core/setup/CoreNetworkCapabilities.java index 96dd4dd42c..3199f60371 100644 --- a/core/src/main/java/bisq/core/setup/CoreNetworkCapabilities.java +++ b/core/src/main/java/bisq/core/setup/CoreNetworkCapabilities.java @@ -22,12 +22,14 @@ import bisq.core.dao.DaoOptionKeys; import bisq.common.app.Capabilities; import bisq.common.app.Capability; +import bisq.common.config.Config; import lombok.extern.slf4j.Slf4j; @Slf4j public class CoreNetworkCapabilities { - static void setSupportedCapabilities(BisqEnvironment bisqEnvironment) { + + static void setSupportedCapabilities(Config config) { Capabilities.app.addAll( Capability.TRADE_STATISTICS, Capability.TRADE_STATISTICS_2, @@ -43,17 +45,16 @@ public class CoreNetworkCapabilities { Capability.TRADE_STATISTICS_HASH_UPDATE ); - if (BisqEnvironment.isDaoActivated(bisqEnvironment)) { - maybeApplyDaoFullMode(bisqEnvironment); + if (config.isDaoActivated()) { + maybeApplyDaoFullMode(config); } } - public static void maybeApplyDaoFullMode(BisqEnvironment bisqEnvironment) { + public static void maybeApplyDaoFullMode(Config config) { // If we set dao full mode at the preferences view we add the capability there. We read the preferences a // bit later than we call that method so we have to add DAO_FULL_NODE Capability at preferences as well to // be sure it is set in both cases. - String isFullDaoNode = bisqEnvironment.getProperty(DaoOptionKeys.FULL_DAO_NODE, String.class, "false"); - if (isFullDaoNode != null && !isFullDaoNode.isEmpty() && isFullDaoNode.toLowerCase().equals("true")) { + if (config.isFullDaoNode()) { log.info("Set Capability.DAO_FULL_NODE"); Capabilities.app.addAll(Capability.DAO_FULL_NODE); } else { diff --git a/core/src/main/java/bisq/core/setup/CorePersistedDataHost.java b/core/src/main/java/bisq/core/setup/CorePersistedDataHost.java index f5a0e39c6b..4a83b4329b 100644 --- a/core/src/main/java/bisq/core/setup/CorePersistedDataHost.java +++ b/core/src/main/java/bisq/core/setup/CorePersistedDataHost.java @@ -38,6 +38,7 @@ import bisq.core.user.User; import bisq.network.p2p.P2PService; +import bisq.common.config.Config; import bisq.common.proto.persistable.PersistedDataHost; import com.google.inject.Injector; @@ -67,7 +68,7 @@ public class CorePersistedDataHost { persistedDataHosts.add(injector.getInstance(RefundDisputeListService.class)); persistedDataHosts.add(injector.getInstance(P2PService.class)); - if (injector.getInstance(Key.get(Boolean.class, Names.named(DaoOptionKeys.DAO_ACTIVATED)))) { + if (injector.getInstance(Config.class).isDaoActivated()) { persistedDataHosts.add(injector.getInstance(BallotListService.class)); persistedDataHosts.add(injector.getInstance(MyBlindVoteListService.class)); persistedDataHosts.add(injector.getInstance(MyVoteListService.class)); diff --git a/core/src/main/java/bisq/core/setup/CoreSetup.java b/core/src/main/java/bisq/core/setup/CoreSetup.java index b6715ac1c8..0e580e7af6 100644 --- a/core/src/main/java/bisq/core/setup/CoreSetup.java +++ b/core/src/main/java/bisq/core/setup/CoreSetup.java @@ -17,13 +17,12 @@ package bisq.core.setup; -import bisq.core.app.BisqEnvironment; import bisq.core.locale.CurrencyUtil; import bisq.core.locale.Res; -import bisq.common.CommonOptionKeys; import bisq.common.app.Log; import bisq.common.app.Version; +import bisq.common.config.Config; import bisq.common.util.Utilities; import java.net.URISyntaxException; @@ -37,14 +36,13 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public class CoreSetup { - public static void setup(BisqEnvironment bisqEnvironment) { - setupLog(bisqEnvironment); - CoreNetworkCapabilities.setSupportedCapabilities(bisqEnvironment); + public static void setup(Config config) { + setupLog(config); + CoreNetworkCapabilities.setSupportedCapabilities(config); Res.setup(); CurrencyUtil.setup(); - bisqEnvironment.saveBaseCryptoNetwork(BisqEnvironment.getBaseCurrencyNetwork()); - Version.setBaseCryptoNetworkId(BisqEnvironment.getBaseCurrencyNetwork().ordinal()); + Version.setBaseCryptoNetworkId(config.getBaseCurrencyNetwork().ordinal()); Version.printVersion(); try { @@ -57,11 +55,11 @@ public class CoreSetup { } } - private static void setupLog(BisqEnvironment bisqEnvironment) { - String logPath = Paths.get(bisqEnvironment.getAppDataDir(), "bisq").toString(); + private static void setupLog(Config config) { + String logPath = Paths.get(config.getAppDataDir().getPath(), "bisq").toString(); Log.setup(logPath); log.info("\n\n\nLog files under: " + logPath); Utilities.printSysInfo(); - Log.setLevel(Level.toLevel(bisqEnvironment.getRequiredProperty(CommonOptionKeys.LOG_LEVEL_KEY))); + Log.setLevel(Level.toLevel(config.getLogLevel())); } } diff --git a/core/src/main/java/bisq/core/support/dispute/agent/DisputeAgentService.java b/core/src/main/java/bisq/core/support/dispute/agent/DisputeAgentService.java index e7661d8421..fe2b2b5597 100644 --- a/core/src/main/java/bisq/core/support/dispute/agent/DisputeAgentService.java +++ b/core/src/main/java/bisq/core/support/dispute/agent/DisputeAgentService.java @@ -17,7 +17,6 @@ package bisq.core.support.dispute.agent; -import bisq.core.app.BisqEnvironment; import bisq.core.filter.FilterManager; import bisq.network.p2p.NodeAddress; @@ -25,6 +24,7 @@ import bisq.network.p2p.P2PService; import bisq.network.p2p.storage.HashMapChangedListener; import bisq.common.app.DevEnv; +import bisq.common.config.BaseCurrencyNetwork; import bisq.common.handlers.ErrorMessageHandler; import bisq.common.handlers.ResultHandler; import bisq.common.util.Utilities; @@ -62,7 +62,7 @@ public abstract class DisputeAgentService { ResultHandler resultHandler, ErrorMessageHandler errorMessageHandler) { log.debug("addDisputeAgent disputeAgent.hashCode() " + disputeAgent.hashCode()); - if (!BisqEnvironment.getBaseCurrencyNetwork().isMainnet() || + if (!BaseCurrencyNetwork.CURRENT_NETWORK.isMainnet() || !Utilities.encodeToHex(disputeAgent.getRegistrationPubKey()).equals(DevEnv.DEV_PRIVILEGE_PUB_KEY)) { boolean result = p2PService.addProtectedStorageEntry(disputeAgent); if (result) { diff --git a/core/src/main/java/bisq/core/trade/TradeModule.java b/core/src/main/java/bisq/core/trade/TradeModule.java index c26420f6a6..ff99e91a86 100644 --- a/core/src/main/java/bisq/core/trade/TradeModule.java +++ b/core/src/main/java/bisq/core/trade/TradeModule.java @@ -30,6 +30,7 @@ import bisq.core.trade.statistics.TradeStatistics2StorageService; import bisq.core.trade.statistics.TradeStatisticsManager; import bisq.common.app.AppModule; +import bisq.common.config.Config; import org.springframework.core.env.Environment; @@ -39,8 +40,8 @@ import static com.google.inject.name.Names.named; public class TradeModule extends AppModule { - public TradeModule(Environment environment) { - super(environment); + public TradeModule(Environment environment, Config config) { + super(environment, config); } @Override diff --git a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSetsLockTime.java b/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSetsLockTime.java index 18cb46a96c..d541a07e59 100644 --- a/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSetsLockTime.java +++ b/core/src/main/java/bisq/core/trade/protocol/tasks/maker/MakerSetsLockTime.java @@ -17,11 +17,10 @@ package bisq.core.trade.protocol.tasks.maker; -import bisq.core.app.BisqEnvironment; import bisq.core.trade.Trade; import bisq.core.trade.protocol.tasks.TradeTask; -import bisq.common.app.DevEnv; +import bisq.common.config.BaseCurrencyNetwork; import bisq.common.taskrunner.TaskRunner; import lombok.extern.slf4j.Slf4j; @@ -40,7 +39,7 @@ public class MakerSetsLockTime extends TradeTask { // 10 days for altcoins, 20 days for other payment methods int delay = processModel.getOffer().getPaymentMethod().isAsset() ? 144 * 10 : 144 * 20; - if (BisqEnvironment.getBaseCurrencyNetwork().isRegtest()) { + if (BaseCurrencyNetwork.CURRENT_NETWORK.isRegtest()) { delay = 5; } diff --git a/core/src/main/java/bisq/core/user/Preferences.java b/core/src/main/java/bisq/core/user/Preferences.java index 7c8070e309..39295f0fed 100644 --- a/core/src/main/java/bisq/core/user/Preferences.java +++ b/core/src/main/java/bisq/core/user/Preferences.java @@ -18,8 +18,6 @@ package bisq.core.user; import bisq.core.app.AppOptionKeys; -import bisq.core.app.BisqEnvironment; -import bisq.core.btc.BaseCurrencyNetwork; import bisq.core.btc.BtcOptionKeys; import bisq.core.btc.nodes.BtcNodes; import bisq.core.btc.wallet.Restrictions; @@ -37,6 +35,8 @@ import bisq.core.setup.CoreNetworkCapabilities; import bisq.network.p2p.network.BridgeAddressProvider; +import bisq.common.config.BaseCurrencyNetwork; +import bisq.common.config.Config; import bisq.common.proto.persistable.PersistedDataHost; import bisq.common.storage.Storage; import bisq.common.util.Utilities; @@ -135,7 +135,7 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid private final ObservableMap dontShowAgainMapAsObservable = FXCollections.observableHashMap(); private final Storage storage; - private final BisqEnvironment bisqEnvironment; + private final Config config; private final String btcNodesFromOptions, useTorFlagFromOptions, referralIdFromOptions, fullDaoNodeFromOptions, rpcUserFromOptions, rpcPwFromOptions, blockNotifyPortFromOptions; @Getter @@ -150,7 +150,7 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid @SuppressWarnings("WeakerAccess") @Inject public Preferences(Storage storage, - BisqEnvironment bisqEnvironment, + Config config, @Named(BtcOptionKeys.BTC_NODES) String btcNodesFromOptions, @Named(BtcOptionKeys.USE_TOR_FOR_BTC) String useTorFlagFromOptions, @Named(AppOptionKeys.REFERRAL_ID) String referralId, @@ -161,7 +161,7 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid this.storage = storage; - this.bisqEnvironment = bisqEnvironment; + this.config = config; this.btcNodesFromOptions = btcNodesFromOptions; this.useTorFlagFromOptions = useTorFlagFromOptions; this.referralIdFromOptions = referralId; @@ -206,7 +206,7 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid @Override public void readPersisted() { PreferencesPayload persisted = storage.initAndGetPersistedWithFileName("PreferencesPayload", 100); - BaseCurrencyNetwork baseCurrencyNetwork = BisqEnvironment.getBaseCurrencyNetwork(); + BaseCurrencyNetwork baseCurrencyNetwork = BaseCurrencyNetwork.CURRENT_NETWORK; TradeCurrency preferredTradeCurrency; if (persisted != null) { prefPayload = persisted; @@ -304,7 +304,7 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid // We set the capability in CoreNetworkCapabilities if the program argument is set. // If we have set it in the preferences view we handle it here. - CoreNetworkCapabilities.maybeApplyDaoFullMode(bisqEnvironment); + CoreNetworkCapabilities.maybeApplyDaoFullMode(config); initialReadDone = true; persist(); @@ -375,7 +375,7 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid } public void setBlockChainExplorer(BlockChainExplorer blockChainExplorer) { - if (BisqEnvironment.getBaseCurrencyNetwork().isMainnet()) + if (BaseCurrencyNetwork.CURRENT_NETWORK.isMainnet()) setBlockChainExplorerMainNet(blockChainExplorer); else setBlockChainExplorerTestNet(blockChainExplorer); @@ -696,7 +696,7 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid } public BlockChainExplorer getBlockChainExplorer() { - BaseCurrencyNetwork baseCurrencyNetwork = BisqEnvironment.getBaseCurrencyNetwork(); + BaseCurrencyNetwork baseCurrencyNetwork = BaseCurrencyNetwork.CURRENT_NETWORK; switch (baseCurrencyNetwork) { case BTC_MAINNET: return prefPayload.getBlockChainExplorerMainNet(); @@ -715,7 +715,7 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid } public ArrayList getBlockChainExplorers() { - BaseCurrencyNetwork baseCurrencyNetwork = BisqEnvironment.getBaseCurrencyNetwork(); + BaseCurrencyNetwork baseCurrencyNetwork = BaseCurrencyNetwork.CURRENT_NETWORK; switch (baseCurrencyNetwork) { case BTC_MAINNET: return BTC_MAIN_NET_EXPLORERS; @@ -743,8 +743,8 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid // We override the useTorForBitcoinJ and set it to false if we detected a localhost node or if we are not on mainnet, // unless the useTorForBtc parameter is explicitly provided. // On testnet there are very few Bitcoin tor nodes and we don't provide tor nodes. - if ((!BisqEnvironment.getBaseCurrencyNetwork().isMainnet() - || bisqEnvironment.isBitcoinLocalhostNodeRunning()) + if ((!BaseCurrencyNetwork.CURRENT_NETWORK.isMainnet() + || config.isLocalBitcoinNodeIsRunning()) && (useTorFlagFromOptions == null || useTorFlagFromOptions.isEmpty())) return false; else @@ -775,7 +775,7 @@ public final class Preferences implements PersistedDataHost, BridgeAddressProvid } public long getWithdrawalTxFeeInBytes() { - return Math.max(prefPayload.getWithdrawalTxFeeInBytes(), BisqEnvironment.getBaseCurrencyNetwork().getDefaultMinFeePerByte()); + return Math.max(prefPayload.getWithdrawalTxFeeInBytes(), BaseCurrencyNetwork.CURRENT_NETWORK.getDefaultMinFeePerByte()); } public boolean isDaoFullNode() { diff --git a/core/src/main/java/bisq/core/util/coin/BsqFormatter.java b/core/src/main/java/bisq/core/util/coin/BsqFormatter.java index 42d2a1a68e..db7f66d94e 100644 --- a/core/src/main/java/bisq/core/util/coin/BsqFormatter.java +++ b/core/src/main/java/bisq/core/util/coin/BsqFormatter.java @@ -17,7 +17,6 @@ package bisq.core.util.coin; -import bisq.core.app.BisqEnvironment; import bisq.core.dao.governance.param.Param; import bisq.core.dao.governance.proposal.ProposalValidationException; import bisq.core.locale.GlobalSettings; @@ -29,6 +28,7 @@ import bisq.core.util.validation.BtcAddressValidator; import bisq.core.util.validation.InputValidator; import bisq.common.app.DevEnv; +import bisq.common.config.BaseCurrencyNetwork; import bisq.common.util.MathUtils; import org.bitcoinj.core.Address; @@ -72,7 +72,7 @@ public class BsqFormatter implements CoinFormatter { @Inject public BsqFormatter() { - this.btcCoinFormat = BisqEnvironment.getParameters().getMonetaryFormat(); + this.btcCoinFormat = BaseCurrencyNetwork.CURRENT_PARAMETERS.getMonetaryFormat(); this.monetaryFormat = new MonetaryFormat().shift(6).code(6, "BSQ").minDecimals(2); this.immutableCoinFormatter = new ImmutableCoinFormatter(monetaryFormat); @@ -110,7 +110,7 @@ public class BsqFormatter implements CoinFormatter { encoded = encoded.substring(prefix.length(), encoded.length()); try { - return Address.fromBase58(BisqEnvironment.getParameters(), encoded); + return Address.fromBase58(BaseCurrencyNetwork.CURRENT_PARAMETERS, encoded); } catch (AddressFormatException e) { throw new RuntimeException(e); } diff --git a/core/src/main/java/bisq/core/util/validation/BtcAddressValidator.java b/core/src/main/java/bisq/core/util/validation/BtcAddressValidator.java index 5d1876d4c0..7956155728 100644 --- a/core/src/main/java/bisq/core/util/validation/BtcAddressValidator.java +++ b/core/src/main/java/bisq/core/util/validation/BtcAddressValidator.java @@ -17,9 +17,10 @@ package bisq.core.util.validation; -import bisq.core.app.BisqEnvironment; import bisq.core.locale.Res; +import bisq.common.config.BaseCurrencyNetwork; + import org.bitcoinj.core.Address; import org.bitcoinj.core.AddressFormatException; @@ -43,7 +44,7 @@ public final class BtcAddressValidator extends InputValidator { private ValidationResult validateBtcAddress(String input) { try { - Address.fromBase58(BisqEnvironment.getParameters(), input); + Address.fromBase58(BaseCurrencyNetwork.CURRENT_PARAMETERS, input); return new ValidationResult(true); } catch (AddressFormatException e) { return new ValidationResult(false, Res.get("validation.btc.invalidFormat")); diff --git a/core/src/test/java/bisq/core/app/BisqHelpFormatterTest.java b/core/src/test/java/bisq/core/app/BisqHelpFormatterTest.java index 1c740dcec2..7ac9777bc2 100644 --- a/core/src/test/java/bisq/core/app/BisqHelpFormatterTest.java +++ b/core/src/test/java/bisq/core/app/BisqHelpFormatterTest.java @@ -17,6 +17,8 @@ package bisq.core.app; +import bisq.common.config.BisqHelpFormatter; + import joptsimple.OptionParser; import java.net.URISyntaxException; diff --git a/core/src/test/java/bisq/core/locale/CurrencyUtilTest.java b/core/src/test/java/bisq/core/locale/CurrencyUtilTest.java index 0623445d61..592b438e46 100644 --- a/core/src/test/java/bisq/core/locale/CurrencyUtilTest.java +++ b/core/src/test/java/bisq/core/locale/CurrencyUtilTest.java @@ -17,7 +17,7 @@ package bisq.core.locale; -import bisq.core.btc.BaseCurrencyNetwork; +import bisq.common.config.BaseCurrencyNetwork; import bisq.asset.Asset; import bisq.asset.AssetRegistry; diff --git a/core/src/test/java/bisq/core/network/p2p/seed/DefaultSeedNodeRepositoryTest.java b/core/src/test/java/bisq/core/network/p2p/seed/DefaultSeedNodeRepositoryTest.java index 85b00a44fc..c2aa9276c7 100644 --- a/core/src/test/java/bisq/core/network/p2p/seed/DefaultSeedNodeRepositoryTest.java +++ b/core/src/test/java/bisq/core/network/p2p/seed/DefaultSeedNodeRepositoryTest.java @@ -17,11 +17,9 @@ package bisq.core.network.p2p.seed; -import bisq.core.app.BisqEnvironment; - import bisq.network.p2p.NodeAddress; -import org.springframework.core.env.PropertySource; +import bisq.common.config.TestConfig; import org.junit.Assert; import org.junit.Test; @@ -30,7 +28,7 @@ public class DefaultSeedNodeRepositoryTest { @Test public void getSeedNodes() { - DefaultSeedNodeRepository DUT = new DefaultSeedNodeRepository(new BisqEnvironment(new PropertySource.StubPropertySource("name")), null); + DefaultSeedNodeRepository DUT = new DefaultSeedNodeRepository(new TestConfig(), null); Assert.assertFalse(DUT.getSeedNodeAddresses().isEmpty()); } @@ -39,7 +37,7 @@ public class DefaultSeedNodeRepositoryTest { String seed1 = "asdf:8001"; String seed2 = "fdsa:6001"; String seedNodes = seed1 + "," + seed2; - DefaultSeedNodeRepository DUT = new DefaultSeedNodeRepository(new BisqEnvironment(new PropertySource.StubPropertySource("name")), seedNodes); + DefaultSeedNodeRepository DUT = new DefaultSeedNodeRepository(new TestConfig(), seedNodes); Assert.assertFalse(DUT.getSeedNodeAddresses().isEmpty()); Assert.assertEquals(2, DUT.getSeedNodeAddresses().size()); Assert.assertTrue(DUT.getSeedNodeAddresses().contains(new NodeAddress(seed1))); diff --git a/core/src/test/java/bisq/core/payment/validation/AltCoinAddressValidatorTest.java b/core/src/test/java/bisq/core/payment/validation/AltCoinAddressValidatorTest.java index 1ef48be4c3..611dbd8110 100644 --- a/core/src/test/java/bisq/core/payment/validation/AltCoinAddressValidatorTest.java +++ b/core/src/test/java/bisq/core/payment/validation/AltCoinAddressValidatorTest.java @@ -17,27 +17,25 @@ package bisq.core.payment.validation; -import bisq.core.app.BisqEnvironment; -import bisq.core.btc.BaseCurrencyNetwork; import bisq.core.locale.CurrencyUtil; import bisq.core.locale.Res; +import bisq.asset.AssetRegistry; + +import bisq.common.config.BaseCurrencyNetwork; + import org.junit.Test; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; - - -import bisq.asset.AssetRegistry; - public class AltCoinAddressValidatorTest { @Test public void test() { AltCoinAddressValidator validator = new AltCoinAddressValidator(new AssetRegistry()); - BaseCurrencyNetwork baseCurrencyNetwork = BisqEnvironment.getBaseCurrencyNetwork(); + BaseCurrencyNetwork baseCurrencyNetwork = BaseCurrencyNetwork.CURRENT_NETWORK; String currencyCode = baseCurrencyNetwork.getCurrencyCode(); Res.setBaseCurrencyCode(currencyCode); Res.setBaseCurrencyName(baseCurrencyNetwork.getCurrencyName()); diff --git a/core/src/test/java/bisq/core/user/PreferencesTest.java b/core/src/test/java/bisq/core/user/PreferencesTest.java index 5c37b6b0c4..a569949b68 100644 --- a/core/src/test/java/bisq/core/user/PreferencesTest.java +++ b/core/src/test/java/bisq/core/user/PreferencesTest.java @@ -17,7 +17,6 @@ package bisq.core.user; -import bisq.core.app.BisqEnvironment; import bisq.core.locale.CountryUtil; import bisq.core.locale.CryptoCurrency; import bisq.core.locale.CurrencyUtil; @@ -25,6 +24,7 @@ import bisq.core.locale.FiatCurrency; import bisq.core.locale.GlobalSettings; import bisq.core.locale.Res; +import bisq.common.config.TestConfig; import bisq.common.storage.Storage; import javafx.collections.ObservableList; @@ -48,7 +48,6 @@ public class PreferencesTest { private Preferences preferences; private Storage storage; - private BisqEnvironment bisqEnvironment; @Before public void setUp() { @@ -59,9 +58,7 @@ public class PreferencesTest { Res.setBaseCurrencyName("Bitcoin"); storage = mock(Storage.class); - bisqEnvironment = mock(BisqEnvironment.class); - - preferences = new Preferences(storage, bisqEnvironment, null, null, null, null, null, null, null); + preferences = new Preferences(storage, new TestConfig(), null, null, null, null, null, null, null); } @Test diff --git a/daemon/src/main/java/bisq/daemon/app/BisqDaemonMain.java b/daemon/src/main/java/bisq/daemon/app/BisqDaemonMain.java index f25d1be3b1..9e99a24534 100644 --- a/daemon/src/main/java/bisq/daemon/app/BisqDaemonMain.java +++ b/daemon/src/main/java/bisq/daemon/app/BisqDaemonMain.java @@ -17,7 +17,6 @@ package bisq.daemon.app; -import bisq.core.app.BisqExecutable; import bisq.core.app.BisqHeadlessAppMain; import bisq.core.app.BisqSetup; import bisq.core.app.CoreModule; @@ -39,13 +38,7 @@ import lombok.extern.slf4j.Slf4j; public class BisqDaemonMain extends BisqHeadlessAppMain implements BisqSetup.BisqSetupListener { public static void main(String[] args) throws Exception { - if (BisqExecutable.setupInitialOptionParser(args)) { - // For some reason the JavaFX launch process results in us losing the thread context class loader: reset it. - // In order to work around a bug in JavaFX 8u25 and below, you must include the following code as the first line of your realMain method: - Thread.currentThread().setContextClassLoader(BisqDaemonMain.class.getClassLoader()); - - new BisqDaemonMain().execute(args); - } + new BisqDaemonMain().execute(args); } /////////////////////////////////////////////////////////////////////////////////////////// @@ -82,7 +75,7 @@ public class BisqDaemonMain extends BisqHeadlessAppMain implements BisqSetup.Bis @Override protected AppModule getModule() { - return new CoreModule(bisqEnvironment); + return new CoreModule(bisqEnvironment, config); } @Override diff --git a/desktop/src/main/java/bisq/desktop/DesktopModule.java b/desktop/src/main/java/bisq/desktop/DesktopModule.java index ce4124f384..8280d01b7c 100644 --- a/desktop/src/main/java/bisq/desktop/DesktopModule.java +++ b/desktop/src/main/java/bisq/desktop/DesktopModule.java @@ -26,6 +26,7 @@ import bisq.core.app.AppOptionKeys; import bisq.core.locale.Res; import bisq.common.app.AppModule; +import bisq.common.config.Config; import org.springframework.core.env.Environment; @@ -37,8 +38,8 @@ import java.util.ResourceBundle; public class DesktopModule extends AppModule { - public DesktopModule(Environment environment) { - super(environment); + public DesktopModule(Environment environment, Config config) { + super(environment, config); } @Override diff --git a/desktop/src/main/java/bisq/desktop/app/BisqApp.java b/desktop/src/main/java/bisq/desktop/app/BisqApp.java index 3679582728..d22a860458 100644 --- a/desktop/src/main/java/bisq/desktop/app/BisqApp.java +++ b/desktop/src/main/java/bisq/desktop/app/BisqApp.java @@ -34,7 +34,6 @@ import bisq.desktop.util.ImageUtil; import bisq.core.app.AppOptionKeys; import bisq.core.app.AvoidStandbyModeService; -import bisq.core.app.BisqEnvironment; import bisq.core.app.OSXStandbyModeDisabler; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.btc.wallet.WalletsManager; @@ -47,6 +46,7 @@ import bisq.core.user.Preferences; import bisq.common.UserThread; import bisq.common.app.DevEnv; import bisq.common.app.Log; +import bisq.common.config.BaseCurrencyNetwork; import bisq.common.setup.GracefulShutDownHandler; import bisq.common.setup.UncaughtExceptionHandler; import bisq.common.util.Profiler; @@ -243,8 +243,8 @@ public class BisqApp extends Application implements UncaughtExceptionHandler { // configure the primary stage String appName = injector.getInstance(Key.get(String.class, Names.named(AppOptionKeys.APP_NAME_KEY))); - if (!BisqEnvironment.getBaseCurrencyNetwork().isMainnet()) - appName += " [" + Res.get(BisqEnvironment.getBaseCurrencyNetwork().name()) + "]"; + if (!BaseCurrencyNetwork.CURRENT_NETWORK.isMainnet()) + appName += " [" + Res.get(BaseCurrencyNetwork.CURRENT_NETWORK.name()) + "]"; stage.setTitle(appName); stage.setScene(scene); diff --git a/desktop/src/main/java/bisq/desktop/app/BisqAppMain.java b/desktop/src/main/java/bisq/desktop/app/BisqAppMain.java index 7f63a3ef69..75f5d11f52 100644 --- a/desktop/src/main/java/bisq/desktop/app/BisqAppMain.java +++ b/desktop/src/main/java/bisq/desktop/app/BisqAppMain.java @@ -38,20 +38,23 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public class BisqAppMain extends BisqExecutable { + + public static final String DEFAULT_APP_NAME = "Bisq"; + private BisqApp application; public BisqAppMain() { - super("Bisq Desktop", "bisq-desktop", Version.VERSION); + super("Bisq Desktop", "bisq-desktop", DEFAULT_APP_NAME, Version.VERSION); } public static void main(String[] args) throws Exception { - if (BisqExecutable.setupInitialOptionParser(args)) { - // For some reason the JavaFX launch process results in us losing the thread context class loader: reset it. - // In order to work around a bug in JavaFX 8u25 and below, you must include the following code as the first line of your realMain method: - Thread.currentThread().setContextClassLoader(BisqAppMain.class.getClassLoader()); + // For some reason the JavaFX launch process results in us losing the thread + // context class loader: reset it. In order to work around a bug in JavaFX 8u25 + // and below, you must include the following code as the first line of your + // realMain method: + Thread.currentThread().setContextClassLoader(BisqAppMain.class.getClassLoader()); - new BisqAppMain().execute(args); - } + new BisqAppMain().execute(args); } @Override @@ -101,7 +104,7 @@ public class BisqAppMain extends BisqExecutable { @Override protected AppModule getModule() { - return new BisqAppModule(bisqEnvironment); + return new BisqAppModule(bisqEnvironment, config); } @Override diff --git a/desktop/src/main/java/bisq/desktop/app/BisqAppModule.java b/desktop/src/main/java/bisq/desktop/app/BisqAppModule.java index 942c49a718..35079a0dcd 100644 --- a/desktop/src/main/java/bisq/desktop/app/BisqAppModule.java +++ b/desktop/src/main/java/bisq/desktop/app/BisqAppModule.java @@ -22,26 +22,19 @@ import bisq.desktop.DesktopModule; import bisq.core.app.CoreModule; import bisq.common.app.AppModule; +import bisq.common.config.Config; import org.springframework.core.env.Environment; public class BisqAppModule extends AppModule { - public BisqAppModule(Environment environment) { - super(environment); + public BisqAppModule(Environment environment, Config config) { + super(environment, config); } @Override protected void configure() { - install(coreModule()); - install(desktopModule()); - } - - private CoreModule coreModule() { - return new CoreModule(environment); - } - - private DesktopModule desktopModule() { - return new DesktopModule(environment); + install(new CoreModule(environment, config)); + install(new DesktopModule(environment, config)); } } diff --git a/desktop/src/main/java/bisq/desktop/app/SystemTray.java b/desktop/src/main/java/bisq/desktop/app/SystemTray.java index 61f4c83221..d8dbf749a5 100644 --- a/desktop/src/main/java/bisq/desktop/app/SystemTray.java +++ b/desktop/src/main/java/bisq/desktop/app/SystemTray.java @@ -20,7 +20,7 @@ package bisq.desktop.app; import bisq.desktop.util.GUIUtil; import bisq.desktop.util.ImageUtil; -import bisq.core.exceptions.BisqException; +import bisq.common.BisqException; import bisq.core.locale.Res; import bisq.common.UserThread; diff --git a/desktop/src/main/java/bisq/desktop/main/MainView.java b/desktop/src/main/java/bisq/desktop/main/MainView.java index 061ded5025..de1084a2fb 100644 --- a/desktop/src/main/java/bisq/desktop/main/MainView.java +++ b/desktop/src/main/java/bisq/desktop/main/MainView.java @@ -43,7 +43,7 @@ import bisq.desktop.util.DisplayUtils; import bisq.desktop.util.Transitions; import bisq.core.dao.monitoring.DaoStateMonitoringService; -import bisq.core.exceptions.BisqException; +import bisq.common.BisqException; import bisq.core.locale.GlobalSettings; import bisq.core.locale.LanguageUtil; import bisq.core.locale.Res; diff --git a/desktop/src/main/java/bisq/desktop/main/MainViewModel.java b/desktop/src/main/java/bisq/desktop/main/MainViewModel.java index 23150ff8f4..d69c2064b0 100644 --- a/desktop/src/main/java/bisq/desktop/main/MainViewModel.java +++ b/desktop/src/main/java/bisq/desktop/main/MainViewModel.java @@ -40,11 +40,10 @@ import bisq.desktop.util.GUIUtil; import bisq.core.account.sign.SignedWitnessService; import bisq.core.account.witness.AccountAgeWitnessService; import bisq.core.alert.PrivateNotificationManager; -import bisq.core.app.AppOptionKeys; -import bisq.core.app.BisqEnvironment; import bisq.core.app.BisqSetup; import bisq.core.btc.setup.WalletsSetup; import bisq.core.btc.wallet.BtcWalletService; +import bisq.common.config.Config; import bisq.core.locale.CryptoCurrency; import bisq.core.locale.CurrencyUtil; import bisq.core.locale.Res; @@ -118,7 +117,7 @@ public class MainViewModel implements ViewModel, BisqSetup.BisqSetupListener { private final TacWindow tacWindow; @Getter private final PriceFeedService priceFeedService; - private final BisqEnvironment bisqEnvironment; + private final Config config; private final AccountAgeWitnessService accountAgeWitnessService; @Getter private final TorNetworkSettingsWindow torNetworkSettingsWindow; @@ -158,7 +157,7 @@ public class MainViewModel implements ViewModel, BisqSetup.BisqSetupListener { TacWindow tacWindow, FeeService feeService, PriceFeedService priceFeedService, - BisqEnvironment bisqEnvironment, + Config config, AccountAgeWitnessService accountAgeWitnessService, TorNetworkSettingsWindow torNetworkSettingsWindow, CorruptedDatabaseFilesHandler corruptedDatabaseFilesHandler) { @@ -179,7 +178,7 @@ public class MainViewModel implements ViewModel, BisqSetup.BisqSetupListener { this.notificationCenter = notificationCenter; this.tacWindow = tacWindow; this.priceFeedService = priceFeedService; - this.bisqEnvironment = bisqEnvironment; + this.config = config; this.accountAgeWitnessService = accountAgeWitnessService; this.torNetworkSettingsWindow = torNetworkSettingsWindow; this.corruptedDatabaseFilesHandler = corruptedDatabaseFilesHandler; @@ -318,7 +317,7 @@ public class MainViewModel implements ViewModel, BisqSetup.BisqSetupListener { .onClose(() -> BisqApp.getShutDownHandler().run()) .show()); - bisqSetup.setDisplayUpdateHandler((alert, key) -> new DisplayUpdateDownloadWindow(alert) + bisqSetup.setDisplayUpdateHandler((alert, key) -> new DisplayUpdateDownloadWindow(alert, config) .actionButtonText(Res.get("displayUpdateDownloadWindow.button.downloadLater")) .onAction(() -> { preferences.dontShowAgain(key, false); // update later @@ -371,8 +370,7 @@ public class MainViewModel implements ViewModel, BisqSetup.BisqSetupListener { bisqSetup.setShowPopupIfInvalidBtcConfigHandler(this::showPopupIfInvalidBtcConfig); corruptedDatabaseFilesHandler.getCorruptedDatabaseFiles().ifPresent(files -> new Popup() - .warning(Res.get("popup.warning.incompatibleDB", files.toString(), - bisqEnvironment.getProperty(AppOptionKeys.APP_DATA_DIR_KEY))) + .warning(Res.get("popup.warning.incompatibleDB", files.toString(), config.getAppDataDir())) .useShutDownButton() .show()); @@ -438,7 +436,7 @@ public class MainViewModel implements ViewModel, BisqSetup.BisqSetupListener { checkNumberOfBtcPeersTimer = UserThread.runAfter(() -> { // check again numPeers if (walletsSetup.numPeersProperty().get() == 0) { - if (bisqEnvironment.isBitcoinLocalhostNodeRunning()) + if (config.isLocalBitcoinNodeIsRunning()) getWalletServiceErrorMsg().set(Res.get("mainView.networkWarning.localhostBitcoinLost", Res.getBaseCurrencyName().toLowerCase())); else getWalletServiceErrorMsg().set(Res.get("mainView.networkWarning.allConnectionsLost", Res.getBaseCurrencyName().toLowerCase())); diff --git a/desktop/src/main/java/bisq/desktop/main/account/content/backup/BackupView.java b/desktop/src/main/java/bisq/desktop/main/account/content/backup/BackupView.java index 8fe52da18a..a83f842b41 100644 --- a/desktop/src/main/java/bisq/desktop/main/account/content/backup/BackupView.java +++ b/desktop/src/main/java/bisq/desktop/main/account/content/backup/BackupView.java @@ -22,11 +22,10 @@ import bisq.desktop.common.view.FxmlView; import bisq.desktop.main.overlays.popups.Popup; import bisq.desktop.util.Layout; -import bisq.core.app.AppOptionKeys; -import bisq.core.app.BisqEnvironment; import bisq.core.locale.Res; import bisq.core.user.Preferences; +import bisq.common.config.Config; import bisq.common.storage.FileUtil; import bisq.common.util.Tuple2; import bisq.common.util.Utilities; @@ -73,10 +72,10 @@ public class BackupView extends ActivatableView { /////////////////////////////////////////////////////////////////////////////////////////// @Inject - private BackupView(Preferences preferences, BisqEnvironment environment) { + private BackupView(Preferences preferences, Config config) { super(); this.preferences = preferences; - dataDir = new File(environment.getProperty(AppOptionKeys.APP_DATA_DIR_KEY)); + dataDir = new File(config.getAppDataDir().getPath()); logFile = new File(Paths.get(dataDir.getPath(), "bisq.log").toString()); } diff --git a/desktop/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsView.java b/desktop/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsView.java index 70c93a9103..0c90643309 100644 --- a/desktop/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsView.java +++ b/desktop/src/main/java/bisq/desktop/main/account/content/fiataccounts/FiatAccountsView.java @@ -72,7 +72,6 @@ import bisq.desktop.util.validation.UpholdValidator; import bisq.desktop.util.validation.WeChatPayValidator; import bisq.core.account.witness.AccountAgeWitnessService; -import bisq.core.app.BisqEnvironment; import bisq.core.locale.Res; import bisq.core.offer.OfferRestrictions; import bisq.core.payment.CashDepositAccount; @@ -90,6 +89,7 @@ import bisq.core.util.FormattingUtils; import bisq.core.util.coin.CoinFormatter; import bisq.core.util.validation.InputValidator; +import bisq.common.config.BaseCurrencyNetwork; import bisq.common.util.Tuple2; import bisq.common.util.Tuple3; @@ -256,7 +256,7 @@ public class FiatAccountsView extends PaymentAccountsView { - final String currencyName = BisqEnvironment.getBaseCurrencyNetwork().getCurrencyName(); + final String currencyName = BaseCurrencyNetwork.CURRENT_NETWORK.getCurrencyName(); if (paymentAccount instanceof ClearXchangeAccount) { new Popup().information(Res.get("payment.clearXchange.info", currencyName, currencyName)) .width(900) diff --git a/desktop/src/main/java/bisq/desktop/main/dao/governance/ProposalDisplay.java b/desktop/src/main/java/bisq/desktop/main/dao/governance/ProposalDisplay.java index 1e7439fe24..f2b925081e 100644 --- a/desktop/src/main/java/bisq/desktop/main/dao/governance/ProposalDisplay.java +++ b/desktop/src/main/java/bisq/desktop/main/dao/governance/ProposalDisplay.java @@ -31,7 +31,7 @@ import bisq.desktop.util.Layout; import bisq.desktop.util.validation.BsqValidator; import bisq.desktop.util.validation.RegexValidator; -import bisq.core.btc.BaseCurrencyNetwork; +import bisq.common.config.BaseCurrencyNetwork; import bisq.core.dao.DaoFacade; import bisq.core.dao.governance.bond.Bond; import bisq.core.dao.governance.bond.role.BondedRole; diff --git a/desktop/src/main/java/bisq/desktop/main/overlays/Overlay.java b/desktop/src/main/java/bisq/desktop/main/overlays/Overlay.java index 0053c087aa..ffe711922a 100644 --- a/desktop/src/main/java/bisq/desktop/main/overlays/Overlay.java +++ b/desktop/src/main/java/bisq/desktop/main/overlays/Overlay.java @@ -27,7 +27,6 @@ import bisq.desktop.util.FormBuilder; import bisq.desktop.util.GUIUtil; import bisq.desktop.util.Transitions; -import bisq.core.app.BisqEnvironment; import bisq.core.locale.GlobalSettings; import bisq.core.locale.LanguageUtil; import bisq.core.locale.Res; @@ -35,6 +34,7 @@ import bisq.core.user.DontShowAgainLookup; import bisq.common.Timer; import bisq.common.UserThread; +import bisq.common.config.Config; import bisq.common.util.Utilities; import com.google.common.reflect.TypeToken; @@ -81,8 +81,6 @@ import javafx.collections.ObservableList; import javafx.util.Duration; -import java.nio.file.Paths; - import java.io.File; import java.io.IOException; @@ -845,8 +843,8 @@ public abstract class Overlay> { gridPane.getChildren().add(logButton); logButton.setOnAction(event -> { try { - File dataDir = new File(BisqEnvironment.getStaticAppDataDir()); - File logFile = new File(Paths.get(dataDir.getPath(), "bisq.log").toString()); + File dataDir = Config.CURRENT_APP_DATA_DIR; + File logFile = new File(dataDir, "bisq.log"); Utilities.openFile(logFile); } catch (IOException e) { e.printStackTrace(); diff --git a/desktop/src/main/java/bisq/desktop/main/overlays/windows/DaoLaunchWindow.java b/desktop/src/main/java/bisq/desktop/main/overlays/windows/DaoLaunchWindow.java index c9cdafbaf9..23d35f2f87 100644 --- a/desktop/src/main/java/bisq/desktop/main/overlays/windows/DaoLaunchWindow.java +++ b/desktop/src/main/java/bisq/desktop/main/overlays/windows/DaoLaunchWindow.java @@ -17,6 +17,7 @@ package bisq.desktop.main.overlays.windows; +import bisq.desktop.app.BisqAppMain; import bisq.desktop.components.AutoTooltipToggleButton; import bisq.desktop.main.overlays.Overlay; @@ -101,7 +102,7 @@ public class DaoLaunchWindow extends Overlay { @Override protected void addHeadLine() { - Label versionNumber = addLabel(gridPane, ++rowIndex, BisqEnvironment.DEFAULT_APP_NAME + " v1.0"); + Label versionNumber = addLabel(gridPane, ++rowIndex, BisqAppMain.DEFAULT_APP_NAME + " v1.0"); versionNumber.getStyleClass().add("dao-launch-version"); GridPane.setColumnSpan(versionNumber, 2); Label headlineLabel = addLabel(gridPane, ++rowIndex, headLine); diff --git a/desktop/src/main/java/bisq/desktop/main/overlays/windows/NewTradeProtocolLaunchWindow.java b/desktop/src/main/java/bisq/desktop/main/overlays/windows/NewTradeProtocolLaunchWindow.java index 8f6172310f..aaa4811892 100644 --- a/desktop/src/main/java/bisq/desktop/main/overlays/windows/NewTradeProtocolLaunchWindow.java +++ b/desktop/src/main/java/bisq/desktop/main/overlays/windows/NewTradeProtocolLaunchWindow.java @@ -17,6 +17,7 @@ package bisq.desktop.main.overlays.windows; +import bisq.desktop.app.BisqAppMain; import bisq.desktop.components.AutoTooltipLabel; import bisq.desktop.components.ExternalHyperlink; import bisq.desktop.components.HyperlinkWithIcon; @@ -83,7 +84,7 @@ public class NewTradeProtocolLaunchWindow extends Overlay { private final Alert alert; + private final Config config; private Optional downloadTaskOptional; private VerifyTask verifyTask; private ProgressBar progressBar; @@ -81,9 +83,9 @@ public class DisplayUpdateDownloadWindow extends Overlay { private final Preferences preferences; private final BtcNodes btcNodes; private final FilterManager filterManager; - private final BisqEnvironment bisqEnvironment; + private final Config config; private final TorNetworkSettingsWindow torNetworkSettingsWindow; private final ClockWatcher clockWatcher; private final WalletsSetup walletsSetup; @@ -137,7 +137,7 @@ public class NetworkSettingsView extends ActivatableView { Preferences preferences, BtcNodes btcNodes, FilterManager filterManager, - BisqEnvironment bisqEnvironment, + Config config, TorNetworkSettingsWindow torNetworkSettingsWindow, ClockWatcher clockWatcher) { super(); @@ -146,7 +146,7 @@ public class NetworkSettingsView extends ActivatableView { this.preferences = preferences; this.btcNodes = btcNodes; this.filterManager = filterManager; - this.bisqEnvironment = bisqEnvironment; + this.config = config; this.torNetworkSettingsWindow = torNetworkSettingsWindow; this.clockWatcher = clockWatcher; } @@ -165,7 +165,7 @@ public class NetworkSettingsView extends ActivatableView { bitcoinPeerSubVersionColumn.setGraphic(new AutoTooltipLabel(Res.get("settings.net.subVersionColumn"))); bitcoinPeerHeightColumn.setGraphic(new AutoTooltipLabel(Res.get("settings.net.heightColumn"))); localhostBtcNodeInfoLabel.setText(Res.get("settings.net.localhostBtcNodeInfo")); - if (!bisqEnvironment.isBitcoinLocalhostNodeRunning()) { + if (!config.isLocalBitcoinNodeIsRunning()) { localhostBtcNodeInfoLabel.setVisible(false); } useProvidedNodesRadio.setText(Res.get("settings.net.useProvidedNodesRadio")); @@ -380,7 +380,7 @@ public class NetworkSettingsView extends ActivatableView { } private void onBitcoinPeersToggleSelected(boolean calledFromUser) { - boolean bitcoinLocalhostNodeRunning = bisqEnvironment.isBitcoinLocalhostNodeRunning(); + boolean bitcoinLocalhostNodeRunning = config.isLocalBitcoinNodeIsRunning(); useTorForBtcJCheckBox.setDisable(bitcoinLocalhostNodeRunning); bitcoinNodesLabel.setDisable(bitcoinLocalhostNodeRunning); btcNodesLabel.setDisable(bitcoinLocalhostNodeRunning); @@ -460,7 +460,7 @@ public class NetworkSettingsView extends ActivatableView { private void applyPreventPublicBtcNetwork() { final boolean preventPublicBtcNetwork = isPreventPublicBtcNetwork(); - usePublicNodesRadio.setDisable(bisqEnvironment.isBitcoinLocalhostNodeRunning() || preventPublicBtcNetwork); + usePublicNodesRadio.setDisable(config.isLocalBitcoinNodeIsRunning() || preventPublicBtcNetwork); if (preventPublicBtcNetwork && selectedBitcoinNodesOption == BtcNodes.BitcoinNodesOption.PUBLIC) { selectedBitcoinNodesOption = BtcNodes.BitcoinNodesOption.PROVIDED; preferences.setBitcoinNodesOptionOrdinal(selectedBitcoinNodesOption.ordinal()); diff --git a/desktop/src/main/java/bisq/desktop/main/settings/preferences/PreferencesView.java b/desktop/src/main/java/bisq/desktop/main/settings/preferences/PreferencesView.java index 5143dddb9c..08e5515762 100644 --- a/desktop/src/main/java/bisq/desktop/main/settings/preferences/PreferencesView.java +++ b/desktop/src/main/java/bisq/desktop/main/settings/preferences/PreferencesView.java @@ -30,7 +30,6 @@ import bisq.desktop.util.ImageUtil; import bisq.desktop.util.Layout; import bisq.desktop.util.validation.RegexValidator; -import bisq.core.app.BisqEnvironment; import bisq.core.btc.wallet.Restrictions; import bisq.core.dao.DaoFacade; import bisq.core.dao.DaoOptionKeys; @@ -53,6 +52,7 @@ import bisq.core.util.validation.IntegerValidator; import bisq.common.UserThread; import bisq.common.app.DevEnv; +import bisq.common.config.BaseCurrencyNetwork; import bisq.common.util.Tuple3; import bisq.common.util.Utilities; @@ -273,7 +273,7 @@ public class PreferencesView extends ActivatableViewAndModel onSelectNetwork()); - selectBaseCurrencyNetworkComboBox.getSelectionModel().select(BisqEnvironment.getBaseCurrencyNetwork());*/ + selectBaseCurrencyNetworkComboBox.getSelectionModel().select(BaseCurrencyNetwork.CURRENT_VALUE);*/ boolean useCustomWithdrawalTxFee = preferences.isUseCustomWithdrawalTxFee(); useCustomFee.setSelected(useCustomWithdrawalTxFee); @@ -920,7 +920,7 @@ public class PreferencesView extends ActivatableViewAndModel selectBaseCurrencyNetworkComboBox.getSelectionModel().select(BisqEnvironment.getBaseCurrencyNetwork())) + .onClose(() -> selectBaseCurrencyNetworkComboBox.getSelectionModel().select(BaseCurrencyNetwork.CURRENT_VALUE)) .show(); }*/ diff --git a/desktop/src/main/java/bisq/desktop/util/GUIUtil.java b/desktop/src/main/java/bisq/desktop/util/GUIUtil.java index d77f9ac9cd..7848e364aa 100644 --- a/desktop/src/main/java/bisq/desktop/util/GUIUtil.java +++ b/desktop/src/main/java/bisq/desktop/util/GUIUtil.java @@ -31,7 +31,6 @@ import bisq.desktop.util.validation.RegexValidator; import bisq.core.account.witness.AccountAgeWitness; import bisq.core.account.witness.AccountAgeWitnessService; -import bisq.core.app.BisqEnvironment; import bisq.core.btc.setup.WalletsSetup; import bisq.core.btc.wallet.WalletsManager; import bisq.core.locale.Country; @@ -59,6 +58,7 @@ import bisq.network.p2p.P2PService; import bisq.common.UserThread; import bisq.common.app.DevEnv; +import bisq.common.config.BaseCurrencyNetwork; import bisq.common.proto.persistable.PersistableList; import bisq.common.proto.persistable.PersistenceProtoResolver; import bisq.common.storage.CorruptedDatabaseFilesHandler; @@ -692,7 +692,7 @@ public class GUIUtil { public static void showClearXchangeWarning() { String key = "confirmClearXchangeRequirements"; - final String currencyName = BisqEnvironment.getBaseCurrencyNetwork().getCurrencyName(); + final String currencyName = BaseCurrencyNetwork.CURRENT_NETWORK.getCurrencyName(); new Popup().information(Res.get("payment.clearXchange.info", currencyName, currencyName)) .width(900) .closeButtonText(Res.get("shared.iConfirm")) @@ -702,7 +702,7 @@ public class GUIUtil { public static String getBitcoinURI(String address, Coin amount, String label) { return address != null ? - BitcoinURI.convertToBitcoinURI(Address.fromBase58(BisqEnvironment.getParameters(), + BitcoinURI.convertToBitcoinURI(Address.fromBase58(BaseCurrencyNetwork.CURRENT_PARAMETERS, address), amount, label, null) : ""; } diff --git a/desktop/src/test/java/bisq/desktop/GuiceSetupTest.java b/desktop/src/test/java/bisq/desktop/GuiceSetupTest.java index 1569552201..c294b81460 100644 --- a/desktop/src/test/java/bisq/desktop/GuiceSetupTest.java +++ b/desktop/src/test/java/bisq/desktop/GuiceSetupTest.java @@ -53,6 +53,7 @@ import bisq.network.p2p.network.BridgeAddressProvider; import bisq.network.p2p.seed.SeedNodeRepository; import bisq.common.ClockWatcher; +import bisq.common.config.TestConfig; import bisq.common.crypto.KeyRing; import bisq.common.crypto.KeyStorage; import bisq.common.crypto.PubKeyRing; @@ -82,7 +83,7 @@ public class GuiceSetupTest { Res.setup(); CurrencyUtil.setup(); - injector = Guice.createInjector(new BisqAppModule(new BisqEnvironment(new MockPropertySource()))); + injector = Guice.createInjector(new BisqAppModule(new BisqEnvironment(new MockPropertySource()), new TestConfig())); } @Test diff --git a/desktop/src/test/java/bisq/desktop/main/market/offerbook/OfferBookChartViewModelTest.java b/desktop/src/test/java/bisq/desktop/main/market/offerbook/OfferBookChartViewModelTest.java index 18bdbbf066..f595008b7d 100644 --- a/desktop/src/test/java/bisq/desktop/main/market/offerbook/OfferBookChartViewModelTest.java +++ b/desktop/src/test/java/bisq/desktop/main/market/offerbook/OfferBookChartViewModelTest.java @@ -21,12 +21,13 @@ import bisq.desktop.main.offer.offerbook.OfferBook; import bisq.desktop.main.offer.offerbook.OfferBookListItem; import bisq.desktop.main.offer.offerbook.OfferBookListItemMaker; -import bisq.core.app.BisqEnvironment; import bisq.core.locale.GlobalSettings; import bisq.core.provider.price.PriceFeedService; import bisq.core.util.coin.CoinFormatter; import bisq.core.util.coin.ImmutableCoinFormatter; +import bisq.common.config.BaseCurrencyNetwork; + import javafx.beans.property.SimpleIntegerProperty; import javafx.collections.FXCollections; @@ -48,7 +49,7 @@ import static org.mockito.Mockito.when; public class OfferBookChartViewModelTest { - private final CoinFormatter coinFormatter = new ImmutableCoinFormatter(BisqEnvironment.getParameters().getMonetaryFormat()); + private final CoinFormatter coinFormatter = new ImmutableCoinFormatter(BaseCurrencyNetwork.CURRENT_PARAMETERS.getMonetaryFormat()); @Before public void setUp() { diff --git a/desktop/src/test/java/bisq/desktop/main/market/spread/SpreadViewModelTest.java b/desktop/src/test/java/bisq/desktop/main/market/spread/SpreadViewModelTest.java index b94d284c93..4a34da8585 100644 --- a/desktop/src/test/java/bisq/desktop/main/market/spread/SpreadViewModelTest.java +++ b/desktop/src/test/java/bisq/desktop/main/market/spread/SpreadViewModelTest.java @@ -22,11 +22,12 @@ import bisq.desktop.main.offer.offerbook.OfferBook; import bisq.desktop.main.offer.offerbook.OfferBookListItem; import bisq.desktop.main.offer.offerbook.OfferBookListItemMaker; -import bisq.core.app.BisqEnvironment; import bisq.core.provider.price.PriceFeedService; import bisq.core.util.coin.CoinFormatter; import bisq.core.util.coin.ImmutableCoinFormatter; +import bisq.common.config.BaseCurrencyNetwork; + import javafx.collections.FXCollections; import javafx.collections.ObservableList; @@ -43,7 +44,7 @@ import static org.mockito.Mockito.when; public class SpreadViewModelTest { - private final CoinFormatter coinFormatter = new ImmutableCoinFormatter(BisqEnvironment.getParameters().getMonetaryFormat()); + private final CoinFormatter coinFormatter = new ImmutableCoinFormatter(BaseCurrencyNetwork.CURRENT_PARAMETERS.getMonetaryFormat()); @Test public void testMaxCharactersForAmountWithNoOffers() { diff --git a/desktop/src/test/java/bisq/desktop/main/offer/createoffer/CreateOfferViewModelTest.java b/desktop/src/test/java/bisq/desktop/main/offer/createoffer/CreateOfferViewModelTest.java index c44c0f8aad..d56992ae2c 100644 --- a/desktop/src/test/java/bisq/desktop/main/offer/createoffer/CreateOfferViewModelTest.java +++ b/desktop/src/test/java/bisq/desktop/main/offer/createoffer/CreateOfferViewModelTest.java @@ -24,7 +24,6 @@ import bisq.desktop.util.validation.FiatPriceValidator; import bisq.desktop.util.validation.SecurityDepositValidator; import bisq.core.account.witness.AccountAgeWitnessService; -import bisq.core.app.BisqEnvironment; import bisq.core.btc.model.AddressEntry; import bisq.core.btc.wallet.BsqWalletService; import bisq.core.btc.wallet.BtcWalletService; @@ -45,6 +44,8 @@ import bisq.core.util.coin.BsqFormatter; import bisq.core.util.coin.CoinFormatter; import bisq.core.util.validation.InputValidator; +import bisq.common.config.BaseCurrencyNetwork; + import org.bitcoinj.core.Coin; import javafx.beans.property.SimpleIntegerProperty; @@ -70,7 +71,7 @@ import static org.mockito.Mockito.when; public class CreateOfferViewModelTest { private CreateOfferViewModel model; - private final CoinFormatter coinFormatter = new ImmutableCoinFormatter(BisqEnvironment.getParameters().getMonetaryFormat()); + private final CoinFormatter coinFormatter = new ImmutableCoinFormatter(BaseCurrencyNetwork.CURRENT_PARAMETERS.getMonetaryFormat()); @Before public void setUp() { diff --git a/desktop/src/test/java/bisq/desktop/main/offer/offerbook/OfferBookViewModelTest.java b/desktop/src/test/java/bisq/desktop/main/offer/offerbook/OfferBookViewModelTest.java index 6eb83893f1..a999e147f5 100644 --- a/desktop/src/test/java/bisq/desktop/main/offer/offerbook/OfferBookViewModelTest.java +++ b/desktop/src/test/java/bisq/desktop/main/offer/offerbook/OfferBookViewModelTest.java @@ -17,7 +17,6 @@ package bisq.desktop.main.offer.offerbook; -import bisq.core.app.BisqEnvironment; import bisq.core.locale.Country; import bisq.core.locale.CryptoCurrency; import bisq.core.locale.FiatCurrency; @@ -46,6 +45,8 @@ import bisq.core.util.coin.CoinFormatter; import bisq.core.util.coin.ImmutableCoinFormatter; import bisq.core.util.coin.BsqFormatter; +import bisq.common.config.BaseCurrencyNetwork; + import javafx.beans.property.SimpleIntegerProperty; import javafx.collections.FXCollections; @@ -80,7 +81,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class OfferBookViewModelTest { - private final CoinFormatter coinFormatter = new ImmutableCoinFormatter(BisqEnvironment.getParameters().getMonetaryFormat()); + private final CoinFormatter coinFormatter = new ImmutableCoinFormatter(BaseCurrencyNetwork.CURRENT_PARAMETERS.getMonetaryFormat()); private static final Logger log = LoggerFactory.getLogger(OfferBookViewModelTest.class); @Before diff --git a/desktop/src/test/java/bisq/desktop/maker/PreferenceMakers.java b/desktop/src/test/java/bisq/desktop/maker/PreferenceMakers.java index 1cd33a1ad5..ebe3213878 100644 --- a/desktop/src/test/java/bisq/desktop/maker/PreferenceMakers.java +++ b/desktop/src/test/java/bisq/desktop/maker/PreferenceMakers.java @@ -17,9 +17,9 @@ package bisq.desktop.maker; -import bisq.core.app.BisqEnvironment; import bisq.core.user.Preferences; +import bisq.common.config.Config; import bisq.common.storage.Storage; import com.natpryce.makeiteasy.Instantiator; @@ -32,14 +32,14 @@ import static com.natpryce.makeiteasy.MakeItEasy.make; public class PreferenceMakers { public static final Property storage = new Property<>(); - public static final Property bisqEnvironment = new Property<>(); + public static final Property config = new Property<>(); public static final Property btcNodesFromOptions = new Property<>(); public static final Property useTorFlagFromOptions = new Property<>(); public static final Property referralID = new Property<>(); public static final Instantiator Preferences = lookup -> new Preferences( lookup.valueOf(storage, new SameValueDonor(null)), - lookup.valueOf(bisqEnvironment, new SameValueDonor(null)), + lookup.valueOf(config, new SameValueDonor(null)), lookup.valueOf(btcNodesFromOptions, new SameValueDonor(null)), lookup.valueOf(useTorFlagFromOptions, new SameValueDonor(null)), lookup.valueOf(referralID, new SameValueDonor(null)), diff --git a/desktop/src/test/java/bisq/desktop/util/DisplayUtilsTest.java b/desktop/src/test/java/bisq/desktop/util/DisplayUtilsTest.java index 15b261e03b..6a0893e0bb 100644 --- a/desktop/src/test/java/bisq/desktop/util/DisplayUtilsTest.java +++ b/desktop/src/test/java/bisq/desktop/util/DisplayUtilsTest.java @@ -1,6 +1,5 @@ package bisq.desktop.util; -import bisq.core.app.BisqEnvironment; import bisq.core.locale.Res; import bisq.core.monetary.Volume; import bisq.core.offer.Offer; @@ -8,6 +7,8 @@ import bisq.core.offer.OfferPayload; import bisq.core.util.coin.ImmutableCoinFormatter; import bisq.core.util.coin.CoinFormatter; +import bisq.common.config.BaseCurrencyNetwork; + import org.bitcoinj.core.Coin; import java.util.Locale; @@ -26,7 +27,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class DisplayUtilsTest { - private final CoinFormatter formatter = new ImmutableCoinFormatter(BisqEnvironment.getParameters().getMonetaryFormat()); + private final CoinFormatter formatter = new ImmutableCoinFormatter(BaseCurrencyNetwork.CURRENT_PARAMETERS.getMonetaryFormat()); @Before public void setUp() { diff --git a/desktop/src/test/java/bisq/desktop/util/ImmutableCoinFormatterTest.java b/desktop/src/test/java/bisq/desktop/util/ImmutableCoinFormatterTest.java index 3a2172c0d9..3b0cdb6918 100644 --- a/desktop/src/test/java/bisq/desktop/util/ImmutableCoinFormatterTest.java +++ b/desktop/src/test/java/bisq/desktop/util/ImmutableCoinFormatterTest.java @@ -17,11 +17,12 @@ package bisq.desktop.util; -import bisq.core.app.BisqEnvironment; import bisq.core.locale.Res; import bisq.core.util.coin.ImmutableCoinFormatter; import bisq.core.util.coin.CoinFormatter; +import bisq.common.config.BaseCurrencyNetwork; + import org.bitcoinj.core.CoinMaker; import java.util.Locale; @@ -40,7 +41,7 @@ import static org.mockito.Mockito.mock; public class ImmutableCoinFormatterTest { - private final CoinFormatter formatter = new ImmutableCoinFormatter(BisqEnvironment.getParameters().getMonetaryFormat()); + private final CoinFormatter formatter = new ImmutableCoinFormatter(BaseCurrencyNetwork.CURRENT_PARAMETERS.getMonetaryFormat()); @Before public void setUp() { diff --git a/desktop/src/test/java/bisq/desktop/util/validation/AdvancedCashValidatorTest.java b/desktop/src/test/java/bisq/desktop/util/validation/AdvancedCashValidatorTest.java index 5e601ee865..34f41790c5 100644 --- a/desktop/src/test/java/bisq/desktop/util/validation/AdvancedCashValidatorTest.java +++ b/desktop/src/test/java/bisq/desktop/util/validation/AdvancedCashValidatorTest.java @@ -1,10 +1,10 @@ package bisq.desktop.util.validation; -import bisq.core.app.BisqEnvironment; -import bisq.core.btc.BaseCurrencyNetwork; import bisq.core.locale.CurrencyUtil; import bisq.core.locale.Res; +import bisq.common.config.BaseCurrencyNetwork; + import org.junit.Before; import org.junit.Test; @@ -14,7 +14,7 @@ import static org.junit.Assert.assertTrue; public class AdvancedCashValidatorTest { @Before public void setup() { - final BaseCurrencyNetwork baseCurrencyNetwork = BisqEnvironment.getBaseCurrencyNetwork(); + final BaseCurrencyNetwork baseCurrencyNetwork = BaseCurrencyNetwork.CURRENT_NETWORK; final String currencyCode = baseCurrencyNetwork.getCurrencyCode(); Res.setBaseCurrencyCode(currencyCode); Res.setBaseCurrencyName(baseCurrencyNetwork.getCurrencyName()); diff --git a/desktop/src/test/java/bisq/desktop/util/validation/BtcValidatorTest.java b/desktop/src/test/java/bisq/desktop/util/validation/BtcValidatorTest.java index 24b054c038..6ebaae3377 100644 --- a/desktop/src/test/java/bisq/desktop/util/validation/BtcValidatorTest.java +++ b/desktop/src/test/java/bisq/desktop/util/validation/BtcValidatorTest.java @@ -17,8 +17,7 @@ package bisq.desktop.util.validation; -import bisq.core.app.BisqEnvironment; -import bisq.core.btc.BaseCurrencyNetwork; +import bisq.common.config.BaseCurrencyNetwork; import bisq.core.locale.CurrencyUtil; import bisq.core.locale.Res; import bisq.core.util.coin.CoinFormatter; @@ -34,11 +33,11 @@ import static org.junit.Assert.assertTrue; public class BtcValidatorTest { - private final CoinFormatter coinFormatter = new ImmutableCoinFormatter(BisqEnvironment.getParameters().getMonetaryFormat()); + private final CoinFormatter coinFormatter = new ImmutableCoinFormatter(BaseCurrencyNetwork.CURRENT_PARAMETERS.getMonetaryFormat()); @Before public void setup() { - final BaseCurrencyNetwork baseCurrencyNetwork = BisqEnvironment.getBaseCurrencyNetwork(); + final BaseCurrencyNetwork baseCurrencyNetwork = BaseCurrencyNetwork.CURRENT_NETWORK; final String currencyCode = baseCurrencyNetwork.getCurrencyCode(); Res.setBaseCurrencyCode(currencyCode); Res.setBaseCurrencyName(baseCurrencyNetwork.getCurrencyName()); diff --git a/desktop/src/test/java/bisq/desktop/util/validation/FiatVolumeValidatorTest.java b/desktop/src/test/java/bisq/desktop/util/validation/FiatVolumeValidatorTest.java index 60b29ca484..b255b1440d 100644 --- a/desktop/src/test/java/bisq/desktop/util/validation/FiatVolumeValidatorTest.java +++ b/desktop/src/test/java/bisq/desktop/util/validation/FiatVolumeValidatorTest.java @@ -17,11 +17,11 @@ package bisq.desktop.util.validation; -import bisq.core.app.BisqEnvironment; -import bisq.core.btc.BaseCurrencyNetwork; import bisq.core.locale.CurrencyUtil; import bisq.core.locale.Res; +import bisq.common.config.BaseCurrencyNetwork; + import org.junit.Before; import org.junit.Test; @@ -32,7 +32,7 @@ public class FiatVolumeValidatorTest { @Before public void setup() { - final BaseCurrencyNetwork baseCurrencyNetwork = BisqEnvironment.getBaseCurrencyNetwork(); + final BaseCurrencyNetwork baseCurrencyNetwork = BaseCurrencyNetwork.CURRENT_NETWORK; final String currencyCode = baseCurrencyNetwork.getCurrencyCode(); Res.setBaseCurrencyCode(currencyCode); Res.setBaseCurrencyName(baseCurrencyNetwork.getCurrencyName()); diff --git a/desktop/src/test/java/bisq/desktop/util/validation/InteracETransferAnswerValidatorTest.java b/desktop/src/test/java/bisq/desktop/util/validation/InteracETransferAnswerValidatorTest.java index 673cc492b2..cfba9ba1c8 100644 --- a/desktop/src/test/java/bisq/desktop/util/validation/InteracETransferAnswerValidatorTest.java +++ b/desktop/src/test/java/bisq/desktop/util/validation/InteracETransferAnswerValidatorTest.java @@ -17,11 +17,11 @@ package bisq.desktop.util.validation; -import bisq.core.app.BisqEnvironment; -import bisq.core.btc.BaseCurrencyNetwork; import bisq.core.locale.CurrencyUtil; import bisq.core.locale.Res; +import bisq.common.config.BaseCurrencyNetwork; + import org.junit.Before; import org.junit.Test; @@ -32,7 +32,7 @@ public class InteracETransferAnswerValidatorTest { @Before public void setup() { - final BaseCurrencyNetwork baseCurrencyNetwork = BisqEnvironment.getBaseCurrencyNetwork(); + final BaseCurrencyNetwork baseCurrencyNetwork = BaseCurrencyNetwork.CURRENT_NETWORK; final String currencyCode = baseCurrencyNetwork.getCurrencyCode(); Res.setBaseCurrencyCode(currencyCode); Res.setBaseCurrencyName(baseCurrencyNetwork.getCurrencyName()); diff --git a/desktop/src/test/java/bisq/desktop/util/validation/InteracETransferQuestionValidatorTest.java b/desktop/src/test/java/bisq/desktop/util/validation/InteracETransferQuestionValidatorTest.java index af77aa7a29..f816145e4a 100644 --- a/desktop/src/test/java/bisq/desktop/util/validation/InteracETransferQuestionValidatorTest.java +++ b/desktop/src/test/java/bisq/desktop/util/validation/InteracETransferQuestionValidatorTest.java @@ -17,11 +17,11 @@ package bisq.desktop.util.validation; -import bisq.core.app.BisqEnvironment; -import bisq.core.btc.BaseCurrencyNetwork; import bisq.core.locale.CurrencyUtil; import bisq.core.locale.Res; +import bisq.common.config.BaseCurrencyNetwork; + import org.junit.Before; import org.junit.Test; @@ -32,7 +32,7 @@ public class InteracETransferQuestionValidatorTest { @Before public void setup() { - final BaseCurrencyNetwork baseCurrencyNetwork = BisqEnvironment.getBaseCurrencyNetwork(); + final BaseCurrencyNetwork baseCurrencyNetwork = BaseCurrencyNetwork.CURRENT_NETWORK; final String currencyCode = baseCurrencyNetwork.getCurrencyCode(); Res.setBaseCurrencyCode(currencyCode); Res.setBaseCurrencyName(baseCurrencyNetwork.getCurrencyName()); diff --git a/desktop/src/test/java/bisq/desktop/util/validation/InteracETransferValidatorTest.java b/desktop/src/test/java/bisq/desktop/util/validation/InteracETransferValidatorTest.java index 29dc74e76e..4ec35e7777 100644 --- a/desktop/src/test/java/bisq/desktop/util/validation/InteracETransferValidatorTest.java +++ b/desktop/src/test/java/bisq/desktop/util/validation/InteracETransferValidatorTest.java @@ -17,11 +17,11 @@ package bisq.desktop.util.validation; -import bisq.core.app.BisqEnvironment; -import bisq.core.btc.BaseCurrencyNetwork; import bisq.core.locale.CurrencyUtil; import bisq.core.locale.Res; +import bisq.common.config.BaseCurrencyNetwork; + import org.junit.Before; import org.junit.Test; @@ -32,7 +32,7 @@ public class InteracETransferValidatorTest { @Before public void setup() { - final BaseCurrencyNetwork baseCurrencyNetwork = BisqEnvironment.getBaseCurrencyNetwork(); + final BaseCurrencyNetwork baseCurrencyNetwork = BaseCurrencyNetwork.CURRENT_NETWORK; final String currencyCode = baseCurrencyNetwork.getCurrencyCode(); Res.setBaseCurrencyCode(currencyCode); Res.setBaseCurrencyName(baseCurrencyNetwork.getCurrencyName()); diff --git a/desktop/src/test/java/bisq/desktop/util/validation/LengthValidatorTest.java b/desktop/src/test/java/bisq/desktop/util/validation/LengthValidatorTest.java index 0b95331850..99929a72d2 100644 --- a/desktop/src/test/java/bisq/desktop/util/validation/LengthValidatorTest.java +++ b/desktop/src/test/java/bisq/desktop/util/validation/LengthValidatorTest.java @@ -17,11 +17,11 @@ package bisq.desktop.util.validation; -import bisq.core.app.BisqEnvironment; -import bisq.core.btc.BaseCurrencyNetwork; import bisq.core.locale.CurrencyUtil; import bisq.core.locale.Res; +import bisq.common.config.BaseCurrencyNetwork; + import org.junit.Before; import org.junit.Test; @@ -32,7 +32,7 @@ public class LengthValidatorTest { @Before public void setup() { - final BaseCurrencyNetwork baseCurrencyNetwork = BisqEnvironment.getBaseCurrencyNetwork(); + final BaseCurrencyNetwork baseCurrencyNetwork = BaseCurrencyNetwork.CURRENT_NETWORK; final String currencyCode = baseCurrencyNetwork.getCurrencyCode(); Res.setBaseCurrencyCode(currencyCode); Res.setBaseCurrencyName(baseCurrencyNetwork.getCurrencyName()); diff --git a/desktop/src/test/java/bisq/desktop/util/validation/RegexValidatorTest.java b/desktop/src/test/java/bisq/desktop/util/validation/RegexValidatorTest.java index dd9a91a969..13ce3cc1ea 100644 --- a/desktop/src/test/java/bisq/desktop/util/validation/RegexValidatorTest.java +++ b/desktop/src/test/java/bisq/desktop/util/validation/RegexValidatorTest.java @@ -17,15 +17,14 @@ package bisq.desktop.util.validation; -import bisq.core.app.BisqEnvironment; -import bisq.core.btc.BaseCurrencyNetwork; import bisq.core.locale.CurrencyUtil; import bisq.core.locale.Res; +import bisq.common.config.BaseCurrencyNetwork; + import org.junit.Before; import org.junit.Test; -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -33,7 +32,7 @@ public class RegexValidatorTest { @Before public void setup() { - final BaseCurrencyNetwork baseCurrencyNetwork = BisqEnvironment.getBaseCurrencyNetwork(); + final BaseCurrencyNetwork baseCurrencyNetwork = BaseCurrencyNetwork.CURRENT_NETWORK; final String currencyCode = baseCurrencyNetwork.getCurrencyCode(); Res.setBaseCurrencyCode(currencyCode); Res.setBaseCurrencyName(baseCurrencyNetwork.getCurrencyName()); diff --git a/monitor/src/main/java/bisq/monitor/Metric.java b/monitor/src/main/java/bisq/monitor/Metric.java index 342980602f..ad25f69e73 100644 --- a/monitor/src/main/java/bisq/monitor/Metric.java +++ b/monitor/src/main/java/bisq/monitor/Metric.java @@ -17,10 +17,8 @@ package bisq.monitor; -import bisq.common.app.Capabilities; import bisq.common.app.Version; -import java.util.Arrays; import java.util.Properties; import java.util.Random; import java.util.concurrent.ScheduledExecutorService; diff --git a/monitor/src/main/java/bisq/monitor/metric/P2PMarketStats.java b/monitor/src/main/java/bisq/monitor/metric/P2PMarketStats.java index 21a17fd994..c89a7437f1 100644 --- a/monitor/src/main/java/bisq/monitor/metric/P2PMarketStats.java +++ b/monitor/src/main/java/bisq/monitor/metric/P2PMarketStats.java @@ -21,7 +21,7 @@ import bisq.monitor.OnionParser; import bisq.monitor.Reporter; import bisq.core.account.witness.AccountAgeWitnessStore; -import bisq.core.btc.BaseCurrencyNetwork; +import bisq.common.config.BaseCurrencyNetwork; import bisq.core.offer.OfferPayload; import bisq.core.proto.persistable.CorePersistenceProtoResolver; import bisq.core.trade.statistics.TradeStatistics2Store; diff --git a/monitor/src/main/java/bisq/monitor/metric/P2PNetworkLoad.java b/monitor/src/main/java/bisq/monitor/metric/P2PNetworkLoad.java index 5ae4dc61ac..fe496201f9 100644 --- a/monitor/src/main/java/bisq/monitor/metric/P2PNetworkLoad.java +++ b/monitor/src/main/java/bisq/monitor/metric/P2PNetworkLoad.java @@ -24,7 +24,7 @@ import bisq.monitor.Reporter; import bisq.monitor.ThreadGate; import bisq.core.app.BisqEnvironment; -import bisq.core.btc.BaseCurrencyNetwork; +import bisq.common.config.BaseCurrencyNetwork; import bisq.core.btc.BtcOptionKeys; import bisq.core.network.p2p.seed.DefaultSeedNodeRepository; import bisq.core.proto.network.CoreNetworkProtoResolver; @@ -42,13 +42,12 @@ import bisq.network.p2p.peers.peerexchange.PeerList; import bisq.network.p2p.storage.messages.BroadcastMessage; import bisq.common.ClockWatcher; +import bisq.common.config.Config; import bisq.common.proto.network.NetworkEnvelope; import bisq.common.proto.network.NetworkProtoResolver; import bisq.common.storage.CorruptedDatabaseFilesHandler; import bisq.common.storage.Storage; -import org.springframework.core.env.PropertySource; - import java.time.Clock; import java.io.File; @@ -130,21 +129,13 @@ public class P2PNetworkLoad extends Metric implements MessageListener, SetupList // boot up P2P node File storageDir = torHiddenServiceDir; try { - BisqEnvironment environment = new BisqEnvironment(new PropertySource("name") { - - @Override - public String getProperty(String name) { - if(BtcOptionKeys.BASE_CURRENCY_NETWORK.equals(name)) - return BaseCurrencyNetwork.BTC_MAINNET.name(); - return ""; - } - }); + Config config = new Config("bisq-monitor"); CorruptedDatabaseFilesHandler corruptedDatabaseFilesHandler = new CorruptedDatabaseFilesHandler(); int maxConnections = Integer.parseInt(configuration.getProperty(MAX_CONNECTIONS, "12")); NetworkProtoResolver networkProtoResolver = new CoreNetworkProtoResolver(Clock.systemDefaultZone()); CorePersistenceProtoResolver persistenceProtoResolver = new CorePersistenceProtoResolver(null, networkProtoResolver, storageDir, corruptedDatabaseFilesHandler); - DefaultSeedNodeRepository seedNodeRepository = new DefaultSeedNodeRepository(environment, null); + DefaultSeedNodeRepository seedNodeRepository = new DefaultSeedNodeRepository(config, null); PeerManager peerManager = new PeerManager(networkNode, seedNodeRepository, new ClockWatcher(), maxConnections, new Storage(storageDir, persistenceProtoResolver, corruptedDatabaseFilesHandler)); diff --git a/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshot.java b/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshot.java index aefb227189..8da68d450d 100644 --- a/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshot.java +++ b/monitor/src/main/java/bisq/monitor/metric/P2PSeedNodeSnapshot.java @@ -21,7 +21,7 @@ import bisq.monitor.OnionParser; import bisq.monitor.Reporter; import bisq.core.account.witness.AccountAgeWitnessStore; -import bisq.core.btc.BaseCurrencyNetwork; +import bisq.common.config.BaseCurrencyNetwork; import bisq.core.dao.monitoring.model.StateHash; import bisq.core.dao.monitoring.network.messages.GetBlindVoteStateHashesRequest; import bisq.core.dao.monitoring.network.messages.GetDaoStateHashesRequest; diff --git a/monitor/src/main/java/bisq/monitor/reporter/ConsoleReporter.java b/monitor/src/main/java/bisq/monitor/reporter/ConsoleReporter.java index e3d666dbf2..e6df6fa46e 100644 --- a/monitor/src/main/java/bisq/monitor/reporter/ConsoleReporter.java +++ b/monitor/src/main/java/bisq/monitor/reporter/ConsoleReporter.java @@ -19,7 +19,7 @@ package bisq.monitor.reporter; import bisq.monitor.Reporter; -import bisq.core.btc.BaseCurrencyNetwork; +import bisq.common.config.BaseCurrencyNetwork; import bisq.common.app.Version; diff --git a/monitor/src/main/java/bisq/monitor/reporter/GraphiteReporter.java b/monitor/src/main/java/bisq/monitor/reporter/GraphiteReporter.java index 466ca0801a..406704bc63 100644 --- a/monitor/src/main/java/bisq/monitor/reporter/GraphiteReporter.java +++ b/monitor/src/main/java/bisq/monitor/reporter/GraphiteReporter.java @@ -20,7 +20,7 @@ package bisq.monitor.reporter; import bisq.monitor.OnionParser; import bisq.monitor.Reporter; -import bisq.core.btc.BaseCurrencyNetwork; +import bisq.common.config.BaseCurrencyNetwork; import bisq.network.p2p.NodeAddress; diff --git a/p2p/src/main/java/bisq/network/crypto/EncryptionServiceModule.java b/p2p/src/main/java/bisq/network/crypto/EncryptionServiceModule.java index 0204443bbd..b40e41775c 100644 --- a/p2p/src/main/java/bisq/network/crypto/EncryptionServiceModule.java +++ b/p2p/src/main/java/bisq/network/crypto/EncryptionServiceModule.java @@ -18,6 +18,7 @@ package bisq.network.crypto; import bisq.common.app.AppModule; +import bisq.common.config.Config; import org.springframework.core.env.Environment; @@ -25,8 +26,8 @@ import com.google.inject.Singleton; public class EncryptionServiceModule extends AppModule { - public EncryptionServiceModule(Environment environment) { - super(environment); + public EncryptionServiceModule(Environment environment, Config config) { + super(environment, config); } @Override diff --git a/p2p/src/main/java/bisq/network/p2p/P2PModule.java b/p2p/src/main/java/bisq/network/p2p/P2PModule.java index d1f3aeb22c..6211f2b11e 100644 --- a/p2p/src/main/java/bisq/network/p2p/P2PModule.java +++ b/p2p/src/main/java/bisq/network/p2p/P2PModule.java @@ -35,6 +35,7 @@ import bisq.network.p2p.storage.persistence.ProtectedDataStoreService; import bisq.network.p2p.storage.persistence.ResourceDataStoreService; import bisq.common.app.AppModule; +import bisq.common.config.Config; import org.springframework.core.env.Environment; @@ -47,11 +48,10 @@ import java.io.File; import static com.google.inject.name.Names.named; - public class P2PModule extends AppModule { - public P2PModule(Environment environment) { - super(environment); + public P2PModule(Environment environment, Config config) { + super(environment, config); } @Override diff --git a/seednode/src/main/java/bisq/seednode/SeedNodeMain.java b/seednode/src/main/java/bisq/seednode/SeedNodeMain.java index ad0bf0e4eb..201066b0e4 100644 --- a/seednode/src/main/java/bisq/seednode/SeedNodeMain.java +++ b/seednode/src/main/java/bisq/seednode/SeedNodeMain.java @@ -38,15 +38,12 @@ public class SeedNodeMain extends ExecutableForAppWithP2p { private SeedNode seedNode; public SeedNodeMain() { - super("Bisq Seednode", "bisq-seednode", VERSION); + super("Bisq Seednode", "bisq-seednode", "bisq_seednode", VERSION); } public static void main(String[] args) throws Exception { log.info("SeedNode.VERSION: " + VERSION); - BisqEnvironment.setDefaultAppName("bisq_seednode"); - - if (BisqExecutable.setupInitialOptionParser(args)) - new SeedNodeMain().execute(args); + new SeedNodeMain().execute(args); } @Override @@ -89,7 +86,7 @@ public class SeedNodeMain extends ExecutableForAppWithP2p { @Override protected AppModule getModule() { - return new ModuleForAppWithP2p(bisqEnvironment); + return new ModuleForAppWithP2p(bisqEnvironment, config); } @Override diff --git a/seednode/src/test/java/bisq/seednode/GuiceSetupTest.java b/seednode/src/test/java/bisq/seednode/GuiceSetupTest.java index f1a309f1ea..bce08f3f46 100644 --- a/seednode/src/test/java/bisq/seednode/GuiceSetupTest.java +++ b/seednode/src/test/java/bisq/seednode/GuiceSetupTest.java @@ -6,6 +6,8 @@ import bisq.core.app.misc.ModuleForAppWithP2p; import bisq.core.locale.CurrencyUtil; import bisq.core.locale.Res; +import bisq.common.config.TestConfig; + import org.springframework.mock.env.MockPropertySource; import com.google.inject.Guice; @@ -18,7 +20,7 @@ public class GuiceSetupTest { Res.setup(); CurrencyUtil.setup(); - ModuleForAppWithP2p module = new ModuleForAppWithP2p(new BisqEnvironment(new MockPropertySource())); + ModuleForAppWithP2p module = new ModuleForAppWithP2p(new BisqEnvironment(new MockPropertySource()), new TestConfig()); Guice.createInjector(module).getInstance(AppSetupWithP2PAndDAO.class); } } diff --git a/statsnode/src/main/java/bisq/statistics/StatisticsMain.java b/statsnode/src/main/java/bisq/statistics/StatisticsMain.java index 8a028099c3..d80e8ee6c6 100644 --- a/statsnode/src/main/java/bisq/statistics/StatisticsMain.java +++ b/statsnode/src/main/java/bisq/statistics/StatisticsMain.java @@ -18,7 +18,6 @@ package bisq.statistics; import bisq.core.app.BisqEnvironment; -import bisq.core.app.BisqExecutable; import bisq.core.app.misc.ExecutableForAppWithP2p; import bisq.core.app.misc.ModuleForAppWithP2p; @@ -36,15 +35,12 @@ public class StatisticsMain extends ExecutableForAppWithP2p { private Statistics statistics; public StatisticsMain() { - super("Bisq Statsnode", "bisq-statistics", VERSION); + super("Bisq Statsnode", "bisq-statistics", "bisq_statistics", VERSION); } public static void main(String[] args) throws Exception { log.info("Statistics.VERSION: " + VERSION); - BisqEnvironment.setDefaultAppName("bisq_statistics"); - - if (BisqExecutable.setupInitialOptionParser(args)) - new StatisticsMain().execute(args); + new StatisticsMain().execute(args); } @Override @@ -85,7 +81,7 @@ public class StatisticsMain extends ExecutableForAppWithP2p { @Override protected AppModule getModule() { - return new ModuleForAppWithP2p(bisqEnvironment); + return new ModuleForAppWithP2p(bisqEnvironment, config); } @Override