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;