diff --git a/apitest/src/main/resources/logback.xml b/apitest/src/main/resources/logback.xml
index 9c5d0974bf..28279faa11 100644
--- a/apitest/src/main/resources/logback.xml
+++ b/apitest/src/main/resources/logback.xml
@@ -16,6 +16,5 @@
-
diff --git a/build.gradle b/build.gradle
index c1a0a38f23..d790d79a83 100644
--- a/build.gradle
+++ b/build.gradle
@@ -29,7 +29,6 @@ configure(subprojects) {
ext { // in alphabetical order
bcVersion = '1.63'
bitcoinjVersion = '2a80db4'
- btcdCli4jVersion = '27b94333'
codecVersion = '1.13'
easybindVersion = '1.0.3'
easyVersion = '4.0.1'
@@ -315,25 +314,9 @@ configure(project(':core')) {
exclude(module: 'commons-codec')
}
compile "com.google.guava:guava:$guavaVersion"
- compile("network.bisq.btcd-cli4j:btcd-cli4j-core:$btcdCli4jVersion") {
- exclude(module: 'guava')
- exclude(module: 'slf4j-api')
- exclude(module: 'httpclient')
- exclude(module: 'commons-lang3')
- exclude(module: 'jackson-core')
- exclude(module: 'jackson-annotations')
- exclude(module: 'jackson-databind')
+ compile("com.github.briandilley.jsonrpc4j:jsonrpc4j:$jsonrpc4jVersion") {
+ exclude(module: 'base64')
}
- compile("network.bisq.btcd-cli4j:btcd-cli4j-daemon:$btcdCli4jVersion") {
- exclude(module: 'guava')
- exclude(module: 'slf4j-api')
- exclude(module: 'httpclient')
- exclude(module: 'commons-lang3')
- exclude(module: 'jackson-core')
- exclude(module: 'jackson-annotations')
- exclude(module: 'jackson-databind')
- }
- compile "com.github.briandilley.jsonrpc4j:jsonrpc4j:$jsonrpc4jVersion"
compile "com.fasterxml.jackson.core:jackson-core:$jacksonVersion"
compile "com.fasterxml.jackson.core:jackson-annotations:$jacksonVersion"
compile("com.fasterxml.jackson.core:jackson-databind:$jacksonVersion") {
@@ -669,7 +652,7 @@ configure(project(':apitest')) {
"${result.skippedTestCount} skipped] html report contains skipped test info")
// Show report link if all tests passed in case you want to see more detail, stdout, skipped, etc.
- if(result.resultType == TestResult.ResultType.SUCCESS) {
+ if (result.resultType == TestResult.ResultType.SUCCESS) {
DirectoryReport htmlReport = getReports().getHtml()
String reportUrl = new org.gradle.internal.logging.ConsoleRenderer()
.asClickableFileUrl(htmlReport.getEntryPoint())
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 2bf8ac5f44..1bdd6b1ffb 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
@@ -20,6 +20,7 @@ package bisq.core.dao.node.full;
import bisq.core.dao.node.BsqNode;
import bisq.core.dao.node.explorer.ExportJsonFilesService;
import bisq.core.dao.node.full.network.FullNodeNetworkService;
+import bisq.core.dao.node.full.rpc.NotificationHandlerException;
import bisq.core.dao.node.parser.BlockParser;
import bisq.core.dao.node.parser.exceptions.BlockHashNotConnectingException;
import bisq.core.dao.node.parser.exceptions.BlockHeightNotConnectingException;
@@ -34,11 +35,10 @@ import bisq.network.p2p.network.ConnectionState;
import bisq.common.UserThread;
import bisq.common.handlers.ResultHandler;
-import com.neemre.btcdcli4j.core.http.HttpLayerException;
-import com.neemre.btcdcli4j.daemon.NotificationHandlerException;
-
import javax.inject.Inject;
+import java.net.ConnectException;
+
import java.util.function.Consumer;
import lombok.extern.slf4j.Slf4j;
@@ -64,15 +64,14 @@ public class FullNode extends BsqNode {
// Constructor
///////////////////////////////////////////////////////////////////////////////////////////
- @SuppressWarnings("WeakerAccess")
@Inject
- public FullNode(BlockParser blockParser,
- DaoStateService daoStateService,
- DaoStateSnapshotService daoStateSnapshotService,
- P2PService p2PService,
- RpcService rpcService,
- ExportJsonFilesService exportJsonFilesService,
- FullNodeNetworkService fullNodeNetworkService) {
+ private FullNode(BlockParser blockParser,
+ DaoStateService daoStateService,
+ DaoStateSnapshotService daoStateSnapshotService,
+ P2PService p2PService,
+ RpcService rpcService,
+ ExportJsonFilesService exportJsonFilesService,
+ FullNodeNetworkService fullNodeNetworkService) {
super(blockParser, daoStateService, daoStateSnapshotService, p2PService, exportJsonFilesService);
this.rpcService = rpcService;
@@ -150,7 +149,7 @@ public class FullNode extends BsqNode {
private void addBlockHandler() {
if (!addBlockHandlerAdded) {
addBlockHandlerAdded = true;
- rpcService.addNewBtcBlockHandler(rawBlock -> {
+ rpcService.addNewDtoBlockHandler(rawBlock -> {
try {
// We need to call that before parsing to have set the chain tip correctly for clients
// which might listen for new blocks on daoStateService. DaoStateListener.onNewBlockHeight
@@ -238,7 +237,7 @@ public class FullNode extends BsqNode {
Consumer newBlockHandler,
ResultHandler resultHandler,
Consumer errorHandler) {
- rpcService.requestBtcBlock(blockHeight,
+ rpcService.requestDtoBlock(blockHeight,
rawBlock -> {
try {
doParseBlock(rawBlock).ifPresent(newBlockHandler);
@@ -270,20 +269,18 @@ public class FullNode extends BsqNode {
if (throwable instanceof RpcException) {
Throwable cause = throwable.getCause();
if (cause != null) {
- if (cause instanceof HttpLayerException) {
- if (((HttpLayerException) cause).getCode() == 1004004) {
- if (warnMessageHandler != null)
- warnMessageHandler.accept("You have configured Bisq to run as DAO full node but there is no " +
- "localhost Bitcoin Core node detected. You need to have Bitcoin Core started and synced before " +
- "starting Bisq. Please restart Bisq with proper DAO full node setup or switch to lite node mode.");
- return;
- }
+ if (cause instanceof ConnectException) {
+ if (warnMessageHandler != null)
+ warnMessageHandler.accept("You have configured Bisq to run as DAO full node but there is no " +
+ "localhost Bitcoin Core node detected. You need to have Bitcoin Core started and synced before " +
+ "starting Bisq. Please restart Bisq with proper DAO full node setup or switch to lite node mode.");
+ return;
} else if (cause instanceof NotificationHandlerException) {
- // Maybe we need to react specifically to errors as in NotificationHandlerException.getError()
- // So far only IO_UNKNOWN was observed
- log.error("Error type of NotificationHandlerException: " + ((NotificationHandlerException) cause).getError().toString());
+ log.error("Error from within block notification daemon: {}", cause.getCause().toString());
startReOrgFromLastSnapshot();
return;
+ } else if (cause instanceof Error) {
+ throw (Error) cause;
}
}
}
diff --git a/core/src/main/java/bisq/core/dao/node/full/RpcService.java b/core/src/main/java/bisq/core/dao/node/full/RpcService.java
index 6ff0f41f38..24794063bd 100644
--- a/core/src/main/java/bisq/core/dao/node/full/RpcService.java
+++ b/core/src/main/java/bisq/core/dao/node/full/RpcService.java
@@ -17,7 +17,11 @@
package bisq.core.dao.node.full;
+import bisq.core.dao.node.full.rpc.BitcoindClient;
+import bisq.core.dao.node.full.rpc.BitcoindDaemon;
+import bisq.core.dao.node.full.rpc.dto.RawTransaction;
import bisq.core.dao.state.model.blockchain.PubKeyScript;
+import bisq.core.dao.state.model.blockchain.ScriptType;
import bisq.core.dao.state.model.blockchain.TxInput;
import bisq.core.user.Preferences;
@@ -28,21 +32,6 @@ import bisq.common.util.Utilities;
import org.bitcoinj.core.Utils;
-import com.neemre.btcdcli4j.core.BitcoindException;
-import com.neemre.btcdcli4j.core.BtcdCli4jVersion;
-import com.neemre.btcdcli4j.core.CommunicationException;
-import com.neemre.btcdcli4j.core.client.BtcdClient;
-import com.neemre.btcdcli4j.core.client.BtcdClientImpl;
-import com.neemre.btcdcli4j.core.domain.RawTransaction;
-import com.neemre.btcdcli4j.core.domain.enums.ScriptTypes;
-import com.neemre.btcdcli4j.daemon.BtcdDaemon;
-import com.neemre.btcdcli4j.daemon.BtcdDaemonImpl;
-import com.neemre.btcdcli4j.daemon.event.BlockListener;
-
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
-
import com.google.inject.Inject;
import javax.inject.Named;
@@ -54,8 +43,9 @@ import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors;
+import java.math.BigDecimal;
+
import java.util.List;
-import java.util.Properties;
import java.util.function.Consumer;
import java.util.stream.Collectors;
@@ -77,8 +67,8 @@ public class RpcService {
private final int rpcBlockPort;
private final String rpcBlockHost;
- private BtcdClient client;
- private BtcdDaemon daemon;
+ private BitcoindClient client;
+ private BitcoindDaemon daemon;
// We could use multiple threads but then we need to support ordering of results in a queue
// Keep that for optimization after measuring performance differences
@@ -89,13 +79,12 @@ public class RpcService {
// Constructor
///////////////////////////////////////////////////////////////////////////////////////////
- @SuppressWarnings("WeakerAccess")
@Inject
- public RpcService(Preferences preferences,
- @Named(Config.RPC_HOST) String rpcHost,
- @Named(Config.RPC_PORT) int rpcPort,
- @Named(Config.RPC_BLOCK_NOTIFICATION_PORT) int rpcBlockPort,
- @Named(Config.RPC_BLOCK_NOTIFICATION_HOST) String rpcBlockHost) {
+ private RpcService(Preferences preferences,
+ @Named(Config.RPC_HOST) String rpcHost,
+ @Named(Config.RPC_PORT) int rpcPort,
+ @Named(Config.RPC_BLOCK_NOTIFICATION_PORT) int rpcBlockPort,
+ @Named(Config.RPC_BLOCK_NOTIFICATION_HOST) String rpcBlockHost) {
this.rpcUser = preferences.getRpcUser();
this.rpcPassword = preferences.getRpcPw();
@@ -127,53 +116,31 @@ public class RpcService {
log.info("daemon shut down");
}
- if (client != null) {
- client.close();
- log.info("client closed");
- }
-
executor.shutdown();
}
void setup(ResultHandler resultHandler, Consumer errorHandler) {
ListenableFuture future = executor.submit(() -> {
try {
- log.info("Starting RPCService with btcd-cli4j version {} on {}:{} with user {}, " +
- "listening for blocknotify on port {} from {}",
- BtcdCli4jVersion.VERSION, this.rpcHost, this.rpcPort, this.rpcUser, this.rpcBlockPort,
- this.rpcBlockHost);
+ log.info("Starting RpcService on {}:{} with user {}, listening for blocknotify on port {} from {}",
+ this.rpcHost, this.rpcPort, this.rpcUser, this.rpcBlockPort, this.rpcBlockHost);
long startTs = System.currentTimeMillis();
- PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
- CloseableHttpClient httpProvider = HttpClients.custom().setConnectionManager(cm).build();
- Properties nodeConfig = new Properties();
- nodeConfig.setProperty("node.bitcoind.rpc.protocol", "http");
- nodeConfig.setProperty("node.bitcoind.rpc.host", rpcHost);
- nodeConfig.setProperty("node.bitcoind.rpc.auth_scheme", "Basic");
- nodeConfig.setProperty("node.bitcoind.rpc.user", rpcUser);
- nodeConfig.setProperty("node.bitcoind.rpc.password", rpcPassword);
- nodeConfig.setProperty("node.bitcoind.rpc.port", Integer.toString(rpcPort));
- nodeConfig.setProperty("node.bitcoind.notification.block.port", Integer.toString(rpcBlockPort));
- nodeConfig.setProperty("node.bitcoind.notification.block.host", rpcBlockHost);
- nodeConfig.setProperty("node.bitcoind.notification.alert.port", Integer.toString(bisq.network.utils.Utils.findFreeSystemPort()));
- nodeConfig.setProperty("node.bitcoind.notification.wallet.port", Integer.toString(bisq.network.utils.Utils.findFreeSystemPort()));
- nodeConfig.setProperty("node.bitcoind.http.auth_scheme", "Basic");
- BtcdClientImpl client = new BtcdClientImpl(httpProvider, nodeConfig);
- daemon = new BtcdDaemonImpl(client, throwable -> {
+ client = BitcoindClient.builder()
+ .rpcHost(rpcHost)
+ .rpcPort(rpcPort)
+ .rpcUser(rpcUser)
+ .rpcPassword(rpcPassword)
+ .build();
+ daemon = new BitcoindDaemon(rpcBlockHost, rpcBlockPort, throwable -> {
log.error(throwable.toString());
throwable.printStackTrace();
UserThread.execute(() -> errorHandler.accept(new RpcException(throwable)));
});
+ // TODO: Client should ping or request network info from bitcoind to make sure it is up.
+
log.info("Setup took {} ms", System.currentTimeMillis() - startTs);
- this.client = client;
- } catch (BitcoindException | CommunicationException e) {
- if (e instanceof CommunicationException)
- log.error("Probably Bitcoin Core is not running or the rpc port is not set correctly. rpcPort=" + rpcPort);
- log.error(e.toString());
- e.printStackTrace();
- log.error(e.getCause() != null ? e.getCause().toString() : "e.getCause()=null");
- throw new RpcException(e.getMessage(), e);
} catch (Throwable e) {
log.error(e.toString());
e.printStackTrace();
@@ -193,31 +160,23 @@ public class RpcService {
}, MoreExecutors.directExecutor());
}
- void addNewBtcBlockHandler(Consumer btcBlockHandler,
+ void addNewDtoBlockHandler(Consumer dtoBlockHandler,
Consumer errorHandler) {
- daemon.addBlockListener(new BlockListener() {
- @Override
- public void blockDetected(com.neemre.btcdcli4j.core.domain.RawBlock rawBtcBlock) {
- if (rawBtcBlock.getHeight() == null || rawBtcBlock.getHeight() == 0) {
- log.warn("We received a RawBlock with no data. blockHash={}", rawBtcBlock.getHash());
- return;
- }
+ daemon.setBlockListener(blockHash -> {
+ try {
+ var rawDtoBlock = client.getBlock(blockHash, 2);
+ log.info("New block received: height={}, id={}", rawDtoBlock.getHeight(), rawDtoBlock.getHash());
- try {
- log.info("New block received: height={}, id={}", rawBtcBlock.getHeight(), rawBtcBlock.getHash());
- List txList = rawBtcBlock.getTx().stream()
- .map(e -> getTxFromRawTransaction(e, rawBtcBlock))
- .collect(Collectors.toList());
- UserThread.execute(() -> {
- btcBlockHandler.accept(new RawBlock(rawBtcBlock.getHeight(),
- rawBtcBlock.getTime() * 1000, // rawBtcBlock.getTime() is in sec but we want ms
- rawBtcBlock.getHash(),
- rawBtcBlock.getPreviousBlockHash(),
- ImmutableList.copyOf(txList)));
- });
- } catch (Throwable t) {
- errorHandler.accept(t);
- }
+ List txList = rawDtoBlock.getTx().stream()
+ .map(e -> getTxFromRawTransaction(e, rawDtoBlock))
+ .collect(Collectors.toList());
+ UserThread.execute(() -> dtoBlockHandler.accept(new RawBlock(rawDtoBlock.getHeight(),
+ rawDtoBlock.getTime() * 1000, // rawDtoBlock.getTime() is in sec but we want ms
+ rawDtoBlock.getHash(),
+ rawDtoBlock.getPreviousBlockHash(),
+ ImmutableList.copyOf(txList))));
+ } catch (Throwable t) {
+ errorHandler.accept(t);
}
});
}
@@ -235,22 +194,22 @@ public class RpcService {
}, MoreExecutors.directExecutor());
}
- void requestBtcBlock(int blockHeight,
+ void requestDtoBlock(int blockHeight,
Consumer resultHandler,
Consumer errorHandler) {
ListenableFuture future = executor.submit(() -> {
long startTs = System.currentTimeMillis();
String blockHash = client.getBlockHash(blockHeight);
- com.neemre.btcdcli4j.core.domain.RawBlock rawBtcBlock = client.getBlock(blockHash, 2);
- List txList = rawBtcBlock.getTx().stream()
- .map(e -> getTxFromRawTransaction(e, rawBtcBlock))
+ var rawDtoBlock = client.getBlock(blockHash, 2);
+ List txList = rawDtoBlock.getTx().stream()
+ .map(e -> getTxFromRawTransaction(e, rawDtoBlock))
.collect(Collectors.toList());
- log.info("requestBtcBlock from bitcoind at blockHeight {} with {} txs took {} ms",
+ log.info("requestDtoBlock from bitcoind at blockHeight {} with {} txs took {} ms",
blockHeight, txList.size(), System.currentTimeMillis() - startTs);
- return new RawBlock(rawBtcBlock.getHeight(),
- rawBtcBlock.getTime() * 1000, // rawBtcBlock.getTime() is in sec but we want ms
- rawBtcBlock.getHash(),
- rawBtcBlock.getPreviousBlockHash(),
+ return new RawBlock(rawDtoBlock.getHeight(),
+ rawDtoBlock.getTime() * 1000, // rawDtoBlock.getTime() is in sec but we want ms
+ rawDtoBlock.getHash(),
+ rawDtoBlock.getPreviousBlockHash(),
ImmutableList.copyOf(txList));
});
@@ -262,7 +221,7 @@ public class RpcService {
@Override
public void onFailure(@NotNull Throwable throwable) {
- log.error("Error at requestBtcBlock: blockHeight={}", blockHeight);
+ log.error("Error at requestDtoBlock: blockHeight={}", blockHeight);
UserThread.execute(() -> errorHandler.accept(throwable));
}
}, MoreExecutors.directExecutor());
@@ -273,13 +232,13 @@ public class RpcService {
// Private
///////////////////////////////////////////////////////////////////////////////////////////
- private RawTx getTxFromRawTransaction(RawTransaction rawBtcTx,
- com.neemre.btcdcli4j.core.domain.RawBlock rawBtcBlock) {
- String txId = rawBtcTx.getTxId();
- long blockTime = rawBtcBlock.getTime() * 1000; // We convert block time from sec to ms
- int blockHeight = rawBtcBlock.getHeight();
- String blockHash = rawBtcBlock.getHash();
- final List txInputs = rawBtcTx.getVIn()
+ private RawTx getTxFromRawTransaction(RawTransaction rawDtoTx,
+ bisq.core.dao.node.full.rpc.dto.RawBlock rawDtoBlock) {
+ String txId = rawDtoTx.getTxId();
+ long blockTime = rawDtoBlock.getTime() * 1000; // We convert block time from sec to ms
+ int blockHeight = rawDtoBlock.getHeight();
+ String blockHash = rawDtoBlock.getHash();
+ final List txInputs = rawDtoTx.getVIn()
.stream()
.filter(rawInput -> rawInput != null && rawInput.getVOut() != null && rawInput.getTxId() != null)
.map(rawInput -> {
@@ -295,19 +254,19 @@ public class RpcService {
pubKeyAsHex = null;
log.debug("pubKeyAsHex is not set as we received a not supported sigScript " +
"(segWit or payToPubKey tx). txId={}, asm={}",
- rawBtcTx.getTxId(), rawInput.getScriptSig().getAsm());
+ rawDtoTx.getTxId(), rawInput.getScriptSig().getAsm());
}
return new TxInput(rawInput.getTxId(), rawInput.getVOut(), pubKeyAsHex);
})
.collect(Collectors.toList());
- final List txOutputs = rawBtcTx.getVOut()
+ final List txOutputs = rawDtoTx.getVOut()
.stream()
.filter(e -> e != null && e.getN() != null && e.getValue() != null && e.getScriptPubKey() != null)
- .map(rawBtcTxOutput -> {
+ .map(rawDtoTxOutput -> {
byte[] opReturnData = null;
- com.neemre.btcdcli4j.core.domain.PubKeyScript scriptPubKey = rawBtcTxOutput.getScriptPubKey();
- if (ScriptTypes.NULL_DATA.equals(scriptPubKey.getType()) && scriptPubKey.getAsm() != null) {
+ bisq.core.dao.node.full.rpc.dto.PubKeyScript scriptPubKey = rawDtoTxOutput.getScriptPubKey();
+ if (ScriptType.NULL_DATA.equals(scriptPubKey.getType()) && scriptPubKey.getAsm() != null) {
String[] chunks = scriptPubKey.getAsm().split(" ");
// We get on testnet a lot of "OP_RETURN 0" data, so we filter those away
if (chunks.length == 2 && "OP_RETURN".equals(chunks[0]) && !"0".equals(chunks[1])) {
@@ -327,9 +286,9 @@ public class RpcService {
String address = scriptPubKey.getAddresses() != null &&
scriptPubKey.getAddresses().size() == 1 ? scriptPubKey.getAddresses().get(0) : null;
PubKeyScript pubKeyScript = new PubKeyScript(scriptPubKey);
- return new RawTxOutput(rawBtcTxOutput.getN(),
- rawBtcTxOutput.getValue().movePointRight(8).longValue(),
- rawBtcTx.getTxId(),
+ return new RawTxOutput(rawDtoTxOutput.getN(),
+ BigDecimal.valueOf(rawDtoTxOutput.getValue()).movePointRight(8).longValueExact(),
+ rawDtoTx.getTxId(),
pubKeyScript,
address,
opReturnData,
diff --git a/core/src/main/java/bisq/core/dao/state/model/blockchain/PubKeyScript.java b/core/src/main/java/bisq/core/dao/state/model/blockchain/PubKeyScript.java
index a3b6750ff1..c94a9c847c 100644
--- a/core/src/main/java/bisq/core/dao/state/model/blockchain/PubKeyScript.java
+++ b/core/src/main/java/bisq/core/dao/state/model/blockchain/PubKeyScript.java
@@ -43,9 +43,9 @@ public class PubKeyScript implements PersistablePayload, ImmutableDaoStateModel
private final String asm;
private final String hex;
- public PubKeyScript(com.neemre.btcdcli4j.core.domain.PubKeyScript scriptPubKey) {
+ public PubKeyScript(bisq.core.dao.node.full.rpc.dto.PubKeyScript scriptPubKey) {
this(scriptPubKey.getReqSigs() != null ? scriptPubKey.getReqSigs() : 0,
- ScriptType.forName(scriptPubKey.getType().getName()),
+ scriptPubKey.getType(),
scriptPubKey.getAddresses() != null ? ImmutableList.copyOf(scriptPubKey.getAddresses()) : null,
scriptPubKey.getAsm(),
scriptPubKey.getHex());
diff --git a/daemon/src/main/resources/logback.xml b/daemon/src/main/resources/logback.xml
index ac5e6444ea..bc8edf0221 100644
--- a/daemon/src/main/resources/logback.xml
+++ b/daemon/src/main/resources/logback.xml
@@ -10,7 +10,6 @@
-
diff --git a/desktop/src/main/resources/logback.xml b/desktop/src/main/resources/logback.xml
index 6b05588a4f..c21adbf325 100644
--- a/desktop/src/main/resources/logback.xml
+++ b/desktop/src/main/resources/logback.xml
@@ -10,7 +10,4 @@
-
-
-
diff --git a/gradle/witness/gradle-witness.gradle b/gradle/witness/gradle-witness.gradle
index 9ab1e2d7ce..536615a5d7 100644
--- a/gradle/witness/gradle-witness.gradle
+++ b/gradle/witness/gradle-witness.gradle
@@ -24,6 +24,7 @@ dependencyVerification {
'com.github.bisq-network.netlayer:tor.native:b15aba7fe987185037791c7ec7c529cb001b90d723d047d54aab87aceb3b3d45',
'com.github.bisq-network.netlayer:tor:a974190aa3a031067ccd1dda28a3ae58cad14060792299d86ea38a05fb21afc5',
'com.github.bisq-network:bitcoinj:65ed08fa5777ea4a08599bdd575e7dc1f4ba2d4d5835472551439d6f6252e68a',
+ 'com.github.briandilley.jsonrpc4j:jsonrpc4j:c9078f037b3b5f45a30a4296f10e4a8de29aa6ace54607fe68e3693b5feeb314',
'com.github.cd2357.tor-binary:tor-binary-geoip:ae27b6aca1a3a50a046eb11e38202b6d21c2fcd2b8643bbeb5ea85e065fbc1be',
'com.github.cd2357.tor-binary:tor-binary-linux32:7b5d6770aa442ef6d235e8a9bfbaa7c62560690f9fe69ff03c7a752eae84f7dc',
'com.github.cd2357.tor-binary:tor-binary-linux64:24111fa35027599a750b0176392dc1e9417d919414396d1b221ac2e707eaba76',
@@ -68,8 +69,6 @@ dependencyVerification {
'net.glxn:qrgen:c85d9d8512d91e8ad11fe56259a7825bd50ce0245447e236cf168d1b17591882',
'net.jcip:jcip-annotations:be5805392060c71474bf6c9a67a099471274d30b83eef84bfc4e0889a4f1dcc0',
'net.sf.jopt-simple:jopt-simple:df26cc58f235f477db07f753ba5a3ab243ebe5789d9f89ecf68dd62ea9a66c28',
- 'network.bisq.btcd-cli4j:btcd-cli4j-core:4634b39de93764c4609e295e254e8c3b1427ba24febf43352f4f315029c5b1b3',
- 'network.bisq.btcd-cli4j:btcd-cli4j-daemon:fa3580d2f309e220b9c4f67d0437461fa10cfec75f4468a038b58bdbc36caaee',
'org.apache.commons:commons-compress:5f2df1e467825e4cac5996d44890c4201c000b43c0b23cffc0782d28a0beb9b0',
'org.apache.commons:commons-lang3:9375aad1000cdd5bd3068e832de9802094fac1f145655251e141d5d0072fab9a',
'org.apache.httpcomponents:httpclient:bc5f065aba5dd815ee559dd24d9bcb797fb102ff9cfa036f5091ebc529bd3b93',
diff --git a/inventory/src/main/resources/logback.xml b/inventory/src/main/resources/logback.xml
index 6b05588a4f..c21adbf325 100644
--- a/inventory/src/main/resources/logback.xml
+++ b/inventory/src/main/resources/logback.xml
@@ -10,7 +10,4 @@
-
-
-
diff --git a/seednode/src/main/resources/logback.xml b/seednode/src/main/resources/logback.xml
index 47fdc20cfa..914b9d3d4b 100644
--- a/seednode/src/main/resources/logback.xml
+++ b/seednode/src/main/resources/logback.xml
@@ -10,8 +10,6 @@
-
-
diff --git a/statsnode/src/main/resources/logback.xml b/statsnode/src/main/resources/logback.xml
index 4a14ad263d..914b9d3d4b 100644
--- a/statsnode/src/main/resources/logback.xml
+++ b/statsnode/src/main/resources/logback.xml
@@ -11,6 +11,5 @@
-