diff --git a/src/main/java/io/bitsquare/BitSquare.java b/src/main/java/io/bitsquare/BitSquare.java index d2af1e97fc..e06916bbb6 100644 --- a/src/main/java/io/bitsquare/BitSquare.java +++ b/src/main/java/io/bitsquare/BitSquare.java @@ -19,7 +19,6 @@ package io.bitsquare; import io.bitsquare.btc.WalletFacade; import io.bitsquare.di.BitSquareModule; -import io.bitsquare.di.GuiceFXMLLoader; import io.bitsquare.gui.NavigationItem; import io.bitsquare.gui.components.Popups; import io.bitsquare.gui.util.Profiler; @@ -28,6 +27,7 @@ import io.bitsquare.persistence.Persistence; import io.bitsquare.settings.Settings; import io.bitsquare.user.User; import io.bitsquare.util.AWTSystemTray; +import io.bitsquare.util.BSFXMLLoader; import com.google.common.base.Throwables; @@ -111,10 +111,10 @@ public class BitSquare extends Application { primaryStage.setTitle("BitSquare (" + APP_NAME + ")"); - GuiceFXMLLoader.setInjector(injector); + BSFXMLLoader.setInjector(injector); - final GuiceFXMLLoader loader = - new GuiceFXMLLoader(getClass().getResource(NavigationItem.MAIN.getFxmlUrl()), false); + final BSFXMLLoader loader = + new BSFXMLLoader(getClass().getResource(NavigationItem.MAIN.getFxmlUrl()), false); try { final Parent view = loader.load(); diff --git a/src/main/java/io/bitsquare/btc/AddressBasedCoinSelector.java b/src/main/java/io/bitsquare/btc/AddressBasedCoinSelector.java index 4f8fd440e6..1687d9445c 100644 --- a/src/main/java/io/bitsquare/btc/AddressBasedCoinSelector.java +++ b/src/main/java/io/bitsquare/btc/AddressBasedCoinSelector.java @@ -128,13 +128,17 @@ public class AddressBasedCoinSelector extends DefaultCoinSelector { if (addressEntry != null && addressOutput.equals(addressEntry.getAddress())) { return true; } + log.warn("No match found at matchesRequiredAddress addressOutput/addressEntry " + addressOutput.toString + () + "/" + addressEntry.getAddress().toString()); } return false; } @Override public CoinSelection select(Coin target, List candidates) { + log.debug("candidates.size: " + candidates.size()); long targetAsLong = target.longValue(); + log.debug("value needed: " + targetAsLong); HashSet selected = new HashSet<>(); // Sort the inputs by age*value so we get the highest "coindays" spent. // TODO: Consider changing the wallets internal format to track just outputs and keep them ordered. @@ -159,6 +163,8 @@ public class AddressBasedCoinSelector extends DefaultCoinSelector { selected.add(output); total += output.getValue().longValue(); + + log.debug("adding up outputs: output/total: " + output.getValue().longValue() + "/" + total); } // Total may be lower than target here, if the given candidates were insufficient to create to requested // transaction. diff --git a/src/main/java/io/bitsquare/btc/FeePolicy.java b/src/main/java/io/bitsquare/btc/FeePolicy.java index 96a7ce3658..296c998f00 100644 --- a/src/main/java/io/bitsquare/btc/FeePolicy.java +++ b/src/main/java/io/bitsquare/btc/FeePolicy.java @@ -30,13 +30,22 @@ import org.slf4j.LoggerFactory; public class FeePolicy { public static final Coin TX_FEE = Transaction.REFERENCE_DEFAULT_MIN_TX_FEE; - public static final Coin ACCOUNT_REGISTRATION_FEE = Coin.CENT; // 0.01 + + // The min. REGISTRATION_FEE calculated with Transaction.MIN_NONDUST_OUTPUT would be 0.00015460 which might lead + // to problems for the spending wallet. + // Some web wallets don't allow more then 4 decimal places (need more investigation) + // So we use 0.0002 as that fits also to our 4 decimal places restriction for BTC values. + // The remaining 0.0000454 BTC is given to miners at the moment as it is lower then dust. + public static final Coin REGISTRATION_FEE = TX_FEE.add(TX_FEE); + public static final Coin CREATE_OFFER_FEE = Coin.MILLICOIN; // 0.001 public static final Coin TAKE_OFFER_FEE = CREATE_OFFER_FEE; private static final Logger log = LoggerFactory.getLogger(FeePolicy.class); // those are just dummy yet. trading fees will go probably to arbiters - private static final String registrationFeeAddress = "mvkDXt4QmN4Nq9dRUsRigBCaovde9nLkZR"; + // Not used at the moment + // private static final String registrationFeeAddress = "mvkDXt4QmN4Nq9dRUsRigBCaovde9nLkZR"; + private static final String createOfferFeeAddress = "n2upbsaKAe4PD3cc4JfS7UCqPC5oNd7Ckg"; private static final String takeOfferFeeAddress = "n2upbsaKAe4PD3cc4JfS7UCqPC5oNd7Ckg"; @@ -48,15 +57,16 @@ public class FeePolicy { } //TODO who is receiver? other users or dev address? use donation option list? + // Not used at the moment // (dev, other users, wikileaks, tor, sub projects (bitcoinj, tomp2p,...)...) - public Address getAddressForRegistrationFee() { + /* public Address getAddressForRegistrationFee() { try { return new Address(params, registrationFeeAddress); } catch (AddressFormatException e) { e.printStackTrace(); return null; } - } + }*/ //TODO get address form arbitrator list public Address getAddressForCreateOfferFee() { diff --git a/src/main/java/io/bitsquare/btc/WalletFacade.java b/src/main/java/io/bitsquare/btc/WalletFacade.java index dba1ebc6ca..5f0d6baae8 100644 --- a/src/main/java/io/bitsquare/btc/WalletFacade.java +++ b/src/main/java/io/bitsquare/btc/WalletFacade.java @@ -234,6 +234,7 @@ public class WalletFacade { registrationAddressEntry = addressEntryList.get(0); } else { + // First time lock.lock(); DeterministicKey registrationKey = wallet.currentReceiveKey(); registrationAddressEntry = new AddressEntry(registrationKey, params, @@ -479,7 +480,7 @@ public class WalletFacade { } public boolean isRegistrationFeeBalanceSufficient() { - return getRegistrationBalance().compareTo(FeePolicy.ACCOUNT_REGISTRATION_FEE) >= 0; + return getRegistrationBalance().compareTo(FeePolicy.REGISTRATION_FEE) >= 0; } //TODO @@ -505,18 +506,22 @@ public class WalletFacade { getRegistrationAddressEntry().getKey(), stringifiedBankAccounts); tx.addOutput(Transaction.MIN_NONDUST_OUTPUT, new ScriptBuilder().op(OP_RETURN).data(data).build()); - Coin fee = FeePolicy.ACCOUNT_REGISTRATION_FEE + // We don't take a fee at the moment + // 0.0000454 BTC will get extra to miners as it is lower then durst + /* Coin fee = FeePolicy.REGISTRATION_FEE .subtract(Transaction.MIN_NONDUST_OUTPUT) .subtract(FeePolicy.TX_FEE); log.trace("fee: " + fee.toFriendlyString()); - tx.addOutput(fee, feePolicy.getAddressForRegistrationFee()); + tx.addOutput(fee, feePolicy.getAddressForRegistrationFee());*/ Wallet.SendRequest sendRequest = Wallet.SendRequest.forTx(tx); sendRequest.shuffleOutputs = false; - // we don't allow spending of unconfirmed tx as with fake registrations we would open up doors for spam and - // market manipulation with fake offers - // so set includePending to false - sendRequest.coinSelector = new AddressBasedCoinSelector(params, getRegistrationAddressEntry(), false); + + // We accept at the moment registration fee payment with 0 confirmations. + // The verification will be done at the end of the trade process again, and then a double spend would be + // detected and lead to arbitration. + // The last param (boolean includePending) is used for indicating that we accept 0 conf tx. + sendRequest.coinSelector = new AddressBasedCoinSelector(params, getRegistrationAddressEntry(), true); sendRequest.changeAddress = getRegistrationAddressEntry().getAddress(); Wallet.SendResult sendResult = wallet.sendCoins(sendRequest); Futures.addCallback(sendResult.broadcastComplete, callback); diff --git a/src/main/java/io/bitsquare/gui/CodeBehind.java b/src/main/java/io/bitsquare/gui/CodeBehind.java index f88f9344bc..74330f994c 100644 --- a/src/main/java/io/bitsquare/gui/CodeBehind.java +++ b/src/main/java/io/bitsquare/gui/CodeBehind.java @@ -81,7 +81,7 @@ public class CodeBehind implements Initializable { * @param navigationItem NavigationItem to be loaded. * @return The ViewController of the loaded view. */ - public Initializable loadViewAndGetChildController(NavigationItem navigationItem) { + public Initializable loadView(NavigationItem navigationItem) { log.trace("Lifecycle: loadViewAndGetChildController " + this.getClass().getSimpleName() + " / navigationItem " + "= " + navigationItem); return null; diff --git a/src/main/java/io/bitsquare/gui/MainController.java b/src/main/java/io/bitsquare/gui/MainController.java index f096522cdd..01470c519a 100644 --- a/src/main/java/io/bitsquare/gui/MainController.java +++ b/src/main/java/io/bitsquare/gui/MainController.java @@ -20,7 +20,6 @@ package io.bitsquare.gui; import io.bitsquare.bank.BankAccount; import io.bitsquare.btc.WalletFacade; import io.bitsquare.btc.listeners.BalanceListener; -import io.bitsquare.di.GuiceFXMLLoader; import io.bitsquare.gui.components.NetworkSyncPane; import io.bitsquare.gui.orders.OrdersController; import io.bitsquare.gui.util.BSFormatter; @@ -33,6 +32,7 @@ import io.bitsquare.persistence.Persistence; import io.bitsquare.trade.TradeManager; import io.bitsquare.user.User; import io.bitsquare.util.AWTSystemTray; +import io.bitsquare.util.BSFXMLLoader; import com.google.bitcoin.core.Coin; @@ -85,6 +85,7 @@ public class MainController extends ViewController { private Pane ordersButtonButtonHolder; private boolean messageFacadeInited; private boolean walletFacadeInited; + private NavigationItem previousNavigationItem; /////////////////////////////////////////////////////////////////////////////////////////// @@ -321,7 +322,7 @@ public class MainController extends ViewController { /////////////////////////////////////////////////////////////////////////////////////////// private void loadView(NavigationItem navigationItem) { - final GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource(navigationItem.getFxmlUrl())); + final BSFXMLLoader loader = new BSFXMLLoader(getClass().getResource(navigationItem.getFxmlUrl())); try { final Node view = loader.load(); viewBuilder.contentPane.getChildren().setAll(view); @@ -336,9 +337,7 @@ public class MainController extends ViewController { persistence.write(this, "selectedNavigationItem", navigationItem); } catch (IOException e) { log.error("Loading view failed. FxmlUrl = " + navigationItem.getFxmlUrl()); - log.error(e.getCause().toString()); - log.error(e.getMessage()); - log.error(e.getStackTrace().toString()); + e.getStackTrace(); } } @@ -448,6 +447,14 @@ public class MainController extends ViewController { vBox.getChildren().setAll(comboBox, titleLabel); parent.getChildren().add(vBox); } + + public void setPreviousNavigationItem(NavigationItem previousNavigationItem) { + this.previousNavigationItem = previousNavigationItem; + } + + public NavigationItem getPreviousNavigationItem() { + return previousNavigationItem; + } } diff --git a/src/main/java/io/bitsquare/gui/NavigationItem.java b/src/main/java/io/bitsquare/gui/NavigationItem.java index ec22c2cfb1..520f443d44 100644 --- a/src/main/java/io/bitsquare/gui/NavigationItem.java +++ b/src/main/java/io/bitsquare/gui/NavigationItem.java @@ -29,7 +29,6 @@ public enum NavigationItem { MSG("/io/bitsquare/gui/msg/MsgView.fxml", ImageUtil.MSG, ImageUtil.MSG_ACTIVE), SETTINGS("/io/bitsquare/gui/settings/SettingsView.fxml", ImageUtil.SETTINGS, ImageUtil.SETTINGS_ACTIVE), ACCOUNT("/io/bitsquare/gui/account/AccountView.fxml", ImageUtil.ACCOUNT, ImageUtil.ACCOUNT_ACTIVE), - SETUP("/io/bitsquare/gui/account/setup/SetupView.fxml"), ORDER_BOOK("/io/bitsquare/gui/trade/orderbook/OrderBookView.fxml"), CREATE_OFFER("/io/bitsquare/gui/trade/createoffer/CreateOfferView.fxml"), @@ -44,8 +43,11 @@ public enum NavigationItem { WITHDRAWAL("/io/bitsquare/gui/funds/withdrawal/WithdrawalView.fxml"), TRANSACTIONS("/io/bitsquare/gui/funds/transactions/TransactionsView.fxml"), + ACCOUNT_SETUP("/io/bitsquare/gui/account/setup/SetupView.fxml"), + ACCOUNT_SETTINGS("/io/bitsquare/gui/account/settings/AccountSettingsView.fxml"), SEED_WORDS("/io/bitsquare/gui/account/seedwords/SeedWordsView.fxml"), - PASSWORD("/io/bitsquare/gui/account/password/PasswordView.fxml"), + ADD_PASSWORD("/io/bitsquare/gui/account/addpassword/PasswordView.fxml"), + CHANGE_PASSWORD("/io/bitsquare/gui/account/changepassword/PasswordView.fxml"), RESTRICTIONS("/io/bitsquare/gui/account/restrictions/RestrictionsView.fxml"), REGISTRATION("/io/bitsquare/gui/account/registration/RegistrationView.fxml"), FIAT_ACCOUNT("/io/bitsquare/gui/account/fiataccount/FiatAccountView.fxml"), diff --git a/src/main/java/io/bitsquare/gui/account/AccountCB.java b/src/main/java/io/bitsquare/gui/account/AccountCB.java index 3f856bb38d..15ffd6e30e 100644 --- a/src/main/java/io/bitsquare/gui/account/AccountCB.java +++ b/src/main/java/io/bitsquare/gui/account/AccountCB.java @@ -17,12 +17,11 @@ package io.bitsquare.gui.account; -import io.bitsquare.di.GuiceFXMLLoader; import io.bitsquare.gui.CachedCodeBehind; import io.bitsquare.gui.CodeBehind; +import io.bitsquare.gui.MainController; import io.bitsquare.gui.NavigationItem; -import io.bitsquare.gui.PresentationModel; -import io.bitsquare.gui.account.setup.SetupPM; +import io.bitsquare.util.BSFXMLLoader; import java.io.IOException; @@ -32,26 +31,25 @@ import java.util.ResourceBundle; import javax.inject.Inject; +import javafx.fxml.Initializable; import javafx.scene.control.*; import javafx.scene.layout.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class AccountCB extends CachedCodeBehind { +public class AccountCB extends CachedCodeBehind { private static final Logger log = LoggerFactory.getLogger(AccountCB.class); - public Button registrationButton; - public Label headLineLabel; - public Label titleLabel; - public Tab setupTab; + public Tab tab; + /////////////////////////////////////////////////////////////////////////////////////////// // Constructor /////////////////////////////////////////////////////////////////////////////////////////// @Inject - public AccountCB(SetupPM presentationModel) { + public AccountCB(AccountPM presentationModel) { super(presentationModel); } @@ -63,13 +61,22 @@ public class AccountCB extends CachedCodeBehind { @Override public void initialize(URL url, ResourceBundle rb) { super.initialize(url, rb); - - loadViewAndGetChildController(NavigationItem.SETUP); } @Override public void activate() { super.activate(); + + if (childController == null) { + if (presentationModel.getNeedRegistration()) { + childController = loadView(NavigationItem.ACCOUNT_SETUP); + tab.setText("Account setup"); + } + else { + childController = loadView(NavigationItem.ACCOUNT_SETTINGS); + tab.setText("Account settings"); + } + } } @Override @@ -82,46 +89,42 @@ public class AccountCB extends CachedCodeBehind { super.terminate(); } - public void onRegister() { - loadViewAndGetChildController(NavigationItem.SETUP); - } - /////////////////////////////////////////////////////////////////////////////////////////// - // Public Methods + // Navigation /////////////////////////////////////////////////////////////////////////////////////////// @Override - public CodeBehind loadViewAndGetChildController(NavigationItem navigationItem) { - super.loadViewAndGetChildController(navigationItem); + public Initializable loadView(NavigationItem navigationItem) { + super.loadView(navigationItem); - final GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource(navigationItem.getFxmlUrl())); + final BSFXMLLoader loader = new BSFXMLLoader(getClass().getResource(navigationItem.getFxmlUrl())); try { - Pane setupView = loader.load(); - setupTab.setContent(setupView); - childController = loader.getController(); - + Pane view = loader.load(); + tab.setContent(view); + Initializable childController = loader.getController(); ((CodeBehind) childController).setParentController(this); - } catch (IOException e) { - log.error("Loading view failed. FxmlUrl = " + NavigationItem.ACCOUNT.getFxmlUrl()); - log.error(e.getCause().toString()); - log.error(e.getMessage()); - log.error(e.getStackTrace().toString()); + log.error("Loading view failed. FxmlUrl = " + NavigationItem.ACCOUNT_SETUP.getFxmlUrl()); + e.getStackTrace(); } - - return (CodeBehind) childController; + return childController; } - /////////////////////////////////////////////////////////////////////////////////////////// - // UI handlers - /////////////////////////////////////////////////////////////////////////////////////////// + public void removeSetup() { + childController = null; + + NavigationItem previousItem = MainController.GET_INSTANCE().getPreviousNavigationItem(); + if (previousItem == null) + previousItem = NavigationItem.HOME; + + MainController.GET_INSTANCE().loadViewAndGetChildController(previousItem); + } /////////////////////////////////////////////////////////////////////////////////////////// // Private methods /////////////////////////////////////////////////////////////////////////////////////////// - } diff --git a/src/main/java/io/bitsquare/gui/account/AccountModel.java b/src/main/java/io/bitsquare/gui/account/AccountModel.java index 4ed9abf1bf..4fa975baa6 100644 --- a/src/main/java/io/bitsquare/gui/account/AccountModel.java +++ b/src/main/java/io/bitsquare/gui/account/AccountModel.java @@ -18,6 +18,7 @@ package io.bitsquare.gui.account; import io.bitsquare.gui.UIModel; +import io.bitsquare.user.User; import com.google.inject.Inject; @@ -26,14 +27,16 @@ import org.slf4j.LoggerFactory; public class AccountModel extends UIModel { private static final Logger log = LoggerFactory.getLogger(AccountModel.class); + private User user; /////////////////////////////////////////////////////////////////////////////////////////// // Constructor /////////////////////////////////////////////////////////////////////////////////////////// @Inject - public AccountModel() { + public AccountModel(User user) { + this.user = user; } @@ -51,7 +54,10 @@ public class AccountModel extends UIModel { // Getters /////////////////////////////////////////////////////////////////////////////////////////// + boolean getNeedRegistration() { + return user.getAccountId() == null; + } /////////////////////////////////////////////////////////////////////////////////////////// // Setters /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/main/java/io/bitsquare/gui/account/AccountPm.java b/src/main/java/io/bitsquare/gui/account/AccountPm.java index aad29a4b98..68c8320f16 100644 --- a/src/main/java/io/bitsquare/gui/account/AccountPm.java +++ b/src/main/java/io/bitsquare/gui/account/AccountPm.java @@ -51,6 +51,9 @@ public class AccountPM extends PresentationModel { // Getters /////////////////////////////////////////////////////////////////////////////////////////// + boolean getNeedRegistration() { + return model.getNeedRegistration(); + } /////////////////////////////////////////////////////////////////////////////////////////// // Setters diff --git a/src/main/java/io/bitsquare/gui/account/AccountView.fxml b/src/main/java/io/bitsquare/gui/account/AccountView.fxml index d2dc50163b..0a43151297 100644 --- a/src/main/java/io/bitsquare/gui/account/AccountView.fxml +++ b/src/main/java/io/bitsquare/gui/account/AccountView.fxml @@ -19,33 +19,14 @@ - - - - - - - + - - - - + + + + + diff --git a/src/main/java/io/bitsquare/gui/account/restrictions/RestrictionsCB.java b/src/main/java/io/bitsquare/gui/account/restrictions/RestrictionsCB.java index 7ebd0df286..e32b9cee3f 100644 --- a/src/main/java/io/bitsquare/gui/account/restrictions/RestrictionsCB.java +++ b/src/main/java/io/bitsquare/gui/account/restrictions/RestrictionsCB.java @@ -19,15 +19,16 @@ package io.bitsquare.gui.account.restrictions; import io.bitsquare.BitSquare; import io.bitsquare.arbitrator.Arbitrator; -import io.bitsquare.di.GuiceFXMLLoader; import io.bitsquare.gui.CachedCodeBehind; import io.bitsquare.gui.NavigationItem; +import io.bitsquare.gui.account.settings.AccountSettingsCB; import io.bitsquare.gui.account.setup.SetupCB; import io.bitsquare.gui.help.Help; import io.bitsquare.gui.help.HelpId; import io.bitsquare.gui.util.ImageUtil; import io.bitsquare.locale.Country; import io.bitsquare.locale.Region; +import io.bitsquare.util.BSFXMLLoader; import java.io.IOException; @@ -60,7 +61,7 @@ public class RestrictionsCB extends CachedCodeBehind { @FXML private ComboBox languageComboBox; @FXML private ComboBox regionComboBox; @FXML private ComboBox countryComboBox; - @FXML private Button doneButton, addAllEuroCountriesButton; + @FXML private Button completedButton, addAllEuroCountriesButton; /////////////////////////////////////////////////////////////////////////////////////////// @@ -85,7 +86,7 @@ public class RestrictionsCB extends CachedCodeBehind { initCountry(); initArbitrators(); - doneButton.disableProperty().bind(presentationModel.doneButtonDisabled); + completedButton.disableProperty().bind(presentationModel.doneButtonDisabled); } @Override @@ -108,6 +109,19 @@ public class RestrictionsCB extends CachedCodeBehind { } + /////////////////////////////////////////////////////////////////////////////////////////// + // Override from CodeBehind + /////////////////////////////////////////////////////////////////////////////////////////// + + @Override + public void setParentController(Initializable parentController) { + super.setParentController(parentController); + if (parentController instanceof AccountSettingsCB) { + ((GridPane) root).getChildren().remove(completedButton); + } + } + + /////////////////////////////////////////////////////////////////////////////////////////// // UI handlers /////////////////////////////////////////////////////////////////////////////////////////// @@ -140,13 +154,14 @@ public class RestrictionsCB extends CachedCodeBehind { @FXML private void onOpenArbitratorScreen() { - loadViewAndGetChildController(NavigationItem.ARBITRATOR_BROWSER); + loadView(NavigationItem.ARBITRATOR_BROWSER); } @FXML - private void onDone() { - ((SetupCB) parentController).onCompleted(this); + private void onCompleted() { + if (parentController instanceof SetupCB) + ((SetupCB) parentController).onCompleted(this); } @FXML @@ -170,9 +185,9 @@ public class RestrictionsCB extends CachedCodeBehind { /////////////////////////////////////////////////////////////////////////////////////////// @Override - public Initializable loadViewAndGetChildController(NavigationItem navigationItem) { + public Initializable loadView(NavigationItem navigationItem) { // TODO caching causes exception - final GuiceFXMLLoader loader = new GuiceFXMLLoader(getClass().getResource(navigationItem.getFxmlUrl()), false); + final BSFXMLLoader loader = new BSFXMLLoader(getClass().getResource(navigationItem.getFxmlUrl()), false); try { final Node view = loader.load(); //TODO Resolve type problem... diff --git a/src/main/java/io/bitsquare/gui/account/restrictions/RestrictionsPm.java b/src/main/java/io/bitsquare/gui/account/restrictions/RestrictionsPm.java index 669411d9f9..82996d1958 100644 --- a/src/main/java/io/bitsquare/gui/account/restrictions/RestrictionsPm.java +++ b/src/main/java/io/bitsquare/gui/account/restrictions/RestrictionsPm.java @@ -37,7 +37,7 @@ public class RestrictionsPM extends PresentationModel { private static final Logger log = LoggerFactory.getLogger(RestrictionsPM.class); - public BooleanProperty doneButtonDisabled = new SimpleBooleanProperty(true); + public final BooleanProperty doneButtonDisabled = new SimpleBooleanProperty(true); /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/main/java/io/bitsquare/gui/account/restrictions/RestrictionsView.fxml b/src/main/java/io/bitsquare/gui/account/restrictions/RestrictionsView.fxml index ad398a2282..fbc445f36f 100644 --- a/src/main/java/io/bitsquare/gui/account/restrictions/RestrictionsView.fxml +++ b/src/main/java/io/bitsquare/gui/account/restrictions/RestrictionsView.fxml @@ -137,7 +137,7 @@ -