diff --git a/apitest/src/main/java/bisq/apitest/config/BisqAppConfig.java b/apitest/src/main/java/bisq/apitest/config/BisqAppConfig.java index 08a7531ca30..eb0934d4a07 100644 --- a/apitest/src/main/java/bisq/apitest/config/BisqAppConfig.java +++ b/apitest/src/main/java/bisq/apitest/config/BisqAppConfig.java @@ -66,7 +66,7 @@ public enum BisqAppConfig { 49998), alicedesktop("bisq-BTC_REGTEST_Alice_dao", "bisq-desktop", - "-XX:MaxRAM=4g -Dlogback.configurationFile=apitest/build/resources/main/logback.xml", + "-XX:MaxRAM=8g -Dlogback.configurationFile=apitest/build/resources/main/logback.xml", BisqAppMain.class.getName(), 7777, 5122, @@ -82,7 +82,7 @@ public enum BisqAppConfig { 49999), bobdesktop("bisq-BTC_REGTEST_Bob_dao", "bisq-desktop", - "-XX:MaxRAM=4g -Dlogback.configurationFile=apitest/build/resources/main/logback.xml", + "-XX:MaxRAM=8g -Dlogback.configurationFile=apitest/build/resources/main/logback.xml", BisqAppMain.class.getName(), 8888, 5123, diff --git a/build.gradle b/build.gradle index 10761cadad2..90087191fc8 100644 --- a/build.gradle +++ b/build.gradle @@ -145,7 +145,9 @@ configure([project(':cli'), if (applicationName == 'desktop') { def script = file("${rootProject.projectDir}/bisq-$applicationName") script.text = script.text.replace( - 'DEFAULT_JVM_OPTS=""', 'DEFAULT_JVM_OPTS="-XX:MaxRAM=4g"') + 'DEFAULT_JVM_OPTS=""', 'DEFAULT_JVM_OPTS="-XX:MaxRAM=8g -Xss1280k -XX:+UseG1GC ' + + '-XX:MaxHeapFreeRatio=10 -XX:MinHeapFreeRatio=5 -XX:+UseStringDeduplication ' + + '-Djava.net.preferIPv4Stack=true"') } if (applicationName == 'apitest') { @@ -412,7 +414,7 @@ configure(project(':desktop')) { modules = ['javafx.controls', 'javafx.fxml'] } - version = '1.7.1-SNAPSHOT' + version = '1.7.2-SNAPSHOT' jar.manifest.attributes( "Implementation-Title": project.name, diff --git a/common/src/main/java/bisq/common/app/Version.java b/common/src/main/java/bisq/common/app/Version.java index 0bc9fc7f857..47d444e0274 100644 --- a/common/src/main/java/bisq/common/app/Version.java +++ b/common/src/main/java/bisq/common/app/Version.java @@ -30,7 +30,7 @@ public class Version { // VERSION = 0.5.0 introduces proto buffer for the P2P network and local DB and is a not backward compatible update // Therefore all sub versions start again with 1 // We use semantic versioning with major, minor and patch - public static final String VERSION = "1.7.1"; + public static final String VERSION = "1.7.2"; /** * Holds a list of the tagged resource files for optimizing the getData requests. @@ -38,7 +38,7 @@ public class Version { * historical data stores. */ public static final List HISTORICAL_RESOURCE_FILE_VERSION_TAGS = Arrays.asList("1.4.0", "1.5.0", "1.5.2", - "1.5.5", "1.5.7", "1.6.0", "1.6.3", "1.6.5"); + "1.5.5", "1.5.7", "1.6.0", "1.6.3", "1.6.5", "1.7.2"); public static int getMajorVersion(String version) { return getSubVersion(version, 0); diff --git a/core/src/main/java/bisq/core/locale/CurrencyUtil.java b/core/src/main/java/bisq/core/locale/CurrencyUtil.java index d38729f8f0b..b7275ddf4a8 100644 --- a/core/src/main/java/bisq/core/locale/CurrencyUtil.java +++ b/core/src/main/java/bisq/core/locale/CurrencyUtil.java @@ -348,6 +348,15 @@ public static List getAllAmazonGiftCardCurrencies() { return currencies; } + public static List getAllCapitualCurrencies() { + return new ArrayList<>(Arrays.asList( + new FiatCurrency("BRL"), + new FiatCurrency("EUR"), + new FiatCurrency("GBP"), + new FiatCurrency("USD") + )); + } + // https://www.revolut.com/help/getting-started/exchanging-currencies/what-fiat-currencies-are-supported-for-holding-and-exchange public static List getAllRevolutCurrencies() { ArrayList currencies = new ArrayList<>(Arrays.asList( diff --git a/core/src/main/java/bisq/core/payment/CapitualAccount.java b/core/src/main/java/bisq/core/payment/CapitualAccount.java new file mode 100644 index 00000000000..46ba14a43f1 --- /dev/null +++ b/core/src/main/java/bisq/core/payment/CapitualAccount.java @@ -0,0 +1,46 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.payment; + +import bisq.core.locale.CurrencyUtil; +import bisq.core.payment.payload.CapitualAccountPayload; +import bisq.core.payment.payload.PaymentAccountPayload; +import bisq.core.payment.payload.PaymentMethod; + +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +public final class CapitualAccount extends PaymentAccount { + public CapitualAccount() { + super(PaymentMethod.CAPITUAL); + tradeCurrencies.addAll(CurrencyUtil.getAllCapitualCurrencies()); + } + + @Override + protected PaymentAccountPayload createPayload() { + return new CapitualAccountPayload(paymentMethod.getId(), id); + } + + public void setAccountNr(String accountNr) { + ((CapitualAccountPayload) paymentAccountPayload).setAccountNr(accountNr); + } + + public String getAccountNr() { + return ((CapitualAccountPayload) paymentAccountPayload).getAccountNr(); + } +} diff --git a/core/src/main/java/bisq/core/payment/PaymentAccountFactory.java b/core/src/main/java/bisq/core/payment/PaymentAccountFactory.java index faed57acd34..0cceb0cb865 100644 --- a/core/src/main/java/bisq/core/payment/PaymentAccountFactory.java +++ b/core/src/main/java/bisq/core/payment/PaymentAccountFactory.java @@ -86,6 +86,8 @@ public static PaymentAccount getPaymentAccount(PaymentMethod paymentMethod) { return new AmazonGiftCardAccount(); case PaymentMethod.BLOCK_CHAINS_INSTANT_ID: return new InstantCryptoCurrencyAccount(); + case PaymentMethod.CAPITUAL_ID: + return new CapitualAccount(); // Cannot be deleted as it would break old trade history entries case PaymentMethod.OK_PAY_ID: diff --git a/core/src/main/java/bisq/core/payment/payload/CapitualAccountPayload.java b/core/src/main/java/bisq/core/payment/payload/CapitualAccountPayload.java new file mode 100644 index 00000000000..e8db6f0b50a --- /dev/null +++ b/core/src/main/java/bisq/core/payment/payload/CapitualAccountPayload.java @@ -0,0 +1,99 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.core.payment.payload; + +import bisq.core.locale.Res; + +import com.google.protobuf.Message; + +import java.nio.charset.StandardCharsets; + +import java.util.HashMap; +import java.util.Map; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; + +@EqualsAndHashCode(callSuper = true) +@ToString +@Setter +@Getter +@Slf4j +public final class CapitualAccountPayload extends PaymentAccountPayload { + private String accountNr = ""; + + public CapitualAccountPayload(String paymentMethod, String id) { + super(paymentMethod, id); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // PROTO BUFFER + /////////////////////////////////////////////////////////////////////////////////////////// + + private CapitualAccountPayload(String paymentMethod, + String id, + String accountNr, + long maxTradePeriod, + Map excludeFromJsonDataMap) { + super(paymentMethod, + id, + maxTradePeriod, + excludeFromJsonDataMap); + + this.accountNr = accountNr; + } + + @Override + public Message toProtoMessage() { + return getPaymentAccountPayloadBuilder() + .setCapitualAccountPayload(protobuf.CapitualAccountPayload.newBuilder() + .setAccountNr(accountNr)) + .build(); + } + + public static CapitualAccountPayload fromProto(protobuf.PaymentAccountPayload proto) { + return new CapitualAccountPayload(proto.getPaymentMethodId(), + proto.getId(), + proto.getCapitualAccountPayload().getAccountNr(), + proto.getMaxTradePeriod(), + new HashMap<>(proto.getExcludeFromJsonDataMap())); + } + + /////////////////////////////////////////////////////////////////////////////////////////// + // API + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public String getPaymentDetails() { + return Res.get(paymentMethodId) + " - " + Res.getWithCol("payment.capitual.cap") + " " + accountNr; + } + + @Override + public String getPaymentDetailsForTradePopup() { + return getPaymentDetails(); + } + + @Override + public byte[] getAgeWitnessInputData() { + return super.getAgeWitnessInputData(accountNr.getBytes(StandardCharsets.UTF_8)); + } +} diff --git a/core/src/main/java/bisq/core/payment/payload/PaymentMethod.java b/core/src/main/java/bisq/core/payment/payload/PaymentMethod.java index 3d2c3004f27..0a6072e69dd 100644 --- a/core/src/main/java/bisq/core/payment/payload/PaymentMethod.java +++ b/core/src/main/java/bisq/core/payment/payload/PaymentMethod.java @@ -99,6 +99,7 @@ public final class PaymentMethod implements PersistablePayload, Comparable CFBundleVersion - 1.7.1 + 1.7.2 CFBundleShortVersionString - 1.7.1 + 1.7.2 CFBundleExecutable Bisq diff --git a/desktop/package/macosx/copy_dbs.sh b/desktop/package/macosx/copy_dbs.sh index fa46eda014a..8c1f9a8d57f 100755 --- a/desktop/package/macosx/copy_dbs.sh +++ b/desktop/package/macosx/copy_dbs.sh @@ -2,7 +2,7 @@ cd $(dirname $0)/../../../ -version="1.7.1" +version="1.7.2" # Set BISQ_DIR as environment var to the path of your locally synced Bisq data directory e.g. BISQ_DIR=~/Library/Application\ Support/Bisq diff --git a/desktop/package/macosx/finalize.sh b/desktop/package/macosx/finalize.sh index 7ac301f54ed..b3c779c2a95 100755 --- a/desktop/package/macosx/finalize.sh +++ b/desktop/package/macosx/finalize.sh @@ -2,7 +2,7 @@ cd ../../ -version="1.7.1-SNAPSHOT" +version="1.7.2-SNAPSHOT" target_dir="releases/$version" diff --git a/desktop/package/macosx/insert_snapshot_version.sh b/desktop/package/macosx/insert_snapshot_version.sh index 852c505697c..0baba93029a 100755 --- a/desktop/package/macosx/insert_snapshot_version.sh +++ b/desktop/package/macosx/insert_snapshot_version.sh @@ -2,7 +2,7 @@ cd $(dirname $0)/../../../ -version=1.7.1 +version=1.7.2 find . -type f \( -name "finalize.sh" \ -o -name "create_app.sh" \ diff --git a/desktop/package/macosx/replace_version_number.sh b/desktop/package/macosx/replace_version_number.sh index a6b772e3f31..4a8d66271eb 100755 --- a/desktop/package/macosx/replace_version_number.sh +++ b/desktop/package/macosx/replace_version_number.sh @@ -2,8 +2,8 @@ cd $(dirname $0)/../../../. -oldVersion=1.7.0 -newVersion=1.7.1 +oldVersion=1.7.1 +newVersion=1.7.2 find . -type f \( -name "finalize.sh" \ -o -name "create_app.sh" \ diff --git a/desktop/package/package.gradle b/desktop/package/package.gradle index 4f0e9bdb4a9..aaba761f66c 100644 --- a/desktop/package/package.gradle +++ b/desktop/package/package.gradle @@ -231,7 +231,11 @@ task packageInstallers { " --main-jar ${mainJarName}" + " --main-class bisq.desktop.app.BisqAppMain" + " --java-options -Xss1280k" + - " --java-options -XX:MaxRAM=4g" + + " --java-options -XX:MaxRAM=8g" + + " --java-options -XX:+UseG1GC" + + " --java-options -XX:MaxHeapFreeRatio=10" + + " --java-options -XX:MinHeapFreeRatio=5" + + " --java-options -XX:+UseStringDeduplication" + " --java-options -Djava.net.preferIPv4Stack=true" // Warning: this will cause guice reflection exceptions and lead to issues with the guice internal cache // resulting in the UI not loading diff --git a/desktop/src/main/java/bisq/desktop/components/paymentmethods/CapitualForm.java b/desktop/src/main/java/bisq/desktop/components/paymentmethods/CapitualForm.java new file mode 100644 index 00000000000..e4fa6163a4d --- /dev/null +++ b/desktop/src/main/java/bisq/desktop/components/paymentmethods/CapitualForm.java @@ -0,0 +1,131 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.desktop.components.paymentmethods; + +import bisq.desktop.components.InputTextField; +import bisq.desktop.util.FormBuilder; +import bisq.desktop.util.Layout; +import bisq.desktop.util.validation.CapitualValidator; + +import bisq.core.account.witness.AccountAgeWitnessService; +import bisq.core.locale.CurrencyUtil; +import bisq.core.locale.Res; +import bisq.core.payment.CapitualAccount; +import bisq.core.payment.PaymentAccount; +import bisq.core.payment.payload.CapitualAccountPayload; +import bisq.core.payment.payload.PaymentAccountPayload; +import bisq.core.util.coin.CoinFormatter; +import bisq.core.util.validation.InputValidator; + +import bisq.common.util.Tuple2; + +import org.apache.commons.lang3.StringUtils; + +import javafx.scene.control.Label; +import javafx.scene.layout.FlowPane; +import javafx.scene.layout.GridPane; + +import static bisq.desktop.util.FormBuilder.addCompactTopLabelTextField; +import static bisq.desktop.util.FormBuilder.addCompactTopLabelTextFieldWithCopyIcon; +import static bisq.desktop.util.FormBuilder.addTopLabelFlowPane; + +public class CapitualForm extends PaymentMethodForm { + private final CapitualAccount capitualAccount; + private final CapitualValidator capitualValidator; + private InputTextField accountNrInputTextField; + + public static int addFormForBuyer(GridPane gridPane, int gridRow, + PaymentAccountPayload paymentAccountPayload) { + addCompactTopLabelTextFieldWithCopyIcon(gridPane, ++gridRow, Res.get("payment.capitual.cap"), + ((CapitualAccountPayload) paymentAccountPayload).getAccountNr()); + return gridRow; + } + + public CapitualForm(PaymentAccount paymentAccount, + AccountAgeWitnessService accountAgeWitnessService, + CapitualValidator capitualValidator, + InputValidator inputValidator, + GridPane gridPane, + int gridRow, + CoinFormatter formatter) { + super(paymentAccount, accountAgeWitnessService, inputValidator, gridPane, gridRow, formatter); + this.capitualAccount = (CapitualAccount) paymentAccount; + this.capitualValidator = capitualValidator; + } + + @Override + public void addFormForAddAccount() { + gridRowFrom = gridRow + 1; + + accountNrInputTextField = FormBuilder.addInputTextField(gridPane, ++gridRow, Res.get("payment.capitual.cap")); + accountNrInputTextField.setValidator(capitualValidator); + accountNrInputTextField.textProperty().addListener((ov, oldValue, newValue) -> { + capitualAccount.setAccountNr(newValue); + updateFromInputs(); + }); + + addCurrenciesGrid(true); + addLimitations(false); + addAccountNameTextFieldWithAutoFillToggleButton(); + } + + private void addCurrenciesGrid(boolean isEditable) { + final Tuple2 labelFlowPaneTuple2 = addTopLabelFlowPane(gridPane, ++gridRow, Res.get("payment.supportedCurrencies"), 0); + + FlowPane flowPane = labelFlowPaneTuple2.second; + + if (isEditable) + flowPane.setId("flow-pane-checkboxes-bg"); + else + flowPane.setId("flow-pane-checkboxes-non-editable-bg"); + + CurrencyUtil.getAllCapitualCurrencies().forEach(e -> + fillUpFlowPaneWithCurrencies(isEditable, flowPane, e, capitualAccount)); + } + + @Override + protected void autoFillNameTextField() { + if (useCustomAccountNameToggleButton != null && !useCustomAccountNameToggleButton.isSelected()) { + String accountNr = accountNrInputTextField.getText(); + accountNr = StringUtils.abbreviate(accountNr, 9); + String method = Res.get(paymentAccount.getPaymentMethod().getId()); + accountNameTextField.setText(method.concat(": ").concat(accountNr)); + } + } + + @Override + public void addFormForDisplayAccount() { + gridRowFrom = gridRow; + addCompactTopLabelTextField(gridPane, gridRow, Res.get("payment.account.name"), + capitualAccount.getAccountName(), Layout.FIRST_ROW_AND_GROUP_DISTANCE); + addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("shared.paymentMethod"), + Res.get(capitualAccount.getPaymentMethod().getId())); + addCompactTopLabelTextField(gridPane, ++gridRow, Res.get("payment.capitual.cap"), + capitualAccount.getAccountNr()); + addLimitations(true); + addCurrenciesGrid(false); + } + + @Override + public void updateAllInputsValid() { + allInputsValid.set(isAccountNameValid() + && capitualValidator.validate(capitualAccount.getAccountNr()).isValid + && !capitualAccount.getTradeCurrencies().isEmpty()); + } + +} 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 728c87156e2..eb86ac98e25 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 @@ -23,6 +23,7 @@ import bisq.desktop.components.paymentmethods.AliPayForm; import bisq.desktop.components.paymentmethods.AmazonGiftCardForm; import bisq.desktop.components.paymentmethods.AustraliaPayidForm; +import bisq.desktop.components.paymentmethods.CapitualForm; import bisq.desktop.components.paymentmethods.CashByMailForm; import bisq.desktop.components.paymentmethods.CashDepositForm; import bisq.desktop.components.paymentmethods.ChaseQuickPayForm; @@ -59,6 +60,7 @@ import bisq.desktop.util.validation.AliPayValidator; import bisq.desktop.util.validation.AustraliaPayidValidator; import bisq.desktop.util.validation.BICValidator; +import bisq.desktop.util.validation.CapitualValidator; import bisq.desktop.util.validation.ChaseQuickPayValidator; import bisq.desktop.util.validation.ClearXchangeValidator; import bisq.desktop.util.validation.F2FValidator; @@ -135,6 +137,7 @@ public class FiatAccountsView extends PaymentAccountsView disputeDirectMessageListListener; private Subscription inputTextAreaTextSubscription; private final List tempAttachments = new ArrayList<>(); - private ChangeListener storedInMailboxPropertyListener, arrivedPropertyListener; + private ChangeListener storedInMailboxPropertyListener, acknowledgedPropertyListener; private ChangeListener sendMessageErrorPropertyListener; protected final CoinFormatter formatter; @@ -483,6 +483,10 @@ private void updateMsgState(ChatMessage message) { visible = true; icon = AwesomeIcon.OK_SIGN; text = Res.get("support.acknowledged"); + } else if (message.storedInMailboxProperty().get()) { + visible = true; + icon = AwesomeIcon.ENVELOPE; + text = Res.get("support.savedInMailbox"); } else if (message.ackErrorProperty().get() != null) { visible = true; icon = AwesomeIcon.EXCLAMATION_SIGN; @@ -493,10 +497,6 @@ private void updateMsgState(ChatMessage message) { visible = true; icon = AwesomeIcon.MAIL_REPLY; text = Res.get("support.transient"); - } else if (message.storedInMailboxProperty().get()) { - visible = true; - icon = AwesomeIcon.ENVELOPE; - text = Res.get("support.savedInMailbox"); } else { visible = false; log.debug("updateMsgState called but no msg state available. message={}", message); @@ -598,7 +598,7 @@ private void onOpenAttachment(Attachment attachment) { private void onSendMessage(String inputText) { if (chatMessage != null) { - chatMessage.arrivedProperty().removeListener(arrivedPropertyListener); + chatMessage.acknowledgedProperty().removeListener(acknowledgedPropertyListener); chatMessage.storedInMailboxProperty().removeListener(storedInMailboxPropertyListener); chatMessage.sendMessageErrorProperty().removeListener(sendMessageErrorPropertyListener); } @@ -620,8 +620,9 @@ private void onSendMessage(String inputText) { sendMsgBusyAnimation.play(); }, 500, TimeUnit.MILLISECONDS); - arrivedPropertyListener = (observable, oldValue, newValue) -> { + acknowledgedPropertyListener = (observable, oldValue, newValue) -> { if (newValue) { + sendMsgInfoLabel.setVisible(false); hideSendMsgInfo(timer); } }; @@ -642,7 +643,7 @@ private void onSendMessage(String inputText) { } }; if (chatMessage != null) { - chatMessage.arrivedProperty().addListener(arrivedPropertyListener); + chatMessage.acknowledgedProperty().addListener(acknowledgedPropertyListener); chatMessage.storedInMailboxProperty().addListener(storedInMailboxPropertyListener); chatMessage.sendMessageErrorProperty().addListener(sendMessageErrorPropertyListener); } @@ -715,8 +716,8 @@ private void removeListenersOnSessionChange() { chatMessages.removeListener(disputeDirectMessageListListener); if (chatMessage != null) { - if (arrivedPropertyListener != null) - chatMessage.arrivedProperty().removeListener(arrivedPropertyListener); + if (acknowledgedPropertyListener != null) + chatMessage.arrivedProperty().removeListener(acknowledgedPropertyListener); if (storedInMailboxPropertyListener != null) chatMessage.storedInMailboxProperty().removeListener(storedInMailboxPropertyListener); } diff --git a/desktop/src/main/java/bisq/desktop/util/GUIUtil.java b/desktop/src/main/java/bisq/desktop/util/GUIUtil.java index 226c79d9b1f..6160a860cae 100644 --- a/desktop/src/main/java/bisq/desktop/util/GUIUtil.java +++ b/desktop/src/main/java/bisq/desktop/util/GUIUtil.java @@ -795,12 +795,16 @@ public static boolean isBootstrappedOrShowPopup(P2PService p2PService) { } public static void showDaoNeedsResyncPopup(Navigation navigation) { - UserThread.runAfter(() -> new Popup().warning(Res.get("popup.warning.daoNeedsResync")) + String key = "showDaoNeedsResyncPopup"; + if (DontShowAgainLookup.showAgain(key)) { + UserThread.runAfter(() -> new Popup().warning(Res.get("popup.warning.daoNeedsResync")) + .dontShowAgainId(key) .actionButtonTextWithGoTo("navigation.dao.networkMonitor") .onAction(() -> { navigation.navigateTo(MainView.class, DaoView.class, MonitorView.class, DaoStateMonitorView.class); }) .show(), 5, TimeUnit.SECONDS); + } } public static boolean isReadyForTxBroadcastOrShowPopup(P2PService p2PService, WalletsSetup walletsSetup) { diff --git a/desktop/src/main/java/bisq/desktop/util/validation/CapitualValidator.java b/desktop/src/main/java/bisq/desktop/util/validation/CapitualValidator.java new file mode 100644 index 00000000000..f94b933340c --- /dev/null +++ b/desktop/src/main/java/bisq/desktop/util/validation/CapitualValidator.java @@ -0,0 +1,24 @@ +package bisq.desktop.util.validation; + +import bisq.core.locale.Res; +import bisq.core.util.validation.InputValidator; +import bisq.core.util.validation.RegexValidator; + +import javax.inject.Inject; + +public class CapitualValidator extends InputValidator { + private final RegexValidator regexValidator; + + @Inject + public CapitualValidator(RegexValidator regexValidator) { + regexValidator.setPattern("CAP-[A-Za-z0-9]{6}"); + regexValidator.setErrorMessage(Res.get("validation.capitual.invalidFormat")); + this.regexValidator = regexValidator; + } + + @Override + public ValidationResult validate(String input) { + + return regexValidator.validate(input); + } +} diff --git a/desktop/src/test/java/bisq/desktop/util/validation/CapitualValidatorTest.java b/desktop/src/test/java/bisq/desktop/util/validation/CapitualValidatorTest.java new file mode 100644 index 00000000000..36260dfdff1 --- /dev/null +++ b/desktop/src/test/java/bisq/desktop/util/validation/CapitualValidatorTest.java @@ -0,0 +1,45 @@ +package bisq.desktop.util.validation; + +import bisq.core.locale.CurrencyUtil; +import bisq.core.locale.Res; +import bisq.core.util.validation.RegexValidator; + +import bisq.common.config.BaseCurrencyNetwork; +import bisq.common.config.Config; + +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class CapitualValidatorTest { + @Before + public void setup() { + final BaseCurrencyNetwork baseCurrencyNetwork = Config.baseCurrencyNetwork(); + final String currencyCode = baseCurrencyNetwork.getCurrencyCode(); + Res.setBaseCurrencyCode(currencyCode); + Res.setBaseCurrencyName(baseCurrencyNetwork.getCurrencyName()); + CurrencyUtil.setBaseCurrencyCode(currencyCode); + } + + @Test + public void validate() { + CapitualValidator validator = new CapitualValidator( + new RegexValidator() + ); + + assertTrue(validator.validate("CAP-123456").isValid); + assertTrue(validator.validate("CAP-XXXXXX").isValid); + assertTrue(validator.validate("CAP-123XXX").isValid); + + assertFalse(validator.validate("").isValid); + assertFalse(validator.validate(null).isValid); + assertFalse(validator.validate("123456").isValid); + assertFalse(validator.validate("XXXXXX").isValid); + assertFalse(validator.validate("123XXX").isValid); + assertFalse(validator.validate("12XXX").isValid); + assertFalse(validator.validate("CAP-12XXX").isValid); + assertFalse(validator.validate("CA-12XXXx").isValid); + } +} diff --git a/p2p/src/main/resources/AccountAgeWitnessStore_1.7.2_BTC_MAINNET b/p2p/src/main/resources/AccountAgeWitnessStore_1.7.2_BTC_MAINNET new file mode 100644 index 00000000000..9d01d69a195 --- /dev/null +++ b/p2p/src/main/resources/AccountAgeWitnessStore_1.7.2_BTC_MAINNET @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b892de010ce64b5721a55a4730665a51f412041b700c473ff1ddaab443ceaabf +size 118365 diff --git a/p2p/src/main/resources/DaoStateStore_BTC_MAINNET b/p2p/src/main/resources/DaoStateStore_BTC_MAINNET index 87af4fbfb4b..956623e6913 100644 --- a/p2p/src/main/resources/DaoStateStore_BTC_MAINNET +++ b/p2p/src/main/resources/DaoStateStore_BTC_MAINNET @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ef042b2b48fd1237360806ae87329fa0f1af4d5bbe6b2ff08cdd5d42ac7a801a -size 132527715 +oid sha256:5a1091ae27ba6f9c9b79fc3528312a98c89a292c790fe150c004a9773c9b5ae6 +size 135684376 diff --git a/p2p/src/main/resources/SignedWitnessStore_BTC_MAINNET b/p2p/src/main/resources/SignedWitnessStore_BTC_MAINNET index 4818ae88a3e..da4e5cbb9ba 100644 --- a/p2p/src/main/resources/SignedWitnessStore_BTC_MAINNET +++ b/p2p/src/main/resources/SignedWitnessStore_BTC_MAINNET @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:27d7c2a8d74aa02f21a7aab25316cb34dac017d307dd934086c0efda4845d8a0 -size 7978273 +oid sha256:c30d4d24884a29b71b5fd1e38112865d95d2985b081336ccedf527c4bf671793 +size 8183869 diff --git a/p2p/src/main/resources/TradeStatistics3Store_1.7.2_BTC_MAINNET b/p2p/src/main/resources/TradeStatistics3Store_1.7.2_BTC_MAINNET new file mode 100644 index 00000000000..ca02567262d --- /dev/null +++ b/p2p/src/main/resources/TradeStatistics3Store_1.7.2_BTC_MAINNET @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:348a9a94709a5cc1838eb8be762b2ea0d226fcef9fea537f4b6b5fc87ea9e002 +size 319534 diff --git a/proto/src/main/proto/pb.proto b/proto/src/main/proto/pb.proto index c4ee1dd88fa..cc833037170 100644 --- a/proto/src/main/proto/pb.proto +++ b/proto/src/main/proto/pb.proto @@ -996,6 +996,7 @@ message PaymentAccountPayload { AustraliaPayidPayload australia_payid_payload = 30; AmazonGiftCardAccountPayload amazon_gift_card_account_payload = 31; CashByMailAccountPayload cash_by_mail_account_payload = 32; + CapitualAccountPayload capitual_account_payload = 33; } map exclude_from_json_data = 15; } @@ -1217,6 +1218,10 @@ message TransferwiseAccountPayload { string email = 1; } +message CapitualAccountPayload { + string account_nr = 1; +} + /////////////////////////////////////////////////////////////////////////////////////////// // PersistableEnvelope /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/relay/src/main/resources/version.txt b/relay/src/main/resources/version.txt index 6c2a6460aeb..ae1fde61115 100644 --- a/relay/src/main/resources/version.txt +++ b/relay/src/main/resources/version.txt @@ -1 +1 @@ -1.7.1-SNAPSHOT +1.7.2-SNAPSHOT diff --git a/seednode/src/main/java/bisq/seednode/SeedNodeMain.java b/seednode/src/main/java/bisq/seednode/SeedNodeMain.java index 9031e573ef2..0495573f2f4 100644 --- a/seednode/src/main/java/bisq/seednode/SeedNodeMain.java +++ b/seednode/src/main/java/bisq/seednode/SeedNodeMain.java @@ -47,7 +47,7 @@ @Slf4j public class SeedNodeMain extends ExecutableForAppWithP2p { private static final long CHECK_CONNECTION_LOSS_SEC = 30; - private static final String VERSION = "1.7.1"; + private static final String VERSION = "1.7.2"; private SeedNode seedNode; private Timer checkConnectionLossTime;