forked from Qortal/qortal
Merge pull request #197 from AlphaX-Projects/master
Bug fixes and additions
This commit is contained in:
commit
c1da495dd1
BIN
lib/org/ciyam/AT/1.4.2/AT-1.4.2.jar
Normal file
BIN
lib/org/ciyam/AT/1.4.2/AT-1.4.2.jar
Normal file
Binary file not shown.
123
lib/org/ciyam/AT/1.4.2/AT-1.4.2.pom
Normal file
123
lib/org/ciyam/AT/1.4.2/AT-1.4.2.pom
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>org.ciyam</groupId>
|
||||||
|
<artifactId>AT</artifactId>
|
||||||
|
<version>1.4.2</version>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<skipTests>false</skipTests>
|
||||||
|
<bouncycastle.version>1.70</bouncycastle.version>
|
||||||
|
<junit.version>4.13.2</junit.version>
|
||||||
|
<maven-compiler-plugin.version>3.13.0</maven-compiler-plugin.version>
|
||||||
|
<maven-source-plugin.version>3.3.0</maven-source-plugin.version>
|
||||||
|
<maven-javadoc-plugin.version>3.6.3</maven-javadoc-plugin.version>
|
||||||
|
<maven-surefire-plugin.version>3.2.5</maven-surefire-plugin.version>
|
||||||
|
<maven-jar-plugin.version>3.4.1</maven-jar-plugin.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<sourceDirectory>src/main/java</sourceDirectory>
|
||||||
|
<testSourceDirectory>src/test/java</testSourceDirectory>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>${maven-compiler-plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<source>11</source>
|
||||||
|
<target>11</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<version>${maven-surefire-plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<skipTests>${skipTests}</skipTests>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-source-plugin</artifactId>
|
||||||
|
<version>${maven-source-plugin.version}</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>attach-sources</id>
|
||||||
|
<goals>
|
||||||
|
<goal>jar</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
|
<version>${maven-javadoc-plugin.version}</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>attach-javadoc</id>
|
||||||
|
<goals>
|
||||||
|
<goal>jar</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-jar-plugin</artifactId>
|
||||||
|
<version>${maven-jar-plugin.version}</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<goals>
|
||||||
|
<goal>test-jar</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>${maven-compiler-plugin.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<version>${maven-surefire-plugin.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-source-plugin</artifactId>
|
||||||
|
<version>${maven-source-plugin.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
|
<version>${maven-javadoc-plugin.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-jar-plugin</artifactId>
|
||||||
|
<version>${maven-jar-plugin.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.bouncycastle</groupId>
|
||||||
|
<artifactId>bcprov-jdk15on</artifactId>
|
||||||
|
<version>${bouncycastle.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>${junit.version}</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</project>
|
@ -3,13 +3,14 @@
|
|||||||
<groupId>org.ciyam</groupId>
|
<groupId>org.ciyam</groupId>
|
||||||
<artifactId>AT</artifactId>
|
<artifactId>AT</artifactId>
|
||||||
<versioning>
|
<versioning>
|
||||||
<release>1.4.1</release>
|
<release>1.4.2</release>
|
||||||
<versions>
|
<versions>
|
||||||
<version>1.3.7</version>
|
<version>1.3.7</version>
|
||||||
<version>1.3.8</version>
|
<version>1.3.8</version>
|
||||||
<version>1.4.0</version>
|
<version>1.4.0</version>
|
||||||
<version>1.4.1</version>
|
<version>1.4.1</version>
|
||||||
|
<version>1.4.2</version>
|
||||||
</versions>
|
</versions>
|
||||||
<lastUpdated>20231212092227</lastUpdated>
|
<lastUpdated>20240426084210</lastUpdated>
|
||||||
</versioning>
|
</versioning>
|
||||||
</metadata>
|
</metadata>
|
||||||
|
37
pom.xml
37
pom.xml
@ -6,55 +6,56 @@
|
|||||||
<version>4.5.1</version>
|
<version>4.5.1</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
<properties>
|
<properties>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<skipTests>true</skipTests>
|
<skipTests>true</skipTests>
|
||||||
|
|
||||||
<altcoinj.version>7dc8c6f</altcoinj.version>
|
<altcoinj.version>7dc8c6f</altcoinj.version>
|
||||||
<bitcoinj.version>0.15.10</bitcoinj.version>
|
<bitcoinj.version>0.15.10</bitcoinj.version>
|
||||||
<bouncycastle.version>1.69</bouncycastle.version>
|
<bouncycastle.version>1.70</bouncycastle.version>
|
||||||
<build.timestamp>${maven.build.timestamp}</build.timestamp>
|
<build.timestamp>${maven.build.timestamp}</build.timestamp>
|
||||||
<ciyam-at.version>1.4.1</ciyam-at.version>
|
<ciyam-at.version>1.4.2</ciyam-at.version>
|
||||||
<commons-net.version>3.8.0</commons-net.version>
|
<commons-net.version>3.8.0</commons-net.version>
|
||||||
<commons-text.version>1.11.0</commons-text.version>
|
<commons-text.version>1.12.0</commons-text.version>
|
||||||
<commons-io.version>2.15.1</commons-io.version>
|
<commons-io.version>2.16.1</commons-io.version>
|
||||||
<commons-compress.version>1.26.1</commons-compress.version>
|
<commons-compress.version>1.26.2</commons-compress.version>
|
||||||
<commons-lang3.version>3.14.0</commons-lang3.version>
|
<commons-lang3.version>3.14.0</commons-lang3.version>
|
||||||
<dagger.version>1.2.2</dagger.version>
|
<dagger.version>1.2.2</dagger.version>
|
||||||
<extendedset.version>0.12.3</extendedset.version>
|
<extendedset.version>0.12.3</extendedset.version>
|
||||||
<git-commit-id-plugin.version>4.9.10</git-commit-id-plugin.version>
|
<git-commit-id-plugin.version>4.9.10</git-commit-id-plugin.version>
|
||||||
<grpc.version>1.62.2</grpc.version>
|
<grpc.version>1.65.0</grpc.version>
|
||||||
<guava.version>33.0.0-jre</guava.version>
|
<guava.version>33.2.1-jre</guava.version>
|
||||||
<hamcrest-library.version>2.2</hamcrest-library.version>
|
<hamcrest-library.version>2.2</hamcrest-library.version>
|
||||||
<homoglyph.version>1.2.1</homoglyph.version>
|
<homoglyph.version>1.2.1</homoglyph.version>
|
||||||
<hsqldb.version>2.5.1</hsqldb.version>
|
<hsqldb.version>2.5.1</hsqldb.version>
|
||||||
<icu4j.version>74.2</icu4j.version>
|
<icu4j.version>75.1</icu4j.version>
|
||||||
<java-diff-utils.version>4.12</java-diff-utils.version>
|
<java-diff-utils.version>4.12</java-diff-utils.version>
|
||||||
<javax.servlet-api.version>4.0.1</javax.servlet-api.version>
|
<javax.servlet-api.version>4.0.1</javax.servlet-api.version>
|
||||||
<jaxb-runtime.version>2.3.9</jaxb-runtime.version>
|
<jaxb-runtime.version>2.3.9</jaxb-runtime.version>
|
||||||
<jersey.version>2.41</jersey.version>
|
<jersey.version>2.42</jersey.version>
|
||||||
<jetty.version>9.4.54.v20240208</jetty.version>
|
<jetty.version>9.4.54.v20240208</jetty.version>
|
||||||
<json-simple.version>1.1.1</json-simple.version>
|
<json-simple.version>1.1.1</json-simple.version>
|
||||||
<json.version>20240303</json.version>
|
<json.version>20240303</json.version>
|
||||||
<jsoup.version>1.17.2</jsoup.version>
|
<jsoup.version>1.17.2</jsoup.version>
|
||||||
<junit-jupiter-engine.version>5.10.0</junit-jupiter-engine.version>
|
<junit-jupiter-engine.version>5.11.0-M2</junit-jupiter-engine.version>
|
||||||
<lifecycle-mapping.version>1.0.0</lifecycle-mapping.version>
|
<lifecycle-mapping.version>1.0.0</lifecycle-mapping.version>
|
||||||
<log4j.version>2.23.0</log4j.version>
|
<log4j.version>2.23.1</log4j.version>
|
||||||
<mail.version>1.5.0-b01</mail.version>
|
<mail.version>1.5.0-b01</mail.version>
|
||||||
<maven-build-helper-plugin.version>3.5.0</maven-build-helper-plugin.version>
|
<maven-build-helper-plugin.version>3.6.0</maven-build-helper-plugin.version>
|
||||||
<maven-compiler-plugin.version>3.12.1</maven-compiler-plugin.version>
|
<maven-compiler-plugin.version>3.13.0</maven-compiler-plugin.version>
|
||||||
<maven-dependency-plugin.version>3.6.1</maven-dependency-plugin.version>
|
<maven-dependency-plugin.version>3.6.1</maven-dependency-plugin.version>
|
||||||
<maven-jar-plugin.version>3.3.0</maven-jar-plugin.version>
|
<maven-jar-plugin.version>3.4.2</maven-jar-plugin.version>
|
||||||
<maven-package-info-plugin.version>1.1.0</maven-package-info-plugin.version>
|
<maven-package-info-plugin.version>1.1.0</maven-package-info-plugin.version>
|
||||||
<maven-plugin.version>2.16.2</maven-plugin.version>
|
<maven-plugin.version>2.16.2</maven-plugin.version>
|
||||||
<maven-reproducible-build-plugin.version>0.16</maven-reproducible-build-plugin.version>
|
<maven-reproducible-build-plugin.version>0.16</maven-reproducible-build-plugin.version>
|
||||||
<maven-resources-plugin.version>3.3.1</maven-resources-plugin.version>
|
<maven-resources-plugin.version>3.3.1</maven-resources-plugin.version>
|
||||||
<maven-shade-plugin.version>3.5.2</maven-shade-plugin.version>
|
<maven-shade-plugin.version>3.6.0</maven-shade-plugin.version>
|
||||||
<maven-surefire-plugin.version>3.2.5</maven-surefire-plugin.version>
|
<maven-surefire-plugin.version>3.3.0</maven-surefire-plugin.version>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
|
||||||
<protobuf.version>3.25.3</protobuf.version>
|
<protobuf.version>3.25.3</protobuf.version>
|
||||||
<replacer.version>1.5.3</replacer.version>
|
<replacer.version>1.5.3</replacer.version>
|
||||||
<simplemagic.version>1.17</simplemagic.version>
|
<simplemagic.version>1.17</simplemagic.version>
|
||||||
<slf4j.version>1.7.36</slf4j.version>
|
<slf4j.version>1.7.36</slf4j.version>
|
||||||
<swagger-api.version>2.0.10</swagger-api.version>
|
<swagger-api.version>2.0.10</swagger-api.version>
|
||||||
<swagger-ui.version>5.11.8</swagger-ui.version>
|
<swagger-ui.version>5.17.14</swagger-ui.version>
|
||||||
<upnp.version>1.2</upnp.version>
|
<upnp.version>1.2</upnp.version>
|
||||||
<xz.version>1.9</xz.version>
|
<xz.version>1.9</xz.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
@ -5290,7 +5290,7 @@ public final class Service {
|
|||||||
if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(vendor_)) {
|
if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(vendor_)) {
|
||||||
com.google.protobuf.GeneratedMessageV3.writeString(output, 2, vendor_);
|
com.google.protobuf.GeneratedMessageV3.writeString(output, 2, vendor_);
|
||||||
}
|
}
|
||||||
if (taddrSupport_ != false) {
|
if (taddrSupport_) {
|
||||||
output.writeBool(3, taddrSupport_);
|
output.writeBool(3, taddrSupport_);
|
||||||
}
|
}
|
||||||
if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(chainName_)) {
|
if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(chainName_)) {
|
||||||
@ -5341,7 +5341,7 @@ public final class Service {
|
|||||||
if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(vendor_)) {
|
if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(vendor_)) {
|
||||||
size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, vendor_);
|
size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, vendor_);
|
||||||
}
|
}
|
||||||
if (taddrSupport_ != false) {
|
if (taddrSupport_) {
|
||||||
size += com.google.protobuf.CodedOutputStream
|
size += com.google.protobuf.CodedOutputStream
|
||||||
.computeBoolSize(3, taddrSupport_);
|
.computeBoolSize(3, taddrSupport_);
|
||||||
}
|
}
|
||||||
@ -5729,7 +5729,7 @@ public final class Service {
|
|||||||
vendor_ = other.vendor_;
|
vendor_ = other.vendor_;
|
||||||
onChanged();
|
onChanged();
|
||||||
}
|
}
|
||||||
if (other.getTaddrSupport() != false) {
|
if (other.getTaddrSupport()) {
|
||||||
setTaddrSupport(other.getTaddrSupport());
|
setTaddrSupport(other.getTaddrSupport());
|
||||||
}
|
}
|
||||||
if (!other.getChainName().isEmpty()) {
|
if (!other.getChainName().isEmpty()) {
|
||||||
|
@ -340,7 +340,7 @@ public class SelfSponsorshipAlgoV1 {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
transactionDataList.removeIf(t -> t.getTimestamp() >= this.snapshotTimestamp);
|
transactionDataList.removeIf(t -> t.getTimestamp() >= this.snapshotTimestamp);
|
||||||
return transactionDataList.size() == 0;
|
return transactionDataList.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<TransactionData> fetchTransactions(Repository repository, List<TransactionType> txTypes, String address, boolean reverse) throws DataException {
|
private static List<TransactionData> fetchTransactions(Repository repository, List<TransactionType> txTypes, String address, boolean reverse) throws DataException {
|
||||||
|
@ -344,7 +344,7 @@ public class SelfSponsorshipAlgoV3 {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
transactionDataList.removeIf(t -> t.getTimestamp() <= this.snapshotTimestampV1 || t.getTimestamp() >= this.snapshotTimestampV3);
|
transactionDataList.removeIf(t -> t.getTimestamp() <= this.snapshotTimestampV1 || t.getTimestamp() >= this.snapshotTimestampV3);
|
||||||
return transactionDataList.size() == 0;
|
return transactionDataList.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<TransactionData> fetchTransactions(Repository repository, List<TransactionType> txTypes, String address, boolean reverse) throws DataException {
|
private static List<TransactionData> fetchTransactions(Repository repository, List<TransactionType> txTypes, String address, boolean reverse) throws DataException {
|
||||||
|
@ -141,7 +141,7 @@ public class ApiRequest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String resultString = result.toString();
|
String resultString = result.toString();
|
||||||
return resultString.length() > 0 ? resultString.substring(0, resultString.length() - 1) : resultString;
|
return !resultString.isEmpty() ? resultString.substring(0, resultString.length() - 1) : resultString;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -82,7 +82,7 @@ public class HTMLParser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isHtmlFile(String path) {
|
public static boolean isHtmlFile(String path) {
|
||||||
if (path.endsWith(".html") || path.endsWith(".htm") || path.equals("")) {
|
if (path.endsWith(".html") || path.endsWith(".htm") || path.isEmpty()) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -2,5 +2,5 @@ package org.qortal.api;
|
|||||||
|
|
||||||
public enum SearchMode {
|
public enum SearchMode {
|
||||||
LATEST,
|
LATEST,
|
||||||
ALL;
|
ALL
|
||||||
}
|
}
|
||||||
|
@ -41,7 +41,7 @@ public class GatewayResource {
|
|||||||
private ArbitraryResourceStatus getStatus(Service service, String name, String identifier, Boolean build) {
|
private ArbitraryResourceStatus getStatus(Service service, String name, String identifier, Boolean build) {
|
||||||
|
|
||||||
// If "build=true" has been specified in the query string, build the resource before returning its status
|
// If "build=true" has been specified in the query string, build the resource before returning its status
|
||||||
if (build != null && build == true) {
|
if (build != null && build) {
|
||||||
try {
|
try {
|
||||||
ArbitraryDataReader reader = new ArbitraryDataReader(name, ArbitraryDataFile.ResourceIdType.NAME, service, null);
|
ArbitraryDataReader reader = new ArbitraryDataReader(name, ArbitraryDataFile.ResourceIdType.NAME, service, null);
|
||||||
if (!reader.isBuilding()) {
|
if (!reader.isBuilding()) {
|
||||||
@ -80,7 +80,7 @@ public class GatewayResource {
|
|||||||
|
|
||||||
private HttpServletResponse parsePath(String inPath, String qdnContext, String secret58, boolean includeResourceIdInPrefix, boolean async) {
|
private HttpServletResponse parsePath(String inPath, String qdnContext, String secret58, boolean includeResourceIdInPrefix, boolean async) {
|
||||||
|
|
||||||
if (inPath == null || inPath.equals("")) {
|
if (inPath == null || inPath.isEmpty()) {
|
||||||
// Assume not a real file
|
// Assume not a real file
|
||||||
return ArbitraryDataRenderer.getResponse(response, 404, "Error 404: File Not Found");
|
return ArbitraryDataRenderer.getResponse(response, 404, "Error 404: File Not Found");
|
||||||
}
|
}
|
||||||
@ -140,7 +140,7 @@ public class GatewayResource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String prefix = StringUtils.join(prefixParts, "/");
|
String prefix = StringUtils.join(prefixParts, "/");
|
||||||
if (prefix != null && prefix.length() > 0) {
|
if (prefix != null && !prefix.isEmpty()) {
|
||||||
prefix = "/" + prefix;
|
prefix = "/" + prefix;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ public class ConnectedPeer {
|
|||||||
|
|
||||||
public enum Direction {
|
public enum Direction {
|
||||||
INBOUND,
|
INBOUND,
|
||||||
OUTBOUND;
|
OUTBOUND
|
||||||
}
|
}
|
||||||
|
|
||||||
public Direction direction;
|
public Direction direction;
|
||||||
|
@ -233,7 +233,6 @@ public class AddressesResource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} catch (DataException e) {
|
} catch (DataException e) {
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,7 +119,7 @@ public class ArbitraryResource {
|
|||||||
|
|
||||||
// Ensure that "default" and "identifier" parameters cannot coexist
|
// Ensure that "default" and "identifier" parameters cannot coexist
|
||||||
boolean defaultRes = Boolean.TRUE.equals(defaultResource);
|
boolean defaultRes = Boolean.TRUE.equals(defaultResource);
|
||||||
if (defaultRes == true && identifier != null) {
|
if (defaultRes && identifier != null) {
|
||||||
throw ApiExceptionFactory.INSTANCE.createCustomException(request, ApiError.INVALID_CRITERIA, "identifier cannot be specified when requesting a default resource");
|
throw ApiExceptionFactory.INSTANCE.createCustomException(request, ApiError.INVALID_CRITERIA, "identifier cannot be specified when requesting a default resource");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -491,7 +491,7 @@ public class ArbitraryResource {
|
|||||||
|
|
||||||
List<ArbitraryTransactionData> transactionDataList;
|
List<ArbitraryTransactionData> transactionDataList;
|
||||||
|
|
||||||
if (query == null || query.equals("")) {
|
if (query == null || query.isEmpty()) {
|
||||||
transactionDataList = ArbitraryDataStorageManager.getInstance().listAllHostedTransactions(repository, limit, offset);
|
transactionDataList = ArbitraryDataStorageManager.getInstance().listAllHostedTransactions(repository, limit, offset);
|
||||||
} else {
|
} else {
|
||||||
transactionDataList = ArbitraryDataStorageManager.getInstance().searchHostedTransactions(repository,query, limit, offset);
|
transactionDataList = ArbitraryDataStorageManager.getInstance().searchHostedTransactions(repository,query, limit, offset);
|
||||||
@ -1258,7 +1258,7 @@ public class ArbitraryResource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Finish here if user has requested a preview
|
// Finish here if user has requested a preview
|
||||||
if (preview != null && preview == true) {
|
if (preview != null && preview) {
|
||||||
return this.preview(path, service);
|
return this.preview(path, service);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,7 +86,7 @@ public class BlocksResource {
|
|||||||
// Check the database first
|
// Check the database first
|
||||||
BlockData blockData = repository.getBlockRepository().fromSignature(signature);
|
BlockData blockData = repository.getBlockRepository().fromSignature(signature);
|
||||||
if (blockData != null) {
|
if (blockData != null) {
|
||||||
if (includeOnlineSignatures == null || includeOnlineSignatures == false) {
|
if (includeOnlineSignatures == null || !includeOnlineSignatures) {
|
||||||
blockData.setOnlineAccountsSignatures(null);
|
blockData.setOnlineAccountsSignatures(null);
|
||||||
}
|
}
|
||||||
return blockData;
|
return blockData;
|
||||||
@ -95,7 +95,7 @@ public class BlocksResource {
|
|||||||
// Not found, so try the block archive
|
// Not found, so try the block archive
|
||||||
blockData = repository.getBlockArchiveRepository().fromSignature(signature);
|
blockData = repository.getBlockArchiveRepository().fromSignature(signature);
|
||||||
if (blockData != null) {
|
if (blockData != null) {
|
||||||
if (includeOnlineSignatures == null || includeOnlineSignatures == false) {
|
if (includeOnlineSignatures == null || !includeOnlineSignatures) {
|
||||||
blockData.setOnlineAccountsSignatures(null);
|
blockData.setOnlineAccountsSignatures(null);
|
||||||
}
|
}
|
||||||
return blockData;
|
return blockData;
|
||||||
@ -304,7 +304,7 @@ public class BlocksResource {
|
|||||||
try (final Repository repository = RepositoryManager.getRepository()) {
|
try (final Repository repository = RepositoryManager.getRepository()) {
|
||||||
BlockData blockData = repository.getBlockRepository().getLastBlock();
|
BlockData blockData = repository.getBlockRepository().getLastBlock();
|
||||||
|
|
||||||
if (includeOnlineSignatures == null || includeOnlineSignatures == false) {
|
if (includeOnlineSignatures == null || !includeOnlineSignatures) {
|
||||||
blockData.setOnlineAccountsSignatures(null);
|
blockData.setOnlineAccountsSignatures(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -474,7 +474,7 @@ public class BlocksResource {
|
|||||||
// Firstly check the database
|
// Firstly check the database
|
||||||
BlockData blockData = repository.getBlockRepository().fromHeight(height);
|
BlockData blockData = repository.getBlockRepository().fromHeight(height);
|
||||||
if (blockData != null) {
|
if (blockData != null) {
|
||||||
if (includeOnlineSignatures == null || includeOnlineSignatures == false) {
|
if (includeOnlineSignatures == null || !includeOnlineSignatures) {
|
||||||
blockData.setOnlineAccountsSignatures(null);
|
blockData.setOnlineAccountsSignatures(null);
|
||||||
}
|
}
|
||||||
return blockData;
|
return blockData;
|
||||||
@ -483,7 +483,7 @@ public class BlocksResource {
|
|||||||
// Not found, so try the archive
|
// Not found, so try the archive
|
||||||
blockData = repository.getBlockArchiveRepository().fromHeight(height);
|
blockData = repository.getBlockArchiveRepository().fromHeight(height);
|
||||||
if (blockData != null) {
|
if (blockData != null) {
|
||||||
if (includeOnlineSignatures == null || includeOnlineSignatures == false) {
|
if (includeOnlineSignatures == null || !includeOnlineSignatures) {
|
||||||
blockData.setOnlineAccountsSignatures(null);
|
blockData.setOnlineAccountsSignatures(null);
|
||||||
}
|
}
|
||||||
return blockData;
|
return blockData;
|
||||||
@ -596,7 +596,7 @@ public class BlocksResource {
|
|||||||
if (height > 1) {
|
if (height > 1) {
|
||||||
// Found match in Blocks table
|
// Found match in Blocks table
|
||||||
blockData = repository.getBlockRepository().fromHeight(height);
|
blockData = repository.getBlockRepository().fromHeight(height);
|
||||||
if (includeOnlineSignatures == null || includeOnlineSignatures == false) {
|
if (includeOnlineSignatures == null || !includeOnlineSignatures) {
|
||||||
blockData.setOnlineAccountsSignatures(null);
|
blockData.setOnlineAccountsSignatures(null);
|
||||||
}
|
}
|
||||||
return blockData;
|
return blockData;
|
||||||
@ -614,7 +614,7 @@ public class BlocksResource {
|
|||||||
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.BLOCK_UNKNOWN);
|
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.BLOCK_UNKNOWN);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (includeOnlineSignatures == null || includeOnlineSignatures == false) {
|
if (includeOnlineSignatures == null || !includeOnlineSignatures) {
|
||||||
blockData.setOnlineAccountsSignatures(null);
|
blockData.setOnlineAccountsSignatures(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -651,7 +651,7 @@ public class BlocksResource {
|
|||||||
@QueryParam("includeOnlineSignatures") Boolean includeOnlineSignatures) {
|
@QueryParam("includeOnlineSignatures") Boolean includeOnlineSignatures) {
|
||||||
try (final Repository repository = RepositoryManager.getRepository()) {
|
try (final Repository repository = RepositoryManager.getRepository()) {
|
||||||
List<BlockData> blocks = new ArrayList<>();
|
List<BlockData> blocks = new ArrayList<>();
|
||||||
boolean shouldReverse = (reverse != null && reverse == true);
|
boolean shouldReverse = (reverse != null && reverse);
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (i < count) {
|
while (i < count) {
|
||||||
@ -664,7 +664,7 @@ public class BlocksResource {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (includeOnlineSignatures == null || includeOnlineSignatures == false) {
|
if (includeOnlineSignatures == null || !includeOnlineSignatures) {
|
||||||
blockData.setOnlineAccountsSignatures(null);
|
blockData.setOnlineAccountsSignatures(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,7 +8,6 @@ import io.swagger.v3.oas.annotations.parameters.RequestBody;
|
|||||||
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
||||||
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
|
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
import org.bitcoinj.core.Coin;
|
|
||||||
import org.bitcoinj.core.Transaction;
|
import org.bitcoinj.core.Transaction;
|
||||||
import org.qortal.api.ApiError;
|
import org.qortal.api.ApiError;
|
||||||
import org.qortal.api.ApiErrors;
|
import org.qortal.api.ApiErrors;
|
||||||
|
@ -376,7 +376,7 @@ public class CrossChainResource {
|
|||||||
int maximumCount = maxtrades != null ? maxtrades : 10;
|
int maximumCount = maxtrades != null ? maxtrades : 10;
|
||||||
long minimumPeriod = 4 * 60 * 60 * 1000L; // ms
|
long minimumPeriod = 4 * 60 * 60 * 1000L; // ms
|
||||||
Boolean isFinished = Boolean.TRUE;
|
Boolean isFinished = Boolean.TRUE;
|
||||||
boolean useInversePrice = (inverse != null && inverse == true);
|
boolean useInversePrice = (inverse != null && inverse);
|
||||||
|
|
||||||
try (final Repository repository = RepositoryManager.getRepository()) {
|
try (final Repository repository = RepositoryManager.getRepository()) {
|
||||||
Map<ByteArray, Supplier<ACCT>> acctsByCodeHash = SupportedBlockchain.getFilteredAcctMap(foreignBlockchain);
|
Map<ByteArray, Supplier<ACCT>> acctsByCodeHash = SupportedBlockchain.getFilteredAcctMap(foreignBlockchain);
|
||||||
|
@ -330,7 +330,7 @@ public class TransactionsResource {
|
|||||||
public enum ConfirmationStatus {
|
public enum ConfirmationStatus {
|
||||||
CONFIRMED,
|
CONFIRMED,
|
||||||
UNCONFIRMED,
|
UNCONFIRMED,
|
||||||
BOTH;
|
BOTH
|
||||||
}
|
}
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
|
@ -31,7 +31,7 @@ public class AdminStatusWebSocket extends ApiWebSocket implements Listener {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
EventBus.INSTANCE.addListener(this::listen);
|
EventBus.INSTANCE.addListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -28,7 +28,7 @@ public class BlocksWebSocket extends ApiWebSocket implements Listener {
|
|||||||
public void configure(WebSocketServletFactory factory) {
|
public void configure(WebSocketServletFactory factory) {
|
||||||
factory.register(BlocksWebSocket.class);
|
factory.register(BlocksWebSocket.class);
|
||||||
|
|
||||||
EventBus.INSTANCE.addListener(this::listen);
|
EventBus.INSTANCE.addListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -86,7 +86,7 @@ public class PresenceWebSocket extends ApiWebSocket implements Listener {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
EventBus.INSTANCE.addListener(this::listen);
|
EventBus.INSTANCE.addListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -43,7 +43,7 @@ public class TradeBotWebSocket extends ApiWebSocket implements Listener {
|
|||||||
// No output this time
|
// No output this time
|
||||||
}
|
}
|
||||||
|
|
||||||
EventBus.INSTANCE.addListener(this::listen);
|
EventBus.INSTANCE.addListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -67,7 +67,7 @@ public class TradeOffersWebSocket extends ApiWebSocket implements Listener {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
EventBus.INSTANCE.addListener(this::listen);
|
EventBus.INSTANCE.addListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -29,7 +29,7 @@ public class TradePresenceWebSocket extends ApiWebSocket implements Listener {
|
|||||||
|
|
||||||
populateCurrentInfo();
|
populateCurrentInfo();
|
||||||
|
|
||||||
EventBus.INSTANCE.addListener(this::listen);
|
EventBus.INSTANCE.addListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -104,7 +104,7 @@ public class ArbitraryDataBuilder {
|
|||||||
if (latestPut.getMethod() != Method.PUT) {
|
if (latestPut.getMethod() != Method.PUT) {
|
||||||
throw new DataException("Expected PUT but received PATCH");
|
throw new DataException("Expected PUT but received PATCH");
|
||||||
}
|
}
|
||||||
if (transactionDataList.size() == 0) {
|
if (transactionDataList.isEmpty()) {
|
||||||
throw new DataException(String.format("No transactions found for name %s, service %s, " +
|
throw new DataException(String.format("No transactions found for name %s, service %s, " +
|
||||||
"identifier: %s, since %d", name, service, this.identifierString(), latestPut.getTimestamp()));
|
"identifier: %s, since %d", name, service, this.identifierString(), latestPut.getTimestamp()));
|
||||||
}
|
}
|
||||||
@ -176,7 +176,7 @@ public class ArbitraryDataBuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void findLatestSignature() throws DataException {
|
private void findLatestSignature() throws DataException {
|
||||||
if (this.transactions.size() == 0) {
|
if (this.transactions.isEmpty()) {
|
||||||
throw new DataException("Unable to find latest signature from empty transaction list");
|
throw new DataException("Unable to find latest signature from empty transaction list");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -354,7 +354,7 @@ public class ArbitraryDataFile {
|
|||||||
|
|
||||||
public boolean join() {
|
public boolean join() {
|
||||||
// Ensure we have chunks
|
// Ensure we have chunks
|
||||||
if (this.chunks != null && this.chunks.size() > 0) {
|
if (this.chunks != null && !this.chunks.isEmpty()) {
|
||||||
|
|
||||||
// Create temporary path for joined file
|
// Create temporary path for joined file
|
||||||
// Use the user-specified temp dir, as it is deterministic, and is more likely to be located on reusable storage hardware
|
// Use the user-specified temp dir, as it is deterministic, and is more likely to be located on reusable storage hardware
|
||||||
@ -439,7 +439,7 @@ public class ArbitraryDataFile {
|
|||||||
boolean success = false;
|
boolean success = false;
|
||||||
|
|
||||||
// Delete the individual chunks
|
// Delete the individual chunks
|
||||||
if (this.chunks != null && this.chunks.size() > 0) {
|
if (this.chunks != null && !this.chunks.isEmpty()) {
|
||||||
Iterator iterator = this.chunks.iterator();
|
Iterator iterator = this.chunks.iterator();
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
ArbitraryDataFileChunk chunk = (ArbitraryDataFileChunk) iterator.next();
|
ArbitraryDataFileChunk chunk = (ArbitraryDataFileChunk) iterator.next();
|
||||||
@ -709,7 +709,7 @@ public class ArbitraryDataFile {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public byte[] chunkHashes() throws DataException {
|
public byte[] chunkHashes() throws DataException {
|
||||||
if (this.chunks != null && this.chunks.size() > 0) {
|
if (this.chunks != null && !this.chunks.isEmpty()) {
|
||||||
// Return null if we only have one chunk, with the same hash as the parent
|
// Return null if we only have one chunk, with the same hash as the parent
|
||||||
if (Arrays.equals(this.digest(), this.chunks.get(0).digest())) {
|
if (Arrays.equals(this.digest(), this.chunks.get(0).digest())) {
|
||||||
return null;
|
return null;
|
||||||
@ -736,7 +736,7 @@ public class ArbitraryDataFile {
|
|||||||
public List<byte[]> chunkHashList() {
|
public List<byte[]> chunkHashList() {
|
||||||
List<byte[]> chunks = new ArrayList<>();
|
List<byte[]> chunks = new ArrayList<>();
|
||||||
|
|
||||||
if (this.chunks != null && this.chunks.size() > 0) {
|
if (this.chunks != null && !this.chunks.isEmpty()) {
|
||||||
// Return null if we only have one chunk, with the same hash as the parent
|
// Return null if we only have one chunk, with the same hash as the parent
|
||||||
if (Arrays.equals(this.digest(), this.chunks.get(0).digest())) {
|
if (Arrays.equals(this.digest(), this.chunks.get(0).digest())) {
|
||||||
return null;
|
return null;
|
||||||
@ -820,7 +820,7 @@ public class ArbitraryDataFile {
|
|||||||
String outputString = "";
|
String outputString = "";
|
||||||
if (this.chunkCount() > 0) {
|
if (this.chunkCount() > 0) {
|
||||||
for (ArbitraryDataFileChunk chunk : this.chunks) {
|
for (ArbitraryDataFileChunk chunk : this.chunks) {
|
||||||
if (outputString.length() > 0) {
|
if (!outputString.isEmpty()) {
|
||||||
outputString = outputString.concat(",");
|
outputString = outputString.concat(",");
|
||||||
}
|
}
|
||||||
outputString = outputString.concat(chunk.digest58());
|
outputString = outputString.concat(chunk.digest58());
|
||||||
|
@ -73,7 +73,7 @@ public class ArbitraryDataReader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If identifier is a blank string, or reserved keyword "default", treat it as null
|
// If identifier is a blank string, or reserved keyword "default", treat it as null
|
||||||
if (identifier == null || identifier.equals("") || identifier.equals("default")) {
|
if (identifier == null || identifier.isEmpty() || identifier.equals("default")) {
|
||||||
identifier = null;
|
identifier = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -199,7 +199,7 @@ public class ArbitraryDataRenderer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private String getFilename(String directory, String userPath) {
|
private String getFilename(String directory, String userPath) {
|
||||||
if (userPath == null || userPath.endsWith("/") || userPath.equals("")) {
|
if (userPath == null || userPath.endsWith("/") || userPath.isEmpty()) {
|
||||||
// Locate index file
|
// Locate index file
|
||||||
List<String> indexFiles = ArbitraryDataRenderer.indexFiles();
|
List<String> indexFiles = ArbitraryDataRenderer.indexFiles();
|
||||||
for (String indexFile : indexFiles) {
|
for (String indexFile : indexFiles) {
|
||||||
|
@ -52,7 +52,7 @@ public class ArbitraryDataResource {
|
|||||||
this.service = service;
|
this.service = service;
|
||||||
|
|
||||||
// If identifier is a blank string, or reserved keyword "default", treat it as null
|
// If identifier is a blank string, or reserved keyword "default", treat it as null
|
||||||
if (identifier == null || identifier.equals("") || identifier.equals("default")) {
|
if (identifier == null || identifier.isEmpty() || identifier.equals("default")) {
|
||||||
identifier = null;
|
identifier = null;
|
||||||
}
|
}
|
||||||
this.identifier = identifier;
|
this.identifier = identifier;
|
||||||
|
@ -81,7 +81,7 @@ public class ArbitraryDataTransactionBuilder {
|
|||||||
this.service = service;
|
this.service = service;
|
||||||
|
|
||||||
// If identifier is a blank string, or reserved keyword "default", treat it as null
|
// If identifier is a blank string, or reserved keyword "default", treat it as null
|
||||||
if (identifier == null || identifier.equals("") || identifier.equals("default")) {
|
if (identifier == null || identifier.isEmpty() || identifier.equals("default")) {
|
||||||
identifier = null;
|
identifier = null;
|
||||||
}
|
}
|
||||||
this.identifier = identifier;
|
this.identifier = identifier;
|
||||||
|
@ -78,7 +78,7 @@ public class ArbitraryDataWriter {
|
|||||||
this.compression = compression;
|
this.compression = compression;
|
||||||
|
|
||||||
// If identifier is a blank string, or reserved keyword "default", treat it as null
|
// If identifier is a blank string, or reserved keyword "default", treat it as null
|
||||||
if (identifier == null || identifier.equals("") || identifier.equals("default")) {
|
if (identifier == null || identifier.isEmpty() || identifier.equals("default")) {
|
||||||
identifier = null;
|
identifier = null;
|
||||||
}
|
}
|
||||||
this.identifier = identifier;
|
this.identifier = identifier;
|
||||||
|
@ -132,7 +132,7 @@ public class AT {
|
|||||||
// Nothing happened?
|
// Nothing happened?
|
||||||
if (state.getSteps() == 0 && Arrays.equals(stateHash, latestAtStateData.getStateHash()))
|
if (state.getSteps() == 0 && Arrays.equals(stateHash, latestAtStateData.getStateHash()))
|
||||||
// We currently want to execute frozen ATs, to maintain backwards support.
|
// We currently want to execute frozen ATs, to maintain backwards support.
|
||||||
if (state.isFrozen() == false)
|
if (!state.isFrozen())
|
||||||
// this.atStateData will be null
|
// this.atStateData will be null
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
|
|
||||||
|
@ -1086,7 +1086,7 @@ public class Block {
|
|||||||
|
|
||||||
// Online accounts should only be included in designated blocks; all others must be empty
|
// Online accounts should only be included in designated blocks; all others must be empty
|
||||||
if (!this.isOnlineAccountsBlock()) {
|
if (!this.isOnlineAccountsBlock()) {
|
||||||
if (this.blockData.getOnlineAccountsCount() != 0 || accountIndexes.size() != 0) {
|
if (this.blockData.getOnlineAccountsCount() != 0 || !accountIndexes.isEmpty()) {
|
||||||
return ValidationResult.ONLINE_ACCOUNTS_INVALID;
|
return ValidationResult.ONLINE_ACCOUNTS_INVALID;
|
||||||
}
|
}
|
||||||
// Not a designated online accounts block and account count is 0. Everything is correct so no need to validate further.
|
// Not a designated online accounts block and account count is 0. Everything is correct so no need to validate further.
|
||||||
|
@ -159,7 +159,6 @@ public class BlockMinter extends Thread {
|
|||||||
int level = mintingAccount.getEffectiveMintingLevel();
|
int level = mintingAccount.getEffectiveMintingLevel();
|
||||||
if (level < BlockChain.getInstance().getMinAccountLevelForBlockSubmissions()) {
|
if (level < BlockChain.getInstance().getMinAccountLevelForBlockSubmissions()) {
|
||||||
madi.remove();
|
madi.remove();
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,7 +171,7 @@ public class BlockMinter extends Thread {
|
|||||||
|
|
||||||
// Disregard peers that don't have a recent block, but only if we're not in recovery mode.
|
// Disregard peers that don't have a recent block, but only if we're not in recovery mode.
|
||||||
// In that mode, we want to allow minting on top of older blocks, to recover stalled networks.
|
// In that mode, we want to allow minting on top of older blocks, to recover stalled networks.
|
||||||
if (Synchronizer.getInstance().getRecoveryMode() == false)
|
if (!Synchronizer.getInstance().getRecoveryMode())
|
||||||
peers.removeIf(Controller.hasNoRecentBlock);
|
peers.removeIf(Controller.hasNoRecentBlock);
|
||||||
|
|
||||||
// Don't mint if we don't have enough up-to-date peers as where would the transactions/consensus come from?
|
// Don't mint if we don't have enough up-to-date peers as where would the transactions/consensus come from?
|
||||||
@ -197,7 +196,7 @@ public class BlockMinter extends Thread {
|
|||||||
|
|
||||||
// If our latest block isn't recent then we need to synchronize instead of minting, unless we're in recovery mode.
|
// If our latest block isn't recent then we need to synchronize instead of minting, unless we're in recovery mode.
|
||||||
if (!peers.isEmpty() && lastBlockData.getTimestamp() < minLatestBlockTimestamp)
|
if (!peers.isEmpty() && lastBlockData.getTimestamp() < minLatestBlockTimestamp)
|
||||||
if (Synchronizer.getInstance().getRecoveryMode() == false && recoverInvalidBlock == false)
|
if (!Synchronizer.getInstance().getRecoveryMode() && !recoverInvalidBlock)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// There are enough peers with a recent block and our latest block is recent
|
// There are enough peers with a recent block and our latest block is recent
|
||||||
|
@ -17,7 +17,7 @@ public class ChatNotifier {
|
|||||||
void notify(ChatTransactionData chatTransactionData);
|
void notify(ChatTransactionData chatTransactionData);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map<Session, Listener> listenersBySession = new HashMap<>();
|
private final Map<Session, Listener> listenersBySession = new HashMap<>();
|
||||||
|
|
||||||
private ChatNotifier() {
|
private ChatNotifier() {
|
||||||
}
|
}
|
||||||
|
@ -564,6 +564,34 @@ public class Controller extends Thread {
|
|||||||
|
|
||||||
// If GUI is enabled, we're no longer starting up but actually running now
|
// If GUI is enabled, we're no longer starting up but actually running now
|
||||||
Gui.getInstance().notifyRunning();
|
Gui.getInstance().notifyRunning();
|
||||||
|
|
||||||
|
// Check every 10 minutes to see if the block minter is running
|
||||||
|
Timer timer = new Timer();
|
||||||
|
|
||||||
|
timer.schedule(new TimerTask() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (blockMinter.isAlive()) {
|
||||||
|
LOGGER.debug("Block minter is running? {}", blockMinter.isAlive());
|
||||||
|
} else if (!blockMinter.isAlive()) {
|
||||||
|
LOGGER.debug("Block minter is running? {}", blockMinter.isAlive());
|
||||||
|
blockMinter.shutdown();
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Wait 10 seconds before restart
|
||||||
|
TimeUnit.SECONDS.sleep(10);
|
||||||
|
|
||||||
|
// Start new block minter thread
|
||||||
|
LOGGER.info("Restarting block minter");
|
||||||
|
blockMinter.start();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
// Couldn't start new block minter thread
|
||||||
|
LOGGER.info("Starting block minter failed {}", e);
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 10*60*1000, 10*60*1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Called by AdvancedInstaller's launch EXE in single-instance mode, when an instance is already running. */
|
/** Called by AdvancedInstaller's launch EXE in single-instance mode, when an instance is already running. */
|
||||||
@ -571,7 +599,6 @@ public class Controller extends Thread {
|
|||||||
// Return as we don't want to run more than one instance
|
// Return as we don't want to run more than one instance
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Main thread
|
// Main thread
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -775,7 +802,7 @@ public class Controller extends Thread {
|
|||||||
|
|
||||||
public static final Predicate<Peer> hasOldVersion = peer -> {
|
public static final Predicate<Peer> hasOldVersion = peer -> {
|
||||||
final String minPeerVersion = Settings.getInstance().getMinPeerVersion();
|
final String minPeerVersion = Settings.getInstance().getMinPeerVersion();
|
||||||
return peer.isAtLeastVersion(minPeerVersion) == false;
|
return !peer.isAtLeastVersion(minPeerVersion);
|
||||||
};
|
};
|
||||||
|
|
||||||
public static final Predicate<Peer> hasInvalidSigner = peer -> {
|
public static final Predicate<Peer> hasInvalidSigner = peer -> {
|
||||||
@ -1921,7 +1948,6 @@ public class Controller extends Thread {
|
|||||||
// Disregard peers that don't have a recent block
|
// Disregard peers that don't have a recent block
|
||||||
if (peerChainTipData.getTimestamp() == null || peerChainTipData.getTimestamp() < minLatestBlockTimestamp) {
|
if (peerChainTipData.getTimestamp() == null || peerChainTipData.getTimestamp() < minLatestBlockTimestamp) {
|
||||||
iterator.remove();
|
iterator.remove();
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2002,5 +2028,4 @@ public class Controller extends Thread {
|
|||||||
public StatsSnapshot getStatsSnapshot() {
|
public StatsSnapshot getStatsSnapshot() {
|
||||||
return this.stats;
|
return this.stats;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -538,7 +538,6 @@ public class OnlineAccountsManager {
|
|||||||
|
|
||||||
if (++i > 1 + 1) {
|
if (++i > 1 + 1) {
|
||||||
iterator.remove();
|
iterator.remove();
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (DataException e) {
|
} catch (DataException e) {
|
||||||
|
@ -2,7 +2,7 @@ package org.qortal.controller;
|
|||||||
|
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
import org.qortal.ApplyRestart;;
|
import org.qortal.ApplyRestart;
|
||||||
import org.qortal.globalization.Translator;
|
import org.qortal.globalization.Translator;
|
||||||
import org.qortal.gui.SysTray;
|
import org.qortal.gui.SysTray;
|
||||||
import org.qortal.repository.RepositoryManager;
|
import org.qortal.repository.RepositoryManager;
|
||||||
|
@ -90,7 +90,7 @@ public class Synchronizer extends Thread {
|
|||||||
private static Synchronizer instance;
|
private static Synchronizer instance;
|
||||||
|
|
||||||
public enum SynchronizationResult {
|
public enum SynchronizationResult {
|
||||||
OK, NOTHING_TO_DO, GENESIS_ONLY, NO_COMMON_BLOCK, TOO_DIVERGENT, NO_REPLY, INFERIOR_CHAIN, INVALID_DATA, NO_BLOCKCHAIN_LOCK, REPOSITORY_ISSUE, SHUTTING_DOWN, CHAIN_TIP_TOO_OLD;
|
OK, NOTHING_TO_DO, GENESIS_ONLY, NO_COMMON_BLOCK, TOO_DIVERGENT, NO_REPLY, INFERIOR_CHAIN, INVALID_DATA, NO_BLOCKCHAIN_LOCK, REPOSITORY_ISSUE, SHUTTING_DOWN, CHAIN_TIP_TOO_OLD
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class NewChainTipEvent implements Event {
|
public static class NewChainTipEvent implements Event {
|
||||||
@ -258,7 +258,7 @@ public class Synchronizer extends Thread {
|
|||||||
peers.removeIf(Controller.hasNoRecentBlock);
|
peers.removeIf(Controller.hasNoRecentBlock);
|
||||||
|
|
||||||
final int peersRemoved = peersBeforeComparison - peers.size();
|
final int peersRemoved = peersBeforeComparison - peers.size();
|
||||||
if (peersRemoved > 0 && peers.size() > 0)
|
if (peersRemoved > 0 && !peers.isEmpty())
|
||||||
LOGGER.debug(String.format("Ignoring %d peers on inferior chains. Peers remaining: %d", peersRemoved, peers.size()));
|
LOGGER.debug(String.format("Ignoring %d peers on inferior chains. Peers remaining: %d", peersRemoved, peers.size()));
|
||||||
|
|
||||||
if (peers.isEmpty())
|
if (peers.isEmpty())
|
||||||
@ -392,7 +392,7 @@ public class Synchronizer extends Thread {
|
|||||||
private boolean checkRecoveryModeForPeers(List<Peer> qualifiedPeers) {
|
private boolean checkRecoveryModeForPeers(List<Peer> qualifiedPeers) {
|
||||||
List<Peer> handshakedPeers = Network.getInstance().getImmutableHandshakedPeers();
|
List<Peer> handshakedPeers = Network.getInstance().getImmutableHandshakedPeers();
|
||||||
|
|
||||||
if (handshakedPeers.size() > 0) {
|
if (!handshakedPeers.isEmpty()) {
|
||||||
// There is at least one handshaked peer
|
// There is at least one handshaked peer
|
||||||
if (qualifiedPeers.isEmpty()) {
|
if (qualifiedPeers.isEmpty()) {
|
||||||
// There are no 'qualified' peers - i.e. peers that have a recent block we can sync to
|
// There are no 'qualified' peers - i.e. peers that have a recent block we can sync to
|
||||||
@ -406,7 +406,7 @@ public class Synchronizer extends Thread {
|
|||||||
// If enough time has passed, enter recovery mode, which lifts some restrictions on who we can sync with and when we can mint
|
// If enough time has passed, enter recovery mode, which lifts some restrictions on who we can sync with and when we can mint
|
||||||
long recoveryModeTimeout = Settings.getInstance().getRecoveryModeTimeout();
|
long recoveryModeTimeout = Settings.getInstance().getRecoveryModeTimeout();
|
||||||
if (NTP.getTime() - timePeersLastAvailable > recoveryModeTimeout) {
|
if (NTP.getTime() - timePeersLastAvailable > recoveryModeTimeout) {
|
||||||
if (recoveryMode == false) {
|
if (!recoveryMode) {
|
||||||
LOGGER.info(String.format("Peers have been unavailable for %d minutes. Entering recovery mode...", recoveryModeTimeout/60/1000));
|
LOGGER.info(String.format("Peers have been unavailable for %d minutes. Entering recovery mode...", recoveryModeTimeout/60/1000));
|
||||||
recoveryMode = true;
|
recoveryMode = true;
|
||||||
}
|
}
|
||||||
@ -445,7 +445,7 @@ public class Synchronizer extends Thread {
|
|||||||
try (final Repository repository = RepositoryManager.getRepository()) {
|
try (final Repository repository = RepositoryManager.getRepository()) {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
if (peers.size() == 0)
|
if (peers.isEmpty())
|
||||||
return SynchronizationResult.NOTHING_TO_DO;
|
return SynchronizationResult.NOTHING_TO_DO;
|
||||||
|
|
||||||
// If our latest block is very old, it's best that we don't try and determine the best peers to sync to.
|
// If our latest block is very old, it's best that we don't try and determine the best peers to sync to.
|
||||||
@ -663,7 +663,7 @@ public class Synchronizer extends Thread {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (useCachedSummaries == false) {
|
if (!useCachedSummaries) {
|
||||||
if (summariesRequired > 0) {
|
if (summariesRequired > 0) {
|
||||||
LOGGER.trace(String.format("Requesting %d block summar%s from peer %s after common block %.8s. Peer height: %d", summariesRequired, (summariesRequired != 1 ? "ies" : "y"), peer, Base58.encode(commonBlockSummary.getSignature()), peerHeight));
|
LOGGER.trace(String.format("Requesting %d block summar%s from peer %s after common block %.8s. Peer height: %d", summariesRequired, (summariesRequired != 1 ? "ies" : "y"), peer, Base58.encode(commonBlockSummary.getSignature()), peerHeight));
|
||||||
|
|
||||||
@ -701,7 +701,7 @@ public class Synchronizer extends Thread {
|
|||||||
|
|
||||||
// Reduce minChainLength if needed. If we don't have any blocks, this peer will be excluded from chain weight comparisons later in the process, so we shouldn't update minChainLength
|
// Reduce minChainLength if needed. If we don't have any blocks, this peer will be excluded from chain weight comparisons later in the process, so we shouldn't update minChainLength
|
||||||
List <BlockSummaryData> peerBlockSummaries = peer.getCommonBlockData().getBlockSummariesAfterCommonBlock();
|
List <BlockSummaryData> peerBlockSummaries = peer.getCommonBlockData().getBlockSummariesAfterCommonBlock();
|
||||||
if (peerBlockSummaries != null && peerBlockSummaries.size() > 0)
|
if (peerBlockSummaries != null && !peerBlockSummaries.isEmpty())
|
||||||
if (peerBlockSummaries.size() < minChainLength)
|
if (peerBlockSummaries.size() < minChainLength)
|
||||||
minChainLength = peerBlockSummaries.size();
|
minChainLength = peerBlockSummaries.size();
|
||||||
}
|
}
|
||||||
@ -728,7 +728,7 @@ public class Synchronizer extends Thread {
|
|||||||
|
|
||||||
// Calculate our chain weight
|
// Calculate our chain weight
|
||||||
BigInteger ourChainWeight = BigInteger.valueOf(0);
|
BigInteger ourChainWeight = BigInteger.valueOf(0);
|
||||||
if (ourBlockSummaries.size() > 0)
|
if (!ourBlockSummaries.isEmpty())
|
||||||
ourChainWeight = Block.calcChainWeight(commonBlockSummary.getHeight(), commonBlockSummary.getSignature(), ourBlockSummaries, maxHeightForChainWeightComparisons);
|
ourChainWeight = Block.calcChainWeight(commonBlockSummary.getHeight(), commonBlockSummary.getSignature(), ourBlockSummaries, maxHeightForChainWeightComparisons);
|
||||||
|
|
||||||
LOGGER.debug(String.format("Our chain weight based on %d blocks is %s", (usingSameLengthChainWeight ? minChainLength : ourBlockSummaries.size()), accurateFormatter.format(ourChainWeight)));
|
LOGGER.debug(String.format("Our chain weight based on %d blocks is %s", (usingSameLengthChainWeight ? minChainLength : ourBlockSummaries.size()), accurateFormatter.format(ourChainWeight)));
|
||||||
@ -780,7 +780,7 @@ public class Synchronizer extends Thread {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Now that we have selected the best peers, compare them against each other and remove any with lower weights
|
// Now that we have selected the best peers, compare them against each other and remove any with lower weights
|
||||||
if (superiorPeersForComparison.size() > 0) {
|
if (!superiorPeersForComparison.isEmpty()) {
|
||||||
BigInteger bestChainWeight = null;
|
BigInteger bestChainWeight = null;
|
||||||
for (Peer peer : superiorPeersForComparison) {
|
for (Peer peer : superiorPeersForComparison) {
|
||||||
// Increase bestChainWeight if needed
|
// Increase bestChainWeight if needed
|
||||||
@ -1290,7 +1290,7 @@ public class Synchronizer extends Thread {
|
|||||||
cachedCommonBlockData.setBlockSummariesAfterCommonBlock(null);
|
cachedCommonBlockData.setBlockSummariesAfterCommonBlock(null);
|
||||||
|
|
||||||
// If we have already received newer blocks from this peer that what we have already, go ahead and apply them
|
// If we have already received newer blocks from this peer that what we have already, go ahead and apply them
|
||||||
if (peerBlocks.size() > 0) {
|
if (!peerBlocks.isEmpty()) {
|
||||||
final BlockData ourLatestBlockData = repository.getBlockRepository().getLastBlock();
|
final BlockData ourLatestBlockData = repository.getBlockRepository().getLastBlock();
|
||||||
final Block peerLatestBlock = peerBlocks.get(peerBlocks.size() - 1);
|
final Block peerLatestBlock = peerBlocks.get(peerBlocks.size() - 1);
|
||||||
final Long minLatestBlockTimestamp = Controller.getMinimumLatestBlockTimestamp();
|
final Long minLatestBlockTimestamp = Controller.getMinimumLatestBlockTimestamp();
|
||||||
@ -1352,7 +1352,7 @@ public class Synchronizer extends Thread {
|
|||||||
|
|
||||||
if (retryCount >= maxRetries) {
|
if (retryCount >= maxRetries) {
|
||||||
// If we have already received newer blocks from this peer that what we have already, go ahead and apply them
|
// If we have already received newer blocks from this peer that what we have already, go ahead and apply them
|
||||||
if (peerBlocks.size() > 0) {
|
if (!peerBlocks.isEmpty()) {
|
||||||
final BlockData ourLatestBlockData = repository.getBlockRepository().getLastBlock();
|
final BlockData ourLatestBlockData = repository.getBlockRepository().getLastBlock();
|
||||||
final Block peerLatestBlock = peerBlocks.get(peerBlocks.size() - 1);
|
final Block peerLatestBlock = peerBlocks.get(peerBlocks.size() - 1);
|
||||||
final Long minLatestBlockTimestamp = Controller.getMinimumLatestBlockTimestamp();
|
final Long minLatestBlockTimestamp = Controller.getMinimumLatestBlockTimestamp();
|
||||||
|
@ -208,7 +208,6 @@ public class ArbitraryDataCleanupManager extends Thread {
|
|||||||
Base58.encode(arbitraryTransactionData.getSignature())));
|
Base58.encode(arbitraryTransactionData.getSignature())));
|
||||||
|
|
||||||
ArbitraryTransactionUtils.convertFileToChunks(arbitraryTransactionData, now, STALE_FILE_TIMEOUT);
|
ArbitraryTransactionUtils.convertFileToChunks(arbitraryTransactionData, now, STALE_FILE_TIMEOUT);
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -284,7 +283,6 @@ public class ArbitraryDataCleanupManager extends Thread {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} catch (DataException e) {
|
} catch (DataException e) {
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -605,7 +605,7 @@ public class ArbitraryDataFileListManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add the chunk hashes
|
// Add the chunk hashes
|
||||||
if (arbitraryDataFile.getChunkHashes().size() > 0) {
|
if (!arbitraryDataFile.getChunkHashes().isEmpty()) {
|
||||||
requestedHashes.addAll(arbitraryDataFile.getChunkHashes());
|
requestedHashes.addAll(arbitraryDataFile.getChunkHashes());
|
||||||
}
|
}
|
||||||
// Add complete file if there are no hashes
|
// Add complete file if there are no hashes
|
||||||
@ -641,7 +641,7 @@ public class ArbitraryDataFileListManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// We should only respond if we have at least one hash
|
// We should only respond if we have at least one hash
|
||||||
if (hashes.size() > 0) {
|
if (!hashes.isEmpty()) {
|
||||||
|
|
||||||
// Firstly we should keep track of the requesting peer, to allow for potential direct connections later
|
// Firstly we should keep track of the requesting peer, to allow for potential direct connections later
|
||||||
ArbitraryDataFileManager.getInstance().addRecentDataRequest(requestingPeer);
|
ArbitraryDataFileManager.getInstance().addRecentDataRequest(requestingPeer);
|
||||||
|
@ -43,7 +43,7 @@ public class ArbitraryDataFileManager extends Thread {
|
|||||||
/**
|
/**
|
||||||
* Map to keep track of hashes that we might need to relay
|
* Map to keep track of hashes that we might need to relay
|
||||||
*/
|
*/
|
||||||
public List<ArbitraryRelayInfo> arbitraryRelayMap = Collections.synchronizedList(new ArrayList<>());
|
public final List<ArbitraryRelayInfo> arbitraryRelayMap = Collections.synchronizedList(new ArrayList<>());
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List to keep track of any arbitrary data file hash responses
|
* List to keep track of any arbitrary data file hash responses
|
||||||
@ -53,7 +53,7 @@ public class ArbitraryDataFileManager extends Thread {
|
|||||||
/**
|
/**
|
||||||
* List to keep track of peers potentially available for direct connections, based on recent requests
|
* List to keep track of peers potentially available for direct connections, based on recent requests
|
||||||
*/
|
*/
|
||||||
private List<ArbitraryDirectConnectionInfo> directConnectionInfo = Collections.synchronizedList(new ArrayList<>());
|
private final List<ArbitraryDirectConnectionInfo> directConnectionInfo = Collections.synchronizedList(new ArrayList<>());
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Map to keep track of peers requesting QDN data that we hold.
|
* Map to keep track of peers requesting QDN data that we hold.
|
||||||
|
@ -230,7 +230,6 @@ public class ArbitraryDataManager extends Thread {
|
|||||||
// Remove transactions that we already have local data for
|
// Remove transactions that we already have local data for
|
||||||
if (hasLocalData(arbitraryTransaction)) {
|
if (hasLocalData(arbitraryTransaction)) {
|
||||||
iterator.remove();
|
iterator.remove();
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -313,7 +312,6 @@ public class ArbitraryDataManager extends Thread {
|
|||||||
// Remove transactions that we already have local data for
|
// Remove transactions that we already have local data for
|
||||||
if (hasLocalMetadata(arbitraryTransaction)) {
|
if (hasLocalMetadata(arbitraryTransaction)) {
|
||||||
iterator.remove();
|
iterator.remove();
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -291,7 +291,6 @@ public class ArbitraryDataStorageManager extends Thread {
|
|||||||
arbitraryTransactionDataList.add(arbitraryTransactionData);
|
arbitraryTransactionDataList.add(arbitraryTransactionData);
|
||||||
|
|
||||||
} catch (DataException e) {
|
} catch (DataException e) {
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -345,7 +344,6 @@ public class ArbitraryDataStorageManager extends Thread {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -207,7 +207,7 @@ public class NamesDatabaseIntegrityCheck {
|
|||||||
// FUTURE: check database integrity for names that have been updated and then the original name re-registered
|
// FUTURE: check database integrity for names that have been updated and then the original name re-registered
|
||||||
else if (Objects.equals(updateNameTransactionData.getName(), registeredName)) {
|
else if (Objects.equals(updateNameTransactionData.getName(), registeredName)) {
|
||||||
String newName = updateNameTransactionData.getNewName();
|
String newName = updateNameTransactionData.getNewName();
|
||||||
if (newName == null || newName.length() == 0) {
|
if (newName == null || newName.isEmpty()) {
|
||||||
// If new name is blank (or maybe null, just to be safe), it means that it stayed the same
|
// If new name is blank (or maybe null, just to be safe), it means that it stayed the same
|
||||||
newName = registeredName;
|
newName = registeredName;
|
||||||
}
|
}
|
||||||
|
@ -724,7 +724,6 @@ public class TradeBot implements Listener {
|
|||||||
|
|
||||||
} catch (DataException e) {
|
} catch (DataException e) {
|
||||||
LOGGER.info("Unable to determine failed state of AT {}", crossChainTradeData.qortalAtAddress);
|
LOGGER.info("Unable to determine failed state of AT {}", crossChainTradeData.qortalAtAddress);
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -757,7 +757,7 @@ public abstract class Bitcoiny implements ForeignBlockchain {
|
|||||||
Address address = Address.fromKey(this.params, keyChain.getKey(KeyChain.KeyPurpose.RECEIVE_FUNDS), ScriptType.P2PKH);
|
Address address = Address.fromKey(this.params, keyChain.getKey(KeyChain.KeyPurpose.RECEIVE_FUNDS), ScriptType.P2PKH);
|
||||||
|
|
||||||
// if zero transactions, return address
|
// if zero transactions, return address
|
||||||
if( 0 == getAddressTransactions(ScriptBuilder.createOutputScript(address).getProgram(), true).size() )
|
if(getAddressTransactions(ScriptBuilder.createOutputScript(address).getProgram(), true).isEmpty())
|
||||||
return address.toString();
|
return address.toString();
|
||||||
|
|
||||||
// else try the next receive funds address
|
// else try the next receive funds address
|
||||||
|
@ -142,7 +142,7 @@ public class ElectrumX extends BitcoinyBlockchainProvider {
|
|||||||
private int nextId = 1;
|
private int nextId = 1;
|
||||||
|
|
||||||
private static final int TX_CACHE_SIZE = 1000;
|
private static final int TX_CACHE_SIZE = 1000;
|
||||||
@SuppressWarnings("serial")
|
|
||||||
private final Map<String, BitcoinyTransaction> transactionCache = Collections.synchronizedMap(new LinkedHashMap<>(TX_CACHE_SIZE + 1, 0.75F, true) {
|
private final Map<String, BitcoinyTransaction> transactionCache = Collections.synchronizedMap(new LinkedHashMap<>(TX_CACHE_SIZE + 1, 0.75F, true) {
|
||||||
// This method is called just after a new entry has been added
|
// This method is called just after a new entry has been added
|
||||||
@Override
|
@Override
|
||||||
@ -222,10 +222,10 @@ public class ElectrumX extends BitcoinyBlockchainProvider {
|
|||||||
if (!(countObj instanceof Long) || !(hexObj instanceof String))
|
if (!(countObj instanceof Long) || !(hexObj instanceof String))
|
||||||
throw new ForeignBlockchainException.NetworkException("Missing/invalid 'count' or 'hex' entries in JSON from ElectrumX blockchain.block.headers RPC");
|
throw new ForeignBlockchainException.NetworkException("Missing/invalid 'count' or 'hex' entries in JSON from ElectrumX blockchain.block.headers RPC");
|
||||||
|
|
||||||
Long returnedCount = (Long) countObj;
|
long returnedCount = (Long) countObj;
|
||||||
String hex = (String) hexObj;
|
String hex = (String) hexObj;
|
||||||
|
|
||||||
List<byte[]> rawBlockHeaders = new ArrayList<>(returnedCount.intValue());
|
List<byte[]> rawBlockHeaders = new ArrayList<>((int) returnedCount);
|
||||||
|
|
||||||
byte[] raw = HashCode.fromString(hex).asBytes();
|
byte[] raw = HashCode.fromString(hex).asBytes();
|
||||||
|
|
||||||
@ -592,7 +592,7 @@ public class ElectrumX extends BitcoinyBlockchainProvider {
|
|||||||
|
|
||||||
Object peers = this.connectedRpc("server.peers.subscribe");
|
Object peers = this.connectedRpc("server.peers.subscribe");
|
||||||
|
|
||||||
for (Object rawPeer : (JSONArray) peers) {
|
for (Object rawPeer : (JSONArray) Objects.requireNonNull(peers)) {
|
||||||
JSONArray peer = (JSONArray) rawPeer;
|
JSONArray peer = (JSONArray) rawPeer;
|
||||||
if (peer.size() < 3)
|
if (peer.size() < 3)
|
||||||
// We're expecting at least 3 fields for each peer entry: IP, hostname, features
|
// We're expecting at least 3 fields for each peer entry: IP, hostname, features
|
||||||
@ -721,7 +721,7 @@ public class ElectrumX extends BitcoinyBlockchainProvider {
|
|||||||
// Check connection is suitable by asking for server features, including genesis block hash
|
// Check connection is suitable by asking for server features, including genesis block hash
|
||||||
JSONObject featuresJson = (JSONObject) this.connectedRpc("server.features");
|
JSONObject featuresJson = (JSONObject) this.connectedRpc("server.features");
|
||||||
|
|
||||||
if (featuresJson == null || Double.valueOf((String) featuresJson.get("protocol_min")) < MIN_PROTOCOL_VERSION)
|
if (featuresJson == null || Double.parseDouble((String) featuresJson.get("protocol_min")) < MIN_PROTOCOL_VERSION)
|
||||||
return Optional.of( recorder.recordConnection(server, requestedBy, true, false, MINIMUM_VERSION_ERROR) );
|
return Optional.of( recorder.recordConnection(server, requestedBy, true, false, MINIMUM_VERSION_ERROR) );
|
||||||
|
|
||||||
if (this.expectedGenesisHash != null && !((String) featuresJson.get("genesis_hash")).equals(this.expectedGenesisHash))
|
if (this.expectedGenesisHash != null && !((String) featuresJson.get("genesis_hash")).equals(this.expectedGenesisHash))
|
||||||
@ -729,9 +729,11 @@ public class ElectrumX extends BitcoinyBlockchainProvider {
|
|||||||
|
|
||||||
// Ask for more servers
|
// Ask for more servers
|
||||||
Set<Server> moreServers = serverPeersSubscribe();
|
Set<Server> moreServers = serverPeersSubscribe();
|
||||||
|
|
||||||
// Discard duplicate servers we already know
|
// Discard duplicate servers we already know
|
||||||
moreServers.removeAll(this.servers);
|
moreServers.removeAll(this.servers);
|
||||||
// Add to both lists
|
|
||||||
|
// Add all servers to both lists
|
||||||
this.remainingServers.addAll(moreServers);
|
this.remainingServers.addAll(moreServers);
|
||||||
this.servers.addAll(moreServers);
|
this.servers.addAll(moreServers);
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ public class ArbitraryTransactionData extends TransactionData {
|
|||||||
// "data" field types
|
// "data" field types
|
||||||
public enum DataType {
|
public enum DataType {
|
||||||
RAW_DATA,
|
RAW_DATA,
|
||||||
DATA_HASH;
|
DATA_HASH
|
||||||
}
|
}
|
||||||
|
|
||||||
// Methods
|
// Methods
|
||||||
|
@ -4,7 +4,6 @@ import org.apache.logging.log4j.LogManager;
|
|||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
import org.qortal.controller.Controller;
|
import org.qortal.controller.Controller;
|
||||||
import org.qortal.globalization.Translator;
|
import org.qortal.globalization.Translator;
|
||||||
import org.qortal.settings.Settings;
|
|
||||||
import org.qortal.utils.URLViewer;
|
import org.qortal.utils.URLViewer;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
@ -17,14 +16,11 @@ import java.awt.event.WindowEvent;
|
|||||||
import java.awt.event.WindowFocusListener;
|
import java.awt.event.WindowFocusListener;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.net.InetSocketAddress;
|
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.nio.channels.SocketChannel;
|
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.nio.file.StandardCopyOption;
|
import java.nio.file.StandardCopyOption;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
@ -70,15 +70,15 @@ public enum Handshake {
|
|||||||
peer.setPeersVersion(versionString, version);
|
peer.setPeersVersion(versionString, version);
|
||||||
|
|
||||||
// Ensure the peer is running at least the version specified in MIN_PEER_VERSION
|
// Ensure the peer is running at least the version specified in MIN_PEER_VERSION
|
||||||
if (peer.isAtLeastVersion(MIN_PEER_VERSION) == false) {
|
if (!peer.isAtLeastVersion(MIN_PEER_VERSION)) {
|
||||||
LOGGER.debug(String.format("Ignoring peer %s because it is on an old version (%s)", peer, versionString));
|
LOGGER.debug(String.format("Ignoring peer %s because it is on an old version (%s)", peer, versionString));
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Settings.getInstance().getAllowConnectionsWithOlderPeerVersions() == false) {
|
if (!Settings.getInstance().getAllowConnectionsWithOlderPeerVersions()) {
|
||||||
// Ensure the peer is running at least the minimum version allowed for connections
|
// Ensure the peer is running at least the minimum version allowed for connections
|
||||||
final String minPeerVersion = Settings.getInstance().getMinPeerVersion();
|
final String minPeerVersion = Settings.getInstance().getMinPeerVersion();
|
||||||
if (peer.isAtLeastVersion(minPeerVersion) == false) {
|
if (!peer.isAtLeastVersion(minPeerVersion)) {
|
||||||
LOGGER.debug(String.format("Ignoring peer %s because it is on an old version (%s)", peer, versionString));
|
LOGGER.debug(String.format("Ignoring peer %s because it is on an old version (%s)", peer, versionString));
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -810,7 +810,7 @@ public class Network {
|
|||||||
.filter(peer -> peer.hasReachedMaxConnectionAge())
|
.filter(peer -> peer.hasReachedMaxConnectionAge())
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
if (peersToDisconnect != null && peersToDisconnect.size() > 0) {
|
if (peersToDisconnect != null && !peersToDisconnect.isEmpty()) {
|
||||||
for (Peer peer : peersToDisconnect) {
|
for (Peer peer : peersToDisconnect) {
|
||||||
LOGGER.debug("Forcing disconnection of peer {} because connection age ({} ms) " +
|
LOGGER.debug("Forcing disconnection of peer {} because connection age ({} ms) " +
|
||||||
"has reached the maximum ({} ms)", peer, peer.getConnectionAge(), peer.getMaxConnectionAge());
|
"has reached the maximum ({} ms)", peer, peer.getConnectionAge(), peer.getMaxConnectionAge());
|
||||||
|
@ -859,7 +859,7 @@ public class Peer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (logStats && this.receivedMessageStats.size() > 0) {
|
if (logStats && !this.receivedMessageStats.isEmpty()) {
|
||||||
StringBuilder statsBuilder = new StringBuilder(1024);
|
StringBuilder statsBuilder = new StringBuilder(1024);
|
||||||
statsBuilder.append("peer ").append(this).append(" message stats:\n=received=");
|
statsBuilder.append("peer ").append(this).append(" message stats:\n=received=");
|
||||||
appendMessageStats(statsBuilder, this.receivedMessageStats);
|
appendMessageStats(statsBuilder, this.receivedMessageStats);
|
||||||
|
@ -1024,7 +1024,7 @@ public class HSQLDBArbitraryRepository implements ArbitraryRepository {
|
|||||||
String tag5 = null;
|
String tag5 = null;
|
||||||
|
|
||||||
if (tags != null) {
|
if (tags != null) {
|
||||||
if (tags.size() > 0) tag1 = tags.get(0);
|
if (!tags.isEmpty()) tag1 = tags.get(0);
|
||||||
if (tags.size() > 1) tag2 = tags.get(1);
|
if (tags.size() > 1) tag2 = tags.get(1);
|
||||||
if (tags.size() > 2) tag3 = tags.get(2);
|
if (tags.size() > 2) tag3 = tags.get(2);
|
||||||
if (tags.size() > 3) tag4 = tags.get(3);
|
if (tags.size() > 3) tag4 = tags.get(3);
|
||||||
|
@ -69,10 +69,10 @@ public class HSQLDBChatRepository implements ChatRepository {
|
|||||||
bindParams.add(chatReferenceBytes);
|
bindParams.add(chatReferenceBytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hasChatReference != null && hasChatReference == true) {
|
if (hasChatReference != null && hasChatReference) {
|
||||||
whereClauses.add("chat_reference IS NOT NULL");
|
whereClauses.add("chat_reference IS NOT NULL");
|
||||||
}
|
}
|
||||||
else if (hasChatReference != null && hasChatReference == false) {
|
else if (hasChatReference != null && !hasChatReference) {
|
||||||
whereClauses.add("chat_reference IS NULL");
|
whereClauses.add("chat_reference IS NULL");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,7 +137,7 @@ public class HSQLDBImportExport {
|
|||||||
String existingTradePrivateKey = (String) existingTradeBotDataItem.get("tradePrivateKey");
|
String existingTradePrivateKey = (String) existingTradeBotDataItem.get("tradePrivateKey");
|
||||||
// Check if we already have an entry for this trade
|
// Check if we already have an entry for this trade
|
||||||
boolean found = allTradeBotData.stream().anyMatch(tradeBotData -> Base58.encode(tradeBotData.getTradePrivateKey()).equals(existingTradePrivateKey));
|
boolean found = allTradeBotData.stream().anyMatch(tradeBotData -> Base58.encode(tradeBotData.getTradePrivateKey()).equals(existingTradePrivateKey));
|
||||||
if (found == false)
|
if (!found)
|
||||||
// Add the data from the backup file to our "allTradeBotDataJson" array as it's not currently in the db
|
// Add the data from the backup file to our "allTradeBotDataJson" array as it's not currently in the db
|
||||||
allTradeBotDataJson.put(existingTradeBotDataItem);
|
allTradeBotDataJson.put(existingTradeBotDataItem);
|
||||||
}
|
}
|
||||||
|
@ -70,6 +70,10 @@ public class CancelGroupBanTransaction extends Transaction {
|
|||||||
if (!this.repository.getGroupRepository().adminExists(groupId, admin.getAddress()))
|
if (!this.repository.getGroupRepository().adminExists(groupId, admin.getAddress()))
|
||||||
return ValidationResult.NOT_GROUP_ADMIN;
|
return ValidationResult.NOT_GROUP_ADMIN;
|
||||||
|
|
||||||
|
// Can't unban if not group's current owner
|
||||||
|
if (!admin.getAddress().equals(groupData.getOwner()))
|
||||||
|
return ValidationResult.INVALID_GROUP_OWNER;
|
||||||
|
|
||||||
Account member = getMember();
|
Account member = getMember();
|
||||||
|
|
||||||
// Check ban actually exists
|
// Check ban actually exists
|
||||||
|
@ -168,7 +168,7 @@ public class ChatTransaction extends Transaction {
|
|||||||
|
|
||||||
// Check for blocked author by registered name
|
// Check for blocked author by registered name
|
||||||
List<NameData> names = this.repository.getNameRepository().getNamesByOwner(this.chatTransactionData.getSender());
|
List<NameData> names = this.repository.getNameRepository().getNamesByOwner(this.chatTransactionData.getSender());
|
||||||
if (names != null && names.size() > 0) {
|
if (names != null && !names.isEmpty()) {
|
||||||
for (NameData nameData : names) {
|
for (NameData nameData : names) {
|
||||||
if (nameData != null && nameData.getName() != null) {
|
if (nameData != null && nameData.getName() != null) {
|
||||||
if (ListUtils.isNameBlocked(nameData.getName())) {
|
if (ListUtils.isNameBlocked(nameData.getName())) {
|
||||||
|
@ -70,6 +70,10 @@ public class GroupBanTransaction extends Transaction {
|
|||||||
if (!this.repository.getGroupRepository().adminExists(groupId, admin.getAddress()))
|
if (!this.repository.getGroupRepository().adminExists(groupId, admin.getAddress()))
|
||||||
return ValidationResult.NOT_GROUP_ADMIN;
|
return ValidationResult.NOT_GROUP_ADMIN;
|
||||||
|
|
||||||
|
// Can't ban if not group's current owner
|
||||||
|
if (!admin.getAddress().equals(groupData.getOwner()))
|
||||||
|
return ValidationResult.INVALID_GROUP_OWNER;
|
||||||
|
|
||||||
Account offender = getOffender();
|
Account offender = getOffender();
|
||||||
|
|
||||||
// Can't ban group owner
|
// Can't ban group owner
|
||||||
|
@ -82,6 +82,10 @@ public class GroupKickTransaction extends Transaction {
|
|||||||
if (!admin.getAddress().equals(groupData.getOwner()) && groupRepository.adminExists(groupId, member.getAddress()))
|
if (!admin.getAddress().equals(groupData.getOwner()) && groupRepository.adminExists(groupId, member.getAddress()))
|
||||||
return ValidationResult.INVALID_GROUP_OWNER;
|
return ValidationResult.INVALID_GROUP_OWNER;
|
||||||
|
|
||||||
|
// Can't kick if not group's current owner
|
||||||
|
if (!admin.getAddress().equals(groupData.getOwner()))
|
||||||
|
return ValidationResult.INVALID_GROUP_OWNER;
|
||||||
|
|
||||||
// Check creator has enough funds
|
// Check creator has enough funds
|
||||||
if (admin.getConfirmedBalance(Asset.QORT) < this.groupKickTransactionData.getFee())
|
if (admin.getConfirmedBalance(Asset.QORT) < this.groupKickTransactionData.getFee())
|
||||||
return ValidationResult.NO_BALANCE;
|
return ValidationResult.NO_BALANCE;
|
||||||
|
@ -43,7 +43,7 @@ public class RewardShareTransaction extends Transaction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private RewardShareData getExistingRewardShare() throws DataException {
|
private RewardShareData getExistingRewardShare() throws DataException {
|
||||||
if (this.haveCheckedForExistingRewardShare == false) {
|
if (!this.haveCheckedForExistingRewardShare) {
|
||||||
this.haveCheckedForExistingRewardShare = true;
|
this.haveCheckedForExistingRewardShare = true;
|
||||||
|
|
||||||
// Look up any existing reward-share (using transaction's reward-share public key)
|
// Look up any existing reward-share (using transaction's reward-share public key)
|
||||||
|
@ -83,6 +83,10 @@ public class UpdateGroupTransaction extends Transaction {
|
|||||||
|
|
||||||
Account owner = getOwner();
|
Account owner = getOwner();
|
||||||
|
|
||||||
|
// Check creator is group's current owner
|
||||||
|
if (!owner.getAddress().equals(groupData.getOwner()))
|
||||||
|
return ValidationResult.INVALID_GROUP_OWNER;
|
||||||
|
|
||||||
// Check creator has enough funds
|
// Check creator has enough funds
|
||||||
if (owner.getConfirmedBalance(Asset.QORT) < this.updateGroupTransactionData.getFee())
|
if (owner.getConfirmedBalance(Asset.QORT) < this.updateGroupTransactionData.getFee())
|
||||||
return ValidationResult.NO_BALANCE;
|
return ValidationResult.NO_BALANCE;
|
||||||
|
@ -398,7 +398,7 @@ public class ArbitraryTransactionUtils {
|
|||||||
public static ArbitraryResourceStatus getStatus(Service service, String name, String identifier, Boolean build, boolean updateCache) {
|
public static ArbitraryResourceStatus getStatus(Service service, String name, String identifier, Boolean build, boolean updateCache) {
|
||||||
|
|
||||||
// If "build" has been specified, build the resource before returning its status
|
// If "build" has been specified, build the resource before returning its status
|
||||||
if (build != null && build == true) {
|
if (build != null && build) {
|
||||||
try {
|
try {
|
||||||
ArbitraryDataReader reader = new ArbitraryDataReader(name, ArbitraryDataFile.ResourceIdType.NAME, service, identifier);
|
ArbitraryDataReader reader = new ArbitraryDataReader(name, ArbitraryDataFile.ResourceIdType.NAME, service, identifier);
|
||||||
if (!reader.isBuilding()) {
|
if (!reader.isBuilding()) {
|
||||||
|
@ -111,7 +111,7 @@ public class Base58 {
|
|||||||
//
|
//
|
||||||
// Nothing to do if we have an empty string
|
// Nothing to do if we have an empty string
|
||||||
//
|
//
|
||||||
if (string.length() == 0)
|
if (string.isEmpty())
|
||||||
return null;
|
return null;
|
||||||
//
|
//
|
||||||
// Convert the input string to a byte sequence
|
// Convert the input string to a byte sequence
|
||||||
|
@ -59,7 +59,7 @@ public class BlockArchiveUtils {
|
|||||||
if (firstBlock == null || firstBlock.getBlockData().getHeight() != startHeight) {
|
if (firstBlock == null || firstBlock.getBlockData().getHeight() != startHeight) {
|
||||||
throw new IllegalStateException("Non matching first block when importing from archive");
|
throw new IllegalStateException("Non matching first block when importing from archive");
|
||||||
}
|
}
|
||||||
if (blockInfoList.size() > 0) {
|
if (!blockInfoList.isEmpty()) {
|
||||||
BlockTransformation lastBlock = blockInfoList.get(blockInfoList.size() - 1);
|
BlockTransformation lastBlock = blockInfoList.get(blockInfoList.size() - 1);
|
||||||
if (lastBlock == null || lastBlock.getBlockData().getHeight() != endHeight) {
|
if (lastBlock == null || lastBlock.getBlockData().getHeight() != endHeight) {
|
||||||
throw new IllegalStateException("Non matching last block when importing from archive");
|
throw new IllegalStateException("Non matching last block when importing from archive");
|
||||||
|
@ -141,7 +141,7 @@ public abstract class Unicode {
|
|||||||
while ((line = bufferedReader.readLine()) != null) {
|
while ((line = bufferedReader.readLine()) != null) {
|
||||||
line = line.trim();
|
line = line.trim();
|
||||||
|
|
||||||
if (line.startsWith("#") || line.length() == 0)
|
if (line.startsWith("#") || line.isEmpty())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
String[] charCodes = line.split(",");
|
String[] charCodes = line.split(",");
|
||||||
|
@ -180,7 +180,6 @@ public class SyncReport {
|
|||||||
|
|
||||||
// Sync went bad
|
// Sync went bad
|
||||||
syncEvent = null;
|
syncEvent = null;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,7 +7,6 @@ import org.junit.Test;
|
|||||||
import org.qortal.account.Account;
|
import org.qortal.account.Account;
|
||||||
import org.qortal.account.PrivateKeyAccount;
|
import org.qortal.account.PrivateKeyAccount;
|
||||||
import org.qortal.asset.Asset;
|
import org.qortal.asset.Asset;
|
||||||
import org.qortal.at.AT;
|
|
||||||
import org.qortal.block.Block;
|
import org.qortal.block.Block;
|
||||||
import org.qortal.data.at.ATData;
|
import org.qortal.data.at.ATData;
|
||||||
import org.qortal.data.at.ATStateData;
|
import org.qortal.data.at.ATStateData;
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
package org.qortal.test.crosschain;
|
package org.qortal.test.crosschain;
|
||||||
|
|
||||||
import org.junit.Ignore;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.qortal.crosschain.Bitcoin;
|
import org.qortal.crosschain.Bitcoin;
|
||||||
import org.qortal.crosschain.Bitcoiny;
|
import org.qortal.crosschain.Bitcoiny;
|
||||||
|
|
||||||
|
@ -11,7 +11,6 @@ import org.qortal.crypto.Crypto;
|
|||||||
import org.qortal.transform.TransformationException;
|
import org.qortal.transform.TransformationException;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
import static org.qortal.crosschain.BitcoinyHTLC.Status.*;
|
import static org.qortal.crosschain.BitcoinyHTLC.Status.*;
|
||||||
|
Loading…
Reference in New Issue
Block a user