diff --git a/common/src/main/java/bisq/common/app/Log.java b/common/src/main/java/bisq/common/app/Log.java
index 0d808629e2a..45eae96b494 100644
--- a/common/src/main/java/bisq/common/app/Log.java
+++ b/common/src/main/java/bisq/common/app/Log.java
@@ -88,6 +88,10 @@ public static void setup(String fileName) {
logbackLogger.addAppender(errorAppender);*/
}
+ public static void setCustomLogLevel(String pattern, Level logLevel) {
+ ((Logger) LoggerFactory.getLogger(pattern)).setLevel(logLevel);
+ }
+
public static void traceCall() {
if (LoggerFactory.getLogger(Log.class).isTraceEnabled()) {
StackTraceElement stackTraceElement = new Throwable().getStackTrace()[1];
diff --git a/common/src/main/java/bisq/common/proto/network/NetworkEnvelope.java b/common/src/main/java/bisq/common/proto/network/NetworkEnvelope.java
index f4691d5d79e..b09996f1a8d 100644
--- a/common/src/main/java/bisq/common/proto/network/NetworkEnvelope.java
+++ b/common/src/main/java/bisq/common/proto/network/NetworkEnvelope.java
@@ -67,4 +67,10 @@ public int getMessageVersion() {
return messageVersion;
}
+ @Override
+ public String toString() {
+ return "NetworkEnvelope{" +
+ "\n messageVersion=" + messageVersion +
+ "\n}";
+ }
}
diff --git a/core/src/main/java/bisq/core/app/BisqEnvironment.java b/core/src/main/java/bisq/core/app/BisqEnvironment.java
index 5e463e76062..b75074c5b51 100644
--- a/core/src/main/java/bisq/core/app/BisqEnvironment.java
+++ b/core/src/main/java/bisq/core/app/BisqEnvironment.java
@@ -292,7 +292,7 @@ public BisqEnvironment(PropertySource commandLineProperties) {
"";
genesisBlockHeight = commandLineProperties.containsProperty(DaoOptionKeys.GENESIS_BLOCK_HEIGHT) ?
(String) commandLineProperties.getProperty(DaoOptionKeys.GENESIS_BLOCK_HEIGHT) :
- "";
+ "-1";
daoActivated = commandLineProperties.containsProperty(DaoOptionKeys.DAO_ACTIVATED) ?
(String) commandLineProperties.getProperty(DaoOptionKeys.DAO_ACTIVATED) :
"";
diff --git a/core/src/main/java/bisq/core/app/BisqExecutable.java b/core/src/main/java/bisq/core/app/BisqExecutable.java
index 0e02ebaa83e..0950ffc270e 100644
--- a/core/src/main/java/bisq/core/app/BisqExecutable.java
+++ b/core/src/main/java/bisq/core/app/BisqExecutable.java
@@ -437,7 +437,7 @@ protected void customizeOptionParsing(OptionParser parser) {
description("Genesis transaction ID when not using the hard coded one", ""))
.withRequiredArg();
parser.accepts(DaoOptionKeys.GENESIS_BLOCK_HEIGHT,
- description("Genesis transaction block height when not using the hard coded one", ""))
+ description("Genesis transaction block height when not using the hard coded one", -1))
.withRequiredArg();
parser.accepts(DaoOptionKeys.DAO_ACTIVATED,
description("Developer flag. If true it enables dao phase 2 features.", false))
diff --git a/core/src/main/java/bisq/core/app/BisqSetup.java b/core/src/main/java/bisq/core/app/BisqSetup.java
index a3d1bc4eb7f..0ad31159fc8 100644
--- a/core/src/main/java/bisq/core/app/BisqSetup.java
+++ b/core/src/main/java/bisq/core/app/BisqSetup.java
@@ -24,9 +24,9 @@
import bisq.core.arbitration.ArbitratorManager;
import bisq.core.arbitration.DisputeManager;
import bisq.core.btc.listeners.BalanceListener;
-import bisq.core.btc.setup.WalletsSetup;
import bisq.core.btc.model.AddressEntry;
import bisq.core.btc.model.BalanceModel;
+import bisq.core.btc.setup.WalletsSetup;
import bisq.core.btc.wallet.BtcWalletService;
import bisq.core.btc.wallet.WalletsManager;
import bisq.core.dao.DaoSetup;
@@ -61,6 +61,7 @@
import bisq.common.Timer;
import bisq.common.UserThread;
import bisq.common.app.DevEnv;
+import bisq.common.app.Log;
import bisq.common.crypto.CryptoException;
import bisq.common.crypto.KeyRing;
import bisq.common.crypto.SealedAndSigned;
@@ -99,6 +100,8 @@
import java.util.function.BiConsumer;
import java.util.function.Consumer;
+import ch.qos.logback.classic.Level;
+
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
@@ -469,6 +472,11 @@ private void startP2pNetworkAndWallet() {
walletInitialized.addListener(walletInitializedListener);
else if (displayTorNetworkSettingsHandler != null)
displayTorNetworkSettingsHandler.accept(true);
+
+ log.info("Set log level for org.berndpruenster.netlayer classes to DEBUG to show more details for " +
+ "Tor network connection issues");
+ Log.setCustomLogLevel("org.berndpruenster.netlayer", Level.DEBUG);
+
}, STARTUP_TIMEOUT_MINUTES, TimeUnit.MINUTES);
p2pNetworkReady = p2PNetworkSetup.init(this::initWallet, displayTorNetworkSettingsHandler);
diff --git a/core/src/main/java/bisq/core/dao/DaoModule.java b/core/src/main/java/bisq/core/dao/DaoModule.java
index 48d1c3727be..f757c65eeb3 100644
--- a/core/src/main/java/bisq/core/dao/DaoModule.java
+++ b/core/src/main/java/bisq/core/dao/DaoModule.java
@@ -157,10 +157,10 @@ protected void configure() {
bind(IssuanceService.class).in(Singleton.class);
// Genesis
- String genesisTxId = environment.getProperty(DaoOptionKeys.GENESIS_TX_ID, String.class, null);
+ String genesisTxId = environment.getProperty(DaoOptionKeys.GENESIS_TX_ID, String.class, "");
bind(String.class).annotatedWith(Names.named(DaoOptionKeys.GENESIS_TX_ID)).toInstance(genesisTxId);
- Integer genesisBlockHeight = environment.getProperty(DaoOptionKeys.GENESIS_BLOCK_HEIGHT, Integer.class, 0);
+ Integer genesisBlockHeight = environment.getProperty(DaoOptionKeys.GENESIS_BLOCK_HEIGHT, Integer.class, -1);
bind(Integer.class).annotatedWith(Names.named(DaoOptionKeys.GENESIS_BLOCK_HEIGHT)).toInstance(genesisBlockHeight);
// Bonds
diff --git a/core/src/main/java/bisq/core/dao/node/BsqNode.java b/core/src/main/java/bisq/core/dao/node/BsqNode.java
index 1ff7b43a083..3cb8d0d7cd9 100644
--- a/core/src/main/java/bisq/core/dao/node/BsqNode.java
+++ b/core/src/main/java/bisq/core/dao/node/BsqNode.java
@@ -155,7 +155,11 @@ protected void onP2PNetworkReady() {
@SuppressWarnings("WeakerAccess")
protected int getStartBlockHeight() {
- final int startBlockHeight = Math.max(genesisBlockHeight, bsqStateService.getChainHeight());
+ int chainHeight = bsqStateService.getChainHeight();
+ int startBlockHeight = chainHeight;
+ if (chainHeight > genesisBlockHeight)
+ startBlockHeight = chainHeight + 1;
+
log.info("Start parse blocks:\n" +
" Start block height={}\n" +
" Genesis txId={}\n" +
@@ -164,7 +168,7 @@ protected int getStartBlockHeight() {
startBlockHeight,
genesisTxId,
genesisBlockHeight,
- bsqStateService.getChainHeight());
+ chainHeight);
return startBlockHeight;
}
diff --git a/core/src/main/java/bisq/core/dao/node/full/FullNode.java b/core/src/main/java/bisq/core/dao/node/full/FullNode.java
index 5843368accd..05f8fa05817 100644
--- a/core/src/main/java/bisq/core/dao/node/full/FullNode.java
+++ b/core/src/main/java/bisq/core/dao/node/full/FullNode.java
@@ -40,7 +40,7 @@
/**
* Main class for a full node which have Bitcoin Core with rpc running and does the blockchain lookup itself.
* It also provides the BSQ transactions to lite nodes on request and broadcasts new BSQ blocks.
- *
+ *
* TODO request p2p network data again after parsing is complete to be sure that in case we missed data during parsing
* we get it added.
*/
@@ -188,8 +188,8 @@ private void parseBlocksOnHeadHeight(int startBlockHeight, int chainHeadHeight)
parseBlocksIfNewBlockAvailable(chainHeadHeight);
}, throwable -> {
if (throwable instanceof BlockNotConnectingException) {
- int blockHeightOfLastBlock = bsqStateService.getBlockHeightOfLastBlock();
- requestChainHeadHeightAndParseBlocks(blockHeightOfLastBlock);
+ int startHeight = bsqStateService.getBlockHeightOfLastBlock() + 1;
+ requestChainHeadHeightAndParseBlocks(startHeight);
} else {
handleError(throwable);
}
@@ -232,6 +232,8 @@ private void parseBlock(int blockHeight, int chainHeadHeight,
} catch (BlockNotConnectingException e) {
errorHandler.accept(e);
}
+ } else {
+ log.info("Block was already added height=", rawBlock.getHeight());
}
},
errorHandler);
diff --git a/core/src/main/java/bisq/core/dao/node/full/network/GetBlocksRequestHandler.java b/core/src/main/java/bisq/core/dao/node/full/network/GetBlocksRequestHandler.java
index 5714d87f51b..74d984b7ceb 100644
--- a/core/src/main/java/bisq/core/dao/node/full/network/GetBlocksRequestHandler.java
+++ b/core/src/main/java/bisq/core/dao/node/full/network/GetBlocksRequestHandler.java
@@ -95,7 +95,8 @@ public void onGetBlocksRequest(GetBlocksRequest getBlocksRequest, final Connecti
List rawBlocks = blocks.stream().map(RawBlock::fromBlock).collect(Collectors.toList());
final GetBlocksResponse getBlocksResponse = new GetBlocksResponse(rawBlocks, getBlocksRequest.getNonce());
log.debug("getBlocksResponse " + getBlocksResponse.getRequestNonce());
-
+ log.info("Received getBlocksResponse from {} for blocks from height {}",
+ connection.getPeersNodeAddressOptional(), getBlocksRequest.getFromBlockHeight());
if (timeoutTimer == null) {
timeoutTimer = UserThread.runAfter(() -> { // setup before sending to avoid race conditions
String errorMessage = "A timeout occurred for getBlocksResponse:" + getBlocksResponse +
@@ -110,7 +111,7 @@ public void onGetBlocksRequest(GetBlocksRequest getBlocksRequest, final Connecti
@Override
public void onSuccess(Connection connection) {
if (!stopped) {
- log.trace("Send DataResponse to {} succeeded. getBlocksResponse={}",
+ log.info("Send DataResponse to {} succeeded. getBlocksResponse={}",
connection.getPeersNodeAddressOptional(), getBlocksResponse);
cleanup();
listener.onComplete();
diff --git a/core/src/main/java/bisq/core/dao/node/lite/network/LiteNodeNetworkService.java b/core/src/main/java/bisq/core/dao/node/lite/network/LiteNodeNetworkService.java
index 32a24cc8989..e9e9a0dd35c 100644
--- a/core/src/main/java/bisq/core/dao/node/lite/network/LiteNodeNetworkService.java
+++ b/core/src/main/java/bisq/core/dao/node/lite/network/LiteNodeNetworkService.java
@@ -139,7 +139,6 @@ public void addListener(Listener listener) {
}
public void requestBlocks(int startBlockHeight) {
- Log.traceCall();
lastRequestedBlockHeight = startBlockHeight;
Optional connectionToSeedNodeOptional = networkNode.getConfirmedConnections().stream()
.filter(peerManager::isSeedNode)
@@ -219,6 +218,7 @@ public void onAwakeFromStandby() {
@Override
public void onMessage(NetworkEnvelope networkEnvelope, Connection connection) {
if (networkEnvelope instanceof NewBlockBroadcastMessage) {
+ log.info("We received blocks from peer {}", connection.getPeersNodeAddressOptional());
listeners.forEach(listener -> listener.onNewBlockReceived((NewBlockBroadcastMessage) networkEnvelope));
}
}
@@ -239,7 +239,7 @@ private void requestBlocks(NodeAddress peersNodeAddress, int startBlockHeight) {
new RequestBlocksHandler.Listener() {
@Override
public void onComplete(GetBlocksResponse getBlocksResponse) {
- log.trace("requestBlocksHandler of outbound connection complete. nodeAddress={}",
+ log.info("requestBlocksHandler of outbound connection complete. nodeAddress={}",
peersNodeAddress);
stopRetryTimer();
@@ -270,6 +270,7 @@ public void onFault(String errorMessage, @Nullable Connection connection) {
}
});
requestBlocksHandlerMap.put(key, requestBlocksHandler);
+ log.info("requestBlocks with startBlockHeight={} from peer {}", startBlockHeight, peersNodeAddress);
requestBlocksHandler.requestBlocks();
} else {
//TODO check with re-orgs
diff --git a/core/src/main/java/bisq/core/dao/node/lite/network/RequestBlocksHandler.java b/core/src/main/java/bisq/core/dao/node/lite/network/RequestBlocksHandler.java
index 371a43f78f6..1ff519f7a1e 100644
--- a/core/src/main/java/bisq/core/dao/node/lite/network/RequestBlocksHandler.java
+++ b/core/src/main/java/bisq/core/dao/node/lite/network/RequestBlocksHandler.java
@@ -126,14 +126,14 @@ public void requestBlocks() {
TIMEOUT);
}
- log.debug("We send a {} to peer {}. ", getBlocksRequest.getClass().getSimpleName(), nodeAddress);
+ log.info("We send to peer {} a {}.", nodeAddress, getBlocksRequest);
networkNode.addMessageListener(this);
SettableFuture future = networkNode.sendMessage(nodeAddress, getBlocksRequest);
Futures.addCallback(future, new FutureCallback() {
@Override
public void onSuccess(Connection connection) {
if (!stopped) {
- log.trace("Send " + getBlocksRequest + " to " + nodeAddress + " succeeded.");
+ log.info("Sending of GetBlocksRequest message to peer {} succeeded.", nodeAddress.getHostName());
} else {
log.trace("We have stopped already. We ignore that networkNode.sendMessage.onSuccess call." +
"Might be caused by an previous timeout.");
@@ -178,6 +178,7 @@ public void onMessage(NetworkEnvelope networkEnvelope, Connection connection) {
"RequestDataHandler.onMessage: connection.getPeersNodeAddressOptional() must be present " +
"at that moment");
cleanup();
+ log.info("We received from peer {} a {}", nodeAddress.getFullAddress(), getBlocksResponse);
listener.onComplete(getBlocksResponse);
} else {
log.warn("Nonce not matching. That can happen rarely if we get a response after a canceled " +
diff --git a/core/src/main/java/bisq/core/dao/node/messages/GetBlocksRequest.java b/core/src/main/java/bisq/core/dao/node/messages/GetBlocksRequest.java
index 3750f55ccf7..ee66b69d1a6 100644
--- a/core/src/main/java/bisq/core/dao/node/messages/GetBlocksRequest.java
+++ b/core/src/main/java/bisq/core/dao/node/messages/GetBlocksRequest.java
@@ -32,11 +32,9 @@
import lombok.EqualsAndHashCode;
import lombok.Getter;
-import lombok.ToString;
@EqualsAndHashCode(callSuper = true)
@Getter
-@ToString
public final class GetBlocksRequest extends NetworkEnvelope implements DirectMessage, CapabilityRequiringPayload {
private final int fromBlockHeight;
private final int nonce;
@@ -75,4 +73,13 @@ public List getRequiredCapabilities() {
Capabilities.Capability.DAO_FULL_NODE.ordinal()
));
}
+
+
+ @Override
+ public String toString() {
+ return "GetBlocksRequest{" +
+ "\n fromBlockHeight=" + fromBlockHeight +
+ ",\n nonce=" + nonce +
+ "\n} " + super.toString();
+ }
}
diff --git a/core/src/main/java/bisq/core/dao/node/messages/GetBlocksResponse.java b/core/src/main/java/bisq/core/dao/node/messages/GetBlocksResponse.java
index ad8c6493e41..c8b244d2ef5 100644
--- a/core/src/main/java/bisq/core/dao/node/messages/GetBlocksResponse.java
+++ b/core/src/main/java/bisq/core/dao/node/messages/GetBlocksResponse.java
@@ -75,4 +75,13 @@ public static NetworkEnvelope fromProto(PB.GetBlocksResponse proto, int messageV
proto.getRequestNonce(),
messageVersion);
}
+
+
+ @Override
+ public String toString() {
+ return "GetBlocksResponse{" +
+ "\n blocks=" + blocks +
+ ",\n requestNonce=" + requestNonce +
+ "\n} " + super.toString();
+ }
}
diff --git a/core/src/main/java/bisq/core/dao/node/parser/TxParser.java b/core/src/main/java/bisq/core/dao/node/parser/TxParser.java
index 86957ce4b88..3827b11741b 100644
--- a/core/src/main/java/bisq/core/dao/node/parser/TxParser.java
+++ b/core/src/main/java/bisq/core/dao/node/parser/TxParser.java
@@ -372,22 +372,17 @@ private Optional getOptionalOpReturnType() {
// We want to be sure that the initial assumption of the opReturn type was matching the result after full
// validation.
Optional optionalOpReturnTypeCandidate = txOutputParser.getOptionalOpReturnTypeCandidate();
- if (optionalOpReturnTypeCandidate.isPresent()) {
- OpReturnType opReturnTypeCandidate = optionalOpReturnTypeCandidate.get();
- Optional optionalVerifiedOpReturnType = txOutputParser.getOptionalVerifiedOpReturnType();
- if (optionalVerifiedOpReturnType.isPresent()) {
- OpReturnType verifiedOpReturnType = optionalVerifiedOpReturnType.get();
- if (opReturnTypeCandidate == verifiedOpReturnType) {
- return optionalVerifiedOpReturnType;
- }
+ Optional optionalVerifiedOpReturnType = txOutputParser.getOptionalVerifiedOpReturnType();
+ if (optionalOpReturnTypeCandidate.isPresent() && optionalVerifiedOpReturnType.isPresent()) {
+ if (optionalOpReturnTypeCandidate.get() == optionalVerifiedOpReturnType.get()) {
+ return optionalVerifiedOpReturnType;
+ } else {
+ String msg = "We got a different opReturn type after validation as we expected initially. " +
+ "optionalOpReturnTypeCandidate=" + optionalOpReturnTypeCandidate +
+ ", optionalVerifiedOpReturnType=" + txOutputParser.getOptionalVerifiedOpReturnType();
+ log.warn(msg);
}
}
-
- String msg = "We got a different opReturn type after validation as we expected initially. " +
- "optionalOpReturnTypeCandidate=" + optionalOpReturnTypeCandidate +
- ", optionalVerifiedOpReturnType=" + txOutputParser.getOptionalVerifiedOpReturnType();
- log.error(msg);
-
} else {
String msg = "We got a tx without any valid BSQ output but with burned BSQ. " +
"Burned fee=" + remainingInputValue / 100D + " BSQ.";
diff --git a/core/src/main/java/bisq/core/dao/state/GenesisTxInfo.java b/core/src/main/java/bisq/core/dao/state/GenesisTxInfo.java
index 066645b39d9..db90bc859d6 100644
--- a/core/src/main/java/bisq/core/dao/state/GenesisTxInfo.java
+++ b/core/src/main/java/bisq/core/dao/state/GenesisTxInfo.java
@@ -29,8 +29,6 @@
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
-import javax.annotation.Nullable;
-
/**
* Encapsulate the genesis txId and height.
@@ -87,12 +85,12 @@ public class GenesisTxInfo {
///////////////////////////////////////////////////////////////////////////////////////////
@Inject
- public GenesisTxInfo(@Nullable @Named(DaoOptionKeys.GENESIS_TX_ID) String genesisTxId,
- @Named(DaoOptionKeys.GENESIS_BLOCK_HEIGHT) int genesisBlockHeight) {
+ public GenesisTxInfo(@Named(DaoOptionKeys.GENESIS_TX_ID) String genesisTxId,
+ @Named(DaoOptionKeys.GENESIS_BLOCK_HEIGHT) Integer genesisBlockHeight) {
BaseCurrencyNetwork baseCurrencyNetwork = BisqEnvironment.getBaseCurrencyNetwork();
boolean isMainnet = baseCurrencyNetwork.isMainnet();
boolean isTestnet = baseCurrencyNetwork.isTestnet();
- if (genesisTxId != null && !genesisTxId.isEmpty()) {
+ if (!genesisTxId.isEmpty()) {
this.genesisTxId = genesisTxId;
} else if (isMainnet) {
this.genesisTxId = MAINNET_GENESIS_TX_ID;
@@ -102,7 +100,7 @@ public GenesisTxInfo(@Nullable @Named(DaoOptionKeys.GENESIS_TX_ID) String genesi
this.genesisTxId = "genesisTxId is undefined";
}
- if (genesisBlockHeight != 0) {
+ if (genesisBlockHeight > -1) {
this.genesisBlockHeight = genesisBlockHeight;
} else if (isMainnet) {
this.genesisBlockHeight = MAINNET_GENESIS_BLOCK_HEIGHT;
diff --git a/core/src/main/java/bisq/core/dao/state/SnapshotManager.java b/core/src/main/java/bisq/core/dao/state/SnapshotManager.java
index 2d88ecb3000..dd4e76cfb81 100644
--- a/core/src/main/java/bisq/core/dao/state/SnapshotManager.java
+++ b/core/src/main/java/bisq/core/dao/state/SnapshotManager.java
@@ -37,11 +37,10 @@
/**
* Manages snapshots of BsqState.
- * // FIXME not working correctly anymore
*/
@Slf4j
public class SnapshotManager implements BsqStateListener {
- private static final int SNAPSHOT_GRID = 11000;
+ private static final int SNAPSHOT_GRID = 100;
private final BsqState bsqState;
private final BsqStateService bsqStateService;
@@ -90,7 +89,7 @@ public void onParseTxsComplete(Block block) {
// Now we clone and keep it in memory for the next trigger
snapshotCandidate = bsqState.getClone();
// don't access cloned anymore with methods as locks are transient!
- log.debug("Cloned new snapshotCandidate at height " + chainHeadHeight);
+ log.info("Cloned new snapshotCandidate at height " + chainHeadHeight);
}
}
diff --git a/core/src/main/java/bisq/core/dao/state/blockchain/BaseBlock.java b/core/src/main/java/bisq/core/dao/state/blockchain/BaseBlock.java
index 3ea8349c9fb..ebc6c4b4f7f 100644
--- a/core/src/main/java/bisq/core/dao/state/blockchain/BaseBlock.java
+++ b/core/src/main/java/bisq/core/dao/state/blockchain/BaseBlock.java
@@ -19,8 +19,11 @@
import io.bisq.generated.protobuffer.PB;
+import java.util.Optional;
+
import lombok.Data;
+import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;
/**
@@ -33,6 +36,7 @@ public abstract class BaseBlock {
protected final int height;
protected final long time; // in ms
protected final String hash;
+ @Nullable // in case of first block in the blockchain
protected final String previousBlockHash;
BaseBlock(int height, long time, String hash, String previousBlockHash) {
@@ -48,11 +52,13 @@ public abstract class BaseBlock {
///////////////////////////////////////////////////////////////////////////////////////////
PB.BaseBlock.Builder getBaseBlockBuilder() {
- return PB.BaseBlock.newBuilder()
+ PB.BaseBlock.Builder builder = PB.BaseBlock.newBuilder()
.setHeight(height)
.setTime(time)
- .setHash(hash)
- .setPreviousBlockHash(previousBlockHash);
+ .setHash(hash);
+ Optional.ofNullable(previousBlockHash).ifPresent(builder::setPreviousBlockHash);
+ return builder;
+
}
@Override
diff --git a/core/src/main/java/bisq/core/locale/CurrencyUtil.java b/core/src/main/java/bisq/core/locale/CurrencyUtil.java
index 3cac7dcfb6c..55148efc858 100644
--- a/core/src/main/java/bisq/core/locale/CurrencyUtil.java
+++ b/core/src/main/java/bisq/core/locale/CurrencyUtil.java
@@ -18,12 +18,7 @@
package bisq.core.locale;
import bisq.core.app.BisqEnvironment;
-
-import bisq.asset.Asset;
-import bisq.asset.AssetRegistry;
-import bisq.asset.Coin;
-import bisq.asset.Token;
-import bisq.asset.coins.BSQ;
+import bisq.core.btc.BaseCurrencyNetwork;
import bisq.common.app.DevEnv;
@@ -40,6 +35,16 @@
import lombok.extern.slf4j.Slf4j;
+import static com.google.common.base.Preconditions.checkArgument;
+
+
+
+import bisq.asset.Asset;
+import bisq.asset.AssetRegistry;
+import bisq.asset.Coin;
+import bisq.asset.Token;
+import bisq.asset.coins.BSQ;
+
@Slf4j
public class CurrencyUtil {
@@ -106,14 +111,13 @@ public static List getAllSortedCryptoCurrencies() {
private static List createAllSortedCryptoCurrenciesList() {
List result = assetRegistry.stream()
.filter(CurrencyUtil::assetIsNotBaseCurrency)
- .filter(CurrencyUtil::excludeBsqUnlessDaoTradingIsActive)
- .filter(CurrencyUtil::assetMatchesNetwork)
+ .filter(asset -> isNotBsqOrBsqTradingActivated(asset, BisqEnvironment.getBaseCurrencyNetwork(), DevEnv.isDaoTradingActivated()))
+ .filter(asset -> assetMatchesNetworkIfMainnet(asset, BisqEnvironment.getBaseCurrencyNetwork()))
.map(CurrencyUtil::assetToCryptoCurrency)
.sorted(TradeCurrency::compareTo)
.collect(Collectors.toList());
// Util for printing all altcoins for adding to FAQ page
-
/* StringBuilder sb = new StringBuilder();
result.stream().forEach(e -> sb.append("“")
.append(e.getCode())
@@ -366,20 +370,71 @@ public static TradeCurrency getDefaultTradeCurrency() {
}
private static boolean assetIsNotBaseCurrency(Asset asset) {
- return !asset.getTickerSymbol().equals(baseCurrencyCode);
+ return !assetMatchesCurrencyCode(asset, baseCurrencyCode);
}
- private static boolean assetMatchesNetwork(Asset asset) {
+ // TODO We handle assets of other types (Token, ERC20) as matching the network which is not correct.
+ // We should add support for network property in those tokens as well.
+ public static boolean assetMatchesNetwork(Asset asset, BaseCurrencyNetwork baseCurrencyNetwork) {
return !(asset instanceof Coin) ||
- ((Coin) asset).getNetwork().name().equals(BisqEnvironment.getDefaultBaseCurrencyNetwork().getNetwork());
+ ((Coin) asset).getNetwork().name().equals(baseCurrencyNetwork.getNetwork());
+ }
+
+ // We only check for coins not other types of assets (TODO network check should be supported for all assets)
+ public static boolean assetMatchesNetworkIfMainnet(Asset asset, BaseCurrencyNetwork baseCurrencyNetwork) {
+ return !(asset instanceof Coin) ||
+ coinMatchesNetworkIfMainnet((Coin) asset, baseCurrencyNetwork);
+ }
+
+ // We want all coins available also in testnet or regtest for testing purpose
+ public static boolean coinMatchesNetworkIfMainnet(Coin coin, BaseCurrencyNetwork baseCurrencyNetwork) {
+ boolean matchesNetwork = assetMatchesNetwork(coin, baseCurrencyNetwork);
+ return !baseCurrencyNetwork.isMainnet() ||
+ matchesNetwork;
}
private static CryptoCurrency assetToCryptoCurrency(Asset asset) {
return new CryptoCurrency(asset.getTickerSymbol(), asset.getName(), asset instanceof Token);
}
- private static boolean excludeBsqUnlessDaoTradingIsActive(Asset asset) {
- return (!(asset instanceof BSQ) || (DevEnv.isDaoTradingActivated()
- && ((BSQ) asset).getNetwork().name().equals(BisqEnvironment.getBaseCurrencyNetwork().getNetwork())));
+ private static boolean isNotBsqOrBsqTradingActivated(Asset asset, BaseCurrencyNetwork baseCurrencyNetwork, boolean daoTradingActivated) {
+ return !(asset instanceof BSQ) ||
+ daoTradingActivated && assetMatchesNetwork(asset, baseCurrencyNetwork);
+ }
+
+ public static boolean assetMatchesCurrencyCode(Asset asset, String currencyCode) {
+ return currencyCode.equals(asset.getTickerSymbol());
+ }
+
+ public static Optional findAsset(AssetRegistry assetRegistry, String currencyCode,
+ BaseCurrencyNetwork baseCurrencyNetwork, boolean daoTradingActivated) {
+ List assets = assetRegistry.stream()
+ .filter(asset -> assetMatchesCurrencyCode(asset, currencyCode)).collect(Collectors.toList());
+
+ // If we don't have the ticker symbol we throw an exception
+ if (!assets.stream().findFirst().isPresent())
+ return Optional.empty();
+
+ if (currencyCode.equals("BSQ") && baseCurrencyNetwork.isMainnet() && !daoTradingActivated)
+ return Optional.empty();
+
+ // We check for exact match with network, e.g. BTC$TESTNET
+ Optional optionalAssetMatchesNetwork = assets.stream()
+ .filter(asset -> assetMatchesNetwork(asset, baseCurrencyNetwork))
+ .findFirst();
+ if (optionalAssetMatchesNetwork.isPresent())
+ return optionalAssetMatchesNetwork;
+
+ // In testnet or regtest we want to show all coins as well. Most coins have only Mainnet defined so we deliver
+ // that if no exact match was found in previous step
+ if (!baseCurrencyNetwork.isMainnet()) {
+ Optional optionalAsset = assets.stream().findFirst();
+ checkArgument(optionalAsset.isPresent(), "optionalAsset must be present as we checked for " +
+ "not matching ticker symbols already above");
+ return optionalAsset;
+ }
+
+ // If we are in mainnet we need have a mainet asset defined.
+ throw new IllegalArgumentException("We are on mainnet and we could not find an asset with network type mainnet");
}
}
diff --git a/core/src/main/java/bisq/core/payment/validation/AltCoinAddressValidator.java b/core/src/main/java/bisq/core/payment/validation/AltCoinAddressValidator.java
index d1112ec740e..c6028c52e64 100644
--- a/core/src/main/java/bisq/core/payment/validation/AltCoinAddressValidator.java
+++ b/core/src/main/java/bisq/core/payment/validation/AltCoinAddressValidator.java
@@ -18,22 +18,23 @@
package bisq.core.payment.validation;
import bisq.core.app.BisqEnvironment;
-import bisq.core.btc.BaseCurrencyNetwork;
+import bisq.core.locale.CurrencyUtil;
import bisq.core.locale.Res;
import bisq.core.util.validation.InputValidator;
+import bisq.common.app.DevEnv;
+
import com.google.inject.Inject;
-import lombok.extern.slf4j.Slf4j;
+import java.util.Optional;
-import static java.lang.String.format;
+import lombok.extern.slf4j.Slf4j;
import bisq.asset.AddressValidationResult;
import bisq.asset.Asset;
import bisq.asset.AssetRegistry;
-import bisq.asset.Coin;
@Slf4j
public final class AltCoinAddressValidator extends InputValidator {
@@ -56,30 +57,19 @@ public ValidationResult validate(String input) {
if (!validationResult.isValid || currencyCode == null)
return validationResult;
- Asset asset = assetRegistry.stream()
- .filter(this::assetMatchesSelectedCurrencyCode)
- .filter(this::assetIsNotBaseCurrencyForDifferentNetwork)
- .findFirst()
- .orElseThrow(() ->
- new IllegalArgumentException(format("'%s' is not a registered asset", currencyCode)));
-
- AddressValidationResult result = asset.validateAddress(input);
- if (!result.isValid())
- return new ValidationResult(false,
- Res.get(result.getI18nKey(), asset.getTickerSymbol(), result.getMessage()));
-
- return new ValidationResult(true);
- }
-
- private boolean assetMatchesSelectedCurrencyCode(Asset a) {
- return currencyCode.equals(a.getTickerSymbol());
- }
-
- private boolean assetIsNotBaseCurrencyForDifferentNetwork(Asset asset) {
- BaseCurrencyNetwork baseCurrencyNetwork = BisqEnvironment.getBaseCurrencyNetwork();
-
- return !(asset instanceof Coin)
- || !asset.getTickerSymbol().equals(baseCurrencyNetwork.getCurrencyCode())
- || (((Coin) asset).getNetwork().name().equals(baseCurrencyNetwork.getNetwork()));
+ Optional optionalAsset = CurrencyUtil.findAsset(assetRegistry, currencyCode,
+ BisqEnvironment.getBaseCurrencyNetwork(), DevEnv.isDaoTradingActivated());
+ if (optionalAsset.isPresent()) {
+ Asset asset = optionalAsset.get();
+ AddressValidationResult result = asset.validateAddress(input);
+ if (!result.isValid()) {
+ return new ValidationResult(false, Res.get(result.getI18nKey(), asset.getTickerSymbol(),
+ result.getMessage()));
+ }
+
+ return new ValidationResult(true);
+ } else {
+ return new ValidationResult(false);
+ }
}
}
diff --git a/core/src/main/java/bisq/core/util/BSFormatter.java b/core/src/main/java/bisq/core/util/BSFormatter.java
index 0699df48663..1a49166bb18 100644
--- a/core/src/main/java/bisq/core/util/BSFormatter.java
+++ b/core/src/main/java/bisq/core/util/BSFormatter.java
@@ -328,7 +328,7 @@ public String formatAltcoinVolume(Altcoin altcoin, boolean appendCurrencyCode) {
// TODO quick hack...
String res;
if (altcoin.getCurrencyCode().equals("BSQ"))
- res = altcoinFormat.noCode().minDecimals(3).repeatOptionalDecimals(0, 0).format(altcoin).toString();
+ res = altcoinFormat.noCode().minDecimals(2).repeatOptionalDecimals(0, 0).format(altcoin).toString();
else
res = altcoinFormat.noCode().format(altcoin).toString();
if (appendCurrencyCode)
diff --git a/core/src/test/java/bisq/core/locale/CurrencyUtilTest.java b/core/src/test/java/bisq/core/locale/CurrencyUtilTest.java
index 8f6838fc5dd..1f4e52708d4 100644
--- a/core/src/test/java/bisq/core/locale/CurrencyUtilTest.java
+++ b/core/src/test/java/bisq/core/locale/CurrencyUtilTest.java
@@ -17,15 +17,30 @@
package bisq.core.locale;
+import bisq.core.btc.BaseCurrencyNetwork;
+
+import java.util.ArrayList;
+import java.util.List;
import java.util.Locale;
import java.util.Optional;
+import java.util.ServiceLoader;
+import java.util.stream.Stream;
+import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+
+
+import bisq.asset.Asset;
+import bisq.asset.AssetRegistry;
+import bisq.asset.Coin;
+import bisq.asset.coins.Ether;
+
public class CurrencyUtilTest {
@Before
@@ -39,9 +54,95 @@ public void testGetTradeCurrency() {
Optional naira = CurrencyUtil.getTradeCurrency("NGN");
Optional fake = CurrencyUtil.getTradeCurrency("FAK");
-
assertTrue(euro.isPresent());
assertTrue(naira.isPresent());
assertFalse("Fake currency shouldn't exist", fake.isPresent());
}
+
+ @Test
+ public void testFindAsset() {
+ MockAssetRegistry assetRegistry = new MockAssetRegistry();
+
+ // test if code is matching
+ boolean daoTradingActivated = false;
+ // Test if BSQ on mainnet is failing
+ Assert.assertFalse(CurrencyUtil.findAsset(assetRegistry, "BSQ",
+ BaseCurrencyNetwork.BTC_MAINNET, daoTradingActivated).isPresent());
+
+ // on testnet/regtest it is allowed
+ assertEquals(CurrencyUtil.findAsset(assetRegistry, "BSQ",
+ BaseCurrencyNetwork.BTC_TESTNET, daoTradingActivated).get().getTickerSymbol(), "BSQ");
+
+
+ daoTradingActivated = true;
+ // With daoTradingActivated we can request BSQ
+ assertEquals(CurrencyUtil.findAsset(assetRegistry, "BSQ",
+ BaseCurrencyNetwork.BTC_MAINNET, daoTradingActivated).get().getTickerSymbol(), "BSQ");
+
+ // Test if not matching ticker is failing
+ Assert.assertFalse(CurrencyUtil.findAsset(assetRegistry, "BSQ1",
+ BaseCurrencyNetwork.BTC_MAINNET, daoTradingActivated).isPresent());
+
+ // Add a mock coin which has no mainnet version, needs to fail if we are on mainnet
+ MockTestnetCoin.Testnet mockTestnetCoin = new MockTestnetCoin.Testnet();
+ try {
+ assetRegistry.addAsset(mockTestnetCoin);
+ CurrencyUtil.findAsset(assetRegistry, "MOCK_COIN",
+ BaseCurrencyNetwork.BTC_MAINNET, daoTradingActivated);
+ Assert.fail("Expected an IllegalArgumentException");
+ } catch (IllegalArgumentException e) {
+ String wantMessage = "We are on mainnet and we could not find an asset with network type mainnet";
+ Assert.assertTrue("Unexpected exception, want message starting with " +
+ "'" + wantMessage + "', got '" + e.getMessage() + "'", e.getMessage().startsWith(wantMessage));
+ }
+
+ // For testnet its ok
+ assertEquals(CurrencyUtil.findAsset(assetRegistry, "MOCK_COIN",
+ BaseCurrencyNetwork.BTC_TESTNET, daoTradingActivated).get().getTickerSymbol(), "MOCK_COIN");
+ assertEquals(Coin.Network.TESTNET, mockTestnetCoin.getNetwork());
+
+ // For regtest its still found
+ assertEquals(CurrencyUtil.findAsset(assetRegistry, "MOCK_COIN",
+ BaseCurrencyNetwork.BTC_REGTEST, daoTradingActivated).get().getTickerSymbol(), "MOCK_COIN");
+
+
+ // We test if we are not on mainnet to get the mainnet coin
+ Coin ether = new Ether();
+ assertEquals(CurrencyUtil.findAsset(assetRegistry, "ETH",
+ BaseCurrencyNetwork.BTC_TESTNET, daoTradingActivated).get().getTickerSymbol(), "ETH");
+ assertEquals(CurrencyUtil.findAsset(assetRegistry, "ETH",
+ BaseCurrencyNetwork.BTC_REGTEST, daoTradingActivated).get().getTickerSymbol(), "ETH");
+ assertEquals(Coin.Network.MAINNET, ether.getNetwork());
+
+ // We test if network matches exactly if there are distinct network types defined like with BSQ
+ Coin bsq = (Coin) CurrencyUtil.findAsset(assetRegistry, "BSQ", BaseCurrencyNetwork.BTC_MAINNET, daoTradingActivated).get();
+ assertEquals("BSQ", bsq.getTickerSymbol());
+ assertEquals(Coin.Network.MAINNET, bsq.getNetwork());
+
+ bsq = (Coin) CurrencyUtil.findAsset(assetRegistry, "BSQ", BaseCurrencyNetwork.BTC_TESTNET, daoTradingActivated).get();
+ assertEquals("BSQ", bsq.getTickerSymbol());
+ assertEquals(Coin.Network.TESTNET, bsq.getNetwork());
+
+ bsq = (Coin) CurrencyUtil.findAsset(assetRegistry, "BSQ", BaseCurrencyNetwork.BTC_REGTEST, daoTradingActivated).get();
+ assertEquals("BSQ", bsq.getTickerSymbol());
+ assertEquals(Coin.Network.REGTEST, bsq.getNetwork());
+ }
+
+ class MockAssetRegistry extends AssetRegistry {
+ private List registeredAssets = new ArrayList<>();
+
+ MockAssetRegistry() {
+ for (Asset asset : ServiceLoader.load(Asset.class)) {
+ registeredAssets.add(asset);
+ }
+ }
+
+ void addAsset(Asset asset) {
+ registeredAssets.add(asset);
+ }
+
+ public Stream stream() {
+ return registeredAssets.stream();
+ }
+ }
}
diff --git a/core/src/test/java/bisq/core/locale/MockTestnetCoin.java b/core/src/test/java/bisq/core/locale/MockTestnetCoin.java
new file mode 100644
index 00000000000..ddffc0e8fa9
--- /dev/null
+++ b/core/src/test/java/bisq/core/locale/MockTestnetCoin.java
@@ -0,0 +1,69 @@
+/*
+ * 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.locale;
+
+import org.bitcoinj.core.NetworkParameters;
+import org.bitcoinj.params.MainNetParams;
+import org.bitcoinj.params.RegTestParams;
+import org.bitcoinj.params.TestNet3Params;
+
+
+
+import bisq.asset.AddressValidationResult;
+import bisq.asset.Base58BitcoinAddressValidator;
+import bisq.asset.Coin;
+
+public class MockTestnetCoin extends Coin {
+
+ public MockTestnetCoin(Network network, NetworkParameters networkParameters) {
+ super("MockTestnetCoin", "MOCK_COIN", new BSQAddressValidator(networkParameters), network);
+ }
+
+ public static class Mainnet extends MockTestnetCoin {
+
+ public Mainnet() {
+ super(Network.MAINNET, MainNetParams.get());
+ }
+ }
+
+ public static class Testnet extends MockTestnetCoin {
+
+ public Testnet() {
+ super(Network.TESTNET, TestNet3Params.get());
+ }
+ }
+
+ public static class Regtest extends MockTestnetCoin {
+
+ public Regtest() {
+ super(Network.REGTEST, RegTestParams.get());
+ }
+ }
+
+ public static class BSQAddressValidator extends Base58BitcoinAddressValidator {
+
+ public BSQAddressValidator(NetworkParameters networkParameters) {
+ super(networkParameters);
+ }
+
+ @Override
+ public AddressValidationResult validate(String address) {
+ return super.validate(address);
+ }
+ }
+}
diff --git a/core/src/test/java/bisq/core/offer/OfferMaker.java b/core/src/test/java/bisq/core/offer/OfferMaker.java
index c32f9f0adbf..aa9d294c2e2 100644
--- a/core/src/test/java/bisq/core/offer/OfferMaker.java
+++ b/core/src/test/java/bisq/core/offer/OfferMaker.java
@@ -33,9 +33,10 @@ public class OfferMaker {
public static final Property direction = new Property<>();
public static final Property useMarketBasedPrice = new Property<>();
public static final Property marketPriceMargin = new Property<>();
+ public static final Property id = new Property<>();
public static final Instantiator Offer = lookup -> new Offer(
- new OfferPayload("",
+ new OfferPayload(lookup.valueOf(id, "1234"),
0L,
null,
null,
diff --git a/core/src/test/java/bisq/core/payment/validation/AltCoinAddressValidatorTest.java b/core/src/test/java/bisq/core/payment/validation/AltCoinAddressValidatorTest.java
index dd8bbbb1c56..1ef48be4c32 100644
--- a/core/src/test/java/bisq/core/payment/validation/AltCoinAddressValidatorTest.java
+++ b/core/src/test/java/bisq/core/payment/validation/AltCoinAddressValidatorTest.java
@@ -24,10 +24,8 @@
import org.junit.Test;
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
@@ -52,11 +50,7 @@ public void test() {
assertTrue(validator.validate("Lg3PX8wRWmApFCoCMAsPF5P9dPHYQHEWKW").isValid);
validator.setCurrencyCode("BOGUS");
- try {
- validator.validate("1BOGUSADDR");
- fail("expected validation to fail for unregistered asset 'BOGUS'");
- } catch (IllegalArgumentException ex) {
- assertThat(ex.getMessage(), containsString("'BOGUS' is not a registered asset"));
- }
+
+ assertFalse(validator.validate("1BOGUSADDR").isValid);
}
}
diff --git a/desktop/src/main/java/bisq/desktop/app/BisqApp.java b/desktop/src/main/java/bisq/desktop/app/BisqApp.java
index 1c52ed135ab..37dfa017745 100644
--- a/desktop/src/main/java/bisq/desktop/app/BisqApp.java
+++ b/desktop/src/main/java/bisq/desktop/app/BisqApp.java
@@ -44,6 +44,7 @@
import bisq.common.UserThread;
import bisq.common.app.DevEnv;
+import bisq.common.app.Log;
import bisq.common.setup.GracefulShutDownHandler;
import bisq.common.setup.UncaughtExceptionHandler;
import bisq.common.util.Profiler;
@@ -73,6 +74,11 @@
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
+import org.slf4j.LoggerFactory;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.Logger;
+
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
@@ -263,6 +269,17 @@ private void addSceneKeyEventHandler(Scene scene, Injector injector) {
showSendAlertMessagePopup(injector);
} else if (Utilities.isAltOrCtrlPressed(KeyCode.F, keyEvent)) {
showFilterPopup(injector);
+ } else if (Utilities.isAltOrCtrlPressed(KeyCode.T, keyEvent)) {
+ // Toggle between show tor logs and only show warnings. Helpful in case of connection problems
+ String pattern = "org.berndpruenster.netlayer";
+ Level logLevel = ((Logger) LoggerFactory.getLogger(pattern)).getLevel();
+ if (logLevel != Level.DEBUG) {
+ log.info("Set log level for org.berndpruenster.netlayer classes to DEBUG");
+ Log.setCustomLogLevel(pattern, Level.DEBUG);
+ } else {
+ log.info("Set log level for org.berndpruenster.netlayer classes to WARN");
+ Log.setCustomLogLevel(pattern, Level.WARN);
+ }
} else if (Utilities.isAltOrCtrlPressed(KeyCode.J, keyEvent)) {
WalletsManager walletsManager = injector.getInstance(WalletsManager.class);
if (walletsManager.areWalletsAvailable())
diff --git a/desktop/src/main/java/bisq/desktop/main/overlays/Overlay.java b/desktop/src/main/java/bisq/desktop/main/overlays/Overlay.java
index 1b7fcd35f66..84167bd35f0 100644
--- a/desktop/src/main/java/bisq/desktop/main/overlays/Overlay.java
+++ b/desktop/src/main/java/bisq/desktop/main/overlays/Overlay.java
@@ -193,21 +193,25 @@ protected void onShow() {
public void hide() {
if (gridPane != null) {
- animateHide(() -> {
- removeEffectFromBackground();
-
- if (stage != null)
- stage.hide();
- else
- log.warn("Stage is null");
-
- cleanup();
- onHidden();
- });
+ animateHide();
}
isDisplayed = false;
}
+ protected void animateHide() {
+ animateHide(() -> {
+ removeEffectFromBackground();
+
+ if (stage != null)
+ stage.hide();
+ else
+ log.warn("Stage is null");
+
+ cleanup();
+ onHidden();
+ });
+ }
+
protected void onHidden() {
}
diff --git a/desktop/src/main/java/bisq/desktop/main/overlays/editor/PeerInfoWithTagEditor.java b/desktop/src/main/java/bisq/desktop/main/overlays/editor/PeerInfoWithTagEditor.java
index e1f827c7c82..5afe3eeb3b0 100644
--- a/desktop/src/main/java/bisq/desktop/main/overlays/editor/PeerInfoWithTagEditor.java
+++ b/desktop/src/main/java/bisq/desktop/main/overlays/editor/PeerInfoWithTagEditor.java
@@ -154,17 +154,7 @@ protected void onShow() {
@Override
public void hide() {
- animateHide(() -> {
- removeEffectFromBackground();
-
- if (stage != null)
- stage.hide();
- else
- log.warn("Stage is null");
-
- cleanup();
- onHidden();
- });
+ animateHide();
}
@Override
diff --git a/desktop/src/main/java/bisq/desktop/main/overlays/notifications/Notification.java b/desktop/src/main/java/bisq/desktop/main/overlays/notifications/Notification.java
index afa085293ba..b5a3c1c849a 100644
--- a/desktop/src/main/java/bisq/desktop/main/overlays/notifications/Notification.java
+++ b/desktop/src/main/java/bisq/desktop/main/overlays/notifications/Notification.java
@@ -34,6 +34,7 @@
import javafx.scene.Camera;
import javafx.scene.PerspectiveCamera;
+import javafx.scene.input.MouseEvent;
import javafx.scene.transform.Rotate;
import javafx.geometry.Insets;
@@ -59,23 +60,18 @@ public Notification() {
public void onReadyForDisplay() {
super.display();
+
if (autoClose && autoCloseTimer == null)
autoCloseTimer = UserThread.runAfter(this::doClose, 6);
+
+ stage.addEventHandler(MouseEvent.MOUSE_PRESSED, (event) -> {
+ doClose();
+ });
}
@Override
public void hide() {
- animateHide(() -> {
- removeEffectFromBackground();
-
- if (stage != null)
- stage.hide();
- else
- log.warn("Stage is null");
-
- cleanup();
- onHidden();
- });
+ animateHide();
}
@Override
diff --git a/desktop/src/main/resources/logback.xml b/desktop/src/main/resources/logback.xml
index 487ecd4b00d..8812d310de9 100644
--- a/desktop/src/main/resources/logback.xml
+++ b/desktop/src/main/resources/logback.xml
@@ -2,7 +2,7 @@
- %highlight(%d{MMM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{15}: %msg %xEx%n)
+ %highlight(%d{MMM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{30}: %msg %xEx%n)
@@ -11,4 +11,7 @@
+
+
diff --git a/desktop/src/test/java/bisq/desktop/main/market/offerbook/OfferBookChartViewModelTest.java b/desktop/src/test/java/bisq/desktop/main/market/offerbook/OfferBookChartViewModelTest.java
index cec316e70fc..a13b1ce9464 100644
--- a/desktop/src/test/java/bisq/desktop/main/market/offerbook/OfferBookChartViewModelTest.java
+++ b/desktop/src/test/java/bisq/desktop/main/market/offerbook/OfferBookChartViewModelTest.java
@@ -38,10 +38,10 @@
import org.junit.Test;
import org.junit.runner.RunWith;
-import static bisq.core.locale.TradeCurrencyMakers.usd;
-import static bisq.core.user.PreferenceMakers.empty;
import static bisq.desktop.main.offer.offerbook.OfferBookListItemMaker.btcBuyItem;
import static bisq.desktop.main.offer.offerbook.OfferBookListItemMaker.btcSellItem;
+import static bisq.desktop.maker.PreferenceMakers.empty;
+import static bisq.desktop.maker.TradeCurrencyMakers.usd;
import static com.natpryce.makeiteasy.MakeItEasy.make;
import static com.natpryce.makeiteasy.MakeItEasy.with;
import static org.junit.Assert.assertEquals;
diff --git a/desktop/src/test/java/bisq/desktop/main/offer/createoffer/CreateOfferViewModelTest.java b/desktop/src/test/java/bisq/desktop/main/offer/createoffer/CreateOfferViewModelTest.java
index 2fa9694899f..8ee590cf89f 100644
--- a/desktop/src/test/java/bisq/desktop/main/offer/createoffer/CreateOfferViewModelTest.java
+++ b/desktop/src/test/java/bisq/desktop/main/offer/createoffer/CreateOfferViewModelTest.java
@@ -54,7 +54,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
-import static bisq.core.user.PreferenceMakers.empty;
+import static bisq.desktop.maker.PreferenceMakers.empty;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.mockito.ArgumentMatchers.any;
diff --git a/desktop/src/test/java/bisq/desktop/main/offer/offerbook/OfferBookListItemMaker.java b/desktop/src/test/java/bisq/desktop/main/offer/offerbook/OfferBookListItemMaker.java
index fc3a481e027..e6e7790a64d 100644
--- a/desktop/src/test/java/bisq/desktop/main/offer/offerbook/OfferBookListItemMaker.java
+++ b/desktop/src/test/java/bisq/desktop/main/offer/offerbook/OfferBookListItemMaker.java
@@ -17,7 +17,8 @@
package bisq.desktop.main.offer.offerbook;
-import bisq.core.offer.OfferMaker;
+import bisq.desktop.maker.OfferMaker;
+
import bisq.core.offer.OfferPayload;
import com.natpryce.makeiteasy.Instantiator;
@@ -25,7 +26,7 @@
import com.natpryce.makeiteasy.Maker;
import com.natpryce.makeiteasy.Property;
-import static bisq.core.offer.OfferMaker.btcUsdOffer;
+import static bisq.desktop.maker.OfferMaker.btcUsdOffer;
import static com.natpryce.makeiteasy.MakeItEasy.a;
import static com.natpryce.makeiteasy.MakeItEasy.make;
import static com.natpryce.makeiteasy.MakeItEasy.with;
diff --git a/desktop/src/test/java/bisq/desktop/main/offer/offerbook/OfferBookViewModelTest.java b/desktop/src/test/java/bisq/desktop/main/offer/offerbook/OfferBookViewModelTest.java
index d92f87c1fea..89c2b748a42 100644
--- a/desktop/src/test/java/bisq/desktop/main/offer/offerbook/OfferBookViewModelTest.java
+++ b/desktop/src/test/java/bisq/desktop/main/offer/offerbook/OfferBookViewModelTest.java
@@ -69,9 +69,9 @@
import org.junit.Test;
import org.junit.runner.RunWith;
-import static bisq.core.locale.TradeCurrencyMakers.usd;
-import static bisq.core.user.PreferenceMakers.empty;
import static bisq.desktop.main.offer.offerbook.OfferBookListItemMaker.*;
+import static bisq.desktop.maker.PreferenceMakers.empty;
+import static bisq.desktop.maker.TradeCurrencyMakers.usd;
import static com.natpryce.makeiteasy.MakeItEasy.make;
import static com.natpryce.makeiteasy.MakeItEasy.with;
import static org.junit.Assert.assertEquals;
diff --git a/desktop/src/test/java/bisq/desktop/main/settings/preferences/PreferencesViewModelTest.java b/desktop/src/test/java/bisq/desktop/main/settings/preferences/PreferencesViewModelTest.java
index 42b368b1456..515b88190f2 100644
--- a/desktop/src/test/java/bisq/desktop/main/settings/preferences/PreferencesViewModelTest.java
+++ b/desktop/src/test/java/bisq/desktop/main/settings/preferences/PreferencesViewModelTest.java
@@ -17,9 +17,10 @@
package bisq.desktop.main.settings.preferences;
+import bisq.desktop.maker.PreferenceMakers;
+
import bisq.core.arbitration.Arbitrator;
import bisq.core.arbitration.ArbitratorManager;
-import bisq.core.user.PreferenceMakers;
import bisq.core.user.Preferences;
import bisq.network.p2p.NodeAddress;
diff --git a/desktop/src/test/java/bisq/desktop/util/CurrencyListItemMakers.java b/desktop/src/test/java/bisq/desktop/maker/CurrencyListItemMakers.java
similarity index 82%
rename from desktop/src/test/java/bisq/desktop/util/CurrencyListItemMakers.java
rename to desktop/src/test/java/bisq/desktop/maker/CurrencyListItemMakers.java
index afcd83a0cc2..f85acc19bce 100644
--- a/desktop/src/test/java/bisq/desktop/util/CurrencyListItemMakers.java
+++ b/desktop/src/test/java/bisq/desktop/maker/CurrencyListItemMakers.java
@@ -15,7 +15,9 @@
* along with Bisq. If not, see .
*/
-package bisq.desktop.util;
+package bisq.desktop.maker;
+
+import bisq.desktop.util.CurrencyListItem;
import bisq.core.locale.TradeCurrency;
@@ -23,14 +25,14 @@
import com.natpryce.makeiteasy.Maker;
import com.natpryce.makeiteasy.Property;
-import static bisq.core.locale.TradeCurrencyMakers.bitcoin;
-import static bisq.core.locale.TradeCurrencyMakers.euro;
+import static bisq.desktop.maker.TradeCurrencyMakers.bitcoin;
+import static bisq.desktop.maker.TradeCurrencyMakers.euro;
import static com.natpryce.makeiteasy.MakeItEasy.a;
import static com.natpryce.makeiteasy.MakeItEasy.with;
public class CurrencyListItemMakers {
- public static final Property tradeCurrency = new Property<>();
+ public static final Property tradeCurrency = new Property<>();
public static final Property numberOfTrades = new Property<>();
public static final Instantiator CurrencyListItem = lookup ->
diff --git a/desktop/src/test/java/bisq/core/offer/OfferMaker.java b/desktop/src/test/java/bisq/desktop/maker/OfferMaker.java
similarity index 96%
rename from desktop/src/test/java/bisq/core/offer/OfferMaker.java
rename to desktop/src/test/java/bisq/desktop/maker/OfferMaker.java
index aa9d294c2e2..e620d1ba92b 100644
--- a/desktop/src/test/java/bisq/core/offer/OfferMaker.java
+++ b/desktop/src/test/java/bisq/desktop/maker/OfferMaker.java
@@ -15,7 +15,10 @@
* along with Bisq. If not, see .
*/
-package bisq.core.offer;
+package bisq.desktop.maker;
+
+import bisq.core.offer.Offer;
+import bisq.core.offer.OfferPayload;
import com.natpryce.makeiteasy.Instantiator;
import com.natpryce.makeiteasy.Maker;
diff --git a/desktop/src/test/java/bisq/core/user/PreferenceMakers.java b/desktop/src/test/java/bisq/desktop/maker/PreferenceMakers.java
similarity index 92%
rename from desktop/src/test/java/bisq/core/user/PreferenceMakers.java
rename to desktop/src/test/java/bisq/desktop/maker/PreferenceMakers.java
index cbaad42cb0a..22b33406450 100644
--- a/desktop/src/test/java/bisq/core/user/PreferenceMakers.java
+++ b/desktop/src/test/java/bisq/desktop/maker/PreferenceMakers.java
@@ -15,9 +15,10 @@
* along with Bisq. If not, see .
*/
-package bisq.core.user;
+package bisq.desktop.maker;
import bisq.core.app.BisqEnvironment;
+import bisq.core.user.Preferences;
import bisq.common.storage.Storage;
@@ -30,7 +31,7 @@
public class PreferenceMakers {
- public static final Property storage = new Property<>();
+ public static final Property storage = new Property<>();
public static final Property bisqEnvironment = new Property<>();
public static final Property btcNodesFromOptions = new Property<>();
public static final Property useTorFlagFromOptions = new Property<>();
diff --git a/desktop/src/test/java/bisq/core/monetary/PriceMaker.java b/desktop/src/test/java/bisq/desktop/maker/PriceMaker.java
similarity index 94%
rename from desktop/src/test/java/bisq/core/monetary/PriceMaker.java
rename to desktop/src/test/java/bisq/desktop/maker/PriceMaker.java
index 765282aaebc..e96f7c40d2b 100644
--- a/desktop/src/test/java/bisq/core/monetary/PriceMaker.java
+++ b/desktop/src/test/java/bisq/desktop/maker/PriceMaker.java
@@ -15,7 +15,10 @@
* along with Bisq. If not, see .
*/
-package bisq.core.monetary;
+package bisq.desktop.maker;
+
+import bisq.core.monetary.Altcoin;
+import bisq.core.monetary.Price;
import org.bitcoinj.utils.Fiat;
diff --git a/desktop/src/test/java/bisq/core/locale/TradeCurrencyMakers.java b/desktop/src/test/java/bisq/desktop/maker/TradeCurrencyMakers.java
similarity index 82%
rename from desktop/src/test/java/bisq/core/locale/TradeCurrencyMakers.java
rename to desktop/src/test/java/bisq/desktop/maker/TradeCurrencyMakers.java
index 425f148523a..cdd4d3cf4f0 100644
--- a/desktop/src/test/java/bisq/core/locale/TradeCurrencyMakers.java
+++ b/desktop/src/test/java/bisq/desktop/maker/TradeCurrencyMakers.java
@@ -15,7 +15,11 @@
* along with Bisq. If not, see .
*/
-package bisq.core.locale;
+package bisq.desktop.maker;
+
+import bisq.core.locale.CryptoCurrency;
+import bisq.core.locale.FiatCurrency;
+import bisq.core.locale.TradeCurrency;
import com.natpryce.makeiteasy.Instantiator;
import com.natpryce.makeiteasy.Property;
@@ -29,10 +33,10 @@ public class TradeCurrencyMakers {
public static final Property currencyCode = new Property<>();
public static final Property currencyName = new Property<>();
- public static final Instantiator CryptoCurrency = lookup ->
+ public static final Instantiator CryptoCurrency = lookup ->
new CryptoCurrency(lookup.valueOf(currencyCode, "BTC"), lookup.valueOf(currencyName, "Bitcoin"));
- public static final Instantiator FiatCurrency = lookup ->
+ public static final Instantiator FiatCurrency = lookup ->
new FiatCurrency(lookup.valueOf(currencyCode, "EUR"));
public static final CryptoCurrency bitcoin = make(a(CryptoCurrency));
diff --git a/desktop/src/test/java/bisq/core/monetary/VolumeMaker.java b/desktop/src/test/java/bisq/desktop/maker/VolumeMaker.java
similarity index 94%
rename from desktop/src/test/java/bisq/core/monetary/VolumeMaker.java
rename to desktop/src/test/java/bisq/desktop/maker/VolumeMaker.java
index 9ac73504c9e..d52d128b3a8 100644
--- a/desktop/src/test/java/bisq/core/monetary/VolumeMaker.java
+++ b/desktop/src/test/java/bisq/desktop/maker/VolumeMaker.java
@@ -15,7 +15,10 @@
* along with Bisq. If not, see .
*/
-package bisq.core.monetary;
+package bisq.desktop.maker;
+
+import bisq.core.monetary.Altcoin;
+import bisq.core.monetary.Volume;
import org.bitcoinj.utils.Fiat;
diff --git a/desktop/src/test/java/bisq/desktop/util/BSFormatterTest.java b/desktop/src/test/java/bisq/desktop/util/BSFormatterTest.java
index 292435e4eb8..d9bbf5b9dd9 100644
--- a/desktop/src/test/java/bisq/desktop/util/BSFormatterTest.java
+++ b/desktop/src/test/java/bisq/desktop/util/BSFormatterTest.java
@@ -37,11 +37,11 @@
import org.junit.Test;
import org.junit.runner.RunWith;
-import static bisq.core.monetary.PriceMaker.priceString;
-import static bisq.core.monetary.PriceMaker.usdPrice;
-import static bisq.core.monetary.VolumeMaker.usdVolume;
-import static bisq.core.monetary.VolumeMaker.volumeString;
-import static bisq.core.offer.OfferMaker.btcUsdOffer;
+import static bisq.desktop.maker.OfferMaker.btcUsdOffer;
+import static bisq.desktop.maker.PriceMaker.priceString;
+import static bisq.desktop.maker.PriceMaker.usdPrice;
+import static bisq.desktop.maker.VolumeMaker.usdVolume;
+import static bisq.desktop.maker.VolumeMaker.volumeString;
import static com.natpryce.makeiteasy.MakeItEasy.a;
import static com.natpryce.makeiteasy.MakeItEasy.make;
import static com.natpryce.makeiteasy.MakeItEasy.with;
diff --git a/desktop/src/test/java/bisq/desktop/util/GUIUtilTest.java b/desktop/src/test/java/bisq/desktop/util/GUIUtilTest.java
index 0525023158d..b7073cb791a 100644
--- a/desktop/src/test/java/bisq/desktop/util/GUIUtilTest.java
+++ b/desktop/src/test/java/bisq/desktop/util/GUIUtilTest.java
@@ -30,12 +30,12 @@
import org.junit.Before;
import org.junit.Test;
-import static bisq.core.locale.TradeCurrencyMakers.bitcoin;
-import static bisq.core.locale.TradeCurrencyMakers.euro;
-import static bisq.core.user.PreferenceMakers.empty;
-import static bisq.desktop.util.CurrencyListItemMakers.bitcoinItem;
-import static bisq.desktop.util.CurrencyListItemMakers.euroItem;
-import static bisq.desktop.util.CurrencyListItemMakers.numberOfTrades;
+import static bisq.desktop.maker.CurrencyListItemMakers.bitcoinItem;
+import static bisq.desktop.maker.CurrencyListItemMakers.euroItem;
+import static bisq.desktop.maker.CurrencyListItemMakers.numberOfTrades;
+import static bisq.desktop.maker.PreferenceMakers.empty;
+import static bisq.desktop.maker.TradeCurrencyMakers.bitcoin;
+import static bisq.desktop.maker.TradeCurrencyMakers.euro;
import static com.natpryce.makeiteasy.MakeItEasy.make;
import static com.natpryce.makeiteasy.MakeItEasy.with;
import static org.junit.Assert.assertEquals;