refactor monero connection initialization

re-prioritize default connections
monero network status turns red on connection error
remove popup on connection error
remove popup on 0 monero peers which aren't reported
increase main wallet max sync attempts on startup
renames from btc to xmr
This commit is contained in:
woodser 2023-07-30 09:14:22 -04:00
parent 12b6585779
commit 473100620e
23 changed files with 283 additions and 325 deletions

View File

@ -36,7 +36,6 @@ import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@Slf4j
@ -368,6 +367,30 @@ public final class CoreMoneroConnectionsService {
connectionManager.reset();
connectionManager.setTimeout(REFRESH_PERIOD_HTTP_MS);
// run once
if (!isInitialized) {
// register local node listener
nodeService.addListener(new MoneroNodeServiceListener() {
@Override
public void onNodeStarted(MoneroDaemonRpc daemon) {
log.info(getClass() + ".onNodeStarted() called");
daemon.getRpcConnection().checkConnection(connectionManager.getTimeout());
setConnection(daemon.getRpcConnection());
checkConnection();
}
@Override
public void onNodeStopped() {
log.info(getClass() + ".onNodeStopped() called");
checkConnection();
}
});
}
// restore connections
if ("".equals(config.xmrNode)) {
// load previous or default connections
if (coreContext.isApiUser()) {
@ -401,20 +424,9 @@ public final class CoreMoneroConnectionsService {
}
}
// set current connection
Optional<String> currentConnectionUri = Optional.empty();
if ("".equals(config.xmrNode)) {
if (coreContext.isApiUser() && connectionList.getCurrentConnectionUri().isPresent()) {
currentConnectionUri = connectionList.getCurrentConnectionUri();
connectionManager.setConnection(currentConnectionUri.get());
}
} else if (!isInitialized) {
// set monero connection from startup arguments
MoneroRpcConnection connection = new MoneroRpcConnection(config.xmrNode, config.xmrNodeUsername, config.xmrNodePassword).setPriority(1);
if (useProxy(connection)) connection.setProxyUri(getProxyUri());
connectionManager.setConnection(connection);
currentConnectionUri = Optional.of(connection.getUri());
// restore last connection
if (connectionList.getCurrentConnectionUri().isPresent()) {
connectionManager.setConnection(connectionList.getCurrentConnectionUri().get());
}
// set connection proxies
@ -423,69 +435,41 @@ public final class CoreMoneroConnectionsService {
if (useProxy(connection)) connection.setProxyUri(getProxyUri());
}
// restore configuration
if ("".equals(config.xmrNode)) connectionManager.setAutoSwitch(connectionList.getAutoSwitch());
// restore auto switch
if (coreContext.isApiUser()) connectionManager.setAutoSwitch(connectionList.getAutoSwitch());
else connectionManager.setAutoSwitch(true);
// check connection
checkConnection();
// run once
if (!isInitialized) {
// register local node listener
nodeService.addListener(new MoneroNodeServiceListener() {
@Override
public void onNodeStarted(MoneroDaemonRpc daemon) {
log.info(getClass() + ".onNodeStarted() called");
daemon.getRpcConnection().checkConnection(connectionManager.getTimeout());
setConnection(daemon.getRpcConnection());
}
@Override
public void onNodeStopped() {
log.info(getClass() + ".onNodeStopped() called");
checkConnection();
}
});
}
// if offline and last connection is local node, start local node if it's offline
currentConnectionUri.ifPresent(uri -> {
// start local node if used as last connection and currently offline
if (connectionManager.getConnection() != null && nodeService.equalsUri(connectionManager.getConnection().getUri()) && !nodeService.isOnline()) {
try {
if (!connectionManager.isConnected() && nodeService.equalsUri(uri) && !nodeService.isOnline()) {
log.info("Starting local node");
nodeService.startMoneroNode();
}
} catch (Exception e) {
log.warn("Unable to start local monero node: " + e.getMessage());
e.printStackTrace();
}
});
// prefer to connect to local node unless prevented by configuration
if ("".equals(config.xmrNode) &&
(!connectionManager.isConnected() || connectionManager.getAutoSwitch()) &&
nodeService.isConnected()) {
MoneroRpcConnection connection = connectionManager.getConnectionByUri(nodeService.getDaemon().getRpcConnection().getUri());
if (connection != null) {
connection.checkConnection(connectionManager.getTimeout());
setConnection(connection);
}
}
// if using legacy desktop app, connect to best available connection
if (!coreContext.isApiUser() && "".equals(config.xmrNode)) {
connectionManager.setAutoSwitch(true);
MoneroRpcConnection bestConnection = connectionManager.getBestAvailableConnection();
log.info("Setting best available connection for monerod: " + (bestConnection == null ? null : bestConnection.getUri()));
connectionManager.setConnection(bestConnection);
// update connection
if (connectionManager.getConnection() == null || connectionManager.getAutoSwitch()) {
setConnection(getBestAvailableConnection());
} else {
checkConnection();
}
} else if (!isInitialized) {
// set connection from startup argument if given
connectionManager.setAutoSwitch(false);
MoneroRpcConnection connection = new MoneroRpcConnection(config.xmrNode, config.xmrNodeUsername, config.xmrNodePassword).setPriority(1);
if (useProxy(connection)) connection.setProxyUri(getProxyUri());
connectionManager.setConnection(connection);
}
// register connection change listener
// register connection listener
connectionManager.addListener(this::onConnectionChanged);
isInitialized = true;
// update connection state
// notify final connection
isInitialized = true;
onConnectionChanged(connectionManager.getConnection());
}
}
@ -556,10 +540,11 @@ public final class CoreMoneroConnectionsService {
numPeers.set(lastInfo.getNumOutgoingConnections() + lastInfo.getNumIncomingConnections());
peers.set(new ArrayList<MoneroPeer>());
// log recovery message
// handle error recovery
if (lastErrorTimestamp != null) {
log.info("Successfully fetched daemon info after previous error");
lastErrorTimestamp = null;
HavenoUtils.havenoSetup.getWalletServiceErrorMsg().set(null);
}
// update and notify connected state
@ -575,6 +560,9 @@ public final class CoreMoneroConnectionsService {
if (DevEnv.isDevMode()) e.printStackTrace();
}
// notify error message
HavenoUtils.havenoSetup.getWalletServiceErrorMsg().set(e.getMessage());
// check connection which notifies of changes
synchronized (this) {
if (connectionManager.getAutoSwitch()) connectionManager.setConnection(connectionManager.getBestAvailableConnection());

View File

@ -727,24 +727,24 @@ public class HavenoSetup {
///////////////////////////////////////////////////////////////////////////////////////////
// Wallet
public StringProperty getBtcInfo() {
return walletAppSetup.getBtcInfo();
public StringProperty getXmrInfo() {
return walletAppSetup.getXmrInfo();
}
public DoubleProperty getBtcSyncProgress() {
return walletAppSetup.getBtcSyncProgress();
public DoubleProperty getXmrSyncProgress() {
return walletAppSetup.getXmrSyncProgress();
}
public StringProperty getWalletServiceErrorMsg() {
return walletAppSetup.getWalletServiceErrorMsg();
}
public StringProperty getBtcSplashSyncIconId() {
return walletAppSetup.getBtcSplashSyncIconId();
public StringProperty getXmrSplashSyncIconId() {
return walletAppSetup.getXmrSplashSyncIconId();
}
public BooleanProperty getUseTorForBTC() {
return walletAppSetup.getUseTorForBTC();
public BooleanProperty getUseTorForXMR() {
return walletAppSetup.getUseTorForXMR();
}
// P2P

View File

@ -67,20 +67,20 @@ public class WalletAppSetup {
private final Preferences preferences;
@SuppressWarnings("FieldCanBeLocal")
private MonadicBinding<String> btcInfoBinding;
private MonadicBinding<String> xmrInfoBinding;
@Getter
private final DoubleProperty btcSyncProgress = new SimpleDoubleProperty(-1);
private final DoubleProperty xmrSyncProgress = new SimpleDoubleProperty(-1);
@Getter
private final StringProperty walletServiceErrorMsg = new SimpleStringProperty();
@Getter
private final StringProperty btcSplashSyncIconId = new SimpleStringProperty();
private final StringProperty xmrSplashSyncIconId = new SimpleStringProperty();
@Getter
private final StringProperty btcInfo = new SimpleStringProperty(Res.get("mainView.footer.btcInfo.initializing"));
private final StringProperty xmrInfo = new SimpleStringProperty(Res.get("mainView.footer.xmrInfo.initializing"));
@Getter
private final ObjectProperty<RejectedTxException> rejectedTxException = new SimpleObjectProperty<>();
@Getter
private final BooleanProperty useTorForBTC = new SimpleBooleanProperty();
private final BooleanProperty useTorForXMR = new SimpleBooleanProperty();
@Inject
public WalletAppSetup(CoreContext coreContext,
@ -95,7 +95,7 @@ public class WalletAppSetup {
this.connectionService = connectionService;
this.config = config;
this.preferences = preferences;
this.useTorForBTC.set(preferences.getUseTorForMonero());
this.useTorForXMR.set(preferences.getUseTorForMonero());
}
void init(@Nullable Consumer<String> chainFileLockedExceptionHandler,
@ -107,41 +107,42 @@ public class WalletAppSetup {
VersionMessage.BITCOINJ_VERSION, "2a80db4");
ObjectProperty<Throwable> walletServiceException = new SimpleObjectProperty<>();
btcInfoBinding = EasyBind.combine(connectionService.downloadPercentageProperty(), // TODO (woodser): update to XMR
xmrInfoBinding = EasyBind.combine(connectionService.downloadPercentageProperty(), // TODO (woodser): update to XMR
connectionService.chainHeightProperty(),
walletServiceException,
(downloadPercentage, chainHeight, exception) -> {
getWalletServiceErrorMsg(),
(downloadPercentage, chainHeight, exception, errorMsg) -> {
String result;
if (exception == null) {
if (exception == null && errorMsg == null) {
double percentage = (double) downloadPercentage;
btcSyncProgress.set(percentage);
xmrSyncProgress.set(percentage);
MoneroDaemonInfo lastInfo = connectionService.getLastInfo();
Long bestChainHeight = lastInfo == null ? null : lastInfo.getHeight();
String chainHeightAsString = bestChainHeight != null && bestChainHeight > 0 ?
String.valueOf(bestChainHeight) :
"";
if (percentage == 1) {
String synchronizedWith = Res.get("mainView.footer.btcInfo.synchronizedWith",
getBtcNetworkAsString(), chainHeightAsString);
String synchronizedWith = Res.get("mainView.footer.xmrInfo.synchronizedWith",
getXmrNetworkAsString(), chainHeightAsString);
String feeInfo = ""; // TODO: feeService.isFeeAvailable() returns true, disable
result = Res.get("mainView.footer.btcInfo", synchronizedWith, feeInfo);
getBtcSplashSyncIconId().set("image-connection-synced");
result = Res.get("mainView.footer.xmrInfo", synchronizedWith, feeInfo);
getXmrSplashSyncIconId().set("image-connection-synced");
downloadCompleteHandler.run();
} else if (percentage > 0.0) {
String synchronizingWith = Res.get("mainView.footer.btcInfo.synchronizingWith",
getBtcNetworkAsString(), chainHeightAsString,
String synchronizingWith = Res.get("mainView.footer.xmrInfo.synchronizingWith",
getXmrNetworkAsString(), chainHeightAsString,
FormattingUtils.formatToPercentWithSymbol(percentage));
result = Res.get("mainView.footer.btcInfo", synchronizingWith, "");
result = Res.get("mainView.footer.xmrInfo", synchronizingWith, "");
} else {
result = Res.get("mainView.footer.btcInfo",
Res.get("mainView.footer.btcInfo.connectingTo"),
getBtcNetworkAsString());
result = Res.get("mainView.footer.xmrInfo",
Res.get("mainView.footer.xmrInfo.connectingTo"),
getXmrNetworkAsString());
}
} else {
result = Res.get("mainView.footer.btcInfo",
Res.get("mainView.footer.btcInfo.connectionFailed"),
getBtcNetworkAsString());
log.error(exception.toString());
result = Res.get("mainView.footer.xmrInfo",
Res.get("mainView.footer.xmrInfo.connectionFailed"),
getXmrNetworkAsString());
if (exception != null) {
if (exception instanceof TimeoutException) {
getWalletServiceErrorMsg().set(Res.get("mainView.walletServiceErrorMsg.timeout"));
} else if (exception.getCause() instanceof BlockStoreException) {
@ -155,10 +156,10 @@ public class WalletAppSetup {
getWalletServiceErrorMsg().set(Res.get("mainView.walletServiceErrorMsg.connectionError", exception.getMessage()));
}
}
}
return result;
});
btcInfoBinding.subscribe((observable, oldValue, newValue) -> UserThread.execute(() -> btcInfo.set(newValue)));
xmrInfoBinding.subscribe((observable, oldValue, newValue) -> UserThread.execute(() -> xmrInfo.set(newValue)));
walletsSetup.initialize(null,
() -> {
@ -253,7 +254,7 @@ public class WalletAppSetup {
});
}
private String getBtcNetworkAsString() {
private String getXmrNetworkAsString() {
String postFix;
if (config.ignoreLocalXmrNode)
postFix = " " + Res.get("mainView.footer.localhostBitcoinNode");

View File

@ -56,22 +56,22 @@ public class XmrNodes {
return Arrays.asList(
new XmrNode(MoneroNodesOption.PROVIDED, null, null, "127.0.0.1", 38081, 1, "@local"),
new XmrNode(MoneroNodesOption.PROVIDED, null, null, "127.0.0.1", 39081, 1, "@local"),
new XmrNode(MoneroNodesOption.PROVIDED, null, null, "45.63.8.26", 38081, 1, "@haveno"),
new XmrNode(MoneroNodesOption.PROVIDED, null, null, "stagenet.community.rino.io", 38081, 2, "@RINOwallet"),
new XmrNode(MoneroNodesOption.PUBLIC, null, null, "stagenet.melo.tools", 38081, 2, null),
new XmrNode(MoneroNodesOption.PUBLIC, null, null, "node.sethforprivacy.com", 38089, 2, null),
new XmrNode(MoneroNodesOption.PUBLIC, null, null, "node2.sethforprivacy.com", 38089, 2, null),
new XmrNode(MoneroNodesOption.PROVIDED, null, null, "45.63.8.26", 38081, 2, "@haveno"),
new XmrNode(MoneroNodesOption.PROVIDED, null, null, "stagenet.community.rino.io", 38081, 3, "@RINOwallet"),
new XmrNode(MoneroNodesOption.PUBLIC, null, null, "stagenet.melo.tools", 38081, 3, null),
new XmrNode(MoneroNodesOption.PUBLIC, null, null, "node.sethforprivacy.com", 38089, 3, null),
new XmrNode(MoneroNodesOption.PUBLIC, null, null, "node2.sethforprivacy.com", 38089, 3, null),
new XmrNode(MoneroNodesOption.PUBLIC, null, "plowsof3t5hogddwabaeiyrno25efmzfxyro2vligremt7sxpsclfaid.onion", null, 38089, 2, null)
);
case XMR_MAINNET:
return Arrays.asList(
new XmrNode(MoneroNodesOption.PROVIDED, null, null, "127.0.0.1", 18081, 1, "@local"),
new XmrNode(MoneroNodesOption.PROVIDED, null, null, "xmr-node.cakewallet.com", 18081, 1, "@cakewallet"),
new XmrNode(MoneroNodesOption.PROVIDED, null, null, "xmr-node.cakewallet.com", 18081, 2, "@cakewallet"),
new XmrNode(MoneroNodesOption.PROVIDED, null, null, "xmr-node-eu.cakewallet.com", 18081, 2, "@cakewallet"),
new XmrNode(MoneroNodesOption.PROVIDED, null, null, "xmr-node-usa-east.cakewallet.com", 18081, 2, "@cakewallet"),
new XmrNode(MoneroNodesOption.PROVIDED, null, null, "xmr-node-uk.cakewallet.com", 18081, 2, "@cakewallet"),
new XmrNode(MoneroNodesOption.PUBLIC, null, null, "node.community.rino.io", 18081, 2, "@RINOwallet"),
new XmrNode(MoneroNodesOption.PUBLIC, null, null, "xmr-node-eu.cakewallet.com", 18081, 2, "@cakewallet"),
new XmrNode(MoneroNodesOption.PUBLIC, null, null, "xmr-node-usa-east.cakewallet.com", 18081, 2, "@cakewallet"),
new XmrNode(MoneroNodesOption.PUBLIC, null, null, "xmr-node-uk.cakewallet.com", 18081, 2, "@cakewallet"),
new XmrNode(MoneroNodesOption.PUBLIC, null, null, "node.sethforprivacy.com", 18089, 2, "@sethforprivacy")
new XmrNode(MoneroNodesOption.PUBLIC, null, null, "node.sethforprivacy.com", 18089, 3, "@sethforprivacy")
);
default:
throw new IllegalStateException("Unexpected base currency network: " + Config.baseCurrencyNetwork());

View File

@ -42,8 +42,8 @@ public class XmrNodesSetupPreferences {
XmrNodes.MoneroNodesOption nodesOption = XmrNodes.MoneroNodesOption.values()[preferences.getMoneroNodesOptionOrdinal()];
switch (nodesOption) {
case CUSTOM:
String bitcoinNodes = preferences.getMoneroNodes();
Set<String> distinctNodes = Utilities.commaSeparatedListToSet(bitcoinNodes, false);
String moneroNodes = preferences.getMoneroNodes();
Set<String> distinctNodes = Utilities.commaSeparatedListToSet(moneroNodes, false);
result = XmrNodes.toCustomXmrNodesList(distinctNodes);
if (result.isEmpty()) {
log.warn("Custom nodes is set but no valid nodes are provided. " +

View File

@ -675,7 +675,7 @@ public class XmrWalletService {
if (wallet != null) {
log.info("Monero wallet uri={}, path={}", wallet.getRpcConnection().getUri(), wallet.getPath());
int numAttempts = 0;
int maxAttempts = 2;
int maxAttempts = 3;
while (!HavenoUtils.havenoSetup.getWalletInitialized().get()) {
try {

View File

@ -265,13 +265,13 @@ mainView.balance.pending.short=Pending
mainView.footer.usingTor=(via Tor)
mainView.footer.localhostBitcoinNode=(localhost)
mainView.footer.btcInfo={0} {1}
mainView.footer.xmrInfo={0} {1}
mainView.footer.btcFeeRate=/ Fee rate: {0} sat/vB
mainView.footer.btcInfo.initializing=Connecting to Monero network
mainView.footer.btcInfo.synchronizingWith=Synchronizing with {0} at block: {1} / {2}
mainView.footer.btcInfo.synchronizedWith=Synced with {0} at block {1}
mainView.footer.btcInfo.connectingTo=Connecting to
mainView.footer.btcInfo.connectionFailed=Connection failed to
mainView.footer.xmrInfo.initializing=Connecting to Monero network
mainView.footer.xmrInfo.synchronizingWith=Synchronizing with {0} at block: {1} / {2}
mainView.footer.xmrInfo.synchronizedWith=Synced with {0} at block {1}
mainView.footer.xmrInfo.connectingTo=Connecting to
mainView.footer.xmrInfo.connectionFailed=Connection failed to
mainView.footer.xmrPeers=Monero network peers: {0}
mainView.footer.p2pPeers=Haveno network peers: {0}

View File

@ -246,13 +246,13 @@ mainView.balance.pending.short=Zamčeno
mainView.footer.usingTor=(přes Tor)
mainView.footer.localhostBitcoinNode=(localhost)
mainView.footer.btcInfo={0} {1}
mainView.footer.xmrInfo={0} {1}
mainView.footer.btcFeeRate=/ Aktuální poplatek: {0} sat/vB
mainView.footer.btcInfo.initializing=Připojování do Bitcoinové sítě
mainView.footer.btcInfo.synchronizingWith=Synchronizace s {0} v bloku: {1} / {2}
mainView.footer.btcInfo.synchronizedWith=Synchronizováno s {0} v bloku {1}
mainView.footer.btcInfo.connectingTo=Připojování
mainView.footer.btcInfo.connectionFailed=Připojení se nezdařilo
mainView.footer.xmrInfo.initializing=Připojování do Bitcoinové sítě
mainView.footer.xmrInfo.synchronizingWith=Synchronizace s {0} v bloku: {1} / {2}
mainView.footer.xmrInfo.synchronizedWith=Synchronizováno s {0} v bloku {1}
mainView.footer.xmrInfo.connectingTo=Připojování
mainView.footer.xmrInfo.connectionFailed=Připojení se nezdařilo
mainView.footer.xmrPeers=Monero síťové nody: {0}
mainView.footer.p2pPeers=Haveno síťové nody: {0}

View File

@ -246,13 +246,13 @@ mainView.balance.pending.short=Gesperrt
mainView.footer.usingTor=(über Tor)
mainView.footer.localhostBitcoinNode=(localhost)
mainView.footer.btcInfo={0} {1}
mainView.footer.xmrInfo={0} {1}
mainView.footer.btcFeeRate=/ Aktuelle Gebühr: {0} sat/vB
mainView.footer.btcInfo.initializing=Verbindung mit Bitcoin-Netzwerk wird hergestellt
mainView.footer.btcInfo.synchronizingWith=Synchronisierung mit {0} bei Block: {1} / {2}
mainView.footer.btcInfo.synchronizedWith=Synchronisierung mit {0} bei Block {1}
mainView.footer.btcInfo.connectingTo=Verbinde mit
mainView.footer.btcInfo.connectionFailed=Verbindung fehlgeschlagen zu
mainView.footer.xmrInfo.initializing=Verbindung mit Bitcoin-Netzwerk wird hergestellt
mainView.footer.xmrInfo.synchronizingWith=Synchronisierung mit {0} bei Block: {1} / {2}
mainView.footer.xmrInfo.synchronizedWith=Synchronisierung mit {0} bei Block {1}
mainView.footer.xmrInfo.connectingTo=Verbinde mit
mainView.footer.xmrInfo.connectionFailed=Verbindung fehlgeschlagen zu
mainView.footer.xmrPeers=Monero Netzwerk Peers: {0}
mainView.footer.p2pPeers=Haveno Netzwerk Peers: {0}

View File

@ -246,13 +246,13 @@ mainView.balance.pending.short=Bloqueado
mainView.footer.usingTor=(via Tor)
mainView.footer.localhostBitcoinNode=(localhost)
mainView.footer.btcInfo={0} {1}
mainView.footer.xmrInfo={0} {1}
mainView.footer.btcFeeRate=/Tasas actuales: {0} sat/vB
mainView.footer.btcInfo.initializing=Conectando a la red Bitcoin
mainView.footer.btcInfo.synchronizingWith=Sincronizando con {0} en el bloque: {1} / {2}
mainView.footer.btcInfo.synchronizedWith=Sincronizado con {0} en el bloque {1}
mainView.footer.btcInfo.connectingTo=Conectando a
mainView.footer.btcInfo.connectionFailed=Conexión fallida a
mainView.footer.xmrInfo.initializing=Conectando a la red Bitcoin
mainView.footer.xmrInfo.synchronizingWith=Sincronizando con {0} en el bloque: {1} / {2}
mainView.footer.xmrInfo.synchronizedWith=Sincronizado con {0} en el bloque {1}
mainView.footer.xmrInfo.connectingTo=Conectando a
mainView.footer.xmrInfo.connectionFailed=Conexión fallida a
mainView.footer.xmrPeers=Pares de Monero: {0}
mainView.footer.p2pPeers=Pares de la red de Haveno: {0}

View File

@ -246,13 +246,13 @@ mainView.balance.pending.short=قفل شده
mainView.footer.usingTor=(via Tor)
mainView.footer.localhostBitcoinNode=(لوکال هاست)
mainView.footer.btcInfo={0} {1}
mainView.footer.xmrInfo={0} {1}
mainView.footer.btcFeeRate=/ Fee rate: {0} sat/vB
mainView.footer.btcInfo.initializing=در حال ارتباط با شبکه بیت‌کوین
mainView.footer.btcInfo.synchronizingWith=Synchronizing with {0} at block: {1} / {2}
mainView.footer.btcInfo.synchronizedWith=Synced with {0} at block {1}
mainView.footer.btcInfo.connectingTo=در حال ایجاد ارتباط با
mainView.footer.btcInfo.connectionFailed=Connection failed to
mainView.footer.xmrInfo.initializing=در حال ارتباط با شبکه بیت‌کوین
mainView.footer.xmrInfo.synchronizingWith=Synchronizing with {0} at block: {1} / {2}
mainView.footer.xmrInfo.synchronizedWith=Synced with {0} at block {1}
mainView.footer.xmrInfo.connectingTo=در حال ایجاد ارتباط با
mainView.footer.xmrInfo.connectionFailed=Connection failed to
mainView.footer.xmrPeers=Monero network peers: {0}
mainView.footer.p2pPeers=Haveno network peers: {0}

View File

@ -246,13 +246,13 @@ mainView.balance.pending.short=Vérouillé
mainView.footer.usingTor=(à travers Tor)
mainView.footer.localhostBitcoinNode=(localhost)
mainView.footer.btcInfo={0} {1}
mainView.footer.xmrInfo={0} {1}
mainView.footer.btcFeeRate=/ Taux des frais: {0} sat/vB
mainView.footer.btcInfo.initializing=Connexion au réseau Bitcoin en cours
mainView.footer.btcInfo.synchronizingWith=Synchronisation avec {0} au block: {1}/ {2}
mainView.footer.btcInfo.synchronizedWith=Synchronisé avec {0} au block {1}
mainView.footer.btcInfo.connectingTo=Se connecte à
mainView.footer.btcInfo.connectionFailed=Échec de la connexion à
mainView.footer.xmrInfo.initializing=Connexion au réseau Bitcoin en cours
mainView.footer.xmrInfo.synchronizingWith=Synchronisation avec {0} au block: {1}/ {2}
mainView.footer.xmrInfo.synchronizedWith=Synchronisé avec {0} au block {1}
mainView.footer.xmrInfo.connectingTo=Se connecte à
mainView.footer.xmrInfo.connectionFailed=Échec de la connexion à
mainView.footer.xmrPeers=Pairs du réseau Monero: {0}
mainView.footer.p2pPeers=Pairs du réseau Haveno: {0}

View File

@ -246,13 +246,13 @@ mainView.balance.pending.short=Bloccati
mainView.footer.usingTor=(via Tor)
mainView.footer.localhostBitcoinNode=(localhost)
mainView.footer.btcInfo={0} {1}
mainView.footer.xmrInfo={0} {1}
mainView.footer.btcFeeRate=/ Fee rate: {0} sat/vB
mainView.footer.btcInfo.initializing=Connessione alla rete Bitcoin
mainView.footer.btcInfo.synchronizingWith=Synchronizing with {0} at block: {1} / {2}
mainView.footer.btcInfo.synchronizedWith=Synced with {0} at block {1}
mainView.footer.btcInfo.connectingTo=Connessione a
mainView.footer.btcInfo.connectionFailed=Connessione fallita
mainView.footer.xmrInfo.initializing=Connessione alla rete Bitcoin
mainView.footer.xmrInfo.synchronizingWith=Synchronizing with {0} at block: {1} / {2}
mainView.footer.xmrInfo.synchronizedWith=Synced with {0} at block {1}
mainView.footer.xmrInfo.connectingTo=Connessione a
mainView.footer.xmrInfo.connectionFailed=Connessione fallita
mainView.footer.xmrPeers=Monero network peers: {0}
mainView.footer.p2pPeers=Haveno network peers: {0}

View File

@ -246,13 +246,13 @@ mainView.balance.pending.short=ロック中
mainView.footer.usingTor=(Tor経由で)
mainView.footer.localhostBitcoinNode=(ローカルホスト)
mainView.footer.btcInfo={0} {1}
mainView.footer.xmrInfo={0} {1}
mainView.footer.btcFeeRate=/ 手数料率: {0} サトシ/vB
mainView.footer.btcInfo.initializing=ビットコインネットワークに接続中
mainView.footer.btcInfo.synchronizingWith={0}と同期中、ブロック: {1} / {2}
mainView.footer.btcInfo.synchronizedWith={0}と同期されています、ブロック{1}に
mainView.footer.btcInfo.connectingTo=接続中:
mainView.footer.btcInfo.connectionFailed=接続失敗
mainView.footer.xmrInfo.initializing=ビットコインネットワークに接続中
mainView.footer.xmrInfo.synchronizingWith={0}と同期中、ブロック: {1} / {2}
mainView.footer.xmrInfo.synchronizedWith={0}と同期されています、ブロック{1}に
mainView.footer.xmrInfo.connectingTo=接続中:
mainView.footer.xmrInfo.connectionFailed=接続失敗
mainView.footer.xmrPeers=Moneroネットワークピア: {0}
mainView.footer.p2pPeers=Havenoネットワークピア: {0}

View File

@ -249,13 +249,13 @@ mainView.balance.pending.short=Travado
mainView.footer.usingTor=(via Tor)
mainView.footer.localhostBitcoinNode=(localhost)
mainView.footer.btcInfo={0} {1}
mainView.footer.xmrInfo={0} {1}
mainView.footer.btcFeeRate=/ Fee rate: {0} sat/vB
mainView.footer.btcInfo.initializing=Conectando-se à rede Bitcoin
mainView.footer.btcInfo.synchronizingWith=Synchronizing with {0} at block: {1} / {2}
mainView.footer.btcInfo.synchronizedWith=Synced with {0} at block {1}
mainView.footer.btcInfo.connectingTo=Conectando-se a
mainView.footer.btcInfo.connectionFailed=Falha na conexão à
mainView.footer.xmrInfo.initializing=Conectando-se à rede Bitcoin
mainView.footer.xmrInfo.synchronizingWith=Synchronizing with {0} at block: {1} / {2}
mainView.footer.xmrInfo.synchronizedWith=Synced with {0} at block {1}
mainView.footer.xmrInfo.connectingTo=Conectando-se a
mainView.footer.xmrInfo.connectionFailed=Falha na conexão à
mainView.footer.xmrPeers=Monero network peers: {0}
mainView.footer.p2pPeers=Haveno network peers: {0}

View File

@ -246,13 +246,13 @@ mainView.balance.pending.short=Bloqueado
mainView.footer.usingTor=(via Tor)
mainView.footer.localhostBitcoinNode=(localhost)
mainView.footer.btcInfo={0} {1}
mainView.footer.xmrInfo={0} {1}
mainView.footer.btcFeeRate=/ Fee rate: {0} sat/vB
mainView.footer.btcInfo.initializing=Conectando à rede Bitcoin
mainView.footer.btcInfo.synchronizingWith=Synchronizing with {0} at block: {1} / {2}
mainView.footer.btcInfo.synchronizedWith=Synced with {0} at block {1}
mainView.footer.btcInfo.connectingTo=Conectando à
mainView.footer.btcInfo.connectionFailed=Connection failed to
mainView.footer.xmrInfo.initializing=Conectando à rede Bitcoin
mainView.footer.xmrInfo.synchronizingWith=Synchronizing with {0} at block: {1} / {2}
mainView.footer.xmrInfo.synchronizedWith=Synced with {0} at block {1}
mainView.footer.xmrInfo.connectingTo=Conectando à
mainView.footer.xmrInfo.connectionFailed=Connection failed to
mainView.footer.xmrPeers=Monero network peers: {0}
mainView.footer.p2pPeers=Haveno network peers: {0}

View File

@ -246,13 +246,13 @@ mainView.balance.pending.short=В сделках
mainView.footer.usingTor=(via Tor)
mainView.footer.localhostBitcoinNode=(локальный узел)
mainView.footer.btcInfo={0} {1}
mainView.footer.xmrInfo={0} {1}
mainView.footer.btcFeeRate=/ Fee rate: {0} sat/vB
mainView.footer.btcInfo.initializing=Подключение к сети Биткойн
mainView.footer.btcInfo.synchronizingWith=Synchronizing with {0} at block: {1} / {2}
mainView.footer.btcInfo.synchronizedWith=Synced with {0} at block {1}
mainView.footer.btcInfo.connectingTo=Подключение к
mainView.footer.btcInfo.connectionFailed=Connection failed to
mainView.footer.xmrInfo.initializing=Подключение к сети Биткойн
mainView.footer.xmrInfo.synchronizingWith=Synchronizing with {0} at block: {1} / {2}
mainView.footer.xmrInfo.synchronizedWith=Synced with {0} at block {1}
mainView.footer.xmrInfo.connectingTo=Подключение к
mainView.footer.xmrInfo.connectionFailed=Connection failed to
mainView.footer.xmrPeers=Monero network peers: {0}
mainView.footer.p2pPeers=Haveno network peers: {0}

View File

@ -246,13 +246,13 @@ mainView.balance.pending.short=ถูกล็อคไว้
mainView.footer.usingTor=(via Tor)
mainView.footer.localhostBitcoinNode=(แม่ข่ายเฉพาะที่)
mainView.footer.btcInfo={0} {1}
mainView.footer.xmrInfo={0} {1}
mainView.footer.btcFeeRate=/ Fee rate: {0} sat/vB
mainView.footer.btcInfo.initializing=Connecting to Bitcoin network
mainView.footer.btcInfo.synchronizingWith=Synchronizing with {0} at block: {1} / {2}
mainView.footer.btcInfo.synchronizedWith=Synced with {0} at block {1}
mainView.footer.btcInfo.connectingTo=Connecting to
mainView.footer.btcInfo.connectionFailed=Connection failed to
mainView.footer.xmrInfo.initializing=Connecting to Bitcoin network
mainView.footer.xmrInfo.synchronizingWith=Synchronizing with {0} at block: {1} / {2}
mainView.footer.xmrInfo.synchronizedWith=Synced with {0} at block {1}
mainView.footer.xmrInfo.connectingTo=Connecting to
mainView.footer.xmrInfo.connectionFailed=Connection failed to
mainView.footer.xmrPeers=Monero network peers: {0}
mainView.footer.p2pPeers=Haveno network peers: {0}

View File

@ -246,13 +246,13 @@ mainView.balance.pending.short=Bị khóa
mainView.footer.usingTor=(via Tor)
mainView.footer.localhostBitcoinNode=(Máy chủ nội bộ)
mainView.footer.btcInfo={0} {1}
mainView.footer.xmrInfo={0} {1}
mainView.footer.btcFeeRate=/ Fee rate: {0} sat/vB
mainView.footer.btcInfo.initializing=Đang kết nối với mạng Bitcoin
mainView.footer.btcInfo.synchronizingWith=Synchronizing with {0} at block: {1} / {2}
mainView.footer.btcInfo.synchronizedWith=Synced with {0} at block {1}
mainView.footer.btcInfo.connectingTo=Đang kết nối với
mainView.footer.btcInfo.connectionFailed=Connection failed to
mainView.footer.xmrInfo.initializing=Đang kết nối với mạng Bitcoin
mainView.footer.xmrInfo.synchronizingWith=Synchronizing with {0} at block: {1} / {2}
mainView.footer.xmrInfo.synchronizedWith=Synced with {0} at block {1}
mainView.footer.xmrInfo.connectingTo=Đang kết nối với
mainView.footer.xmrInfo.connectionFailed=Connection failed to
mainView.footer.xmrPeers=Monero network peers: {0}
mainView.footer.p2pPeers=Haveno network peers: {0}

View File

@ -246,13 +246,13 @@ mainView.balance.pending.short=冻结
mainView.footer.usingTor=(通过 Tor
mainView.footer.localhostBitcoinNode=(本地主机)
mainView.footer.btcInfo={0} {1}
mainView.footer.xmrInfo={0} {1}
mainView.footer.btcFeeRate=/ 矿工手费率:{0} 聪/字节
mainView.footer.btcInfo.initializing=连接至比特币网络
mainView.footer.btcInfo.synchronizingWith=正在通过{0}同步区块:{1}/{2}
mainView.footer.btcInfo.synchronizedWith=已通过{0}同步至区块{1}
mainView.footer.btcInfo.connectingTo=连接至
mainView.footer.btcInfo.connectionFailed=连接失败:
mainView.footer.xmrInfo.initializing=连接至比特币网络
mainView.footer.xmrInfo.synchronizingWith=正在通过{0}同步区块:{1}/{2}
mainView.footer.xmrInfo.synchronizedWith=已通过{0}同步至区块{1}
mainView.footer.xmrInfo.connectingTo=连接至
mainView.footer.xmrInfo.connectionFailed=连接失败:
mainView.footer.xmrPeers=Monero网络节点{0}
mainView.footer.p2pPeers=Haveno 网络节点:{0}

View File

@ -246,13 +246,13 @@ mainView.balance.pending.short=凍結
mainView.footer.usingTor=(via Tor)
mainView.footer.localhostBitcoinNode=(本地主機)
mainView.footer.btcInfo={0} {1}
mainView.footer.xmrInfo={0} {1}
mainView.footer.btcFeeRate=/ Fee rate: {0} sat/vB
mainView.footer.btcInfo.initializing=連接至比特幣網絡
mainView.footer.btcInfo.synchronizingWith=Synchronizing with {0} at block: {1} / {2}
mainView.footer.btcInfo.synchronizedWith=Synced with {0} at block {1}
mainView.footer.btcInfo.connectingTo=連接至
mainView.footer.btcInfo.connectionFailed=連接失敗:
mainView.footer.xmrInfo.initializing=連接至比特幣網絡
mainView.footer.xmrInfo.synchronizingWith=Synchronizing with {0} at block: {1} / {2}
mainView.footer.xmrInfo.synchronizedWith=Synced with {0} at block {1}
mainView.footer.xmrInfo.connectingTo=連接至
mainView.footer.xmrInfo.connectionFailed=連接失敗:
mainView.footer.xmrPeers=Monero網絡節點{0}
mainView.footer.p2pPeers=Haveno 網絡節點:{0}

View File

@ -117,15 +117,15 @@ public class MainView extends InitializableView<StackPane, MainViewModel> {
private final Navigation navigation;
private final ToggleGroup navButtons = new ToggleGroup();
private ChangeListener<String> walletServiceErrorMsgListener;
private ChangeListener<String> btcSyncIconIdListener;
private ChangeListener<String> xmrSyncIconIdListener;
private ChangeListener<String> splashP2PNetworkErrorMsgListener;
private ChangeListener<String> splashP2PNetworkIconIdListener;
private ChangeListener<Boolean> splashP2PNetworkVisibleListener;
private BusyAnimation splashP2PNetworkBusyAnimation;
private Label splashP2PNetworkLabel;
private ProgressBar btcSyncIndicator, p2pNetworkProgressBar;
private Label btcSplashInfo;
private Popup p2PNetworkWarnMsgPopup, btcNetworkWarnMsgPopup;
private ProgressBar xmrSyncIndicator, p2pNetworkProgressBar;
private Label xmrSplashInfo;
private Popup p2PNetworkWarnMsgPopup, xmrNetworkWarnMsgPopup;
private final TorNetworkSettingsWindow torNetworkSettingsWindow;
public static StackPane getRootContainer() {
@ -515,31 +515,31 @@ public class MainView extends InitializableView<StackPane, MainViewModel> {
logo.setId(Config.baseCurrencyNetwork() == BaseCurrencyNetwork.XMR_MAINNET ? "image-splash-logo" : "image-splash-testnet-logo");
// createBitcoinInfoBox
btcSplashInfo = new AutoTooltipLabel();
btcSplashInfo.textProperty().bind(model.getBtcInfo());
xmrSplashInfo = new AutoTooltipLabel();
xmrSplashInfo.textProperty().bind(model.getXmrInfo());
walletServiceErrorMsgListener = (ov, oldValue, newValue) -> {
btcSplashInfo.setId("splash-error-state-msg");
btcSplashInfo.getStyleClass().add("error-text");
xmrSplashInfo.setId("splash-error-state-msg");
xmrSplashInfo.getStyleClass().add("error-text");
};
model.getWalletServiceErrorMsg().addListener(walletServiceErrorMsgListener);
btcSyncIndicator = new JFXProgressBar();
btcSyncIndicator.setPrefWidth(305);
btcSyncIndicator.progressProperty().bind(model.getCombinedSyncProgress());
xmrSyncIndicator = new JFXProgressBar();
xmrSyncIndicator.setPrefWidth(305);
xmrSyncIndicator.progressProperty().bind(model.getCombinedSyncProgress());
ImageView btcSyncIcon = new ImageView();
btcSyncIcon.setVisible(false);
btcSyncIcon.setManaged(false);
ImageView xmrSyncIcon = new ImageView();
xmrSyncIcon.setVisible(false);
xmrSyncIcon.setManaged(false);
btcSyncIconIdListener = (ov, oldValue, newValue) -> {
btcSyncIcon.setId(newValue);
btcSyncIcon.setVisible(true);
btcSyncIcon.setManaged(true);
xmrSyncIconIdListener = (ov, oldValue, newValue) -> {
xmrSyncIcon.setId(newValue);
xmrSyncIcon.setVisible(true);
xmrSyncIcon.setManaged(true);
btcSyncIndicator.setVisible(false);
btcSyncIndicator.setManaged(false);
xmrSyncIndicator.setVisible(false);
xmrSyncIndicator.setManaged(false);
};
model.getBtcSplashSyncIconId().addListener(btcSyncIconIdListener);
model.getXmrSplashSyncIconId().addListener(xmrSyncIconIdListener);
HBox blockchainSyncBox = new HBox();
@ -547,7 +547,7 @@ public class MainView extends InitializableView<StackPane, MainViewModel> {
blockchainSyncBox.setAlignment(Pos.CENTER);
blockchainSyncBox.setPadding(new Insets(40, 0, 0, 0));
blockchainSyncBox.setPrefHeight(50);
blockchainSyncBox.getChildren().addAll(btcSplashInfo, btcSyncIcon);
blockchainSyncBox.getChildren().addAll(xmrSplashInfo, xmrSyncIcon);
// create P2PNetworkBox
@ -574,10 +574,10 @@ public class MainView extends InitializableView<StackPane, MainViewModel> {
splashP2PNetworkBusyAnimation.stop();
showTorNetworkSettingsButton.setVisible(true);
showTorNetworkSettingsButton.setManaged(true);
if (model.getUseTorForBTC().get()) {
// If using tor for BTC, hide the BTC status since tor is not working
btcSyncIndicator.setVisible(false);
btcSplashInfo.setVisible(false);
if (model.getUseTorForXMR().get()) {
// If using tor for XMR, hide the XMR status since tor is not working
xmrSyncIndicator.setVisible(false);
xmrSplashInfo.setVisible(false);
}
} else if (model.getSplashP2PNetworkAnimationVisible().get()) {
splashP2PNetworkBusyAnimation.setDisable(false);
@ -623,20 +623,20 @@ public class MainView extends InitializableView<StackPane, MainViewModel> {
splashP2PNetworkBox.setPrefHeight(40);
splashP2PNetworkBox.getChildren().addAll(splashP2PNetworkLabel, splashP2PNetworkBusyAnimation, splashP2PNetworkIcon, showTorNetworkSettingsButton);
vBox.getChildren().addAll(logo, blockchainSyncBox, btcSyncIndicator, splashP2PNetworkBox);
vBox.getChildren().addAll(logo, blockchainSyncBox, xmrSyncIndicator, splashP2PNetworkBox);
return vBox;
}
private void disposeSplashScreen() {
model.getWalletServiceErrorMsg().removeListener(walletServiceErrorMsgListener);
model.getBtcSplashSyncIconId().removeListener(btcSyncIconIdListener);
model.getXmrSplashSyncIconId().removeListener(xmrSyncIconIdListener);
model.getP2pNetworkWarnMsg().removeListener(splashP2PNetworkErrorMsgListener);
model.getP2PNetworkIconId().removeListener(splashP2PNetworkIconIdListener);
model.getSplashP2PNetworkAnimationVisible().removeListener(splashP2PNetworkVisibleListener);
btcSplashInfo.textProperty().unbind();
btcSyncIndicator.progressProperty().unbind();
xmrSplashInfo.textProperty().unbind();
xmrSyncIndicator.progressProperty().unbind();
splashP2PNetworkLabel.textProperty().unbind();
@ -653,12 +653,12 @@ public class MainView extends InitializableView<StackPane, MainViewModel> {
setRightAnchor(separator, 0d);
setTopAnchor(separator, 0d);
// BTC
Label btcInfoLabel = new AutoTooltipLabel();
btcInfoLabel.setId("footer-pane");
btcInfoLabel.textProperty().bind(model.getBtcInfo());
setLeftAnchor(btcInfoLabel, 10d);
setBottomAnchor(btcInfoLabel, 7d);
// XMR
Label xmrInfoLabel = new AutoTooltipLabel();
xmrInfoLabel.setId("footer-pane");
xmrInfoLabel.textProperty().bind(model.getXmrInfo());
setLeftAnchor(xmrInfoLabel, 10d);
setBottomAnchor(xmrInfoLabel, 7d);
// temporarily disabled due to high CPU usage (per issue #4649)
//ProgressBar blockchainSyncIndicator = new JFXProgressBar(-1);
@ -668,16 +668,16 @@ public class MainView extends InitializableView<StackPane, MainViewModel> {
model.getWalletServiceErrorMsg().addListener((ov, oldValue, newValue) -> {
if (newValue != null) {
btcInfoLabel.setId("splash-error-state-msg");
btcInfoLabel.getStyleClass().add("error-text");
if (btcNetworkWarnMsgPopup == null) {
btcNetworkWarnMsgPopup = new Popup().warning(newValue);
btcNetworkWarnMsgPopup.show();
}
xmrInfoLabel.setId("splash-error-state-msg");
xmrInfoLabel.getStyleClass().add("error-text");
// if (xmrNetworkWarnMsgPopup == null) {
// xmrNetworkWarnMsgPopup = new Popup().warning(newValue);
// xmrNetworkWarnMsgPopup.show();
// }
} else {
btcInfoLabel.setId("footer-pane");
if (btcNetworkWarnMsgPopup != null)
btcNetworkWarnMsgPopup.hide();
xmrInfoLabel.setId("footer-pane");
// if (xmrNetworkWarnMsgPopup != null)
// xmrNetworkWarnMsgPopup.hide();
}
});
@ -787,7 +787,7 @@ public class MainView extends InitializableView<StackPane, MainViewModel> {
setRightAnchor(vBox, 53d);
setBottomAnchor(vBox, 5d);
return new AnchorPane(separator, btcInfoLabel, versionBox, vBox, p2PNetworkStatusIcon, p2PNetworkIcon) {{
return new AnchorPane(separator, xmrInfoLabel, versionBox, vBox, p2PNetworkStatusIcon, p2PNetworkIcon) {{
setId("footer-pane");
setMinHeight(30);
setMaxHeight(30);

View File

@ -260,7 +260,6 @@ public class MainViewModel implements ViewModel, HavenoSetup.HavenoSetupListener
});
setupP2PNumPeersWatcher();
setupXmrNumPeersWatcher();
marketPricePresentation.setup();
accountPresentation.setup();
@ -421,7 +420,7 @@ public class MainViewModel implements ViewModel, HavenoSetup.HavenoSetupListener
.warning(Res.get("popup.error.takeOfferRequestFailed", errorMessage))
.show());
havenoSetup.getBtcSyncProgress().addListener((observable, oldValue, newValue) -> updateBtcSyncProgress());
havenoSetup.getXmrSyncProgress().addListener((observable, oldValue, newValue) -> updateXmrSyncProgress());
havenoSetup.setFilterWarningHandler(warning -> new Popup().warning(warning).show());
@ -496,36 +495,6 @@ public class MainViewModel implements ViewModel, HavenoSetup.HavenoSetupListener
});
}
private void setupXmrNumPeersWatcher() {
connectionService.numPeersProperty().addListener((observable, oldValue, newValue) -> {
int numPeers = (int) newValue;
if ((int) oldValue > 0 && numPeers == 0) {
if (checkNumberOfXmrPeersTimer != null)
checkNumberOfXmrPeersTimer.stop();
checkNumberOfXmrPeersTimer = UserThread.runAfter(() -> {
// check again numPeers
if (connectionService.numPeersProperty().get() == 0) {
if (localBitcoinNode.shouldBeUsed())
getWalletServiceErrorMsg().set(
Res.get("mainView.networkWarning.localhostBitcoinLost", // TODO: update error message for XMR
Res.getBaseCurrencyName().toLowerCase()));
else
getWalletServiceErrorMsg().set(
Res.get("mainView.networkWarning.allConnectionsLost",
Res.getBaseCurrencyName().toLowerCase()));
} else {
getWalletServiceErrorMsg().set(null);
}
}, 5);
} else if ((int) oldValue == 0 && numPeers > 0) {
if (checkNumberOfXmrPeersTimer != null)
checkNumberOfXmrPeersTimer.stop();
getWalletServiceErrorMsg().set(null);
}
});
}
private void showPopupIfInvalidBtcConfig() {
preferences.setMoneroNodesOptionOrdinal(0);
new Popup().warning(Res.get("settings.net.warn.invalidBtcConfig"))
@ -564,10 +533,10 @@ public class MainViewModel implements ViewModel, HavenoSetup.HavenoSetupListener
}
}
private void updateBtcSyncProgress() {
final DoubleProperty btcSyncProgress = havenoSetup.getBtcSyncProgress();
private void updateXmrSyncProgress() {
final DoubleProperty xmrSyncProgress = havenoSetup.getXmrSyncProgress();
combinedSyncProgress.set(btcSyncProgress.doubleValue());
combinedSyncProgress.set(xmrSyncProgress.doubleValue());
}
private void setupInvalidOpenOffersHandler() {
@ -637,9 +606,9 @@ public class MainViewModel implements ViewModel, HavenoSetup.HavenoSetupListener
// Wallet
StringProperty getBtcInfo() {
StringProperty getXmrInfo() {
final StringProperty combinedInfo = new SimpleStringProperty();
combinedInfo.bind(havenoSetup.getBtcInfo());
combinedInfo.bind(havenoSetup.getXmrInfo());
return combinedInfo;
}
@ -657,12 +626,12 @@ public class MainViewModel implements ViewModel, HavenoSetup.HavenoSetupListener
return havenoSetup.getWalletServiceErrorMsg();
}
StringProperty getBtcSplashSyncIconId() {
return havenoSetup.getBtcSplashSyncIconId();
StringProperty getXmrSplashSyncIconId() {
return havenoSetup.getXmrSplashSyncIconId();
}
BooleanProperty getUseTorForBTC() {
return havenoSetup.getUseTorForBTC();
BooleanProperty getUseTorForXMR() {
return havenoSetup.getUseTorForXMR();
}
// P2P