mirror of
https://github.com/Qortal/qortal.git
synced 2025-03-30 09:05:52 +00:00
Merge remote-tracking branch 'qortal/master'
This commit is contained in:
commit
35a7a70b93
@ -195,6 +195,10 @@ public class CrossChainResource {
|
|||||||
|
|
||||||
if (minimumTimestamp != null) {
|
if (minimumTimestamp != null) {
|
||||||
minimumFinalHeight = repository.getBlockRepository().getHeightFromTimestamp(minimumTimestamp);
|
minimumFinalHeight = repository.getBlockRepository().getHeightFromTimestamp(minimumTimestamp);
|
||||||
|
if (minimumFinalHeight == 0) {
|
||||||
|
// Try the archive
|
||||||
|
minimumFinalHeight = repository.getBlockArchiveRepository().getHeightFromTimestamp(minimumTimestamp);
|
||||||
|
}
|
||||||
|
|
||||||
if (minimumFinalHeight == 0)
|
if (minimumFinalHeight == 0)
|
||||||
// We don't have any blocks since minimumTimestamp, let alone trades, so nothing to return
|
// We don't have any blocks since minimumTimestamp, let alone trades, so nothing to return
|
||||||
@ -222,6 +226,10 @@ public class CrossChainResource {
|
|||||||
|
|
||||||
// We also need block timestamp for use as trade timestamp
|
// We also need block timestamp for use as trade timestamp
|
||||||
long timestamp = repository.getBlockRepository().getTimestampFromHeight(atState.getHeight());
|
long timestamp = repository.getBlockRepository().getTimestampFromHeight(atState.getHeight());
|
||||||
|
if (timestamp == 0) {
|
||||||
|
// Try the archive
|
||||||
|
timestamp = repository.getBlockArchiveRepository().getTimestampFromHeight(atState.getHeight());
|
||||||
|
}
|
||||||
|
|
||||||
CrossChainTradeSummary crossChainTradeSummary = new CrossChainTradeSummary(crossChainTradeData, timestamp);
|
CrossChainTradeSummary crossChainTradeSummary = new CrossChainTradeSummary(crossChainTradeData, timestamp);
|
||||||
crossChainTrades.add(crossChainTradeSummary);
|
crossChainTrades.add(crossChainTradeSummary);
|
||||||
@ -260,7 +268,12 @@ public class CrossChainResource {
|
|||||||
description = "Maximum number of trades to include in price calculation",
|
description = "Maximum number of trades to include in price calculation",
|
||||||
example = "10",
|
example = "10",
|
||||||
schema = @Schema(type = "integer", defaultValue = "10")
|
schema = @Schema(type = "integer", defaultValue = "10")
|
||||||
) @QueryParam("maxtrades") Integer maxtrades) {
|
) @QueryParam("maxtrades") Integer maxtrades,
|
||||||
|
@Parameter(
|
||||||
|
description = "Display price in terms of foreign currency per unit QORT",
|
||||||
|
example = "false",
|
||||||
|
schema = @Schema(type = "boolean", defaultValue = "false")
|
||||||
|
) @QueryParam("inverse") Boolean inverse) {
|
||||||
// foreignBlockchain is required
|
// foreignBlockchain is required
|
||||||
if (foreignBlockchain == null)
|
if (foreignBlockchain == null)
|
||||||
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA);
|
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA);
|
||||||
@ -291,7 +304,7 @@ public class CrossChainResource {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Amounts.scaledDivide(totalQort, totalForeign);
|
return inverse ? Amounts.scaledDivide(totalForeign, totalQort) : Amounts.scaledDivide(totalQort, totalForeign);
|
||||||
} catch (DataException e) {
|
} catch (DataException e) {
|
||||||
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.REPOSITORY_ISSUE, e);
|
throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.REPOSITORY_ISSUE, e);
|
||||||
}
|
}
|
||||||
|
@ -42,36 +42,30 @@ public class Bitcoin extends Bitcoiny {
|
|||||||
public Collection<ElectrumX.Server> getServers() {
|
public Collection<ElectrumX.Server> getServers() {
|
||||||
return Arrays.asList(
|
return Arrays.asList(
|
||||||
// Servers chosen on NO BASIS WHATSOEVER from various sources!
|
// Servers chosen on NO BASIS WHATSOEVER from various sources!
|
||||||
new Server("128.0.190.26", Server.ConnectionType.SSL, 50002),
|
|
||||||
new Server("hodlers.beer", Server.ConnectionType.SSL, 50002),
|
new Server("hodlers.beer", Server.ConnectionType.SSL, 50002),
|
||||||
new Server("electrumx.erbium.eu", Server.ConnectionType.TCP, 50001),
|
|
||||||
new Server("electrumx.erbium.eu", Server.ConnectionType.SSL, 50002),
|
|
||||||
new Server("btc.lastingcoin.net", Server.ConnectionType.SSL, 50002),
|
new Server("btc.lastingcoin.net", Server.ConnectionType.SSL, 50002),
|
||||||
new Server("electrum.bitaroo.net", Server.ConnectionType.SSL, 50002),
|
new Server("electrum.bitaroo.net", Server.ConnectionType.SSL, 50002),
|
||||||
new Server("bitcoin.grey.pw", Server.ConnectionType.SSL, 50002),
|
new Server("bitcoin.grey.pw", Server.ConnectionType.SSL, 50002),
|
||||||
new Server("2electrumx.hopto.me", Server.ConnectionType.SSL, 56022),
|
|
||||||
new Server("185.64.116.15", Server.ConnectionType.SSL, 50002),
|
new Server("185.64.116.15", Server.ConnectionType.SSL, 50002),
|
||||||
new Server("kirsche.emzy.de", Server.ConnectionType.SSL, 50002),
|
|
||||||
new Server("alviss.coinjoined.com", Server.ConnectionType.SSL, 50002),
|
new Server("alviss.coinjoined.com", Server.ConnectionType.SSL, 50002),
|
||||||
new Server("electrum.emzy.de", Server.ConnectionType.SSL, 50002),
|
|
||||||
new Server("electrum.emzy.de", Server.ConnectionType.TCP, 50001),
|
|
||||||
new Server("vmd71287.contaboserver.net", Server.ConnectionType.SSL, 50002),
|
|
||||||
new Server("btc.litepay.ch", Server.ConnectionType.SSL, 50002),
|
new Server("btc.litepay.ch", Server.ConnectionType.SSL, 50002),
|
||||||
new Server("electrum.stippy.com", Server.ConnectionType.SSL, 50002),
|
|
||||||
new Server("xtrum.com", Server.ConnectionType.SSL, 50002),
|
new Server("xtrum.com", Server.ConnectionType.SSL, 50002),
|
||||||
new Server("electrum.acinq.co", Server.ConnectionType.SSL, 50002),
|
new Server("electrum.acinq.co", Server.ConnectionType.SSL, 50002),
|
||||||
new Server("electrum2.taborsky.cz", Server.ConnectionType.SSL, 50002),
|
|
||||||
new Server("vmd63185.contaboserver.net", Server.ConnectionType.SSL, 50002),
|
|
||||||
new Server("electrum2.privateservers.network", Server.ConnectionType.SSL, 50002),
|
|
||||||
new Server("electrumx.alexridevski.net", Server.ConnectionType.SSL, 50002),
|
|
||||||
new Server("192.166.219.200", Server.ConnectionType.SSL, 50002),
|
|
||||||
new Server("2ex.digitaleveryware.com", Server.ConnectionType.SSL, 50002),
|
|
||||||
new Server("dxm.no-ip.biz", Server.ConnectionType.SSL, 50002),
|
|
||||||
new Server("caleb.vegas", Server.ConnectionType.SSL, 50002),
|
new Server("caleb.vegas", Server.ConnectionType.SSL, 50002),
|
||||||
new Server("ecdsa.net", Server.ConnectionType.SSL, 110),
|
new Server("electrum.coinext.com.br", Server.ConnectionType.TCP, 50001),
|
||||||
new Server("electrum.hsmiths.com", Server.ConnectionType.SSL, 995),
|
new Server("korea.electrum-server.com", Server.ConnectionType.TCP, 50001),
|
||||||
new Server("elec.luggs.co", Server.ConnectionType.SSL, 443),
|
new Server("eai.coincited.net", Server.ConnectionType.TCP, 50001),
|
||||||
new Server("btc.smsys.me", Server.ConnectionType.SSL, 995));
|
new Server("electrum.coinext.com.br", Server.ConnectionType.SSL, 50002),
|
||||||
|
new Server("node1.btccuracao.com", Server.ConnectionType.SSL, 50002),
|
||||||
|
new Server("korea.electrum-server.com", Server.ConnectionType.SSL, 50002),
|
||||||
|
new Server("btce.iiiiiii.biz", Server.ConnectionType.SSL, 50002),
|
||||||
|
new Server("bitcoin.lukechilds.co", Server.ConnectionType.SSL, 50002),
|
||||||
|
new Server("guichet.centure.cc", Server.ConnectionType.SSL, 50002),
|
||||||
|
new Server("electrumx.hodlwallet.com", Server.ConnectionType.SSL, 50002),
|
||||||
|
new Server("eai.coincited.net", Server.ConnectionType.SSL, 50002),
|
||||||
|
new Server("prospero.bitsrc.net", Server.ConnectionType.SSL, 50002),
|
||||||
|
new Server("gd42.org", Server.ConnectionType.SSL, 50002),
|
||||||
|
new Server("electrum.pabu.io", Server.ConnectionType.SSL, 50002));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -71,6 +71,15 @@ public interface BlockArchiveRepository {
|
|||||||
*/
|
*/
|
||||||
public int getHeightFromTimestamp(long timestamp) throws DataException;
|
public int getHeightFromTimestamp(long timestamp) throws DataException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns block timestamp for a given height.
|
||||||
|
*
|
||||||
|
* @param height
|
||||||
|
* @return timestamp, or 0 if height is out of bounds.
|
||||||
|
* @throws DataException
|
||||||
|
*/
|
||||||
|
public long getTimestampFromHeight(int height) throws DataException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns block summaries for blocks signed by passed public key, or reward-share with minter with passed public key.
|
* Returns block summaries for blocks signed by passed public key, or reward-share with minter with passed public key.
|
||||||
*/
|
*/
|
||||||
|
@ -103,6 +103,20 @@ public class HSQLDBBlockArchiveRepository implements BlockArchiveRepository {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getTimestampFromHeight(int height) throws DataException {
|
||||||
|
String sql = "SELECT minted_when FROM BlockArchive WHERE height = ?";
|
||||||
|
|
||||||
|
try (ResultSet resultSet = this.repository.checkedExecute(sql, height)) {
|
||||||
|
if (resultSet == null)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return resultSet.getLong(1);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
throw new DataException("Error obtaining block timestamp by height from BlockArchive repository", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<BlockSummaryData> getBlockSummariesBySigner(byte[] signerPublicKey, Integer limit, Integer offset, Boolean reverse) throws DataException {
|
public List<BlockSummaryData> getBlockSummariesBySigner(byte[] signerPublicKey, Integer limit, Integer offset, Boolean reverse) throws DataException {
|
||||||
StringBuilder sql = new StringBuilder(512);
|
StringBuilder sql = new StringBuilder(512);
|
||||||
|
@ -4,68 +4,68 @@
|
|||||||
# "localeLang": "de",
|
# "localeLang": "de",
|
||||||
|
|
||||||
### Common ###
|
### Common ###
|
||||||
JSON = JSON nachricht konnte nicht geparsed werden
|
JSON = JSON Nachricht konnte nicht geparst werden
|
||||||
|
|
||||||
INSUFFICIENT_BALANCE = insufficient balance
|
INSUFFICIENT_BALANCE = insufficient balance
|
||||||
|
|
||||||
UNAUTHORIZED = API call unauthorized
|
UNAUTHORIZED = API-Aufruf nicht autorisiert
|
||||||
|
|
||||||
REPOSITORY_ISSUE = repository error
|
REPOSITORY_ISSUE = Repository-Fehler
|
||||||
|
|
||||||
NON_PRODUCTION = this API call is not permitted for production systems
|
NON_PRODUCTION = this API call is not permitted for production systems
|
||||||
|
|
||||||
BLOCKCHAIN_NEEDS_SYNC = blockchain needs to synchronize first
|
BLOCKCHAIN_NEEDS_SYNC = blockchain needs to synchronize first
|
||||||
|
|
||||||
NO_TIME_SYNC = no clock synchronization yet
|
NO_TIME_SYNC = noch keine Uhrensynchronisation
|
||||||
|
|
||||||
### Validation ###
|
### Validation ###
|
||||||
INVALID_SIGNATURE = ungültige signatur
|
INVALID_SIGNATURE = ungültige Signatur
|
||||||
|
|
||||||
INVALID_ADDRESS = ungültige adresse
|
INVALID_ADDRESS = ungültige Adresse
|
||||||
|
|
||||||
INVALID_PUBLIC_KEY = ungültiger public key
|
INVALID_PUBLIC_KEY = ungültiger public key
|
||||||
|
|
||||||
INVALID_DATA = ungültige daten
|
INVALID_DATA = ungültige Daten
|
||||||
|
|
||||||
INVALID_NETWORK_ADDRESS = invalid network address
|
INVALID_NETWORK_ADDRESS = ungültige Netzwerk Adresse
|
||||||
|
|
||||||
ADDRESS_UNKNOWN = account address unknown
|
ADDRESS_UNKNOWN = Account Adresse unbekannt
|
||||||
|
|
||||||
INVALID_CRITERIA = invalid search criteria
|
INVALID_CRITERIA = ungültige Suchkriterien
|
||||||
|
|
||||||
INVALID_REFERENCE = invalid reference
|
INVALID_REFERENCE = ungültige Referenz
|
||||||
|
|
||||||
TRANSFORMATION_ERROR = could not transform JSON into transaction
|
TRANSFORMATION_ERROR = konnte JSON nicht in eine Transaktion umwandeln
|
||||||
|
|
||||||
INVALID_PRIVATE_KEY = invalid private key
|
INVALID_PRIVATE_KEY = ungültiger private key
|
||||||
|
|
||||||
INVALID_HEIGHT = invalid block height
|
INVALID_HEIGHT = ungültige block height
|
||||||
|
|
||||||
CANNOT_MINT = account cannot mint
|
CANNOT_MINT = Account kann nicht minten
|
||||||
|
|
||||||
### Blocks ###
|
### Blocks ###
|
||||||
BLOCK_UNKNOWN = block unknown
|
BLOCK_UNKNOWN = block unbekannt
|
||||||
|
|
||||||
### Transactions ###
|
### Transactions ###
|
||||||
TRANSACTION_UNKNOWN = transaction unknown
|
TRANSACTION_UNKNOWN = Transaktion unbekannt
|
||||||
|
|
||||||
PUBLIC_KEY_NOT_FOUND = public key wurde nicht gefunden
|
PUBLIC_KEY_NOT_FOUND = public key wurde nicht gefunden
|
||||||
|
|
||||||
# this one is special in that caller expected to pass two additional strings, hence the two %s
|
# this one is special in that caller expected to pass two additional strings, hence the two %s
|
||||||
TRANSACTION_INVALID = transaction invalid: %s (%s)
|
TRANSACTION_INVALID = Transaktion ungültig: %s (%s)
|
||||||
|
|
||||||
### Naming ###
|
### Naming ###
|
||||||
NAME_UNKNOWN = name unknown
|
NAME_UNKNOWN = Name unbekannt
|
||||||
|
|
||||||
### Asset ###
|
### Asset ###
|
||||||
INVALID_ASSET_ID = ungültige asset ID
|
INVALID_ASSET_ID = ungültige asset ID
|
||||||
|
|
||||||
INVALID_ORDER_ID = invalid asset order ID
|
INVALID_ORDER_ID = ungültige asset order ID
|
||||||
|
|
||||||
ORDER_UNKNOWN = unknown asset order ID
|
ORDER_UNKNOWN = unbekannte asset order ID
|
||||||
|
|
||||||
### Groups ###
|
### Groups ###
|
||||||
GROUP_UNKNOWN = group unknown
|
GROUP_UNKNOWN = Gruppe unbekannt
|
||||||
|
|
||||||
### Foreign Blockchain ###
|
### Foreign Blockchain ###
|
||||||
FOREIGN_BLOCKCHAIN_NETWORK_ISSUE = foreign blokchain or ElectrumX network issue
|
FOREIGN_BLOCKCHAIN_NETWORK_ISSUE = foreign blokchain or ElectrumX network issue
|
||||||
@ -78,6 +78,7 @@ FOREIGN_BLOCKCHAIN_TOO_SOON = too soon to broadcast foreign blockchain transacti
|
|||||||
ORDER_SIZE_TOO_SMALL = order amount too low
|
ORDER_SIZE_TOO_SMALL = order amount too low
|
||||||
|
|
||||||
### Data ###
|
### Data ###
|
||||||
FILE_NOT_FOUND = file not found
|
FILE_NOT_FOUND = Datei nicht gefunden
|
||||||
|
|
||||||
NO_REPLY = peer did not reply with data
|
NO_REPLY = peer did not reply with data
|
||||||
|
|
||||||
|
40
src/main/resources/i18n/SysTray_de.properties
Normal file
40
src/main/resources/i18n/SysTray_de.properties
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#Generated by ResourceBundle Editor (http://essiembre.github.io/eclipse-rbe/)
|
||||||
|
# SysTray pop-up menu
|
||||||
|
|
||||||
|
AUTO_UPDATE = Automatisches Update
|
||||||
|
|
||||||
|
APPLYING_UPDATE_AND_RESTARTING = Automatisches Update anwenden und neu starten …
|
||||||
|
|
||||||
|
BLOCK_HEIGHT = height
|
||||||
|
|
||||||
|
BUILD_VERSION = Build-Version
|
||||||
|
|
||||||
|
CHECK_TIME_ACCURACY = Prüfe Zeitgenauigkeit
|
||||||
|
|
||||||
|
CONNECTING = Verbindung wird hergestellt
|
||||||
|
|
||||||
|
CONNECTION = Verbindung
|
||||||
|
|
||||||
|
CONNECTIONS = Verbindungen
|
||||||
|
|
||||||
|
CREATING_BACKUP_OF_DB_FILES = Erstellen Backup von Datenbank Dateien …
|
||||||
|
|
||||||
|
DB_BACKUP = Datenbank Backup
|
||||||
|
|
||||||
|
DB_CHECKPOINT = Datenbank Kontrollpunkt
|
||||||
|
|
||||||
|
EXIT = Verlassen
|
||||||
|
|
||||||
|
MINTING_DISABLED = NOT minting
|
||||||
|
|
||||||
|
MINTING_ENABLED = \u2714 Minting
|
||||||
|
|
||||||
|
OPEN_UI = Öffne UI
|
||||||
|
|
||||||
|
PERFORMING_DB_CHECKPOINT = Speichern nicht übergebener Datenbank Änderungen …
|
||||||
|
|
||||||
|
SYNCHRONIZE_CLOCK = Synchronisiere Uhr
|
||||||
|
|
||||||
|
SYNCHRONIZING_BLOCKCHAIN = Synchronisierung
|
||||||
|
|
||||||
|
SYNCHRONIZING_CLOCK = Synchronisierung Uhr
|
@ -208,8 +208,11 @@ public class BootstrapTests extends Common {
|
|||||||
|
|
||||||
private void deleteBootstraps() throws IOException {
|
private void deleteBootstraps() throws IOException {
|
||||||
try {
|
try {
|
||||||
Path path = Paths.get(String.format("%s%s", Settings.getInstance().getBootstrapFilenamePrefix(), "bootstrap-archive.7z"));
|
Path archivePath = Paths.get(String.format("%s%s", Settings.getInstance().getBootstrapFilenamePrefix(), "bootstrap-archive.7z"));
|
||||||
Files.delete(path);
|
Files.delete(archivePath);
|
||||||
|
|
||||||
|
Path sha256Path = Paths.get(String.format("%s%s", Settings.getInstance().getBootstrapFilenamePrefix(), "bootstrap-archive.7z.sha256"));
|
||||||
|
Files.delete(sha256Path);
|
||||||
|
|
||||||
} catch (NoSuchFileException e) {
|
} catch (NoSuchFileException e) {
|
||||||
// Nothing to delete
|
// Nothing to delete
|
||||||
|
Loading…
x
Reference in New Issue
Block a user