mirror of
https://github.com/bisq-network/bisq.git
synced 2025-02-22 22:45:21 +01:00
Merge branch 'master' into rc_v1.0.0
# Conflicts: # common/src/main/proto/pb.proto # core/src/main/java/bisq/core/dao/governance/blindvote/storage/BlindVotePayload.java
This commit is contained in:
commit
68436f5f85
73 changed files with 763 additions and 403 deletions
|
@ -271,7 +271,7 @@ configure(project(':desktop')) {
|
||||||
apply plugin: 'witness'
|
apply plugin: 'witness'
|
||||||
apply from: '../gradle/witness/gradle-witness.gradle'
|
apply from: '../gradle/witness/gradle-witness.gradle'
|
||||||
|
|
||||||
version = '0.9.7-SNAPSHOT'
|
version = '0.9.8-SNAPSHOT'
|
||||||
|
|
||||||
mainClassName = 'bisq.desktop.app.BisqAppMain'
|
mainClassName = 'bisq.desktop.app.BisqAppMain'
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@ public class Version {
|
||||||
// VERSION = 0.5.0 introduces proto buffer for the P2P network and local DB and is a not backward compatible update
|
// VERSION = 0.5.0 introduces proto buffer for the P2P network and local DB and is a not backward compatible update
|
||||||
// Therefore all sub versions start again with 1
|
// Therefore all sub versions start again with 1
|
||||||
// We use semantic versioning with major, minor and patch
|
// We use semantic versioning with major, minor and patch
|
||||||
public static final String VERSION = "0.9.7";
|
public static final String VERSION = "0.9.8";
|
||||||
|
|
||||||
public static int getMajorVersion(String version) {
|
public static int getMajorVersion(String version) {
|
||||||
return getSubVersion(version, 0);
|
return getSubVersion(version, 0);
|
||||||
|
|
|
@ -162,16 +162,21 @@ public class FileManager<T extends PersistableEnvelope> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized void removeAndBackupFile(String fileName) throws IOException {
|
public static void removeAndBackupFile(File dbDir, File storageFile, String fileName, String backupFolderName)
|
||||||
File corruptedBackupDir = new File(Paths.get(dir.getAbsolutePath(), "backup_of_corrupted_data").toString());
|
throws IOException {
|
||||||
|
File corruptedBackupDir = new File(Paths.get(dbDir.getAbsolutePath(), backupFolderName).toString());
|
||||||
if (!corruptedBackupDir.exists())
|
if (!corruptedBackupDir.exists())
|
||||||
if (!corruptedBackupDir.mkdir())
|
if (!corruptedBackupDir.mkdir())
|
||||||
log.warn("make dir failed");
|
log.warn("make dir failed");
|
||||||
|
|
||||||
File corruptedFile = new File(Paths.get(dir.getAbsolutePath(), "backup_of_corrupted_data", fileName).toString());
|
File corruptedFile = new File(Paths.get(dbDir.getAbsolutePath(), backupFolderName, fileName).toString());
|
||||||
FileUtil.renameFile(storageFile, corruptedFile);
|
FileUtil.renameFile(storageFile, corruptedFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public synchronized void removeAndBackupFile(String fileName) throws IOException {
|
||||||
|
removeAndBackupFile(dir, storageFile, fileName, "backup_of_corrupted_data");
|
||||||
|
}
|
||||||
|
|
||||||
public synchronized void backupFile(String fileName, int numMaxBackupFiles) {
|
public synchronized void backupFile(String fileName, int numMaxBackupFiles) {
|
||||||
FileUtil.rollingBackup(dir, fileName, numMaxBackupFiles);
|
FileUtil.rollingBackup(dir, fileName, numMaxBackupFiles);
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,6 +79,13 @@ public class JsonFileManager {
|
||||||
printWriter = new PrintWriter(tempFile);
|
printWriter = new PrintWriter(tempFile);
|
||||||
printWriter.println(json);
|
printWriter.println(json);
|
||||||
|
|
||||||
|
// This close call and comment is borrowed from FileManager. Not 100% sure it that is really needed but
|
||||||
|
// seems that had fixed in the past and we got reported issues on Windows so that fix might be still
|
||||||
|
// required.
|
||||||
|
// Close resources before replacing file with temp file because otherwise it causes problems on windows
|
||||||
|
// when rename temp file
|
||||||
|
printWriter.close();
|
||||||
|
|
||||||
FileUtil.renameFile(tempFile, jsonFile);
|
FileUtil.renameFile(tempFile, jsonFile);
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
log.error("storageFile " + jsonFile.toString());
|
log.error("storageFile " + jsonFile.toString());
|
||||||
|
|
|
@ -528,6 +528,7 @@ message Filter {
|
||||||
bool prevent_public_btc_network = 12;
|
bool prevent_public_btc_network = 12;
|
||||||
repeated string btc_nodes = 13;
|
repeated string btc_nodes = 13;
|
||||||
bool disable_dao = 14;
|
bool disable_dao = 14;
|
||||||
|
string disable_dao_below_version = 15;
|
||||||
}
|
}
|
||||||
|
|
||||||
// not used anymore from v0.6 on. But leave it for receiving TradeStatistics objects from older
|
// not used anymore from v0.6 on. But leave it for receiving TradeStatistics objects from older
|
||||||
|
|
|
@ -68,6 +68,8 @@ public class BitcoinModule extends AppModule {
|
||||||
RegTestHost.HOST = regTestHost;
|
RegTestHost.HOST = regTestHost;
|
||||||
if (Arrays.asList("localhost", "127.0.0.1").contains(regTestHost)) {
|
if (Arrays.asList("localhost", "127.0.0.1").contains(regTestHost)) {
|
||||||
bind(RegTestHost.class).toInstance(RegTestHost.LOCALHOST);
|
bind(RegTestHost.class).toInstance(RegTestHost.LOCALHOST);
|
||||||
|
} else if ("none".equals(regTestHost)) {
|
||||||
|
bind(RegTestHost.class).toInstance(RegTestHost.NONE);
|
||||||
} else {
|
} else {
|
||||||
bind(RegTestHost.class).toInstance(RegTestHost.REMOTE_HOST);
|
bind(RegTestHost.class).toInstance(RegTestHost.REMOTE_HOST);
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,7 +41,7 @@ public class TxBroadcastTimeoutException extends TxBroadcastException {
|
||||||
*/
|
*/
|
||||||
public TxBroadcastTimeoutException(Transaction localTx, int delay, Wallet wallet) {
|
public TxBroadcastTimeoutException(Transaction localTx, int delay, Wallet wallet) {
|
||||||
super("The transaction was not broadcasted in " + delay +
|
super("The transaction was not broadcasted in " + delay +
|
||||||
"seconds. txId=" + localTx.getHashAsString());
|
" seconds. txId=" + localTx.getHashAsString());
|
||||||
this.localTx = localTx;
|
this.localTx = localTx;
|
||||||
this.delay = delay;
|
this.delay = delay;
|
||||||
this.wallet = wallet;
|
this.wallet = wallet;
|
||||||
|
|
|
@ -72,7 +72,12 @@ public class TxBroadcaster {
|
||||||
void onFailure(TxBroadcastException exception);
|
void onFailure(TxBroadcastException exception);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final int DEFAULT_BROADCAST_TIMEOUT = 30;
|
// Currently there is a bug in BitcoinJ causing the timeout at all BSQ transactions.
|
||||||
|
// It is because BitcoinJ does not handle confidence object correctly in case as tx got altered after the
|
||||||
|
// Wallet.complete() method is called which is the case for all BSQ txs. We will work on a fix for that but that
|
||||||
|
// will take more time. In the meantime we reduce the timeout to 5 seconds to avoid that the trade protocol runs
|
||||||
|
// into a timeout when using BSQ for trade fee.
|
||||||
|
private static final int DEFAULT_BROADCAST_TIMEOUT = 5;
|
||||||
private static Map<String, Timer> broadcastTimerMap = new HashMap<>();
|
private static Map<String, Timer> broadcastTimerMap = new HashMap<>();
|
||||||
|
|
||||||
public static void broadcastTx(Wallet wallet, PeerGroup peerGroup, Transaction localTx, Callback callback) {
|
public static void broadcastTx(Wallet wallet, PeerGroup peerGroup, Transaction localTx, Callback callback) {
|
||||||
|
|
|
@ -21,10 +21,16 @@ import bisq.core.dao.exceptions.DaoDisabledException;
|
||||||
import bisq.core.filter.Filter;
|
import bisq.core.filter.Filter;
|
||||||
import bisq.core.filter.FilterManager;
|
import bisq.core.filter.FilterManager;
|
||||||
|
|
||||||
|
import bisq.common.app.Version;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
public class DaoKillSwitch implements DaoSetupService {
|
public class DaoKillSwitch implements DaoSetupService {
|
||||||
private static DaoKillSwitch INSTANCE;
|
private static DaoKillSwitch INSTANCE;
|
||||||
private final FilterManager filterManager;
|
private final FilterManager filterManager;
|
||||||
|
@ -49,8 +55,19 @@ public class DaoKillSwitch implements DaoSetupService {
|
||||||
applyFilter(filterManager.getFilter());
|
applyFilter(filterManager.getFilter());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void applyFilter(Filter filter) {
|
private void applyFilter(@Nullable Filter filter) {
|
||||||
daoDisabled = filter != null && filter.isDisableDao();
|
if (filter == null) {
|
||||||
|
daoDisabled = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean requireUpdateToNewVersion = false;
|
||||||
|
String disableDaoBelowVersion = filter.getDisableDaoBelowVersion();
|
||||||
|
if (disableDaoBelowVersion != null && !disableDaoBelowVersion.isEmpty()) {
|
||||||
|
requireUpdateToNewVersion = Version.isNewVersion(disableDaoBelowVersion);
|
||||||
|
}
|
||||||
|
|
||||||
|
daoDisabled = requireUpdateToNewVersion || filter.isDisableDao();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void assertDaoIsNotDisabled() {
|
public static void assertDaoIsNotDisabled() {
|
||||||
|
|
|
@ -95,8 +95,8 @@ public class BlindVoteConsensus {
|
||||||
return Encryption.encrypt(bytes, secretKey);
|
return Encryption.encrypt(bytes, secretKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte[] getHashOfEncryptedProposalList(byte[] encryptedProposalList) {
|
public static byte[] getHashOfEncryptedVotes(byte[] encryptedVotes) {
|
||||||
return Hash.getSha256Ripemd160hash(encryptedProposalList);
|
return Hash.getSha256Ripemd160hash(encryptedVotes);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte[] getOpReturnData(byte[] hash) throws IOException {
|
public static byte[] getOpReturnData(byte[] hash) throws IOException {
|
||||||
|
|
|
@ -21,8 +21,10 @@ import bisq.core.dao.DaoOptionKeys;
|
||||||
import bisq.core.dao.DaoSetupService;
|
import bisq.core.dao.DaoSetupService;
|
||||||
import bisq.core.dao.governance.blindvote.storage.BlindVotePayload;
|
import bisq.core.dao.governance.blindvote.storage.BlindVotePayload;
|
||||||
import bisq.core.dao.governance.blindvote.storage.BlindVoteStorageService;
|
import bisq.core.dao.governance.blindvote.storage.BlindVoteStorageService;
|
||||||
|
import bisq.core.dao.governance.period.PeriodService;
|
||||||
import bisq.core.dao.state.DaoStateListener;
|
import bisq.core.dao.state.DaoStateListener;
|
||||||
import bisq.core.dao.state.DaoStateService;
|
import bisq.core.dao.state.DaoStateService;
|
||||||
|
import bisq.core.dao.state.model.governance.DaoPhase;
|
||||||
|
|
||||||
import bisq.network.p2p.P2PService;
|
import bisq.network.p2p.P2PService;
|
||||||
import bisq.network.p2p.storage.payload.PersistableNetworkPayload;
|
import bisq.network.p2p.storage.payload.PersistableNetworkPayload;
|
||||||
|
@ -48,6 +50,8 @@ import lombok.extern.slf4j.Slf4j;
|
||||||
public class BlindVoteListService implements AppendOnlyDataStoreListener, DaoStateListener, DaoSetupService {
|
public class BlindVoteListService implements AppendOnlyDataStoreListener, DaoStateListener, DaoSetupService {
|
||||||
private final DaoStateService daoStateService;
|
private final DaoStateService daoStateService;
|
||||||
private final P2PService p2PService;
|
private final P2PService p2PService;
|
||||||
|
private final PeriodService periodService;
|
||||||
|
private final BlindVoteStorageService blindVoteStorageService;
|
||||||
private final BlindVoteValidator blindVoteValidator;
|
private final BlindVoteValidator blindVoteValidator;
|
||||||
@Getter
|
@Getter
|
||||||
private final ObservableList<BlindVotePayload> blindVotePayloads = FXCollections.observableArrayList();
|
private final ObservableList<BlindVotePayload> blindVotePayloads = FXCollections.observableArrayList();
|
||||||
|
@ -60,12 +64,15 @@ public class BlindVoteListService implements AppendOnlyDataStoreListener, DaoSta
|
||||||
@Inject
|
@Inject
|
||||||
public BlindVoteListService(DaoStateService daoStateService,
|
public BlindVoteListService(DaoStateService daoStateService,
|
||||||
P2PService p2PService,
|
P2PService p2PService,
|
||||||
|
PeriodService periodService,
|
||||||
BlindVoteStorageService blindVoteStorageService,
|
BlindVoteStorageService blindVoteStorageService,
|
||||||
AppendOnlyDataStoreService appendOnlyDataStoreService,
|
AppendOnlyDataStoreService appendOnlyDataStoreService,
|
||||||
BlindVoteValidator blindVoteValidator,
|
BlindVoteValidator blindVoteValidator,
|
||||||
@Named(DaoOptionKeys.DAO_ACTIVATED) boolean daoActivated) {
|
@Named(DaoOptionKeys.DAO_ACTIVATED) boolean daoActivated) {
|
||||||
this.daoStateService = daoStateService;
|
this.daoStateService = daoStateService;
|
||||||
this.p2PService = p2PService;
|
this.p2PService = p2PService;
|
||||||
|
this.periodService = periodService;
|
||||||
|
this.blindVoteStorageService = blindVoteStorageService;
|
||||||
this.blindVoteValidator = blindVoteValidator;
|
this.blindVoteValidator = blindVoteValidator;
|
||||||
|
|
||||||
if (daoActivated)
|
if (daoActivated)
|
||||||
|
@ -80,7 +87,6 @@ public class BlindVoteListService implements AppendOnlyDataStoreListener, DaoSta
|
||||||
@Override
|
@Override
|
||||||
public void addListeners() {
|
public void addListeners() {
|
||||||
daoStateService.addDaoStateListener(this);
|
daoStateService.addDaoStateListener(this);
|
||||||
p2PService.getP2PDataStorage().addAppendOnlyDataStoreListener(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -93,9 +99,18 @@ public class BlindVoteListService implements AppendOnlyDataStoreListener, DaoSta
|
||||||
// DaoStateListener
|
// DaoStateListener
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onNewBlockHeight(int blockHeight) {
|
||||||
|
// We only add blindVotes to blindVoteStorageService if we are not in the vote reveal phase.
|
||||||
|
blindVoteStorageService.setNotInVoteRevealPhase(notInVoteRevealPhase(blockHeight));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onParseBlockChainComplete() {
|
public void onParseBlockChainComplete() {
|
||||||
fillListFromAppendOnlyDataStore();
|
fillListFromAppendOnlyDataStore();
|
||||||
|
|
||||||
|
// We set the listener after parsing is complete to be sure we have a consistent state for the phase check.
|
||||||
|
p2PService.getP2PDataStorage().addAppendOnlyDataStoreListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -133,7 +148,7 @@ public class BlindVoteListService implements AppendOnlyDataStoreListener, DaoSta
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
private void fillListFromAppendOnlyDataStore() {
|
private void fillListFromAppendOnlyDataStore() {
|
||||||
p2PService.getP2PDataStorage().getAppendOnlyDataStoreMap().values().forEach(e -> onAppendOnlyDataAdded(e, false));
|
blindVoteStorageService.getMap().values().forEach(e -> onAppendOnlyDataAdded(e, false));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onAppendOnlyDataAdded(PersistableNetworkPayload persistableNetworkPayload, boolean fromBroadcastMessage) {
|
private void onAppendOnlyDataAdded(PersistableNetworkPayload persistableNetworkPayload, boolean fromBroadcastMessage) {
|
||||||
|
@ -142,18 +157,30 @@ public class BlindVoteListService implements AppendOnlyDataStoreListener, DaoSta
|
||||||
if (!blindVotePayloads.contains(blindVotePayload)) {
|
if (!blindVotePayloads.contains(blindVotePayload)) {
|
||||||
BlindVote blindVote = blindVotePayload.getBlindVote();
|
BlindVote blindVote = blindVotePayload.getBlindVote();
|
||||||
String txId = blindVote.getTxId();
|
String txId = blindVote.getTxId();
|
||||||
// We don't validate as we might receive blindVotes from other cycles or phases at startup.
|
|
||||||
// Beside that we might receive payloads we requested at the vote result phase in case we missed some
|
|
||||||
// payloads. We prefer here resilience over protection against late publishing attacks.
|
|
||||||
if (blindVoteValidator.areDataFieldsValid(blindVote)) {
|
if (blindVoteValidator.areDataFieldsValid(blindVote)) {
|
||||||
if (fromBroadcastMessage) {
|
if (fromBroadcastMessage) {
|
||||||
log.info("We received a blindVotePayload. blindVoteTxId={}", txId);
|
if (notInVoteRevealPhase(daoStateService.getChainHeight())) {
|
||||||
|
// We received the payload outside the vote reveal phase and add the payload.
|
||||||
|
// If we would accept it during the vote reveal phase we would be vulnerable to a late
|
||||||
|
// publishing attack where the attacker tries to pollute the data view of the voters and
|
||||||
|
// render the whole voting cycle invalid if the majority hash is not at least 80% of the
|
||||||
|
// vote stake.
|
||||||
|
blindVotePayloads.add(blindVotePayload);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// In case we received the data from the seed node at startup we cannot apply the phase check as
|
||||||
|
// even in the vote reveal phase we want to receive missed blind votes.
|
||||||
|
blindVotePayloads.add(blindVotePayload);
|
||||||
}
|
}
|
||||||
blindVotePayloads.add(blindVotePayload);
|
|
||||||
} else {
|
} else {
|
||||||
log.warn("We received an invalid blindVotePayload. blindVoteTxId={}", txId);
|
log.warn("We received an invalid blindVotePayload. blindVoteTxId={}", txId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean notInVoteRevealPhase(int blockHeight) {
|
||||||
|
return !periodService.isInPhase(blockHeight, DaoPhase.Phase.VOTE_REVEAL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -136,7 +136,7 @@ public class MyBlindVoteListService implements PersistedDataHost, DaoStateListen
|
||||||
this.myVoteListService = myVoteListService;
|
this.myVoteListService = myVoteListService;
|
||||||
this.myProposalListService = myProposalListService;
|
this.myProposalListService = myProposalListService;
|
||||||
|
|
||||||
numConnectedPeersListener = (observable, oldValue, newValue) -> rePublishMyBlindVoteOnceWellConnected();
|
numConnectedPeersListener = (observable, oldValue, newValue) -> maybeRePublishMyBlindVote();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -177,7 +177,7 @@ public class MyBlindVoteListService implements PersistedDataHost, DaoStateListen
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onParseBlockChainComplete() {
|
public void onParseBlockChainComplete() {
|
||||||
rePublishMyBlindVoteOnceWellConnected();
|
maybeRePublishMyBlindVote();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -263,7 +263,7 @@ public class MyBlindVoteListService implements PersistedDataHost, DaoStateListen
|
||||||
private byte[] getOpReturnData(byte[] encryptedVotes) throws IOException {
|
private byte[] getOpReturnData(byte[] encryptedVotes) throws IOException {
|
||||||
// We cannot use hash of whole blindVote data because we create the merit signature with the blindVoteTxId
|
// We cannot use hash of whole blindVote data because we create the merit signature with the blindVoteTxId
|
||||||
// So we use the encryptedVotes for the hash only.
|
// So we use the encryptedVotes for the hash only.
|
||||||
final byte[] hash = BlindVoteConsensus.getHashOfEncryptedProposalList(encryptedVotes);
|
final byte[] hash = BlindVoteConsensus.getHashOfEncryptedVotes(encryptedVotes);
|
||||||
log.info("Sha256Ripemd160 hash of encryptedVotes: " + Utilities.bytesAsHexString(hash));
|
log.info("Sha256Ripemd160 hash of encryptedVotes: " + Utilities.bytesAsHexString(hash));
|
||||||
return BlindVoteConsensus.getOpReturnData(hash);
|
return BlindVoteConsensus.getOpReturnData(hash);
|
||||||
}
|
}
|
||||||
|
@ -353,23 +353,31 @@ public class MyBlindVoteListService implements PersistedDataHost, DaoStateListen
|
||||||
return bsqWalletService.signTx(txWithBtcFee);
|
return bsqWalletService.signTx(txWithBtcFee);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void rePublishMyBlindVoteOnceWellConnected() {
|
private void maybeRePublishMyBlindVote() {
|
||||||
// We republish at each startup at any block during the cycle. We filter anyway for valid blind votes
|
// We do not republish during vote reveal phase as peer would reject blindVote data to protect against
|
||||||
// of that cycle so it is 1 blind vote getting rebroadcast at each startup to my neighbors.
|
// late publishing attacks.
|
||||||
// Republishing only will have effect if the payload creation date is < 5 hours as other nodes would not
|
// This attack is only relevant during the vote reveal phase as there it could cause damage by disturbing the
|
||||||
// accept payloads which are too old or are in future.
|
// data view of the blind votes of the voter for creating the majority hash.
|
||||||
// Only payloads received from seed nodes would ignore that date check.
|
// To republish after the vote reveal phase still makes sense to reduce risk that some nodes have not received
|
||||||
int minPeers = BisqEnvironment.getBaseCurrencyNetwork().isMainnet() ? 4 : 1;
|
// it and would need to request the data then in the vote result phase.
|
||||||
if ((p2PService.getNumConnectedPeers().get() >= minPeers && p2PService.isBootstrapped()) ||
|
if (!periodService.isInPhase(daoStateService.getChainHeight(), DaoPhase.Phase.VOTE_REVEAL)) {
|
||||||
BisqEnvironment.getBaseCurrencyNetwork().isRegtest()) {
|
// We republish at each startup at any block during the cycle. We filter anyway for valid blind votes
|
||||||
myBlindVoteList.stream()
|
// of that cycle so it is 1 blind vote getting rebroadcast at each startup to my neighbors.
|
||||||
.filter(blindVote -> periodService.isTxInPhaseAndCycle(blindVote.getTxId(),
|
// Republishing only will have effect if the payload creation date is < 5 hours as other nodes would not
|
||||||
DaoPhase.Phase.BLIND_VOTE,
|
// accept payloads which are too old or are in future.
|
||||||
periodService.getChainHeight()))
|
// Only payloads received from seed nodes would ignore that date check.
|
||||||
.forEach(blindVote -> addToP2PNetwork(blindVote, null));
|
int minPeers = BisqEnvironment.getBaseCurrencyNetwork().isMainnet() ? 4 : 1;
|
||||||
|
if ((p2PService.getNumConnectedPeers().get() >= minPeers && p2PService.isBootstrapped()) ||
|
||||||
|
BisqEnvironment.getBaseCurrencyNetwork().isRegtest()) {
|
||||||
|
myBlindVoteList.stream()
|
||||||
|
.filter(blindVote -> periodService.isTxInPhaseAndCycle(blindVote.getTxId(),
|
||||||
|
DaoPhase.Phase.BLIND_VOTE,
|
||||||
|
periodService.getChainHeight()))
|
||||||
|
.forEach(blindVote -> addToP2PNetwork(blindVote, null));
|
||||||
|
|
||||||
// We delay removal of listener as we call that inside listener itself.
|
// We delay removal of listener as we call that inside listener itself.
|
||||||
UserThread.execute(() -> p2PService.getNumConnectedPeers().removeListener(numConnectedPeersListener));
|
UserThread.execute(() -> p2PService.getNumConnectedPeers().removeListener(numConnectedPeersListener));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -52,7 +52,6 @@ import javax.annotation.concurrent.Immutable;
|
||||||
@EqualsAndHashCode
|
@EqualsAndHashCode
|
||||||
public final class BlindVotePayload implements PersistableNetworkPayload, PersistableEnvelope,
|
public final class BlindVotePayload implements PersistableNetworkPayload, PersistableEnvelope,
|
||||||
CapabilityRequiringPayload, ConsensusCritical {
|
CapabilityRequiringPayload, ConsensusCritical {
|
||||||
private static final long TOLERANCE = TimeUnit.HOURS.toMillis(5); // +/- 5 hours
|
|
||||||
|
|
||||||
private final BlindVote blindVote;
|
private final BlindVote blindVote;
|
||||||
protected final byte[] hash; // 20 byte
|
protected final byte[] hash; // 20 byte
|
||||||
|
|
|
@ -31,12 +31,18 @@ import java.io.File;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import lombok.Setter;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class BlindVoteStorageService extends MapStoreService<BlindVoteStore, PersistableNetworkPayload> {
|
public class BlindVoteStorageService extends MapStoreService<BlindVoteStore, PersistableNetworkPayload> {
|
||||||
private static final String FILE_NAME = "BlindVoteStore";
|
private static final String FILE_NAME = "BlindVoteStore";
|
||||||
|
|
||||||
|
// At startup it is true, so the data we receive from the seed node are not checked against the phase as we have
|
||||||
|
// not started up the DAO domain at that moment.
|
||||||
|
@Setter
|
||||||
|
private boolean notInVoteRevealPhase = true;
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Constructor
|
// Constructor
|
||||||
|
@ -64,7 +70,7 @@ public class BlindVoteStorageService extends MapStoreService<BlindVoteStore, Per
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canHandle(PersistableNetworkPayload payload) {
|
public boolean canHandle(PersistableNetworkPayload payload) {
|
||||||
return payload instanceof BlindVotePayload;
|
return payload instanceof BlindVotePayload && notInVoteRevealPhase;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -387,7 +387,7 @@ public class VoteResultService implements DaoStateListener, DaoSetupService {
|
||||||
if (!entry.getValue().isPresent()) {
|
if (!entry.getValue().isPresent()) {
|
||||||
log.warn("We found a local vote but don't have that vote in the data from the " +
|
log.warn("We found a local vote but don't have that vote in the data from the " +
|
||||||
"blind vote. ballot={}", ballot);
|
"blind vote. ballot={}", ballot);
|
||||||
} else if (ballot.getVote() != entry.getValue().get()) {
|
} else if (!ballot.getVote().equals(entry.getValue().get())) {
|
||||||
log.warn("We found a local vote but the vote from the " +
|
log.warn("We found a local vote but the vote from the " +
|
||||||
"blind vote does not match. ballot={}, vote from blindVote data={}",
|
"blind vote does not match. ballot={}, vote from blindVote data={}",
|
||||||
ballot, entry.getValue().get());
|
ballot, entry.getValue().get());
|
||||||
|
|
|
@ -28,7 +28,6 @@ import bisq.core.dao.DaoSetupService;
|
||||||
import bisq.core.dao.governance.blindvote.BlindVote;
|
import bisq.core.dao.governance.blindvote.BlindVote;
|
||||||
import bisq.core.dao.governance.blindvote.BlindVoteConsensus;
|
import bisq.core.dao.governance.blindvote.BlindVoteConsensus;
|
||||||
import bisq.core.dao.governance.blindvote.BlindVoteListService;
|
import bisq.core.dao.governance.blindvote.BlindVoteListService;
|
||||||
import bisq.core.dao.governance.blindvote.storage.BlindVotePayload;
|
|
||||||
import bisq.core.dao.governance.myvote.MyVote;
|
import bisq.core.dao.governance.myvote.MyVote;
|
||||||
import bisq.core.dao.governance.myvote.MyVoteListService;
|
import bisq.core.dao.governance.myvote.MyVoteListService;
|
||||||
import bisq.core.dao.governance.period.PeriodService;
|
import bisq.core.dao.governance.period.PeriodService;
|
||||||
|
@ -41,7 +40,6 @@ import bisq.core.dao.state.model.governance.DaoPhase;
|
||||||
|
|
||||||
import bisq.network.p2p.P2PService;
|
import bisq.network.p2p.P2PService;
|
||||||
|
|
||||||
import bisq.common.UserThread;
|
|
||||||
import bisq.common.util.Utilities;
|
import bisq.common.util.Utilities;
|
||||||
|
|
||||||
import org.bitcoinj.core.InsufficientMoneyException;
|
import org.bitcoinj.core.InsufficientMoneyException;
|
||||||
|
@ -247,12 +245,6 @@ public class VoteRevealService implements DaoStateListener, DaoSetupService {
|
||||||
// We don't want to wait for a successful broadcast to avoid issues if the broadcast succeeds delayed or at
|
// We don't want to wait for a successful broadcast to avoid issues if the broadcast succeeds delayed or at
|
||||||
// next startup but the tx was actually broadcasted.
|
// next startup but the tx was actually broadcasted.
|
||||||
myVoteListService.applyRevealTxId(myVote, voteRevealTx.getHashAsString());
|
myVoteListService.applyRevealTxId(myVote, voteRevealTx.getHashAsString());
|
||||||
|
|
||||||
if (isInVoteRevealPhase) {
|
|
||||||
// Just for additional resilience we republish our blind votes
|
|
||||||
List<BlindVote> sortedBlindVoteListOfCycle = BlindVoteConsensus.getSortedBlindVoteListOfCycle(blindVoteListService);
|
|
||||||
rePublishBlindVotePayloadList(sortedBlindVoteListOfCycle);
|
|
||||||
}
|
|
||||||
} catch (IOException | WalletException | TransactionVerificationException
|
} catch (IOException | WalletException | TransactionVerificationException
|
||||||
| InsufficientMoneyException e) {
|
| InsufficientMoneyException e) {
|
||||||
voteRevealExceptions.add(new VoteRevealException("Exception at calling revealVote.",
|
voteRevealExceptions.add(new VoteRevealException("Exception at calling revealVote.",
|
||||||
|
@ -285,20 +277,4 @@ public class VoteRevealService implements DaoStateListener, DaoSetupService {
|
||||||
Transaction txWithBtcFee = btcWalletService.completePreparedVoteRevealTx(preparedTx, opReturnData);
|
Transaction txWithBtcFee = btcWalletService.completePreparedVoteRevealTx(preparedTx, opReturnData);
|
||||||
return bsqWalletService.signTx(txWithBtcFee);
|
return bsqWalletService.signTx(txWithBtcFee);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void rePublishBlindVotePayloadList(List<BlindVote> blindVoteList) {
|
|
||||||
// If we have 20 blind votes from 20 voters we would have 400 messages sent to their 10 neighbor peers.
|
|
||||||
// Most of the neighbors will already have the data so they will not continue broadcast.
|
|
||||||
// To not flood the network too much we use a long random delay to spread the load over 5 minutes.
|
|
||||||
// As this is only for extra resilience we don't care so much for the case that the user might shut down the
|
|
||||||
// app before we are finished with our delayed broadcast.
|
|
||||||
// We cannot set reBroadcast to false as otherwise it would not have any effect as we have the data already and
|
|
||||||
// broadcast would only be triggered at new data.
|
|
||||||
blindVoteList.stream()
|
|
||||||
.map(BlindVotePayload::new)
|
|
||||||
.forEach(blindVotePayload -> {
|
|
||||||
UserThread.runAfterRandomDelay(() -> p2PService.addPersistableNetworkPayload(blindVotePayload, true),
|
|
||||||
1, 300);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,7 @@ import bisq.core.dao.state.model.governance.DaoPhase;
|
||||||
|
|
||||||
import bisq.network.p2p.NodeAddress;
|
import bisq.network.p2p.NodeAddress;
|
||||||
import bisq.network.p2p.network.Connection;
|
import bisq.network.p2p.network.Connection;
|
||||||
|
import bisq.network.p2p.seed.SeedNodeRepository;
|
||||||
|
|
||||||
import bisq.common.UserThread;
|
import bisq.common.UserThread;
|
||||||
import bisq.common.crypto.Hash;
|
import bisq.common.crypto.Hash;
|
||||||
|
@ -49,6 +50,7 @@ import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.concurrent.CopyOnWriteArrayList;
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
@ -81,6 +83,7 @@ public class BlindVoteStateMonitoringService implements DaoSetupService, DaoStat
|
||||||
private final GenesisTxInfo genesisTxInfo;
|
private final GenesisTxInfo genesisTxInfo;
|
||||||
private final PeriodService periodService;
|
private final PeriodService periodService;
|
||||||
private final BlindVoteListService blindVoteListService;
|
private final BlindVoteListService blindVoteListService;
|
||||||
|
private final Set<String> seedNodeAddresses;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private final LinkedList<BlindVoteStateBlock> blindVoteStateBlockChain = new LinkedList<>();
|
private final LinkedList<BlindVoteStateBlock> blindVoteStateBlockChain = new LinkedList<>();
|
||||||
|
@ -88,7 +91,9 @@ public class BlindVoteStateMonitoringService implements DaoSetupService, DaoStat
|
||||||
private final LinkedList<BlindVoteStateHash> blindVoteStateHashChain = new LinkedList<>();
|
private final LinkedList<BlindVoteStateHash> blindVoteStateHashChain = new LinkedList<>();
|
||||||
private final List<Listener> listeners = new CopyOnWriteArrayList<>();
|
private final List<Listener> listeners = new CopyOnWriteArrayList<>();
|
||||||
@Getter
|
@Getter
|
||||||
private boolean isInConflict;
|
private boolean isInConflictWithNonSeedNode;
|
||||||
|
@Getter
|
||||||
|
private boolean isInConflictWithSeedNode;
|
||||||
private boolean parseBlockChainComplete;
|
private boolean parseBlockChainComplete;
|
||||||
|
|
||||||
|
|
||||||
|
@ -101,12 +106,16 @@ public class BlindVoteStateMonitoringService implements DaoSetupService, DaoStat
|
||||||
BlindVoteStateNetworkService blindVoteStateNetworkService,
|
BlindVoteStateNetworkService blindVoteStateNetworkService,
|
||||||
GenesisTxInfo genesisTxInfo,
|
GenesisTxInfo genesisTxInfo,
|
||||||
PeriodService periodService,
|
PeriodService periodService,
|
||||||
BlindVoteListService blindVoteListService) {
|
BlindVoteListService blindVoteListService,
|
||||||
|
SeedNodeRepository seedNodeRepository) {
|
||||||
this.daoStateService = daoStateService;
|
this.daoStateService = daoStateService;
|
||||||
this.blindVoteStateNetworkService = blindVoteStateNetworkService;
|
this.blindVoteStateNetworkService = blindVoteStateNetworkService;
|
||||||
this.genesisTxInfo = genesisTxInfo;
|
this.genesisTxInfo = genesisTxInfo;
|
||||||
this.periodService = periodService;
|
this.periodService = periodService;
|
||||||
this.blindVoteListService = blindVoteListService;
|
this.blindVoteListService = blindVoteListService;
|
||||||
|
seedNodeAddresses = seedNodeRepository.getSeedNodeAddresses().stream()
|
||||||
|
.map(NodeAddress::getFullAddress)
|
||||||
|
.collect(Collectors.toSet());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -276,7 +285,8 @@ public class BlindVoteStateMonitoringService implements DaoSetupService, DaoStat
|
||||||
|
|
||||||
private boolean processPeersBlindVoteStateHash(BlindVoteStateHash blindVoteStateHash, Optional<NodeAddress> peersNodeAddress, boolean notifyListeners) {
|
private boolean processPeersBlindVoteStateHash(BlindVoteStateHash blindVoteStateHash, Optional<NodeAddress> peersNodeAddress, boolean notifyListeners) {
|
||||||
AtomicBoolean changed = new AtomicBoolean(false);
|
AtomicBoolean changed = new AtomicBoolean(false);
|
||||||
AtomicBoolean isInConflict = new AtomicBoolean(this.isInConflict);
|
AtomicBoolean inConflictWithNonSeedNode = new AtomicBoolean(this.isInConflictWithNonSeedNode);
|
||||||
|
AtomicBoolean inConflictWithSeedNode = new AtomicBoolean(this.isInConflictWithSeedNode);
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
blindVoteStateBlockChain.stream()
|
blindVoteStateBlockChain.stream()
|
||||||
.filter(e -> e.getHeight() == blindVoteStateHash.getHeight()).findAny()
|
.filter(e -> e.getHeight() == blindVoteStateHash.getHeight()).findAny()
|
||||||
|
@ -286,7 +296,12 @@ public class BlindVoteStateMonitoringService implements DaoSetupService, DaoStat
|
||||||
daoStateBlock.putInPeersMap(peersNodeAddressAsString, blindVoteStateHash);
|
daoStateBlock.putInPeersMap(peersNodeAddressAsString, blindVoteStateHash);
|
||||||
if (!daoStateBlock.getMyStateHash().hasEqualHash(blindVoteStateHash)) {
|
if (!daoStateBlock.getMyStateHash().hasEqualHash(blindVoteStateHash)) {
|
||||||
daoStateBlock.putInConflictMap(peersNodeAddressAsString, blindVoteStateHash);
|
daoStateBlock.putInConflictMap(peersNodeAddressAsString, blindVoteStateHash);
|
||||||
isInConflict.set(true);
|
if (seedNodeAddresses.contains(peersNodeAddressAsString)) {
|
||||||
|
inConflictWithSeedNode.set(true);
|
||||||
|
} else {
|
||||||
|
inConflictWithNonSeedNode.set(true);
|
||||||
|
}
|
||||||
|
|
||||||
sb.append("We received a block hash from peer ")
|
sb.append("We received a block hash from peer ")
|
||||||
.append(peersNodeAddressAsString)
|
.append(peersNodeAddressAsString)
|
||||||
.append(" which conflicts with our block hash.\n")
|
.append(" which conflicts with our block hash.\n")
|
||||||
|
@ -298,11 +313,15 @@ public class BlindVoteStateMonitoringService implements DaoSetupService, DaoStat
|
||||||
changed.set(true);
|
changed.set(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
this.isInConflict = isInConflict.get();
|
this.isInConflictWithNonSeedNode = inConflictWithNonSeedNode.get();
|
||||||
|
this.isInConflictWithSeedNode = inConflictWithSeedNode.get();
|
||||||
|
|
||||||
String conflictMsg = sb.toString();
|
String conflictMsg = sb.toString();
|
||||||
if (this.isInConflict && !conflictMsg.isEmpty()) {
|
if (!conflictMsg.isEmpty()) {
|
||||||
log.warn(conflictMsg);
|
if (this.isInConflictWithSeedNode)
|
||||||
|
log.warn("Conflict with seed nodes: {}", conflictMsg);
|
||||||
|
else if (this.isInConflictWithNonSeedNode)
|
||||||
|
log.info("Conflict with non-seed nodes: {}", conflictMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (notifyListeners && changed.get()) {
|
if (notifyListeners && changed.get()) {
|
||||||
|
|
|
@ -33,6 +33,7 @@ import bisq.core.dao.state.model.governance.IssuanceType;
|
||||||
|
|
||||||
import bisq.network.p2p.NodeAddress;
|
import bisq.network.p2p.NodeAddress;
|
||||||
import bisq.network.p2p.network.Connection;
|
import bisq.network.p2p.network.Connection;
|
||||||
|
import bisq.network.p2p.seed.SeedNodeRepository;
|
||||||
|
|
||||||
import bisq.common.UserThread;
|
import bisq.common.UserThread;
|
||||||
import bisq.common.crypto.Hash;
|
import bisq.common.crypto.Hash;
|
||||||
|
@ -48,6 +49,7 @@ import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.concurrent.CopyOnWriteArrayList;
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
@ -83,6 +85,8 @@ public class DaoStateMonitoringService implements DaoSetupService, DaoStateListe
|
||||||
private final DaoStateService daoStateService;
|
private final DaoStateService daoStateService;
|
||||||
private final DaoStateNetworkService daoStateNetworkService;
|
private final DaoStateNetworkService daoStateNetworkService;
|
||||||
private final GenesisTxInfo genesisTxInfo;
|
private final GenesisTxInfo genesisTxInfo;
|
||||||
|
private final Set<String> seedNodeAddresses;
|
||||||
|
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private final LinkedList<DaoStateBlock> daoStateBlockChain = new LinkedList<>();
|
private final LinkedList<DaoStateBlock> daoStateBlockChain = new LinkedList<>();
|
||||||
|
@ -91,7 +95,9 @@ public class DaoStateMonitoringService implements DaoSetupService, DaoStateListe
|
||||||
private final List<Listener> listeners = new CopyOnWriteArrayList<>();
|
private final List<Listener> listeners = new CopyOnWriteArrayList<>();
|
||||||
private boolean parseBlockChainComplete;
|
private boolean parseBlockChainComplete;
|
||||||
@Getter
|
@Getter
|
||||||
private boolean isInConflict;
|
private boolean isInConflictWithNonSeedNode;
|
||||||
|
@Getter
|
||||||
|
private boolean isInConflictWithSeedNode;
|
||||||
@Getter
|
@Getter
|
||||||
private ObservableList<UtxoMismatch> utxoMismatches = FXCollections.observableArrayList();
|
private ObservableList<UtxoMismatch> utxoMismatches = FXCollections.observableArrayList();
|
||||||
|
|
||||||
|
@ -103,10 +109,14 @@ public class DaoStateMonitoringService implements DaoSetupService, DaoStateListe
|
||||||
@Inject
|
@Inject
|
||||||
public DaoStateMonitoringService(DaoStateService daoStateService,
|
public DaoStateMonitoringService(DaoStateService daoStateService,
|
||||||
DaoStateNetworkService daoStateNetworkService,
|
DaoStateNetworkService daoStateNetworkService,
|
||||||
GenesisTxInfo genesisTxInfo) {
|
GenesisTxInfo genesisTxInfo,
|
||||||
|
SeedNodeRepository seedNodeRepository) {
|
||||||
this.daoStateService = daoStateService;
|
this.daoStateService = daoStateService;
|
||||||
this.daoStateNetworkService = daoStateNetworkService;
|
this.daoStateNetworkService = daoStateNetworkService;
|
||||||
this.genesisTxInfo = genesisTxInfo;
|
this.genesisTxInfo = genesisTxInfo;
|
||||||
|
seedNodeAddresses = seedNodeRepository.getSeedNodeAddresses().stream()
|
||||||
|
.map(NodeAddress::getFullAddress)
|
||||||
|
.collect(Collectors.toSet());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -283,7 +293,8 @@ public class DaoStateMonitoringService implements DaoSetupService, DaoStateListe
|
||||||
|
|
||||||
private boolean processPeersDaoStateHash(DaoStateHash daoStateHash, Optional<NodeAddress> peersNodeAddress, boolean notifyListeners) {
|
private boolean processPeersDaoStateHash(DaoStateHash daoStateHash, Optional<NodeAddress> peersNodeAddress, boolean notifyListeners) {
|
||||||
AtomicBoolean changed = new AtomicBoolean(false);
|
AtomicBoolean changed = new AtomicBoolean(false);
|
||||||
AtomicBoolean isInConflict = new AtomicBoolean(this.isInConflict);
|
AtomicBoolean inConflictWithNonSeedNode = new AtomicBoolean(this.isInConflictWithNonSeedNode);
|
||||||
|
AtomicBoolean inConflictWithSeedNode = new AtomicBoolean(this.isInConflictWithSeedNode);
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
daoStateBlockChain.stream()
|
daoStateBlockChain.stream()
|
||||||
.filter(e -> e.getHeight() == daoStateHash.getHeight()).findAny()
|
.filter(e -> e.getHeight() == daoStateHash.getHeight()).findAny()
|
||||||
|
@ -293,7 +304,11 @@ public class DaoStateMonitoringService implements DaoSetupService, DaoStateListe
|
||||||
daoStateBlock.putInPeersMap(peersNodeAddressAsString, daoStateHash);
|
daoStateBlock.putInPeersMap(peersNodeAddressAsString, daoStateHash);
|
||||||
if (!daoStateBlock.getMyStateHash().hasEqualHash(daoStateHash)) {
|
if (!daoStateBlock.getMyStateHash().hasEqualHash(daoStateHash)) {
|
||||||
daoStateBlock.putInConflictMap(peersNodeAddressAsString, daoStateHash);
|
daoStateBlock.putInConflictMap(peersNodeAddressAsString, daoStateHash);
|
||||||
isInConflict.set(true);
|
if (seedNodeAddresses.contains(peersNodeAddressAsString)) {
|
||||||
|
inConflictWithSeedNode.set(true);
|
||||||
|
} else {
|
||||||
|
inConflictWithNonSeedNode.set(true);
|
||||||
|
}
|
||||||
sb.append("We received a block hash from peer ")
|
sb.append("We received a block hash from peer ")
|
||||||
.append(peersNodeAddressAsString)
|
.append(peersNodeAddressAsString)
|
||||||
.append(" which conflicts with our block hash.\n")
|
.append(" which conflicts with our block hash.\n")
|
||||||
|
@ -305,13 +320,18 @@ public class DaoStateMonitoringService implements DaoSetupService, DaoStateListe
|
||||||
changed.set(true);
|
changed.set(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
this.isInConflict = isInConflict.get();
|
this.isInConflictWithNonSeedNode = inConflictWithNonSeedNode.get();
|
||||||
|
this.isInConflictWithSeedNode = inConflictWithSeedNode.get();
|
||||||
|
|
||||||
String conflictMsg = sb.toString();
|
String conflictMsg = sb.toString();
|
||||||
if (this.isInConflict && !conflictMsg.isEmpty()) {
|
if (!conflictMsg.isEmpty()) {
|
||||||
log.warn(conflictMsg);
|
if (this.isInConflictWithSeedNode)
|
||||||
|
log.warn("Conflict with seed nodes: {}", conflictMsg);
|
||||||
|
else if (this.isInConflictWithNonSeedNode)
|
||||||
|
log.info("Conflict with non-seed nodes: {}", conflictMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (notifyListeners && changed.get()) {
|
if (notifyListeners && changed.get()) {
|
||||||
listeners.forEach(Listener::onChangeAfterBatchProcessing);
|
listeners.forEach(Listener::onChangeAfterBatchProcessing);
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,7 @@ import bisq.core.dao.state.model.governance.Proposal;
|
||||||
|
|
||||||
import bisq.network.p2p.NodeAddress;
|
import bisq.network.p2p.NodeAddress;
|
||||||
import bisq.network.p2p.network.Connection;
|
import bisq.network.p2p.network.Connection;
|
||||||
|
import bisq.network.p2p.seed.SeedNodeRepository;
|
||||||
|
|
||||||
import bisq.common.UserThread;
|
import bisq.common.UserThread;
|
||||||
import bisq.common.crypto.Hash;
|
import bisq.common.crypto.Hash;
|
||||||
|
@ -49,6 +50,7 @@ import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.concurrent.CopyOnWriteArrayList;
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
@ -81,6 +83,8 @@ public class ProposalStateMonitoringService implements DaoSetupService, DaoState
|
||||||
private final GenesisTxInfo genesisTxInfo;
|
private final GenesisTxInfo genesisTxInfo;
|
||||||
private final PeriodService periodService;
|
private final PeriodService periodService;
|
||||||
private final ProposalService proposalService;
|
private final ProposalService proposalService;
|
||||||
|
private final Set<String> seedNodeAddresses;
|
||||||
|
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private final LinkedList<ProposalStateBlock> proposalStateBlockChain = new LinkedList<>();
|
private final LinkedList<ProposalStateBlock> proposalStateBlockChain = new LinkedList<>();
|
||||||
|
@ -88,7 +92,9 @@ public class ProposalStateMonitoringService implements DaoSetupService, DaoState
|
||||||
private final LinkedList<ProposalStateHash> proposalStateHashChain = new LinkedList<>();
|
private final LinkedList<ProposalStateHash> proposalStateHashChain = new LinkedList<>();
|
||||||
private final List<Listener> listeners = new CopyOnWriteArrayList<>();
|
private final List<Listener> listeners = new CopyOnWriteArrayList<>();
|
||||||
@Getter
|
@Getter
|
||||||
private boolean isInConflict;
|
private boolean isInConflictWithNonSeedNode;
|
||||||
|
@Getter
|
||||||
|
private boolean isInConflictWithSeedNode;
|
||||||
private boolean parseBlockChainComplete;
|
private boolean parseBlockChainComplete;
|
||||||
|
|
||||||
|
|
||||||
|
@ -101,12 +107,16 @@ public class ProposalStateMonitoringService implements DaoSetupService, DaoState
|
||||||
ProposalStateNetworkService proposalStateNetworkService,
|
ProposalStateNetworkService proposalStateNetworkService,
|
||||||
GenesisTxInfo genesisTxInfo,
|
GenesisTxInfo genesisTxInfo,
|
||||||
PeriodService periodService,
|
PeriodService periodService,
|
||||||
ProposalService proposalService) {
|
ProposalService proposalService,
|
||||||
|
SeedNodeRepository seedNodeRepository) {
|
||||||
this.daoStateService = daoStateService;
|
this.daoStateService = daoStateService;
|
||||||
this.proposalStateNetworkService = proposalStateNetworkService;
|
this.proposalStateNetworkService = proposalStateNetworkService;
|
||||||
this.genesisTxInfo = genesisTxInfo;
|
this.genesisTxInfo = genesisTxInfo;
|
||||||
this.periodService = periodService;
|
this.periodService = periodService;
|
||||||
this.proposalService = proposalService;
|
this.proposalService = proposalService;
|
||||||
|
seedNodeAddresses = seedNodeRepository.getSeedNodeAddresses().stream()
|
||||||
|
.map(NodeAddress::getFullAddress)
|
||||||
|
.collect(Collectors.toSet());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -280,7 +290,8 @@ public class ProposalStateMonitoringService implements DaoSetupService, DaoState
|
||||||
|
|
||||||
private boolean processPeersProposalStateHash(ProposalStateHash proposalStateHash, Optional<NodeAddress> peersNodeAddress, boolean notifyListeners) {
|
private boolean processPeersProposalStateHash(ProposalStateHash proposalStateHash, Optional<NodeAddress> peersNodeAddress, boolean notifyListeners) {
|
||||||
AtomicBoolean changed = new AtomicBoolean(false);
|
AtomicBoolean changed = new AtomicBoolean(false);
|
||||||
AtomicBoolean isInConflict = new AtomicBoolean(this.isInConflict);
|
AtomicBoolean inConflictWithNonSeedNode = new AtomicBoolean(this.isInConflictWithNonSeedNode);
|
||||||
|
AtomicBoolean inConflictWithSeedNode = new AtomicBoolean(this.isInConflictWithSeedNode);
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
proposalStateBlockChain.stream()
|
proposalStateBlockChain.stream()
|
||||||
.filter(e -> e.getHeight() == proposalStateHash.getHeight()).findAny()
|
.filter(e -> e.getHeight() == proposalStateHash.getHeight()).findAny()
|
||||||
|
@ -290,7 +301,11 @@ public class ProposalStateMonitoringService implements DaoSetupService, DaoState
|
||||||
daoStateBlock.putInPeersMap(peersNodeAddressAsString, proposalStateHash);
|
daoStateBlock.putInPeersMap(peersNodeAddressAsString, proposalStateHash);
|
||||||
if (!daoStateBlock.getMyStateHash().hasEqualHash(proposalStateHash)) {
|
if (!daoStateBlock.getMyStateHash().hasEqualHash(proposalStateHash)) {
|
||||||
daoStateBlock.putInConflictMap(peersNodeAddressAsString, proposalStateHash);
|
daoStateBlock.putInConflictMap(peersNodeAddressAsString, proposalStateHash);
|
||||||
isInConflict.set(true);
|
if (seedNodeAddresses.contains(peersNodeAddressAsString)) {
|
||||||
|
inConflictWithSeedNode.set(true);
|
||||||
|
} else {
|
||||||
|
inConflictWithNonSeedNode.set(true);
|
||||||
|
}
|
||||||
sb.append("We received a block hash from peer ")
|
sb.append("We received a block hash from peer ")
|
||||||
.append(peersNodeAddressAsString)
|
.append(peersNodeAddressAsString)
|
||||||
.append(" which conflicts with our block hash.\n")
|
.append(" which conflicts with our block hash.\n")
|
||||||
|
@ -302,11 +317,15 @@ public class ProposalStateMonitoringService implements DaoSetupService, DaoState
|
||||||
changed.set(true);
|
changed.set(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
this.isInConflict = isInConflict.get();
|
this.isInConflictWithNonSeedNode = inConflictWithNonSeedNode.get();
|
||||||
|
this.isInConflictWithSeedNode = inConflictWithSeedNode.get();
|
||||||
|
|
||||||
String conflictMsg = sb.toString();
|
String conflictMsg = sb.toString();
|
||||||
if (this.isInConflict && !conflictMsg.isEmpty()) {
|
if (!conflictMsg.isEmpty()) {
|
||||||
log.warn(conflictMsg);
|
if (this.isInConflictWithSeedNode)
|
||||||
|
log.warn("Conflict with seed nodes: {}", conflictMsg);
|
||||||
|
else if (this.isInConflictWithNonSeedNode)
|
||||||
|
log.info("Conflict with non-seed nodes: {}", conflictMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (notifyListeners && changed.get()) {
|
if (notifyListeners && changed.get()) {
|
||||||
|
|
|
@ -28,8 +28,6 @@ import bisq.common.proto.persistable.PersistablePayload;
|
||||||
|
|
||||||
import io.bisq.generated.protobuffer.PB;
|
import io.bisq.generated.protobuffer.PB;
|
||||||
|
|
||||||
import java.math.BigInteger;
|
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@ -104,8 +102,7 @@ public final class Role implements PersistablePayload, NetworkPayload, BondedAss
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public byte[] getHash() {
|
public byte[] getHash() {
|
||||||
// We use only the immutable data as input for hash
|
byte[] bytes = toProtoMessage().toByteArray();
|
||||||
byte[] bytes = BigInteger.valueOf(hashCode()).toByteArray();
|
|
||||||
return Hash.getSha256Ripemd160hash(bytes);
|
return Hash.getSha256Ripemd160hash(bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -90,6 +90,10 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload {
|
||||||
// added in v0.9.4
|
// added in v0.9.4
|
||||||
private final boolean disableDao;
|
private final boolean disableDao;
|
||||||
|
|
||||||
|
// added in v0.9.8
|
||||||
|
@Nullable
|
||||||
|
private final String disableDaoBelowVersion;
|
||||||
|
|
||||||
public Filter(List<String> bannedOfferIds,
|
public Filter(List<String> bannedOfferIds,
|
||||||
List<String> bannedNodeAddress,
|
List<String> bannedNodeAddress,
|
||||||
List<PaymentAccountFilter> bannedPaymentAccounts,
|
List<PaymentAccountFilter> bannedPaymentAccounts,
|
||||||
|
@ -100,7 +104,8 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload {
|
||||||
@Nullable List<String> priceRelayNodes,
|
@Nullable List<String> priceRelayNodes,
|
||||||
boolean preventPublicBtcNetwork,
|
boolean preventPublicBtcNetwork,
|
||||||
@Nullable List<String> btcNodes,
|
@Nullable List<String> btcNodes,
|
||||||
boolean disableDao) {
|
boolean disableDao,
|
||||||
|
@Nullable String disableDaoBelowVersion) {
|
||||||
this.bannedOfferIds = bannedOfferIds;
|
this.bannedOfferIds = bannedOfferIds;
|
||||||
this.bannedNodeAddress = bannedNodeAddress;
|
this.bannedNodeAddress = bannedNodeAddress;
|
||||||
this.bannedPaymentAccounts = bannedPaymentAccounts;
|
this.bannedPaymentAccounts = bannedPaymentAccounts;
|
||||||
|
@ -112,6 +117,7 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload {
|
||||||
this.preventPublicBtcNetwork = preventPublicBtcNetwork;
|
this.preventPublicBtcNetwork = preventPublicBtcNetwork;
|
||||||
this.btcNodes = btcNodes;
|
this.btcNodes = btcNodes;
|
||||||
this.disableDao = disableDao;
|
this.disableDao = disableDao;
|
||||||
|
this.disableDaoBelowVersion = disableDaoBelowVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -131,6 +137,7 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload {
|
||||||
boolean preventPublicBtcNetwork,
|
boolean preventPublicBtcNetwork,
|
||||||
@Nullable List<String> btcNodes,
|
@Nullable List<String> btcNodes,
|
||||||
boolean disableDao,
|
boolean disableDao,
|
||||||
|
@Nullable String disableDaoBelowVersion,
|
||||||
String signatureAsBase64,
|
String signatureAsBase64,
|
||||||
byte[] ownerPubKeyBytes,
|
byte[] ownerPubKeyBytes,
|
||||||
@Nullable Map<String, String> extraDataMap) {
|
@Nullable Map<String, String> extraDataMap) {
|
||||||
|
@ -144,7 +151,8 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload {
|
||||||
priceRelayNodes,
|
priceRelayNodes,
|
||||||
preventPublicBtcNetwork,
|
preventPublicBtcNetwork,
|
||||||
btcNodes,
|
btcNodes,
|
||||||
disableDao);
|
disableDao,
|
||||||
|
disableDaoBelowVersion);
|
||||||
this.signatureAsBase64 = signatureAsBase64;
|
this.signatureAsBase64 = signatureAsBase64;
|
||||||
this.ownerPubKeyBytes = ownerPubKeyBytes;
|
this.ownerPubKeyBytes = ownerPubKeyBytes;
|
||||||
this.extraDataMap = ExtraDataMapValidator.getValidatedExtraDataMap(extraDataMap);
|
this.extraDataMap = ExtraDataMapValidator.getValidatedExtraDataMap(extraDataMap);
|
||||||
|
@ -174,6 +182,7 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload {
|
||||||
Optional.ofNullable(seedNodes).ifPresent(builder::addAllSeedNodes);
|
Optional.ofNullable(seedNodes).ifPresent(builder::addAllSeedNodes);
|
||||||
Optional.ofNullable(priceRelayNodes).ifPresent(builder::addAllPriceRelayNodes);
|
Optional.ofNullable(priceRelayNodes).ifPresent(builder::addAllPriceRelayNodes);
|
||||||
Optional.ofNullable(btcNodes).ifPresent(builder::addAllBtcNodes);
|
Optional.ofNullable(btcNodes).ifPresent(builder::addAllBtcNodes);
|
||||||
|
Optional.ofNullable(disableDaoBelowVersion).ifPresent(builder::setDisableDaoBelowVersion);
|
||||||
Optional.ofNullable(extraDataMap).ifPresent(builder::putAllExtraData);
|
Optional.ofNullable(extraDataMap).ifPresent(builder::putAllExtraData);
|
||||||
|
|
||||||
return PB.StoragePayload.newBuilder().setFilter(builder).build();
|
return PB.StoragePayload.newBuilder().setFilter(builder).build();
|
||||||
|
@ -193,6 +202,7 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload {
|
||||||
proto.getPreventPublicBtcNetwork(),
|
proto.getPreventPublicBtcNetwork(),
|
||||||
CollectionUtils.isEmpty(proto.getBtcNodesList()) ? null : new ArrayList<>(proto.getBtcNodesList()),
|
CollectionUtils.isEmpty(proto.getBtcNodesList()) ? null : new ArrayList<>(proto.getBtcNodesList()),
|
||||||
proto.getDisableDao(),
|
proto.getDisableDao(),
|
||||||
|
proto.getDisableDaoBelowVersion().isEmpty() ? null : proto.getDisableDaoBelowVersion(),
|
||||||
proto.getSignatureAsBase64(),
|
proto.getSignatureAsBase64(),
|
||||||
proto.getOwnerPubKeyBytes().toByteArray(),
|
proto.getOwnerPubKeyBytes().toByteArray(),
|
||||||
CollectionUtils.isEmpty(proto.getExtraDataMap()) ? null : proto.getExtraDataMap());
|
CollectionUtils.isEmpty(proto.getExtraDataMap()) ? null : proto.getExtraDataMap());
|
||||||
|
@ -205,7 +215,7 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long getTTL() {
|
public long getTTL() {
|
||||||
return TimeUnit.DAYS.toMillis(90);
|
return TimeUnit.DAYS.toMillis(180);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSigAndPubKey(String signatureAsBase64, PublicKey ownerPubKey) {
|
public void setSigAndPubKey(String signatureAsBase64, PublicKey ownerPubKey) {
|
||||||
|
|
|
@ -771,6 +771,7 @@ funds.tx.unknown=Unknown reason: {0}
|
||||||
funds.tx.noFundsFromDispute=No refund from dispute
|
funds.tx.noFundsFromDispute=No refund from dispute
|
||||||
funds.tx.receivedFunds=Received funds
|
funds.tx.receivedFunds=Received funds
|
||||||
funds.tx.withdrawnFromWallet=Withdrawn from wallet
|
funds.tx.withdrawnFromWallet=Withdrawn from wallet
|
||||||
|
funds.tx.withdrawnFromBSQWallet=BTC withdrawn from BSQ wallet
|
||||||
funds.tx.noTxAvailable=No transactions available
|
funds.tx.noTxAvailable=No transactions available
|
||||||
funds.tx.revert=Revert
|
funds.tx.revert=Revert
|
||||||
funds.tx.txSent=Transaction successfully sent to a new address in the local Bisq wallet.
|
funds.tx.txSent=Transaction successfully sent to a new address in the local Bisq wallet.
|
||||||
|
@ -900,7 +901,8 @@ settings.preferences.selectCurrencyNetwork=Select network
|
||||||
setting.preferences.daoOptions=DAO options
|
setting.preferences.daoOptions=DAO options
|
||||||
setting.preferences.dao.resync.label=Rebuild DAO state from genesis tx
|
setting.preferences.dao.resync.label=Rebuild DAO state from genesis tx
|
||||||
setting.preferences.dao.resync.button=Resync
|
setting.preferences.dao.resync.button=Resync
|
||||||
setting.preferences.dao.resync.popup=After an application restart the BSQ consensus state will be rebuilt from the genesis transaction.
|
setting.preferences.dao.resync.popup=After an application restart the P2P network governance data will be reloaded from \
|
||||||
|
the seed nodes and the BSQ consensus state will be rebuilt from the genesis transaction.
|
||||||
setting.preferences.dao.isDaoFullNode=Run Bisq as DAO full node
|
setting.preferences.dao.isDaoFullNode=Run Bisq as DAO full node
|
||||||
setting.preferences.dao.rpcUser=RPC username
|
setting.preferences.dao.rpcUser=RPC username
|
||||||
setting.preferences.dao.rpcPw=RPC password
|
setting.preferences.dao.rpcPw=RPC password
|
||||||
|
@ -1821,6 +1823,7 @@ dao.tx.type.enum.PROOF_OF_BURN=Proof of burn
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.tx.type.enum.IRREGULAR=Irregular
|
dao.tx.type.enum.IRREGULAR=Irregular
|
||||||
|
|
||||||
|
dao.tx.withdrawnFromWallet=BTC withdrawn from wallet
|
||||||
dao.tx.issuanceFromCompReq=Compensation request/issuance
|
dao.tx.issuanceFromCompReq=Compensation request/issuance
|
||||||
dao.tx.issuanceFromCompReq.tooltip=Compensation request which led to an issuance of new BSQ.\n\
|
dao.tx.issuanceFromCompReq.tooltip=Compensation request which led to an issuance of new BSQ.\n\
|
||||||
Issuance date: {0}
|
Issuance date: {0}
|
||||||
|
@ -1837,8 +1840,14 @@ dao.proposal.create.missingBsqFundsForBond=You don''t have sufficient BSQ funds
|
||||||
Missing: {0}
|
Missing: {0}
|
||||||
|
|
||||||
dao.proposal.create.missingMinerFeeFunds=You don''t have sufficient BTC funds for creating the proposal transaction. \
|
dao.proposal.create.missingMinerFeeFunds=You don''t have sufficient BTC funds for creating the proposal transaction. \
|
||||||
Any BSQ transaction require also a miner fee in BTC.\n\
|
All BSQ transactions require a miner fee in BTC.\n\
|
||||||
Missing: {0}
|
Missing: {0}
|
||||||
|
|
||||||
|
dao.proposal.create.missingIssuanceFunds=You don''t have sufficient BTC funds for creating the proposal transaction. \
|
||||||
|
All BSQ transactions require a miner fee in BTC, and issuance transactions also require BTC for the requested BSQ \
|
||||||
|
amount ({0} Satoshis/BSQ).\n\
|
||||||
|
Missing: {1}
|
||||||
|
|
||||||
dao.feeTx.confirm=Confirm {0} transaction
|
dao.feeTx.confirm=Confirm {0} transaction
|
||||||
dao.feeTx.confirm.details={0} fee: {1}\n\
|
dao.feeTx.confirm.details={0} fee: {1}\n\
|
||||||
Mining fee: {2} ({3} Satoshis/byte)\n\
|
Mining fee: {2} ({3} Satoshis/byte)\n\
|
||||||
|
@ -1847,9 +1856,9 @@ dao.feeTx.confirm.details={0} fee: {1}\n\
|
||||||
|
|
||||||
dao.feeTx.issuanceProposal.confirm.details={0} fee: {1}\n\
|
dao.feeTx.issuanceProposal.confirm.details={0} fee: {1}\n\
|
||||||
BTC needed for BSQ issuance: {2} ({3} Satoshis/BSQ)\n\
|
BTC needed for BSQ issuance: {2} ({3} Satoshis/BSQ)\n\
|
||||||
On acceptance, the proposal fee will be deducted from the issued BSQ.\n\n\
|
|
||||||
Mining fee: {4} ({5} Satoshis/byte)\n\
|
Mining fee: {4} ({5} Satoshis/byte)\n\
|
||||||
Transaction size: {6} Kb\n\n\
|
Transaction size: {6} Kb\n\n\
|
||||||
|
If your request is approved, you will receive the amount you requested net of the 2 BSQ proposal fee.\n\n\
|
||||||
Are you sure you want to publish the {7} transaction?
|
Are you sure you want to publish the {7} transaction?
|
||||||
|
|
||||||
dao.news.bisqDAO.title=THE BISQ DAO
|
dao.news.bisqDAO.title=THE BISQ DAO
|
||||||
|
@ -1887,11 +1896,9 @@ dao.monitor.requestAlHashes=Request all hashes
|
||||||
dao.monitor.resync=Resync DAO state
|
dao.monitor.resync=Resync DAO state
|
||||||
dao.monitor.table.header.cycleBlockHeight=Cycle / block height
|
dao.monitor.table.header.cycleBlockHeight=Cycle / block height
|
||||||
dao.monitor.table.cycleBlockHeight=Cycle {0} / block {1}
|
dao.monitor.table.cycleBlockHeight=Cycle {0} / block {1}
|
||||||
|
dao.monitor.table.seedPeers=Seed node: {0}
|
||||||
|
|
||||||
dao.monitor.daoState.headline=DAO state
|
dao.monitor.daoState.headline=DAO state
|
||||||
dao.monitor.daoState.daoStateInSync=Your local DAO state is in consensus with the network
|
|
||||||
dao.monitor.daoState.daoStateNotInSync=Your local DAO state is not in consensus with the network. Please resync your \
|
|
||||||
DAO state.
|
|
||||||
dao.monitor.daoState.table.headline=Chain of DAO state hashes
|
dao.monitor.daoState.table.headline=Chain of DAO state hashes
|
||||||
dao.monitor.daoState.table.blockHeight=Block height
|
dao.monitor.daoState.table.blockHeight=Block height
|
||||||
dao.monitor.daoState.table.hash=Hash of DAO state
|
dao.monitor.daoState.table.hash=Hash of DAO state
|
||||||
|
@ -1903,9 +1910,6 @@ dao.monitor.daoState.utxoConflicts.sumUtxo=Sum of all UTXO: {0} BSQ
|
||||||
dao.monitor.daoState.utxoConflicts.sumBsq=Sum of all BSQ: {0} BSQ
|
dao.monitor.daoState.utxoConflicts.sumBsq=Sum of all BSQ: {0} BSQ
|
||||||
|
|
||||||
dao.monitor.proposal.headline=Proposals state
|
dao.monitor.proposal.headline=Proposals state
|
||||||
dao.monitor.proposal.daoStateInSync=Your local proposals state is in consensus with the network
|
|
||||||
dao.monitor.proposal.daoStateNotInSync=Your local proposals state is not in consensus with the network. Please restart your \
|
|
||||||
application.
|
|
||||||
dao.monitor.proposal.table.headline=Chain of proposal state hashes
|
dao.monitor.proposal.table.headline=Chain of proposal state hashes
|
||||||
dao.monitor.proposal.conflictTable.headline=Proposal state hashes from peers in conflict
|
dao.monitor.proposal.conflictTable.headline=Proposal state hashes from peers in conflict
|
||||||
|
|
||||||
|
@ -1913,11 +1917,13 @@ dao.monitor.proposal.table.hash=Hash of proposal state
|
||||||
dao.monitor.proposal.table.prev=Previous hash
|
dao.monitor.proposal.table.prev=Previous hash
|
||||||
dao.monitor.proposal.table.numProposals=No. proposals
|
dao.monitor.proposal.table.numProposals=No. proposals
|
||||||
|
|
||||||
|
dao.monitor.isInConflictWithSeedNode=Your local data is not in consensus with at least one seed node. \
|
||||||
|
Please resync the DAO state.
|
||||||
|
dao.monitor.isInConflictWithNonSeedNode=One of your peers is not in consensus with the network but your node \
|
||||||
|
is in sync with the seed nodes.
|
||||||
|
dao.monitor.daoStateInSync=Your local node is in consensus with the network
|
||||||
|
|
||||||
dao.monitor.blindVote.headline=Blind votes state
|
dao.monitor.blindVote.headline=Blind votes state
|
||||||
dao.monitor.blindVote.daoStateInSync=Your local blind votes state is in consensus with the network
|
|
||||||
dao.monitor.blindVote.daoStateNotInSync=Your local blind votes state is not in consensus with the network. Please restart your \
|
|
||||||
application.
|
|
||||||
dao.monitor.blindVote.table.headline=Chain of blind vote state hashes
|
dao.monitor.blindVote.table.headline=Chain of blind vote state hashes
|
||||||
dao.monitor.blindVote.conflictTable.headline=Blind vote state hashes from peers in conflict
|
dao.monitor.blindVote.conflictTable.headline=Blind vote state hashes from peers in conflict
|
||||||
dao.monitor.blindVote.table.hash=Hash of blind vote state
|
dao.monitor.blindVote.table.hash=Hash of blind vote state
|
||||||
|
@ -2058,6 +2064,7 @@ filterWindow.priceRelayNode=Filtered price relay nodes (comma sep. onion address
|
||||||
filterWindow.btcNode=Filtered Bitcoin nodes (comma sep. addresses + port)
|
filterWindow.btcNode=Filtered Bitcoin nodes (comma sep. addresses + port)
|
||||||
filterWindow.preventPublicBtcNetwork=Prevent usage of public Bitcoin network
|
filterWindow.preventPublicBtcNetwork=Prevent usage of public Bitcoin network
|
||||||
filterWindow.disableDao=Disable DAO
|
filterWindow.disableDao=Disable DAO
|
||||||
|
filterWindow.disableDaoBelowVersion=Min. version required for DAO
|
||||||
filterWindow.add=Add filter
|
filterWindow.add=Add filter
|
||||||
filterWindow.remove=Remove filter
|
filterWindow.remove=Remove filter
|
||||||
|
|
||||||
|
@ -2236,6 +2243,9 @@ popup.warning.nodeBanned=One of the {0} nodes got banned. Please restart your ap
|
||||||
popup.warning.priceRelay=price relay
|
popup.warning.priceRelay=price relay
|
||||||
popup.warning.seed=seed
|
popup.warning.seed=seed
|
||||||
|
|
||||||
|
popup.warning.burnBTC=This transaction is not possible, as the mining fees of {0} would exceed the amount to transfer of {1}. \
|
||||||
|
Please wait until the mining fees are low again or until you''ve accumulated more BTC to transfer.
|
||||||
|
|
||||||
popup.info.securityDepositInfo=To ensure both traders follow the trade protocol, both traders need to pay a security \
|
popup.info.securityDepositInfo=To ensure both traders follow the trade protocol, both traders need to pay a security \
|
||||||
deposit.\n\nThis deposit is kept in your trade wallet until your trade has been successfully completed, and then it's \
|
deposit.\n\nThis deposit is kept in your trade wallet until your trade has been successfully completed, and then it's \
|
||||||
refunded to you.\n\nPlease note: if you're creating a new offer, Bisq needs to be running for another trader to take \
|
refunded to you.\n\nPlease note: if you're creating a new offer, Bisq needs to be running for another trader to take \
|
||||||
|
|
|
@ -739,6 +739,7 @@ funds.tx.unknown=Unbekannter Grund: {0}
|
||||||
funds.tx.noFundsFromDispute=Keine Rückzahlung vom Konflikt
|
funds.tx.noFundsFromDispute=Keine Rückzahlung vom Konflikt
|
||||||
funds.tx.receivedFunds=Gelder erhalten
|
funds.tx.receivedFunds=Gelder erhalten
|
||||||
funds.tx.withdrawnFromWallet=Von Wallet abgehoben
|
funds.tx.withdrawnFromWallet=Von Wallet abgehoben
|
||||||
|
funds.tx.withdrawnFromBSQWallet=BTC withdrawn from BSQ wallet
|
||||||
funds.tx.noTxAvailable=Keine Transaktionen verfügbar
|
funds.tx.noTxAvailable=Keine Transaktionen verfügbar
|
||||||
funds.tx.revert=Umkehren
|
funds.tx.revert=Umkehren
|
||||||
funds.tx.txSent=Transaktion erfolgreich zu einer neuen Adresse in der lokalen Bisq-Wallet gesendet.
|
funds.tx.txSent=Transaktion erfolgreich zu einer neuen Adresse in der lokalen Bisq-Wallet gesendet.
|
||||||
|
@ -1603,6 +1604,7 @@ dao.tx.type.enum.PROOF_OF_BURN=Nachweis der Verbrennung
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.tx.type.enum.IRREGULAR=Irregulär
|
dao.tx.type.enum.IRREGULAR=Irregulär
|
||||||
|
|
||||||
|
dao.tx.withdrawnFromWallet=BTC withdrawn from wallet
|
||||||
dao.tx.issuanceFromCompReq=Entlohnungsanfrage/ausgabe
|
dao.tx.issuanceFromCompReq=Entlohnungsanfrage/ausgabe
|
||||||
dao.tx.issuanceFromCompReq.tooltip=Entlohnungsanfrage, die zur Ausgabe neuere BSQ führte.\nAusgabedatum: {0}
|
dao.tx.issuanceFromCompReq.tooltip=Entlohnungsanfrage, die zur Ausgabe neuere BSQ führte.\nAusgabedatum: {0}
|
||||||
dao.tx.issuanceFromReimbursement=Rückerstattungsantrag/Ausgabe
|
dao.tx.issuanceFromReimbursement=Rückerstattungsantrag/Ausgabe
|
||||||
|
@ -1611,10 +1613,15 @@ dao.proposal.create.missingBsqFunds=Sie haben nicht ausreichend BSQ um diesen Vo
|
||||||
|
|
||||||
dao.proposal.create.missingBsqFundsForBond=Du hast nicht ausreichend BSQ für diese Rolle. Du kannst den Vorschlag zwar veröffentlichen, benötigst jedoch den vollen BSQ Betrag für diese Rolle, falls dein Vorschlag akzeptiert wird.\nEs fehlen: {0}
|
dao.proposal.create.missingBsqFundsForBond=Du hast nicht ausreichend BSQ für diese Rolle. Du kannst den Vorschlag zwar veröffentlichen, benötigst jedoch den vollen BSQ Betrag für diese Rolle, falls dein Vorschlag akzeptiert wird.\nEs fehlen: {0}
|
||||||
|
|
||||||
dao.proposal.create.missingMinerFeeFunds=Du hast nicht ausreichend BTC, um die Vorschlags-Transaktion zu erstellen. Jede BSQ-Transaktion benötigt Mining-Gebühr in BTC.\nEs fehlen: {0}
|
dao.proposal.create.missingMinerFeeFunds=You don''t have sufficient BTC funds for creating the proposal transaction. All BSQ transactions require a miner fee in BTC.\nMissing: {0}
|
||||||
|
|
||||||
|
dao.proposal.create.missingIssuanceFunds=You don''t have sufficient BTC funds for creating the proposal transaction. All BSQ transactions require a miner fee in BTC, and issuance transactions also require BTC for the requested BSQ amount ({0} Satoshis/BSQ).\nMissing: {1}
|
||||||
|
|
||||||
dao.feeTx.confirm=Bestätige {0} Transaktion
|
dao.feeTx.confirm=Bestätige {0} Transaktion
|
||||||
dao.feeTx.confirm.details={0} Gebühr: {1}\nMining-Gebühr: {2} ({3} Satoshis/Byte)\nTransaktionsgröße: {4} Kb\n\nSind Sie sicher, dass Sie die {5} Transaktion senden wollen?
|
dao.feeTx.confirm.details={0} Gebühr: {1}\nMining-Gebühr: {2} ({3} Satoshis/Byte)\nTransaktionsgröße: {4} Kb\n\nSind Sie sicher, dass Sie die {5} Transaktion senden wollen?
|
||||||
|
|
||||||
|
dao.feeTx.issuanceProposal.confirm.details={0} fee: {1}\nBTC needed for BSQ issuance: {2} ({3} Satoshis/BSQ)\nMining fee: {4} ({5} Satoshis/byte)\nTransaction size: {6} Kb\n\nIf your request is approved, you will receive the amount you requested net of the 2 BSQ proposal fee.\n\nAre you sure you want to publish the {7} transaction?
|
||||||
|
|
||||||
dao.news.bisqDAO.title=DER BISQ DAO
|
dao.news.bisqDAO.title=DER BISQ DAO
|
||||||
dao.news.bisqDAO.description=Genauso wie der Bisq Handelsplatz dezentral und resistent gegen Zensur ist, ist auch die Führung der DAO - die Bisq DAO und der BSQ Token machen es möglich.
|
dao.news.bisqDAO.description=Genauso wie der Bisq Handelsplatz dezentral und resistent gegen Zensur ist, ist auch die Führung der DAO - die Bisq DAO und der BSQ Token machen es möglich.
|
||||||
dao.news.bisqDAO.readMoreLink=Erfahren Sie mehr über den Bisq DAO
|
dao.news.bisqDAO.readMoreLink=Erfahren Sie mehr über den Bisq DAO
|
||||||
|
@ -1946,6 +1953,8 @@ popup.warning.nodeBanned=Einer der {0} Knoten wurde gebannt. Bitte starten Sie d
|
||||||
popup.warning.priceRelay=Preisrelais
|
popup.warning.priceRelay=Preisrelais
|
||||||
popup.warning.seed=Seed
|
popup.warning.seed=Seed
|
||||||
|
|
||||||
|
popup.warning.burnBTC=This transaction is not possible, as the mining fees of {0} would exceed the amount to transfer of {1}. Please wait until the mining fees are low again or until you''ve accumulated more BTC to transfer.
|
||||||
|
|
||||||
popup.info.securityDepositInfo=Um sicherzustellen, dass beide Händler dem Handelsprotokoll folgen, müssen diese eine Kaution zahlen.\n\nDie Kaution bleibt in Ihrer lokalen Wallet, bis das Angebot von einem anderen Händler angenommen wurde.\nSie wird Ihnen zurückerstattet, nachdem der Handel erfolgreich abgeschlossen wurde.\n\nBitte beachten Sie, dass Sie die Anwendung laufen lassen müssen, wenn Sie ein offenes Angebot haben.\nWenn ein anderer Händler Ihr Angebot annehmen möchte ist es notwendig, dass Ihre Anwendung online ist und reagieren kann.\nStellen Sie sicher, dass Sie den Ruhezustand deaktiviert haben, da dieser Ihren Client vom Netzwerk trennen würde (Der Ruhezustand des Monitors ist kein Problem).
|
popup.info.securityDepositInfo=Um sicherzustellen, dass beide Händler dem Handelsprotokoll folgen, müssen diese eine Kaution zahlen.\n\nDie Kaution bleibt in Ihrer lokalen Wallet, bis das Angebot von einem anderen Händler angenommen wurde.\nSie wird Ihnen zurückerstattet, nachdem der Handel erfolgreich abgeschlossen wurde.\n\nBitte beachten Sie, dass Sie die Anwendung laufen lassen müssen, wenn Sie ein offenes Angebot haben.\nWenn ein anderer Händler Ihr Angebot annehmen möchte ist es notwendig, dass Ihre Anwendung online ist und reagieren kann.\nStellen Sie sicher, dass Sie den Ruhezustand deaktiviert haben, da dieser Ihren Client vom Netzwerk trennen würde (Der Ruhezustand des Monitors ist kein Problem).
|
||||||
|
|
||||||
popup.info.cashDepositInfo=Stellen Sie sicher, dass eine Bank-Filiale in Ihrer Nähe befindet, um die Bargeld Kaution zu zahlen.\nDie Bankkennung (BIC/SWIFT) der Bank des Verkäufers ist: {0}.
|
popup.info.cashDepositInfo=Stellen Sie sicher, dass eine Bank-Filiale in Ihrer Nähe befindet, um die Bargeld Kaution zu zahlen.\nDie Bankkennung (BIC/SWIFT) der Bank des Verkäufers ist: {0}.
|
||||||
|
|
|
@ -318,12 +318,12 @@ offerbook.filterByPaymentMethod=Φιλτράρισμα κατά μέθοδο π
|
||||||
offerbook.nrOffers=Πλήθος προσφορών: {0}
|
offerbook.nrOffers=Πλήθος προσφορών: {0}
|
||||||
offerbook.volume={0} (ελάχιστο - μέγιστο)
|
offerbook.volume={0} (ελάχιστο - μέγιστο)
|
||||||
|
|
||||||
offerbook.createOfferToBuy=Create new offer to buy {0}
|
offerbook.createOfferToBuy=Δημιούργησε νέα προσφορά για αγορά {0}
|
||||||
offerbook.createOfferToSell=Create new offer to sell {0}
|
offerbook.createOfferToSell=Δημιούργησε νέα προσφορά για πώληση {0}
|
||||||
offerbook.createOfferToBuy.withFiat=Create new offer to buy {0} with {1}
|
offerbook.createOfferToBuy.withFiat=Δημιούργησε νέα προσφορά για αγορά {0} με {1}
|
||||||
offerbook.createOfferToSell.forFiat=Create new offer to sell {0} for {1}
|
offerbook.createOfferToSell.forFiat=Δημιούργησε νέα προσφορά για πώληση {0} με {1}
|
||||||
offerbook.createOfferToBuy.withCrypto=Create new offer to sell {0} (buy {1})
|
offerbook.createOfferToBuy.withCrypto=Δημιούργησε νέα προσφορά για πώληση {0} (αγορά {1})
|
||||||
offerbook.createOfferToSell.forCrypto=Create new offer to buy {0} (sell {1})
|
offerbook.createOfferToSell.forCrypto=Δημιούργησε νέα προσφορά για αγορά {0} (πώληση {1})
|
||||||
|
|
||||||
offerbook.takeOfferButton.tooltip=Αποδοχή προσφοράς έναντι {0}
|
offerbook.takeOfferButton.tooltip=Αποδοχή προσφοράς έναντι {0}
|
||||||
offerbook.yesCreateOffer=Ναι, δημιούργησε προσφορά
|
offerbook.yesCreateOffer=Ναι, δημιούργησε προσφορά
|
||||||
|
@ -355,7 +355,7 @@ offerbook.info.sellAboveMarketPrice=Θα λάβεις {0} περισσότερα
|
||||||
offerbook.info.buyBelowMarketPrice=Θα πληρώσεις {0} λιγότερα από την τρέχουσα τιμή (ενημερώνεται κάθε λεπτό).
|
offerbook.info.buyBelowMarketPrice=Θα πληρώσεις {0} λιγότερα από την τρέχουσα τιμή (ενημερώνεται κάθε λεπτό).
|
||||||
offerbook.info.buyAtFixedPrice=Θα αγοράσεις σε αυτή την καθορισμένη τιμή.
|
offerbook.info.buyAtFixedPrice=Θα αγοράσεις σε αυτή την καθορισμένη τιμή.
|
||||||
offerbook.info.sellAtFixedPrice=Θα πουλήσεις σε αυτή την καθορισμένη τιμή.
|
offerbook.info.sellAtFixedPrice=Θα πουλήσεις σε αυτή την καθορισμένη τιμή.
|
||||||
offerbook.info.noArbitrationInUserLanguage=Σε περίπτωση διαφωνίας, παρακαλούμε να σημειώσετε ότι η διαιτησία για αυτή την προσφορά θα διεκπεραιωθεί στο {0}. Η γλώσσα είναι αυτήν τη στιγμή ρυθμισμένη στο {1}.\n
|
offerbook.info.noArbitrationInUserLanguage=Σε περίπτωση διαφωνίας, παρακαλούμε να σημειώσετε ότι η διαιτησία για αυτή την προσφορά θα διεκπεραιωθεί στα {0}. Η γλώσσα αυτή τη στιγμή είναι ρυθμισμένη σε {1}.\n
|
||||||
offerbook.info.roundedFiatVolume=Το ποσό στρογγυλοποιήθηκε για να αυξηθεί το απόρρητο της συναλλαγής σου.
|
offerbook.info.roundedFiatVolume=Το ποσό στρογγυλοποιήθηκε για να αυξηθεί το απόρρητο της συναλλαγής σου.
|
||||||
|
|
||||||
####################################################################
|
####################################################################
|
||||||
|
@ -739,6 +739,7 @@ funds.tx.unknown=Άγνωστη αιτία: {0}
|
||||||
funds.tx.noFundsFromDispute=Καμί επιστροφή ποσού από τη διένεξη
|
funds.tx.noFundsFromDispute=Καμί επιστροφή ποσού από τη διένεξη
|
||||||
funds.tx.receivedFunds=Ληφθέντα κεφάλαια
|
funds.tx.receivedFunds=Ληφθέντα κεφάλαια
|
||||||
funds.tx.withdrawnFromWallet=Ανειλημμένα από το πορτοφόλι
|
funds.tx.withdrawnFromWallet=Ανειλημμένα από το πορτοφόλι
|
||||||
|
funds.tx.withdrawnFromBSQWallet=BTC withdrawn from BSQ wallet
|
||||||
funds.tx.noTxAvailable=Δεν υπάρχουν διαθέσιμες συναλλαγές
|
funds.tx.noTxAvailable=Δεν υπάρχουν διαθέσιμες συναλλαγές
|
||||||
funds.tx.revert=Revert
|
funds.tx.revert=Revert
|
||||||
funds.tx.txSent=Η συναλλαγή απεστάλη επιτυχώς σε νέα διεύθυνση στο τοπικό πορτοφόλι Bisq.
|
funds.tx.txSent=Η συναλλαγή απεστάλη επιτυχώς σε νέα διεύθυνση στο τοπικό πορτοφόλι Bisq.
|
||||||
|
@ -816,7 +817,7 @@ setting.preferences.txFeeTooLarge=Εισήγαγες υπέρογκη αξία (
|
||||||
setting.preferences.ignorePeers=Αγνόησε συναλλασσόμενους με διεύθυνση onion (για πολλαπλές εισαγωγές βάλε κόμμα ανάμεσα)
|
setting.preferences.ignorePeers=Αγνόησε συναλλασσόμενους με διεύθυνση onion (για πολλαπλές εισαγωγές βάλε κόμμα ανάμεσα)
|
||||||
setting.preferences.refererId=Referral ID
|
setting.preferences.refererId=Referral ID
|
||||||
setting.preferences.refererId.prompt=Optional referral ID
|
setting.preferences.refererId.prompt=Optional referral ID
|
||||||
setting.preferences.currenciesInList=Νομίσματα στην λίστα τιμών αγοράς
|
setting.preferences.currenciesInList=Νομίσματα στη λίστα τιμών αγοράς
|
||||||
setting.preferences.prefCurrency=Προτιμώμενο νόμισμα
|
setting.preferences.prefCurrency=Προτιμώμενο νόμισμα
|
||||||
setting.preferences.displayFiat=Προβολή εθνικών νομισμάτων
|
setting.preferences.displayFiat=Προβολή εθνικών νομισμάτων
|
||||||
setting.preferences.noFiat=Δεν επέλεξες εθνικό νόμισμα
|
setting.preferences.noFiat=Δεν επέλεξες εθνικό νόμισμα
|
||||||
|
@ -832,7 +833,7 @@ setting.preferences.sortWithNumOffers=Ταξινόμησε τους καταλό
|
||||||
setting.preferences.resetAllFlags=Επανάφερε όλες τις επισημάνσεις \"Να μην επανεμφανιστεί\"
|
setting.preferences.resetAllFlags=Επανάφερε όλες τις επισημάνσεις \"Να μην επανεμφανιστεί\"
|
||||||
setting.preferences.reset=Επαναφορά
|
setting.preferences.reset=Επαναφορά
|
||||||
settings.preferences.languageChange=Για αλλαγή γλώσσας σε όλα τα παράθυρα απαιτείται επανεκκίνηση.
|
settings.preferences.languageChange=Για αλλαγή γλώσσας σε όλα τα παράθυρα απαιτείται επανεκκίνηση.
|
||||||
settings.preferences.arbitrationLanguageWarning=Σε περίπτωση διαφωνίας, σημειώστε ότι η διαιτησία διεκπεραιώνεται στο {0}.
|
settings.preferences.arbitrationLanguageWarning=Σε περίπτωση διαφωνίας, σημειώστε ότι η διαιτησία διεκπεραιώνεται σε {0}.
|
||||||
settings.preferences.selectCurrencyNetwork=Διάλεξε δίκτυο
|
settings.preferences.selectCurrencyNetwork=Διάλεξε δίκτυο
|
||||||
setting.preferences.daoOptions=Επιλογές DAO
|
setting.preferences.daoOptions=Επιλογές DAO
|
||||||
setting.preferences.dao.resync.label=Ανακατασκευή κατάστασης DAO από genesis tx
|
setting.preferences.dao.resync.label=Ανακατασκευή κατάστασης DAO από genesis tx
|
||||||
|
@ -1007,32 +1008,32 @@ account.notifications.email.label=Pairing token
|
||||||
account.notifications.email.prompt=Enter pairing token you received by email
|
account.notifications.email.prompt=Enter pairing token you received by email
|
||||||
account.notifications.settings.title=Ρυθμίσεις
|
account.notifications.settings.title=Ρυθμίσεις
|
||||||
account.notifications.useSound.label=Αναπαραγωγή ήχου ειδοποίησης στο τηλέφωνο
|
account.notifications.useSound.label=Αναπαραγωγή ήχου ειδοποίησης στο τηλέφωνο
|
||||||
account.notifications.trade.label=Receive trade messages
|
account.notifications.trade.label=Λήψη μηνυμάτων συναλλαγών
|
||||||
account.notifications.market.label=Receive offer alerts
|
account.notifications.market.label=Λήψη ειδοποιήσεων προσφορών
|
||||||
account.notifications.price.label=Receive price alerts
|
account.notifications.price.label=Λήψη ειδοποιήσεων τιμών
|
||||||
account.notifications.priceAlert.title=Τιμές ειδοποίησης
|
account.notifications.priceAlert.title=Τιμές ειδοποίησης
|
||||||
account.notifications.priceAlert.high.label=Ειδοποίηση αν η τιμή BTC είναι μεγαλύτερη από
|
account.notifications.priceAlert.high.label=Ειδοποίηση αν η τιμή BTC είναι μεγαλύτερη από
|
||||||
account.notifications.priceAlert.low.label=Ειδοποίηση αν η τιμή BTC είναι μικρότερη από
|
account.notifications.priceAlert.low.label=Ειδοποίηση αν η τιμή BTC είναι μικρότερη από
|
||||||
account.notifications.priceAlert.setButton=Καθόρισε τιμή ειδοποίησης
|
account.notifications.priceAlert.setButton=Καθόρισε τιμή ειδοποίησης
|
||||||
account.notifications.priceAlert.removeButton=Απόσυρε τιμή ειδοποίησης
|
account.notifications.priceAlert.removeButton=Απόσυρε τιμή ειδοποίησης
|
||||||
account.notifications.trade.message.title=Trade state changed
|
account.notifications.trade.message.title=Μεταβολή κατάστασης συναλλαγής
|
||||||
account.notifications.trade.message.msg.conf=The deposit transaction for the trade with ID {0} is confirmed. Please open your Bisq application and start the payment.
|
account.notifications.trade.message.msg.conf=The deposit transaction for the trade with ID {0} is confirmed. Please open your Bisq application and start the payment.
|
||||||
account.notifications.trade.message.msg.started=The BTC buyer has started the payment for the trade with ID {0}.
|
account.notifications.trade.message.msg.started=Ο αγοραστής BTC ξεκίνησε την πληρωμή για τη συναλλαγή με ταυτότητα {0}
|
||||||
account.notifications.trade.message.msg.completed=Η συναλλαγή με ταυτότητα {0} ολοκληρώθηκε.
|
account.notifications.trade.message.msg.completed=Η συναλλαγή με ταυτότητα {0} ολοκληρώθηκε.
|
||||||
account.notifications.offer.message.title=Η προσφορά σου έγινε αποδεκτή
|
account.notifications.offer.message.title=Η προσφορά σου έγινε αποδεκτή
|
||||||
account.notifications.offer.message.msg=Η προσφορά σου με ταυτότητα {0} έγινε αποδεκτή
|
account.notifications.offer.message.msg=Η προσφορά σου με ταυτότητα {0} έγινε αποδεκτή
|
||||||
account.notifications.dispute.message.title=Νέο μήνυμα διένεξης
|
account.notifications.dispute.message.title=Νέο μήνυμα διένεξης
|
||||||
account.notifications.dispute.message.msg=You received a dispute message for trade with ID {0}
|
account.notifications.dispute.message.msg=Έλαβες ένα μήνυμα διένεξης για τη συναλλαγή με ταυτότητα {0}
|
||||||
|
|
||||||
account.notifications.marketAlert.title=Ειδοποιήσεις προσφορών
|
account.notifications.marketAlert.title=Ειδοποιήσεις προσφορών
|
||||||
account.notifications.marketAlert.selectPaymentAccount=Offers matching payment account
|
account.notifications.marketAlert.selectPaymentAccount=Offers matching payment account
|
||||||
account.notifications.marketAlert.offerType.label=Είδος προσφορών για τις οποίες ενδιαφέρομαι
|
account.notifications.marketAlert.offerType.label=Είδος προσφορών για τις οποίες ενδιαφέρομαι
|
||||||
account.notifications.marketAlert.offerType.buy=Προσφορές αγοράς (θέλω να πουλήσω BTC)
|
account.notifications.marketAlert.offerType.buy=Προσφορές αγοράς (θέλω να πουλήσω BTC)
|
||||||
account.notifications.marketAlert.offerType.sell=Προσφορές πώλησης (θέλω να αγοράσω BTC)
|
account.notifications.marketAlert.offerType.sell=Προσφορές πώλησης (θέλω να αγοράσω BTC)
|
||||||
account.notifications.marketAlert.trigger=Offer price distance (%)
|
account.notifications.marketAlert.trigger=Διαφορά (%) τιμής προσφοράς
|
||||||
account.notifications.marketAlert.trigger.info=With a price distance set, you will only receive an alert when an offer that meets (or exceeds) your requirements is published. Example: you want to sell BTC, but you will only sell at a 2% premium to the current market price. Setting this field to 2% will ensure you only receive alerts for offers with prices that are 2% (or more) above the current market price.
|
account.notifications.marketAlert.trigger.info=With a price distance set, you will only receive an alert when an offer that meets (or exceeds) your requirements is published. Example: you want to sell BTC, but you will only sell at a 2% premium to the current market price. Setting this field to 2% will ensure you only receive alerts for offers with prices that are 2% (or more) above the current market price.
|
||||||
account.notifications.marketAlert.trigger.prompt=Percentage distance from market price (e.g. 2.50%, -0.50%, etc)
|
account.notifications.marketAlert.trigger.prompt=Ποσοστιαία διαφορά από τιμή αγοράς (π.χ. 2.50%, -0.50%, κλπ)
|
||||||
account.notifications.marketAlert.addButton=Add offer alert
|
account.notifications.marketAlert.addButton=Πρόσθεσε ειδοποίηση προσφοράς
|
||||||
account.notifications.marketAlert.manageAlertsButton=Διαχείριση ειδοποιήσεων προσφορών
|
account.notifications.marketAlert.manageAlertsButton=Διαχείριση ειδοποιήσεων προσφορών
|
||||||
account.notifications.marketAlert.manageAlerts.title=Διαχείριση ειδοποιήσεων προσφορών
|
account.notifications.marketAlert.manageAlerts.title=Διαχείριση ειδοποιήσεων προσφορών
|
||||||
account.notifications.marketAlert.manageAlerts.label=Ειδοποιήσεις προσφορών
|
account.notifications.marketAlert.manageAlerts.label=Ειδοποιήσεις προσφορών
|
||||||
|
@ -1040,7 +1041,7 @@ account.notifications.marketAlert.manageAlerts.item=Offer alert for {0} offer wi
|
||||||
account.notifications.marketAlert.manageAlerts.header.paymentAccount=Λογαριασμός πληρωμών
|
account.notifications.marketAlert.manageAlerts.header.paymentAccount=Λογαριασμός πληρωμών
|
||||||
account.notifications.marketAlert.manageAlerts.header.trigger=Τιμή ενεργοποίησης
|
account.notifications.marketAlert.manageAlerts.header.trigger=Τιμή ενεργοποίησης
|
||||||
account.notifications.marketAlert.manageAlerts.header.offerType=Τύπος προσφοράς
|
account.notifications.marketAlert.manageAlerts.header.offerType=Τύπος προσφοράς
|
||||||
account.notifications.marketAlert.message.title=Offer alert
|
account.notifications.marketAlert.message.title=Ειδοποίηση προσφοράς
|
||||||
account.notifications.marketAlert.message.msg.below=μεγαλύτερη από
|
account.notifications.marketAlert.message.msg.below=μεγαλύτερη από
|
||||||
account.notifications.marketAlert.message.msg.above=μικρότερη από
|
account.notifications.marketAlert.message.msg.above=μικρότερη από
|
||||||
account.notifications.marketAlert.message.msg=A new ''{0} {1}'' offer with price {2} ({3} {4} market price) and payment method ''{5}'' was published to the Bisq offerbook.\nOffer ID: {6}.
|
account.notifications.marketAlert.message.msg=A new ''{0} {1}'' offer with price {2} ({3} {4} market price) and payment method ''{5}'' was published to the Bisq offerbook.\nOffer ID: {6}.
|
||||||
|
@ -1059,52 +1060,52 @@ account.notifications.priceAlert.warning.lowerPriceTooHigh=Η χαμηλότερ
|
||||||
|
|
||||||
dao.tab.factsAndFigures=Facts & Figures
|
dao.tab.factsAndFigures=Facts & Figures
|
||||||
dao.tab.bsqWallet=Πορτοφόλι BSQ
|
dao.tab.bsqWallet=Πορτοφόλι BSQ
|
||||||
dao.tab.proposals=Governance
|
dao.tab.proposals=Διακυβέρνηση
|
||||||
dao.tab.bonding=Bonding
|
dao.tab.bonding=Bonding
|
||||||
dao.tab.proofOfBurn=Asset listing fee/Proof of burn
|
dao.tab.proofOfBurn=Asset listing fee/Proof of burn
|
||||||
dao.tab.monitor=Network monitor
|
dao.tab.monitor=Παρακολούθηση δικτύου
|
||||||
dao.tab.news=News
|
dao.tab.news=Νέα
|
||||||
|
|
||||||
dao.paidWithBsq=πληρώθηκε με BSQ
|
dao.paidWithBsq=πληρώθηκε με BSQ
|
||||||
dao.availableBsqBalance=Available for spending (verified + unconfirmed change outputs)
|
dao.availableBsqBalance=Available for spending (verified + unconfirmed change outputs)
|
||||||
dao.verifiedBsqBalance=Balance of all verified UTXOs
|
dao.verifiedBsqBalance=Balance of all verified UTXOs
|
||||||
dao.unconfirmedChangeBalance=Balance of all unconfirmed change outputs
|
dao.unconfirmedChangeBalance=Balance of all unconfirmed change outputs
|
||||||
dao.unverifiedBsqBalance=Balance of all unverified transactions (awaiting block confirmation)
|
dao.unverifiedBsqBalance=Balance of all unverified transactions (awaiting block confirmation)
|
||||||
dao.lockedForVoteBalance=Used for voting
|
dao.lockedForVoteBalance=Χρησιμοποιημένα για ψηφοφορία
|
||||||
dao.lockedInBonds=Locked in bonds
|
dao.lockedInBonds=Locked in bonds
|
||||||
dao.availableNonBsqBalance=Available non-BSQ balance (BTC)
|
dao.availableNonBsqBalance=Διαθέσιμο μη BSQ υπόλοιπο (BTC)
|
||||||
dao.totalBsqBalance=Συνολικό υπόλοιπο BSQ
|
dao.totalBsqBalance=Συνολικό υπόλοιπο BSQ
|
||||||
|
|
||||||
dao.tx.published.success=Η συναλλαγή σου κοινοποιήθηκε επιτυχώς.
|
dao.tx.published.success=Η συναλλαγή σου κοινοποιήθηκε επιτυχώς.
|
||||||
dao.proposal.menuItem.make=Κατάθεσε πρόταση
|
dao.proposal.menuItem.make=Κατάθεσε πρόταση
|
||||||
dao.proposal.menuItem.browse=Browse open proposals
|
dao.proposal.menuItem.browse=Περιήγηση ανοιχτών προτάσεων
|
||||||
dao.proposal.menuItem.vote=Ψήφιση προτάσεων
|
dao.proposal.menuItem.vote=Ψήφιση προτάσεων
|
||||||
dao.proposal.menuItem.result=Αποτελέσματα ψηφοφορίας
|
dao.proposal.menuItem.result=Αποτελέσματα ψηφοφορίας
|
||||||
dao.cycle.headline=Voting cycle
|
dao.cycle.headline=Κύκλος ψηφοφορίας
|
||||||
dao.cycle.overview.headline=Voting cycle overview
|
dao.cycle.overview.headline=Επισκόπηση κύκλος ψηφοφορίας
|
||||||
dao.cycle.currentPhase=Current phase
|
dao.cycle.currentPhase=Τρέχουσα φάση
|
||||||
dao.cycle.currentBlockHeight=Current block height
|
dao.cycle.currentBlockHeight=Τρέχων ύψος block
|
||||||
dao.cycle.proposal=Proposal phase
|
dao.cycle.proposal=Φάση προτάσεων
|
||||||
dao.cycle.proposal.next=Next proposal phase
|
dao.cycle.proposal.next=Επόμενη φάση προτάσεων
|
||||||
dao.cycle.blindVote=Blind vote phase
|
dao.cycle.blindVote=Φάση τυφλής ψήφου
|
||||||
dao.cycle.voteReveal=Vote reveal phase
|
dao.cycle.voteReveal=Φάση αποκάλυψης ψήφων
|
||||||
dao.cycle.voteResult=Αποτέλεσμα ψηφοφορίας
|
dao.cycle.voteResult=Αποτέλεσμα ψηφοφορίας
|
||||||
dao.cycle.phaseDuration={0} blocks (≈{1}); Block {2} - {3} (≈{4} - ≈{5})
|
dao.cycle.phaseDuration={0} blocks (≈{1}); Block {2} - {3} (≈{4} - ≈{5})
|
||||||
dao.cycle.phaseDurationWithoutBlocks=Block {0} - {1} (≈{2} - ≈{3})
|
dao.cycle.phaseDurationWithoutBlocks=Block {0} - {1} (≈{2} - ≈{3})
|
||||||
|
|
||||||
dao.voteReveal.txPublished.headLine=Vote reveal transaction published
|
dao.voteReveal.txPublished.headLine=Κοινοποίηση συναλλαγής αποκάλυψης ψήφου
|
||||||
dao.voteReveal.txPublished=Your vote reveal transaction with transaction ID {0} was successfully published.\n\nThis happens automatically by the software if you have participated in the DAO voting.
|
dao.voteReveal.txPublished=Η συναλλαγή για την αποκάλυψη της ψήφου σου με ταυτότητα {0} κοινοποιήθηκε επιτυχώς.\n\nΑυτό συμβαίνει αυτομάτως μέσω του λογισμικού, εφόσον έχεις συμμετάσχει στην ψηφοφορία του DAO.
|
||||||
|
|
||||||
dao.results.cycles.header=Κύκλοι
|
dao.results.cycles.header=Κύκλοι
|
||||||
dao.results.cycles.table.header.cycle=Κύκλος
|
dao.results.cycles.table.header.cycle=Κύκλος
|
||||||
dao.results.cycles.table.header.numProposals=Προτάσεις
|
dao.results.cycles.table.header.numProposals=Προτάσεις
|
||||||
dao.results.cycles.table.header.numVotes=Ψήφοι
|
dao.results.cycles.table.header.numVotes=Ψήφοι
|
||||||
dao.results.cycles.table.header.voteWeight=Vote weight
|
dao.results.cycles.table.header.voteWeight=Βάρος ψήφου
|
||||||
dao.results.cycles.table.header.issuance=Έκδοση
|
dao.results.cycles.table.header.issuance=Έκδοση
|
||||||
|
|
||||||
dao.results.results.table.item.cycle=Cycle {0} started: {1}
|
dao.results.results.table.item.cycle=Εκκίνηση κύκλου {0}: {1}
|
||||||
|
|
||||||
dao.results.proposals.header=Proposals of selected cycle
|
dao.results.proposals.header=Προτάσεις επιλεγμένου κύκλου
|
||||||
dao.results.proposals.table.header.proposalOwnerName=Όνομα
|
dao.results.proposals.table.header.proposalOwnerName=Όνομα
|
||||||
dao.results.proposals.table.header.details=Λεπτομέριες
|
dao.results.proposals.table.header.details=Λεπτομέριες
|
||||||
dao.results.proposals.table.header.myVote=Η ψήφος μου
|
dao.results.proposals.table.header.myVote=Η ψήφος μου
|
||||||
|
@ -1118,28 +1119,28 @@ dao.results.exceptions=Vote result exception(s)
|
||||||
dao.param.UNDEFINED=Ακαθόριστο
|
dao.param.UNDEFINED=Ακαθόριστο
|
||||||
|
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.param.DEFAULT_MAKER_FEE_BSQ=BSQ maker fee
|
dao.param.DEFAULT_MAKER_FEE_BSQ=Προμήθεια δημιουργού προσφοράς BSQ
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.param.DEFAULT_TAKER_FEE_BSQ=BSQ taker fee
|
dao.param.DEFAULT_TAKER_FEE_BSQ=Προμήθεια αποδέκτη προσφοράς BSQ
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.param.MIN_MAKER_FEE_BSQ=Min. BSQ maker fee
|
dao.param.MIN_MAKER_FEE_BSQ=Ελάχιστη προμήθεια δημιουργού προσφοράς BSQ
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.param.MIN_TAKER_FEE_BSQ=Min. BSQ taker fee
|
dao.param.MIN_TAKER_FEE_BSQ=Ελάχιστη προμήθεια αποδέκτη προσφοράς BSQ
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.param.DEFAULT_MAKER_FEE_BTC=BTC maker fee
|
dao.param.DEFAULT_MAKER_FEE_BTC=Προμήθεια δημιουργού προσφοράς BTC
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.param.DEFAULT_TAKER_FEE_BTC=BTC taker fee
|
dao.param.DEFAULT_TAKER_FEE_BTC=Προμήθεια αποδέκτη προσφοράς BTC
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.param.MIN_MAKER_FEE_BTC=Min. BTC maker fee
|
dao.param.MIN_MAKER_FEE_BTC=Ελάχιστη προμήθεια δημιουργού προσφοράς BTC
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.param.MIN_TAKER_FEE_BTC=Min. BTC taker fee
|
dao.param.MIN_TAKER_FEE_BTC=Ελάχιστη προμήθεια αποδέκτη προσφοράς BTC
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
|
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.param.PROPOSAL_FEE=Proposal fee in BSQ
|
dao.param.PROPOSAL_FEE=Αμοιβή πρότασης σε BSQ
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.param.BLIND_VOTE_FEE=Voting fee in BSQ
|
dao.param.BLIND_VOTE_FEE=Αμοιβή ψήφου σε BSQ
|
||||||
|
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.param.COMPENSATION_REQUEST_MIN_AMOUNT=Compensation request min. BSQ amount
|
dao.param.COMPENSATION_REQUEST_MIN_AMOUNT=Compensation request min. BSQ amount
|
||||||
|
@ -1194,14 +1195,14 @@ dao.param.LOCK_TIME_TRADE_PAYOUT=Lock time for alternative trade payout tx
|
||||||
dao.param.ARBITRATOR_FEE=Arbitrator fee in BTC
|
dao.param.ARBITRATOR_FEE=Arbitrator fee in BTC
|
||||||
|
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.param.MAX_TRADE_LIMIT=Max. trade limit in BTC
|
dao.param.MAX_TRADE_LIMIT=Μέγιστο όριο συναλλαγής σε BTC
|
||||||
|
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.param.BONDED_ROLE_FACTOR=Bonded role unit factor in BSQ
|
dao.param.BONDED_ROLE_FACTOR=Bonded role unit factor in BSQ
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.param.ISSUANCE_LIMIT=Issuance limit per cycle in BSQ
|
dao.param.ISSUANCE_LIMIT=Issuance limit per cycle in BSQ
|
||||||
|
|
||||||
dao.param.currentValue=Current value: {0}
|
dao.param.currentValue=Τρέχουσα αξία: {0}
|
||||||
dao.param.blocks={0} blocks
|
dao.param.blocks={0} blocks
|
||||||
|
|
||||||
dao.results.cycle.duration.label=Διάρκεια {0}
|
dao.results.cycle.duration.label=Διάρκεια {0}
|
||||||
|
@ -1215,21 +1216,21 @@ dao.results.invalidVotes=We had invalid votes in that voting cycle. That can hap
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.phase.PHASE_UNDEFINED=Ακαθόριστο
|
dao.phase.PHASE_UNDEFINED=Ακαθόριστο
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.phase.PHASE_PROPOSAL=Proposal phase
|
dao.phase.PHASE_PROPOSAL=Φάση προτάσεων
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.phase.PHASE_BREAK1=Break 1
|
dao.phase.PHASE_BREAK1=Break 1
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.phase.PHASE_BLIND_VOTE=Blind vote phase
|
dao.phase.PHASE_BLIND_VOTE=Φάση τυφλής ψήφου
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.phase.PHASE_BREAK2=Break 2
|
dao.phase.PHASE_BREAK2=Break 2
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.phase.PHASE_VOTE_REVEAL=Vote reveal phase
|
dao.phase.PHASE_VOTE_REVEAL=Φάση αποκάλυψης ψήφων
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.phase.PHASE_BREAK3=Break 3
|
dao.phase.PHASE_BREAK3=Break 3
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.phase.PHASE_RESULT=Result phase
|
dao.phase.PHASE_RESULT=Result phase
|
||||||
|
|
||||||
dao.results.votes.table.header.stakeAndMerit=Vote weight
|
dao.results.votes.table.header.stakeAndMerit=Βάρος ψήφου
|
||||||
dao.results.votes.table.header.stake=Διακύβευμα
|
dao.results.votes.table.header.stake=Διακύβευμα
|
||||||
dao.results.votes.table.header.merit=Earned
|
dao.results.votes.table.header.merit=Earned
|
||||||
dao.results.votes.table.header.vote=Ψήφισε
|
dao.results.votes.table.header.vote=Ψήφισε
|
||||||
|
@ -1393,34 +1394,34 @@ dao.proofOfBurn.txs=Συναλλαγές
|
||||||
dao.proofOfBurn.pubKey=Pubkey
|
dao.proofOfBurn.pubKey=Pubkey
|
||||||
dao.proofOfBurn.signature.window.title=Sign a message with key from proof of burn transaction
|
dao.proofOfBurn.signature.window.title=Sign a message with key from proof of burn transaction
|
||||||
dao.proofOfBurn.verify.window.title=Verify a message with key from proof of burn transaction
|
dao.proofOfBurn.verify.window.title=Verify a message with key from proof of burn transaction
|
||||||
dao.proofOfBurn.copySig=Copy signature to clipboard
|
dao.proofOfBurn.copySig=Αντιγραφή υπογραφής στο πρόχειρο
|
||||||
dao.proofOfBurn.sign=Sign
|
dao.proofOfBurn.sign=Υπόγραψε
|
||||||
dao.proofOfBurn.message=Message
|
dao.proofOfBurn.message=Μήνυμα
|
||||||
dao.proofOfBurn.sig=Signature
|
dao.proofOfBurn.sig=Υπογραφή
|
||||||
dao.proofOfBurn.verify=Verify
|
dao.proofOfBurn.verify=Επαλήθευση
|
||||||
dao.proofOfBurn.verify.header=Verify message with key from proof of burn transaction
|
dao.proofOfBurn.verify.header=Verify message with key from proof of burn transaction
|
||||||
dao.proofOfBurn.verificationResult.ok=Verification succeeded
|
dao.proofOfBurn.verificationResult.ok=Επιτυχία επαλήθευσης
|
||||||
dao.proofOfBurn.verificationResult.failed=Verification failed
|
dao.proofOfBurn.verificationResult.failed=Αποτυχία επαλήθευσης
|
||||||
|
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.phase.UNDEFINED=Ακαθόριστο
|
dao.phase.UNDEFINED=Ακαθόριστο
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.phase.PROPOSAL=Proposal phase
|
dao.phase.PROPOSAL=Φάση προτάσεων
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.phase.BREAK1=Break before blind vote phase
|
dao.phase.BREAK1=Break before blind vote phase
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.phase.BLIND_VOTE=Blind vote phase
|
dao.phase.BLIND_VOTE=Φάση τυφλής ψήφου
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.phase.BREAK2=Break before vote reveal phase
|
dao.phase.BREAK2=Break before vote reveal phase
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.phase.VOTE_REVEAL=Vote reveal phase
|
dao.phase.VOTE_REVEAL=Φάση αποκάλυψης ψήφων
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.phase.BREAK3=Break before result phase
|
dao.phase.BREAK3=Break before result phase
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.phase.RESULT=Vote result phase
|
dao.phase.RESULT=Vote result phase
|
||||||
|
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.phase.separatedPhaseBar.PROPOSAL=Proposal phase
|
dao.phase.separatedPhaseBar.PROPOSAL=Φάση προτάσεων
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.phase.separatedPhaseBar.BLIND_VOTE=Blind vote
|
dao.phase.separatedPhaseBar.BLIND_VOTE=Blind vote
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
|
@ -1454,9 +1455,9 @@ dao.proposal.type.short.REIMBURSEMENT_REQUEST=Αίτημα αποζημίωση
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.proposal.type.short.BONDED_ROLE=Bonded role
|
dao.proposal.type.short.BONDED_ROLE=Bonded role
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.proposal.type.short.REMOVE_ASSET=Removing an altcoin
|
dao.proposal.type.short.REMOVE_ASSET=Απόσυρση κρυπτονομίσματος
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.proposal.type.short.CHANGE_PARAM=Changing a parameter
|
dao.proposal.type.short.CHANGE_PARAM=Αλλαγή παραμέτρου
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.proposal.type.short.GENERIC=Γενική πρόταση
|
dao.proposal.type.short.GENERIC=Γενική πρόταση
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
|
@ -1464,14 +1465,14 @@ dao.proposal.type.short.CONFISCATE_BOND=Confiscating a bond
|
||||||
|
|
||||||
dao.proposal.details=Λεπτομέρειες πρότασης
|
dao.proposal.details=Λεπτομέρειες πρότασης
|
||||||
dao.proposal.selectedProposal=Επιλεγμένη πρόταση
|
dao.proposal.selectedProposal=Επιλεγμένη πρόταση
|
||||||
dao.proposal.active.header=Proposals of current cycle
|
dao.proposal.active.header=Προτάσεις τρέχοντος κύκλου
|
||||||
dao.proposal.active.remove.confirm=Are you sure you want to remove that proposal?\nThe already paid proposal fee will be lost.
|
dao.proposal.active.remove.confirm=Σίγουρα θέλεις να αποσύρεις την πρόταση;\nΘα χάσεις την ήδη πληρωμένη αμοιβή πρότασης.
|
||||||
dao.proposal.active.remove.doRemove=Yes, remove my proposal
|
dao.proposal.active.remove.doRemove=Ναι, απόσυρε την πρότασή μου
|
||||||
dao.proposal.active.remove.failed=Δεν ήταν δυνατή η απόσυρση της πρότασης.
|
dao.proposal.active.remove.failed=Δεν ήταν δυνατή η απόσυρση της πρότασης.
|
||||||
dao.proposal.myVote.title=Ψηφοφορία
|
dao.proposal.myVote.title=Ψηφοφορία
|
||||||
dao.proposal.myVote.accept=Αποδοχή πρότασης
|
dao.proposal.myVote.accept=Αποδοχή πρότασης
|
||||||
dao.proposal.myVote.reject=Απόρριψη πρότασης
|
dao.proposal.myVote.reject=Απόρριψη πρότασης
|
||||||
dao.proposal.myVote.removeMyVote=Ignore proposal
|
dao.proposal.myVote.removeMyVote=Αγνόηση πρότασης
|
||||||
dao.proposal.myVote.merit=Vote weight from earned BSQ
|
dao.proposal.myVote.merit=Vote weight from earned BSQ
|
||||||
dao.proposal.myVote.stake=Vote weight from stake
|
dao.proposal.myVote.stake=Vote weight from stake
|
||||||
dao.proposal.myVote.revealTxId=Vote reveal transaction ID
|
dao.proposal.myVote.revealTxId=Vote reveal transaction ID
|
||||||
|
@ -1484,19 +1485,19 @@ dao.proposal.create.phase.inactive=Please wait until the next proposal phase
|
||||||
dao.proposal.create.proposalType=Τύπος πρότασης
|
dao.proposal.create.proposalType=Τύπος πρότασης
|
||||||
dao.proposal.create.new=Κατάθεση νέας πρότασης
|
dao.proposal.create.new=Κατάθεση νέας πρότασης
|
||||||
dao.proposal.create.button=Κατάθεσε πρόταση
|
dao.proposal.create.button=Κατάθεσε πρόταση
|
||||||
dao.proposal.create.publish=Publish proposal
|
dao.proposal.create.publish=Κοινοποίηση πρότασης
|
||||||
dao.proposal.create.publishing=Proposal publishing is in progress ...
|
dao.proposal.create.publishing=Κοινοποίηση πρότασης σε εξέλιξη...
|
||||||
dao.proposal=πρόταση
|
dao.proposal=πρόταση
|
||||||
dao.proposal.display.type=Τύπος πρότασης
|
dao.proposal.display.type=Τύπος πρότασης
|
||||||
dao.proposal.display.name=Name/nickname
|
dao.proposal.display.name=Όνομα/ψευδώνυμο
|
||||||
dao.proposal.display.link=Link to detail info
|
dao.proposal.display.link=Link to detail info
|
||||||
dao.proposal.display.link.prompt=Link to GitHub issue
|
dao.proposal.display.link.prompt=Σύνδεσμος με θέμα στο GitHub
|
||||||
dao.proposal.display.requestedBsq=Requested amount in BSQ
|
dao.proposal.display.requestedBsq=Αιτούμενο ποσό σε BSQ
|
||||||
dao.proposal.display.bsqAddress=BSQ address
|
dao.proposal.display.bsqAddress=Διεύθυνση BSQ
|
||||||
dao.proposal.display.txId=Proposal transaction ID
|
dao.proposal.display.txId=Ταυτότητα πρότασης
|
||||||
dao.proposal.display.proposalFee=Proposal fee
|
dao.proposal.display.proposalFee=Αμοιβή πρότασης
|
||||||
dao.proposal.display.myVote=Η ψήφος μου
|
dao.proposal.display.myVote=Η ψήφος μου
|
||||||
dao.proposal.display.voteResult=Vote result summary
|
dao.proposal.display.voteResult=Περίληψη αποτελεσμάτων ψηφοφορίας
|
||||||
dao.proposal.display.bondedRoleComboBox.label=Bonded role type
|
dao.proposal.display.bondedRoleComboBox.label=Bonded role type
|
||||||
dao.proposal.display.requiredBondForRole.label=Required bond for role
|
dao.proposal.display.requiredBondForRole.label=Required bond for role
|
||||||
dao.proposal.display.tickerSymbol.label=Ticker Symbol
|
dao.proposal.display.tickerSymbol.label=Ticker Symbol
|
||||||
|
@ -1506,21 +1507,21 @@ dao.proposal.table.header.proposalType=Τύπος πρότασης
|
||||||
dao.proposal.table.header.link=Σύνδεσμος
|
dao.proposal.table.header.link=Σύνδεσμος
|
||||||
dao.proposal.table.header.myVote=Η ψήφος μου
|
dao.proposal.table.header.myVote=Η ψήφος μου
|
||||||
dao.proposal.table.header.remove=Απόσυρε
|
dao.proposal.table.header.remove=Απόσυρε
|
||||||
dao.proposal.table.icon.tooltip.removeProposal=Remove my proposal
|
dao.proposal.table.icon.tooltip.removeProposal=Απόσυρε την πρότασή μου
|
||||||
dao.proposal.table.icon.tooltip.changeVote=Current vote: ''{0}''. Change vote to: ''{1}''
|
dao.proposal.table.icon.tooltip.changeVote=Current vote: ''{0}''. Change vote to: ''{1}''
|
||||||
|
|
||||||
dao.proposal.display.myVote.accepted=Accepted
|
dao.proposal.display.myVote.accepted=Accepted
|
||||||
dao.proposal.display.myVote.rejected=Rejected
|
dao.proposal.display.myVote.rejected=Rejected
|
||||||
dao.proposal.display.myVote.ignored=Ignored
|
dao.proposal.display.myVote.ignored=Ignored
|
||||||
dao.proposal.myVote.summary=Voted: {0}; Vote weight: {1} (earned: {2} + stake: {3});
|
dao.proposal.myVote.summary=Voted: {0}; Vote weight: {1} (earned: {2} + stake: {3});
|
||||||
dao.proposal.myVote.invalid=Vote was invalid
|
dao.proposal.myVote.invalid=Η ψήφος ήταν άκυρη
|
||||||
|
|
||||||
dao.proposal.voteResult.success=Accepted
|
dao.proposal.voteResult.success=Accepted
|
||||||
dao.proposal.voteResult.failed=Rejected
|
dao.proposal.voteResult.failed=Rejected
|
||||||
dao.proposal.voteResult.summary=Result: {0}; Threshold: {1} (required > {2}); Quorum: {3} (required > {4})
|
dao.proposal.voteResult.summary=Result: {0}; Threshold: {1} (required > {2}); Quorum: {3} (required > {4})
|
||||||
|
|
||||||
dao.proposal.display.paramComboBox.label=Select parameter to change
|
dao.proposal.display.paramComboBox.label=Επίλεξε παράμετρο προς μετατροπή
|
||||||
dao.proposal.display.paramValue=Parameter value
|
dao.proposal.display.paramValue=Τιμή παραμέτρου
|
||||||
|
|
||||||
dao.proposal.display.confiscateBondComboBox.label=Choose bond
|
dao.proposal.display.confiscateBondComboBox.label=Choose bond
|
||||||
dao.proposal.display.assetComboBox.label=Asset to remove
|
dao.proposal.display.assetComboBox.label=Asset to remove
|
||||||
|
@ -1534,14 +1535,14 @@ dao.wallet.menuItem.send=Αποστολή
|
||||||
dao.wallet.menuItem.receive=Λήψη
|
dao.wallet.menuItem.receive=Λήψη
|
||||||
dao.wallet.menuItem.transactions=Συναλλαγές
|
dao.wallet.menuItem.transactions=Συναλλαγές
|
||||||
|
|
||||||
dao.wallet.dashboard.myBalance=My wallet balance
|
dao.wallet.dashboard.myBalance=Υπόλοιπο πορτοφολιού μου
|
||||||
|
|
||||||
dao.wallet.receive.fundYourWallet=Your BSQ receive address
|
dao.wallet.receive.fundYourWallet=Your BSQ receive address
|
||||||
dao.wallet.receive.bsqAddress=BSQ wallet address (Fresh unused address)
|
dao.wallet.receive.bsqAddress=Διεύθυνση πορτοφολιού BSQ (νέα αχρησιμοποίητη διεύθυνση)
|
||||||
|
|
||||||
dao.wallet.receive.dao.headline=The Bisq DAO
|
dao.wallet.receive.dao.headline=Αποκεντρωμένος Αυτόνομος Οργανισμός (DAO) Bisq
|
||||||
dao.wallet.receive.daoInfo=Just as the Bisq exchange is decentralized and censorship-resistant, so is its governance model — and the Bisq DAO and BSQ token are the tools that make it possible.
|
dao.wallet.receive.daoInfo=Just as the Bisq exchange is decentralized and censorship-resistant, so is its governance model — and the Bisq DAO and BSQ token are the tools that make it possible.
|
||||||
dao.wallet.receive.daoInfo.button=Learn more about the Bisq DAO
|
dao.wallet.receive.daoInfo.button=Μάθε περισσότερα για τον Bisq DAO
|
||||||
dao.wallet.receive.daoTestnetInfo=The mainnet Bisq DAO is not launched yet but you can learn about the Bisq DAO by running it on testnet.
|
dao.wallet.receive.daoTestnetInfo=The mainnet Bisq DAO is not launched yet but you can learn about the Bisq DAO by running it on testnet.
|
||||||
dao.wallet.receive.daoTestnetInfo.button=How to run the Bisq DAO on our testnet
|
dao.wallet.receive.daoTestnetInfo.button=How to run the Bisq DAO on our testnet
|
||||||
dao.wallet.receive.daoContributorInfo=If you have contributed to Bisq please use the BSQ address below and make a request for taking part of the BSQ genesis distribution.
|
dao.wallet.receive.daoContributorInfo=If you have contributed to Bisq please use the BSQ address below and make a request for taking part of the BSQ genesis distribution.
|
||||||
|
@ -1549,7 +1550,7 @@ dao.wallet.receive.daoContributorInfo.button=How to be part of the BSQ genesis d
|
||||||
|
|
||||||
dao.wallet.send.sendFunds=Αποστολή κεφαλαίων
|
dao.wallet.send.sendFunds=Αποστολή κεφαλαίων
|
||||||
dao.wallet.send.sendBtcFunds=Send non-BSQ funds (BTC)
|
dao.wallet.send.sendBtcFunds=Send non-BSQ funds (BTC)
|
||||||
dao.wallet.send.amount=Amount in BSQ
|
dao.wallet.send.amount=Ποσό σε BSQ
|
||||||
dao.wallet.send.btcAmount=Amount in BTC (non-BSQ funds)
|
dao.wallet.send.btcAmount=Amount in BTC (non-BSQ funds)
|
||||||
dao.wallet.send.setAmount=Όρισε ποσό ανάληψης (ελάχιστο ποσό {0})
|
dao.wallet.send.setAmount=Όρισε ποσό ανάληψης (ελάχιστο ποσό {0})
|
||||||
dao.wallet.send.setBtcAmount=Set amount in BTC to withdraw (min. amount is {0})
|
dao.wallet.send.setBtcAmount=Set amount in BTC to withdraw (min. amount is {0})
|
||||||
|
@ -1557,10 +1558,10 @@ dao.wallet.send.receiverAddress=Receiver's BSQ address
|
||||||
dao.wallet.send.receiverBtcAddress=Receiver's BTC address
|
dao.wallet.send.receiverBtcAddress=Receiver's BTC address
|
||||||
dao.wallet.send.setDestinationAddress=Συμπλήρωσε τη διεύθυνση προορισμού
|
dao.wallet.send.setDestinationAddress=Συμπλήρωσε τη διεύθυνση προορισμού
|
||||||
dao.wallet.send.send=Αποστολή κεφαλαίων BSQ
|
dao.wallet.send.send=Αποστολή κεφαλαίων BSQ
|
||||||
dao.wallet.send.sendBtc=Send BTC funds
|
dao.wallet.send.sendBtc=Αποστολή κεφαλαίων BTC
|
||||||
dao.wallet.send.sendFunds.headline=Επιβεβαίωση αίτησης ανάληψης
|
dao.wallet.send.sendFunds.headline=Επιβεβαίωση αίτησης ανάληψης
|
||||||
dao.wallet.send.sendFunds.details=Αποστολή: {0}\nΔιεύθυνση παραλαβής: {1}\nΑπαιτούμενη αμοιβή συναλλαγής: {2} ({3} satoshis/byte)\nΜέγεθος συναλλαγής: {4} Kb\n\nΟ παραλήπτης θα λάβει: {5}\n\nΕίσαι σίγουρος πως θέλεις να κάνεις ανάληψη αυτού του ποσού;
|
dao.wallet.send.sendFunds.details=Αποστολή: {0}\nΔιεύθυνση παραλαβής: {1}\nΑπαιτούμενη αμοιβή συναλλαγής: {2} ({3} satoshis/byte)\nΜέγεθος συναλλαγής: {4} Kb\n\nΟ παραλήπτης θα λάβει: {5}\n\nΕίσαι σίγουρος πως θέλεις να κάνεις ανάληψη αυτού του ποσού;
|
||||||
dao.wallet.chainHeightSynced=Latest verified block: {0}
|
dao.wallet.chainHeightSynced=Τελευταίο επιβεβαιωμένο block: {0}
|
||||||
dao.wallet.chainHeightSyncing=Awaiting blocks... Verified {0} blocks out of {1}
|
dao.wallet.chainHeightSyncing=Awaiting blocks... Verified {0} blocks out of {1}
|
||||||
dao.wallet.tx.type=Τύπος
|
dao.wallet.tx.type=Τύπος
|
||||||
|
|
||||||
|
@ -1603,6 +1604,7 @@ dao.tx.type.enum.PROOF_OF_BURN=Proof of burn
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.tx.type.enum.IRREGULAR=Irregular
|
dao.tx.type.enum.IRREGULAR=Irregular
|
||||||
|
|
||||||
|
dao.tx.withdrawnFromWallet=BTC withdrawn from wallet
|
||||||
dao.tx.issuanceFromCompReq=Αίτημα/έκδοση αποζημίωσης
|
dao.tx.issuanceFromCompReq=Αίτημα/έκδοση αποζημίωσης
|
||||||
dao.tx.issuanceFromCompReq.tooltip=Αίτημα αποζημίωσης το οποίο οδήγησε σε έκδοση νέων BSQ.\nΗμερομηνία έκδοσης: {0}
|
dao.tx.issuanceFromCompReq.tooltip=Αίτημα αποζημίωσης το οποίο οδήγησε σε έκδοση νέων BSQ.\nΗμερομηνία έκδοσης: {0}
|
||||||
dao.tx.issuanceFromReimbursement=Reimbursement request/issuance
|
dao.tx.issuanceFromReimbursement=Reimbursement request/issuance
|
||||||
|
@ -1611,10 +1613,15 @@ dao.proposal.create.missingBsqFunds=You don''t have sufficient BSQ funds for cre
|
||||||
|
|
||||||
dao.proposal.create.missingBsqFundsForBond=You don''t have sufficient BSQ funds for this role. You can still publish this proposal, but you''ll need the full BSQ amount required for this role if it gets accepted. \nMissing: {0}
|
dao.proposal.create.missingBsqFundsForBond=You don''t have sufficient BSQ funds for this role. You can still publish this proposal, but you''ll need the full BSQ amount required for this role if it gets accepted. \nMissing: {0}
|
||||||
|
|
||||||
dao.proposal.create.missingMinerFeeFunds=You don''t have sufficient BTC funds for creating the proposal transaction. Any BSQ transaction require also a miner fee in BTC.\nMissing: {0}
|
dao.proposal.create.missingMinerFeeFunds=You don''t have sufficient BTC funds for creating the proposal transaction. All BSQ transactions require a miner fee in BTC.\nMissing: {0}
|
||||||
|
|
||||||
|
dao.proposal.create.missingIssuanceFunds=You don''t have sufficient BTC funds for creating the proposal transaction. All BSQ transactions require a miner fee in BTC, and issuance transactions also require BTC for the requested BSQ amount ({0} Satoshis/BSQ).\nMissing: {1}
|
||||||
|
|
||||||
dao.feeTx.confirm=Επιβεβαίωση συναλλαγής {0}
|
dao.feeTx.confirm=Επιβεβαίωση συναλλαγής {0}
|
||||||
dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/byte)\nTransaction size: {4} Kb\n\nAre you sure you want to publish the {5} transaction?
|
dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/byte)\nTransaction size: {4} Kb\n\nAre you sure you want to publish the {5} transaction?
|
||||||
|
|
||||||
|
dao.feeTx.issuanceProposal.confirm.details={0} fee: {1}\nBTC needed for BSQ issuance: {2} ({3} Satoshis/BSQ)\nMining fee: {4} ({5} Satoshis/byte)\nTransaction size: {6} Kb\n\nIf your request is approved, you will receive the amount you requested net of the 2 BSQ proposal fee.\n\nAre you sure you want to publish the {7} transaction?
|
||||||
|
|
||||||
dao.news.bisqDAO.title=THE BISQ DAO
|
dao.news.bisqDAO.title=THE BISQ DAO
|
||||||
dao.news.bisqDAO.description=Just as the Bisq exchange is decentralized and censorship-resistant, so is its governance model - and the Bisq DAO and BSQ token are the tools that make it possible.
|
dao.news.bisqDAO.description=Just as the Bisq exchange is decentralized and censorship-resistant, so is its governance model - and the Bisq DAO and BSQ token are the tools that make it possible.
|
||||||
dao.news.bisqDAO.readMoreLink=Learn More About the Bisq DAO
|
dao.news.bisqDAO.readMoreLink=Learn More About the Bisq DAO
|
||||||
|
@ -1641,7 +1648,7 @@ dao.monitor.proposals=Proposals state
|
||||||
dao.monitor.blindVotes=Blind votes state
|
dao.monitor.blindVotes=Blind votes state
|
||||||
|
|
||||||
dao.monitor.table.peers=Peers
|
dao.monitor.table.peers=Peers
|
||||||
dao.monitor.table.conflicts=Conflicts
|
dao.monitor.table.conflicts=Διενέξεις
|
||||||
dao.monitor.state=Κατάσταση
|
dao.monitor.state=Κατάσταση
|
||||||
dao.monitor.requestAlHashes=Request all hashes
|
dao.monitor.requestAlHashes=Request all hashes
|
||||||
dao.monitor.resync=Resync DAO state
|
dao.monitor.resync=Resync DAO state
|
||||||
|
@ -1946,6 +1953,8 @@ popup.warning.nodeBanned=Ένας από τους κόμβους {0} απαγο
|
||||||
popup.warning.priceRelay=αναμετάδοση τιμής
|
popup.warning.priceRelay=αναμετάδοση τιμής
|
||||||
popup.warning.seed=Λέξεις seed
|
popup.warning.seed=Λέξεις seed
|
||||||
|
|
||||||
|
popup.warning.burnBTC=This transaction is not possible, as the mining fees of {0} would exceed the amount to transfer of {1}. Please wait until the mining fees are low again or until you''ve accumulated more BTC to transfer.
|
||||||
|
|
||||||
popup.info.securityDepositInfo=To ensure both traders follow the trade protocol, both traders need to pay a security deposit.\n\nThis deposit is kept in your trade wallet until your trade has been successfully completed, and then it's refunded to you.\n\nPlease note: if you're creating a new offer, Bisq needs to be running for another trader to take it. To keep your offers online, keep Bisq running and make sure this computer remains online too (i.e., make sure it doesn't switch to standby mode...monitor standby is fine).
|
popup.info.securityDepositInfo=To ensure both traders follow the trade protocol, both traders need to pay a security deposit.\n\nThis deposit is kept in your trade wallet until your trade has been successfully completed, and then it's refunded to you.\n\nPlease note: if you're creating a new offer, Bisq needs to be running for another trader to take it. To keep your offers online, keep Bisq running and make sure this computer remains online too (i.e., make sure it doesn't switch to standby mode...monitor standby is fine).
|
||||||
|
|
||||||
popup.info.cashDepositInfo=Βεβαιώσου πως έχεις υποκατάστημα τράπεζας στην περιοχή σου όπου μπορείς να κάνεις την κατάθεση.\nBIC/SWIFT τράπεζας πωλητή: {0}.
|
popup.info.cashDepositInfo=Βεβαιώσου πως έχεις υποκατάστημα τράπεζας στην περιοχή σου όπου μπορείς να κάνεις την κατάθεση.\nBIC/SWIFT τράπεζας πωλητή: {0}.
|
||||||
|
|
|
@ -318,12 +318,12 @@ offerbook.filterByPaymentMethod=Filtrar por método de pago
|
||||||
offerbook.nrOffers=Número de ofertas: {0}
|
offerbook.nrOffers=Número de ofertas: {0}
|
||||||
offerbook.volume={0} (min - max)
|
offerbook.volume={0} (min - max)
|
||||||
|
|
||||||
offerbook.createOfferToBuy=Create new offer to buy {0}
|
offerbook.createOfferToBuy=Crear nueva oferta para comprar {0}
|
||||||
offerbook.createOfferToSell=Create new offer to sell {0}
|
offerbook.createOfferToSell=Crear nueva oferta para vender {0}
|
||||||
offerbook.createOfferToBuy.withFiat=Create new offer to buy {0} with {1}
|
offerbook.createOfferToBuy.withFiat=Crear nueva oferta para comprar {0} con {1}
|
||||||
offerbook.createOfferToSell.forFiat=Create new offer to sell {0} for {1}
|
offerbook.createOfferToSell.forFiat=Crear nueva oferta para vender {0} por {1}
|
||||||
offerbook.createOfferToBuy.withCrypto=Create new offer to sell {0} (buy {1})
|
offerbook.createOfferToBuy.withCrypto=Crear nueva oferta para vender {0} (comprar {1})
|
||||||
offerbook.createOfferToSell.forCrypto=Create new offer to buy {0} (sell {1})
|
offerbook.createOfferToSell.forCrypto=Crear nueva oferta para comprar {0} (vender {1})
|
||||||
|
|
||||||
offerbook.takeOfferButton.tooltip=Tomar oferta {0}
|
offerbook.takeOfferButton.tooltip=Tomar oferta {0}
|
||||||
offerbook.yesCreateOffer=Sí, crear oferta
|
offerbook.yesCreateOffer=Sí, crear oferta
|
||||||
|
@ -739,6 +739,7 @@ funds.tx.unknown=Razón desconocida: {0}
|
||||||
funds.tx.noFundsFromDispute=Sin devolución de disputa
|
funds.tx.noFundsFromDispute=Sin devolución de disputa
|
||||||
funds.tx.receivedFunds=Fondos recibidos
|
funds.tx.receivedFunds=Fondos recibidos
|
||||||
funds.tx.withdrawnFromWallet=Retirar desde el monedero
|
funds.tx.withdrawnFromWallet=Retirar desde el monedero
|
||||||
|
funds.tx.withdrawnFromBSQWallet=BTC retirados desde el monedero BSQ
|
||||||
funds.tx.noTxAvailable=Sin transacciones disponibles
|
funds.tx.noTxAvailable=Sin transacciones disponibles
|
||||||
funds.tx.revert=Revertir
|
funds.tx.revert=Revertir
|
||||||
funds.tx.txSent=La transacción se ha enviado exitosamente a una nueva dirección en la billetera Bisq local.
|
funds.tx.txSent=La transacción se ha enviado exitosamente a una nueva dirección en la billetera Bisq local.
|
||||||
|
@ -1057,7 +1058,7 @@ account.notifications.priceAlert.warning.lowerPriceTooHigh=El precio inferior de
|
||||||
# DAO
|
# DAO
|
||||||
####################################################################
|
####################################################################
|
||||||
|
|
||||||
dao.tab.factsAndFigures=Facts & Figures
|
dao.tab.factsAndFigures=Hechos y figuras
|
||||||
dao.tab.bsqWallet=Monedero BSQ
|
dao.tab.bsqWallet=Monedero BSQ
|
||||||
dao.tab.proposals=Gobernancia
|
dao.tab.proposals=Gobernancia
|
||||||
dao.tab.bonding=Obligaciones
|
dao.tab.bonding=Obligaciones
|
||||||
|
@ -1199,7 +1200,7 @@ dao.param.MAX_TRADE_LIMIT=Límite máximo de intercambio en BTC
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.param.BONDED_ROLE_FACTOR=Unidad de factor de rol bonificado en BSQ
|
dao.param.BONDED_ROLE_FACTOR=Unidad de factor de rol bonificado en BSQ
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.param.ISSUANCE_LIMIT=Issuance limit per cycle in BSQ
|
dao.param.ISSUANCE_LIMIT=Límite de emisión por ciclo en BSQ
|
||||||
|
|
||||||
dao.param.currentValue=Valor actual: {0}
|
dao.param.currentValue=Valor actual: {0}
|
||||||
dao.param.blocks={0} bloques
|
dao.param.blocks={0} bloques
|
||||||
|
@ -1475,10 +1476,10 @@ dao.proposal.myVote.removeMyVote=Ignorar propuesta
|
||||||
dao.proposal.myVote.merit=Peso del voto de BSQ adquiridos
|
dao.proposal.myVote.merit=Peso del voto de BSQ adquiridos
|
||||||
dao.proposal.myVote.stake=Peso de voto desde stake
|
dao.proposal.myVote.stake=Peso de voto desde stake
|
||||||
dao.proposal.myVote.revealTxId=ID de transacción de revelado de voto
|
dao.proposal.myVote.revealTxId=ID de transacción de revelado de voto
|
||||||
dao.proposal.myVote.stake.prompt=Max. available stake for voting: {0}
|
dao.proposal.myVote.stake.prompt=Cantidad máxima disponible para votaciones: {0}
|
||||||
dao.proposal.votes.header=Set stake for voting and publish your votes
|
dao.proposal.votes.header=Establecer cantidad para votaciones y publicar sus votos
|
||||||
dao.proposal.myVote.button=Publish votes
|
dao.proposal.myVote.button=Publicar votos
|
||||||
dao.proposal.myVote.setStake.description=After voting on all proposals you have to set your stake for voting by locking up BSQ. The more BSQ you lock up, the more weight your vote will have. \n\nBSQ locked up for voting will be unlocked again during the vote reveal phase.
|
dao.proposal.myVote.setStake.description=Después de votar en todas las propuestas tiene que establecer su cantidad para votaciones bloqueando BSQ. Cuantos más BSQ bloquee, más peso tendrá su voto.\n\nLos BSQ bloqueados para votaciones serán desbloqueados de nuevo durante la fase de revelado de votación.
|
||||||
dao.proposal.create.selectProposalType=Seleccionar tipo de propuesta
|
dao.proposal.create.selectProposalType=Seleccionar tipo de propuesta
|
||||||
dao.proposal.create.phase.inactive=Por favor espere a la próxima fase de propuesta
|
dao.proposal.create.phase.inactive=Por favor espere a la próxima fase de propuesta
|
||||||
dao.proposal.create.proposalType=Tipo de propuesta
|
dao.proposal.create.proposalType=Tipo de propuesta
|
||||||
|
@ -1603,6 +1604,7 @@ dao.tx.type.enum.PROOF_OF_BURN=Prueba de quemado
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.tx.type.enum.IRREGULAR=Irregular
|
dao.tx.type.enum.IRREGULAR=Irregular
|
||||||
|
|
||||||
|
dao.tx.withdrawnFromWallet=BTC retirados desde el monedero
|
||||||
dao.tx.issuanceFromCompReq=Solicitud/emisión de compensación
|
dao.tx.issuanceFromCompReq=Solicitud/emisión de compensación
|
||||||
dao.tx.issuanceFromCompReq.tooltip=Solicitud de compensación que lleva a emitir nuevos BSQ.\nFecha de emisión: {0}
|
dao.tx.issuanceFromCompReq.tooltip=Solicitud de compensación que lleva a emitir nuevos BSQ.\nFecha de emisión: {0}
|
||||||
dao.tx.issuanceFromReimbursement=Solicitud de reembolso/emisión
|
dao.tx.issuanceFromReimbursement=Solicitud de reembolso/emisión
|
||||||
|
@ -1611,10 +1613,15 @@ dao.proposal.create.missingBsqFunds=No tiene suficientes fondos para crear la pr
|
||||||
|
|
||||||
dao.proposal.create.missingBsqFundsForBond=No tiene suficientes fondos BSQ para este rol. Aún puede publicar esta propuesta, pero necesitará la cantidad BSQ requerida para este rol si es aceptada.\nSe necesitan: {0}
|
dao.proposal.create.missingBsqFundsForBond=No tiene suficientes fondos BSQ para este rol. Aún puede publicar esta propuesta, pero necesitará la cantidad BSQ requerida para este rol si es aceptada.\nSe necesitan: {0}
|
||||||
|
|
||||||
dao.proposal.create.missingMinerFeeFunds=No tiene suficientes fondos BTC para crear la propuesta de transacción. Cualquier transacción BSQ requiere también una tasa de minado en BTC.\nSe necesitan: {0}
|
dao.proposal.create.missingMinerFeeFunds=No tiene suficientes fondos BTC para crear la transacción propuesta. Todas las transacciones BSQ requieren una tasa de minado en BTC.\nNecesarios: {0}
|
||||||
|
|
||||||
|
dao.proposal.create.missingIssuanceFunds=No tiene suficientes fondos BTC para crear la transacción propuesta. Todas las transacciones BSQ requieren una tasa de minado en BTC, y la emisión de transacciones también requieren BTC para la cantidad de BSQ solicitada ({0} Satoshis/BSQ).\nNecesarios: {1}
|
||||||
|
|
||||||
dao.feeTx.confirm=Confirmar transacción {0}
|
dao.feeTx.confirm=Confirmar transacción {0}
|
||||||
dao.feeTx.confirm.details={0} tasa: {1}\nTasa de minado: {2} ({3} Satoshis/byte)\nTamaño de la transacción: {4} Kb\n\nEstá seguro de que quire publicar la transacción {5}?
|
dao.feeTx.confirm.details={0} tasa: {1}\nTasa de minado: {2} ({3} Satoshis/byte)\nTamaño de la transacción: {4} Kb\n\nEstá seguro de que quire publicar la transacción {5}?
|
||||||
|
|
||||||
|
dao.feeTx.issuanceProposal.confirm.details={0} tasa: {1}\nBTC necesarios para emisión BSQ: {2} ({3} Satoshis/BSQ)\nTasa de minado: {4} ({5} Satoshis/byte)\nTamaño de transacción: {6} Kb\n\nSi la solicitud se aprueba, recibirá la cantidad neta que ha solicitado de las 2 tasa de propuesta que ha solicitado.\nEstá seguro de que quiere publicar la transacción {7}?
|
||||||
|
|
||||||
dao.news.bisqDAO.title=La DAO BISQ
|
dao.news.bisqDAO.title=La DAO BISQ
|
||||||
dao.news.bisqDAO.description=Tal como el exchange Bisq es descentralizado y resistente a la censura, lo es su modelo de governanza - y la DAO BISQ y el token BSQ son herramientas que lo hacen posible.
|
dao.news.bisqDAO.description=Tal como el exchange Bisq es descentralizado y resistente a la censura, lo es su modelo de governanza - y la DAO BISQ y el token BSQ son herramientas que lo hacen posible.
|
||||||
dao.news.bisqDAO.readMoreLink=Aprender más acerca de la DAO Bisq.
|
dao.news.bisqDAO.readMoreLink=Aprender más acerca de la DAO Bisq.
|
||||||
|
@ -1656,10 +1663,10 @@ dao.monitor.daoState.table.blockHeight=Altura de bloque
|
||||||
dao.monitor.daoState.table.hash=Estado de hashes de DAO
|
dao.monitor.daoState.table.hash=Estado de hashes de DAO
|
||||||
dao.monitor.daoState.table.prev=Hash previo
|
dao.monitor.daoState.table.prev=Hash previo
|
||||||
dao.monitor.daoState.conflictTable.headline=Estado de hashes DAO desde pares en conflicto
|
dao.monitor.daoState.conflictTable.headline=Estado de hashes DAO desde pares en conflicto
|
||||||
dao.monitor.daoState.utxoConflicts=UTXO conflicts
|
dao.monitor.daoState.utxoConflicts=conflictos UTXO
|
||||||
dao.monitor.daoState.utxoConflicts.blockHeight=Block height: {0}
|
dao.monitor.daoState.utxoConflicts.blockHeight=Altura de bloque: {0}
|
||||||
dao.monitor.daoState.utxoConflicts.sumUtxo=Sum of all UTXO: {0} BSQ
|
dao.monitor.daoState.utxoConflicts.sumUtxo=Suma de todas las UTXO: {0} BSQ
|
||||||
dao.monitor.daoState.utxoConflicts.sumBsq=Sum of all BSQ: {0} BSQ
|
dao.monitor.daoState.utxoConflicts.sumBsq=Suma de todlas las BSQ: {0} BSQ
|
||||||
|
|
||||||
dao.monitor.proposal.headline=Estado de propuestas
|
dao.monitor.proposal.headline=Estado de propuestas
|
||||||
dao.monitor.proposal.daoStateInSync=El estado de sus propuestas local está en consenso con la red
|
dao.monitor.proposal.daoStateInSync=El estado de sus propuestas local está en consenso con la red
|
||||||
|
@ -1681,27 +1688,27 @@ dao.monitor.blindVote.table.hash=Estado de hash de voto a ciegas
|
||||||
dao.monitor.blindVote.table.prev=Hash previo
|
dao.monitor.blindVote.table.prev=Hash previo
|
||||||
dao.monitor.blindVote.table.numBlindVotes=Número de votos a ciegas
|
dao.monitor.blindVote.table.numBlindVotes=Número de votos a ciegas
|
||||||
|
|
||||||
dao.factsAndFigures.menuItem.supply=BSQ Supply
|
dao.factsAndFigures.menuItem.supply=Oferta BSQ
|
||||||
dao.factsAndFigures.menuItem.transactions=BSQ Transactions
|
dao.factsAndFigures.menuItem.transactions=Transacciones BSQ
|
||||||
|
|
||||||
dao.factsAndFigures.dashboard.marketPrice=Datos de mercad
|
dao.factsAndFigures.dashboard.marketPrice=Datos de mercad
|
||||||
dao.factsAndFigures.dashboard.price=Último precio intercambio BSQ/BTC (en Bisq)
|
dao.factsAndFigures.dashboard.price=Último precio intercambio BSQ/BTC (en Bisq)
|
||||||
dao.factsAndFigures.dashboard.marketCap=Capitalización de mercado (basado en el precio de intercambio)
|
dao.factsAndFigures.dashboard.marketCap=Capitalización de mercado (basado en el precio de intercambio)
|
||||||
dao.factsAndFigures.dashboard.availableAmount=BSQ totales disponibles
|
dao.factsAndFigures.dashboard.availableAmount=BSQ totales disponibles
|
||||||
|
|
||||||
dao.factsAndFigures.supply.issued=BSQ issued
|
dao.factsAndFigures.supply.issued=BSQ emitidos
|
||||||
dao.factsAndFigures.supply.genesisIssueAmount=BSQ emitidos en la transacción génesis
|
dao.factsAndFigures.supply.genesisIssueAmount=BSQ emitidos en la transacción génesis
|
||||||
dao.factsAndFigures.supply.compRequestIssueAmount=BSQ emitidos para solicitudes de compensación
|
dao.factsAndFigures.supply.compRequestIssueAmount=BSQ emitidos para solicitudes de compensación
|
||||||
dao.factsAndFigures.supply.reimbursementAmount=BSQ emitidos para solicitudes de reembolso
|
dao.factsAndFigures.supply.reimbursementAmount=BSQ emitidos para solicitudes de reembolso
|
||||||
|
|
||||||
dao.factsAndFigures.supply.burnt=BSQ burnt
|
dao.factsAndFigures.supply.burnt=BSQ quemados
|
||||||
|
|
||||||
dao.factsAndFigures.supply.locked=Estado global de BSQ bloqueados
|
dao.factsAndFigures.supply.locked=Estado global de BSQ bloqueados
|
||||||
dao.factsAndFigures.supply.totalLockedUpAmount=Bloqueados en obligaciones
|
dao.factsAndFigures.supply.totalLockedUpAmount=Bloqueados en obligaciones
|
||||||
dao.factsAndFigures.supply.totalUnlockingAmount=Desbloqueando BSQ de bonos
|
dao.factsAndFigures.supply.totalUnlockingAmount=Desbloqueando BSQ de bonos
|
||||||
dao.factsAndFigures.supply.totalUnlockedAmount=BSQ desbloqueados de bonos
|
dao.factsAndFigures.supply.totalUnlockedAmount=BSQ desbloqueados de bonos
|
||||||
dao.factsAndFigures.supply.totalConfiscatedAmount=BSQ confiscados de bonos
|
dao.factsAndFigures.supply.totalConfiscatedAmount=BSQ confiscados de bonos
|
||||||
dao.factsAndFigures.supply.invalidTxs=Burned BSQ (invalid transactions)
|
dao.factsAndFigures.supply.invalidTxs=BSQ quemados (transacciones inválidas)
|
||||||
dao.factsAndFigures.supply.burntAmount=BSQ quemados (tasas)
|
dao.factsAndFigures.supply.burntAmount=BSQ quemados (tasas)
|
||||||
|
|
||||||
dao.factsAndFigures.transactions.genesis=Transacción génesis
|
dao.factsAndFigures.transactions.genesis=Transacción génesis
|
||||||
|
@ -1713,8 +1720,8 @@ dao.factsAndFigures.transactions.utxo=Número de todos los outputs de transaccio
|
||||||
dao.factsAndFigures.transactions.compensationIssuanceTx=Número de todas las transacciones emitidas de solicitudes de compensación
|
dao.factsAndFigures.transactions.compensationIssuanceTx=Número de todas las transacciones emitidas de solicitudes de compensación
|
||||||
dao.factsAndFigures.transactions.reimbursementIssuanceTx=Número de todas las transacciones emitidas de solicitud de reembolso
|
dao.factsAndFigures.transactions.reimbursementIssuanceTx=Número de todas las transacciones emitidas de solicitud de reembolso
|
||||||
dao.factsAndFigures.transactions.burntTx=Número de todas las transacciones de tasa de pago
|
dao.factsAndFigures.transactions.burntTx=Número de todas las transacciones de tasa de pago
|
||||||
dao.factsAndFigures.transactions.invalidTx=No. of all invalid transactions
|
dao.factsAndFigures.transactions.invalidTx=Número de todas las transacciones inválidas
|
||||||
dao.factsAndFigures.transactions.irregularTx=No. of all irregular transactions
|
dao.factsAndFigures.transactions.irregularTx=Número de todas las transacciones irregulares
|
||||||
|
|
||||||
####################################################################
|
####################################################################
|
||||||
# Windows
|
# Windows
|
||||||
|
@ -1946,6 +1953,8 @@ popup.warning.nodeBanned=Uno de los nodos {0} ha sido baneado. Por favor reinici
|
||||||
popup.warning.priceRelay=retransmisión de precios
|
popup.warning.priceRelay=retransmisión de precios
|
||||||
popup.warning.seed=Semilla
|
popup.warning.seed=Semilla
|
||||||
|
|
||||||
|
popup.warning.burnBTC=Esta transacción no es posible, ya que las tasas de minado de {0} excederían la cantidad a transferir de {1}. Por favor, espere a que las tasas de minado bajen o hasta que haya acumulado más BTC para transferir.
|
||||||
|
|
||||||
popup.info.securityDepositInfo=Para asegurarse de que ambos comerciantes siguen el protocolo de intercambio, necesitan pagar un depósito de seguridad.\n\nEl depósito se guarda en el monedor de intercambio hasta que el intercambio se complete, y entonces se devuelve.\n\nPor favor, tenga en cuenta que al crear una nueva oferta, Bisq necesita estar en ejecución para que otro comerciante la tome. Para mantener sus ofertas online, mantenga Bisq funcionando y asegúrese de que su computadora está online también (v.g. asegúrese de que no pasa a modo standby...el monitor en standby no es problema!)
|
popup.info.securityDepositInfo=Para asegurarse de que ambos comerciantes siguen el protocolo de intercambio, necesitan pagar un depósito de seguridad.\n\nEl depósito se guarda en el monedor de intercambio hasta que el intercambio se complete, y entonces se devuelve.\n\nPor favor, tenga en cuenta que al crear una nueva oferta, Bisq necesita estar en ejecución para que otro comerciante la tome. Para mantener sus ofertas online, mantenga Bisq funcionando y asegúrese de que su computadora está online también (v.g. asegúrese de que no pasa a modo standby...el monitor en standby no es problema!)
|
||||||
|
|
||||||
popup.info.cashDepositInfo=Por favor asegúrese de que tiene una oficina bancaria donde pueda hacer el depósito de efectivo.\nEl banco con ID (BIC/SWIFT) de el banco del vendedor es: {0}
|
popup.info.cashDepositInfo=Por favor asegúrese de que tiene una oficina bancaria donde pueda hacer el depósito de efectivo.\nEl banco con ID (BIC/SWIFT) de el banco del vendedor es: {0}
|
||||||
|
@ -2117,11 +2126,11 @@ BTC_TESTNET=Red de prueba de Bitcoin
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
BTC_REGTEST=Regtest Bitcoin
|
BTC_REGTEST=Regtest Bitcoin
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
BTC_DAO_TESTNET=Bitcoin DAO Testnet (deprecated)
|
BTC_DAO_TESTNET=Testnet de Bitcoin DAO (depreciada)
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
BTC_DAO_BETANET=Bitcoin DAO Betanet (Bitcoin Mainnet)
|
BTC_DAO_BETANET=Bitcoin DAO Betanet (Bitcoin Mainnet)
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
BTC_DAO_REGTEST=Bitcoin DAO Regtest
|
BTC_DAO_REGTEST=Regtest de Bitcoin DAO
|
||||||
|
|
||||||
time.year=Año
|
time.year=Año
|
||||||
time.month=Mes
|
time.month=Mes
|
||||||
|
|
|
@ -739,6 +739,7 @@ funds.tx.unknown=دلیل ناشناخته: {0}
|
||||||
funds.tx.noFundsFromDispute=عدم بازپرداخت از مناقشه
|
funds.tx.noFundsFromDispute=عدم بازپرداخت از مناقشه
|
||||||
funds.tx.receivedFunds=وجوه دریافت شده
|
funds.tx.receivedFunds=وجوه دریافت شده
|
||||||
funds.tx.withdrawnFromWallet=برداشت شده از کیف پول
|
funds.tx.withdrawnFromWallet=برداشت شده از کیف پول
|
||||||
|
funds.tx.withdrawnFromBSQWallet=BTC withdrawn from BSQ wallet
|
||||||
funds.tx.noTxAvailable=هیچ تراکنشی موجود نیست
|
funds.tx.noTxAvailable=هیچ تراکنشی موجود نیست
|
||||||
funds.tx.revert=عودت
|
funds.tx.revert=عودت
|
||||||
funds.tx.txSent=تراکنش به طور موفقیت آمیز به یک آدرس جدید در کیف پول محلی Bisq ارسال شد.
|
funds.tx.txSent=تراکنش به طور موفقیت آمیز به یک آدرس جدید در کیف پول محلی Bisq ارسال شد.
|
||||||
|
@ -1603,6 +1604,7 @@ dao.tx.type.enum.PROOF_OF_BURN=اثبات امحا
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.tx.type.enum.IRREGULAR=Irregular
|
dao.tx.type.enum.IRREGULAR=Irregular
|
||||||
|
|
||||||
|
dao.tx.withdrawnFromWallet=BTC withdrawn from wallet
|
||||||
dao.tx.issuanceFromCompReq=درخواست/صدور خسارت
|
dao.tx.issuanceFromCompReq=درخواست/صدور خسارت
|
||||||
dao.tx.issuanceFromCompReq.tooltip=درخواست خسارت که منجر به صدور BSQ جدید میشود.\nتاریخ صدور: {0}
|
dao.tx.issuanceFromCompReq.tooltip=درخواست خسارت که منجر به صدور BSQ جدید میشود.\nتاریخ صدور: {0}
|
||||||
dao.tx.issuanceFromReimbursement=درخواست/صدور بازپرداخت
|
dao.tx.issuanceFromReimbursement=درخواست/صدور بازپرداخت
|
||||||
|
@ -1611,10 +1613,15 @@ dao.proposal.create.missingBsqFunds=You don''t have sufficient BSQ funds for cre
|
||||||
|
|
||||||
dao.proposal.create.missingBsqFundsForBond=You don''t have sufficient BSQ funds for this role. You can still publish this proposal, but you''ll need the full BSQ amount required for this role if it gets accepted. \nMissing: {0}
|
dao.proposal.create.missingBsqFundsForBond=You don''t have sufficient BSQ funds for this role. You can still publish this proposal, but you''ll need the full BSQ amount required for this role if it gets accepted. \nMissing: {0}
|
||||||
|
|
||||||
dao.proposal.create.missingMinerFeeFunds=You don''t have sufficient BTC funds for creating the proposal transaction. Any BSQ transaction require also a miner fee in BTC.\nMissing: {0}
|
dao.proposal.create.missingMinerFeeFunds=You don''t have sufficient BTC funds for creating the proposal transaction. All BSQ transactions require a miner fee in BTC.\nMissing: {0}
|
||||||
|
|
||||||
|
dao.proposal.create.missingIssuanceFunds=You don''t have sufficient BTC funds for creating the proposal transaction. All BSQ transactions require a miner fee in BTC, and issuance transactions also require BTC for the requested BSQ amount ({0} Satoshis/BSQ).\nMissing: {1}
|
||||||
|
|
||||||
dao.feeTx.confirm=تایید {0} تراکنش
|
dao.feeTx.confirm=تایید {0} تراکنش
|
||||||
dao.feeTx.confirm.details=کارمزد {0}: {1}\nکارمزد استخراج: {2} ({3} ساتوشی بر بایت)\nاندازه تراکنش: {4} Kb\n\nآیا از انتشار تراکنش {5} اطمینان دارید؟
|
dao.feeTx.confirm.details=کارمزد {0}: {1}\nکارمزد استخراج: {2} ({3} ساتوشی بر بایت)\nاندازه تراکنش: {4} Kb\n\nآیا از انتشار تراکنش {5} اطمینان دارید؟
|
||||||
|
|
||||||
|
dao.feeTx.issuanceProposal.confirm.details={0} fee: {1}\nBTC needed for BSQ issuance: {2} ({3} Satoshis/BSQ)\nMining fee: {4} ({5} Satoshis/byte)\nTransaction size: {6} Kb\n\nIf your request is approved, you will receive the amount you requested net of the 2 BSQ proposal fee.\n\nAre you sure you want to publish the {7} transaction?
|
||||||
|
|
||||||
dao.news.bisqDAO.title=THE BISQ DAO
|
dao.news.bisqDAO.title=THE BISQ DAO
|
||||||
dao.news.bisqDAO.description=Just as the Bisq exchange is decentralized and censorship-resistant, so is its governance model - and the Bisq DAO and BSQ token are the tools that make it possible.
|
dao.news.bisqDAO.description=Just as the Bisq exchange is decentralized and censorship-resistant, so is its governance model - and the Bisq DAO and BSQ token are the tools that make it possible.
|
||||||
dao.news.bisqDAO.readMoreLink=Learn More About the Bisq DAO
|
dao.news.bisqDAO.readMoreLink=Learn More About the Bisq DAO
|
||||||
|
@ -1946,6 +1953,8 @@ popup.warning.nodeBanned=یکی از گره های {0} مسدود شده است.
|
||||||
popup.warning.priceRelay=رله قیمت
|
popup.warning.priceRelay=رله قیمت
|
||||||
popup.warning.seed=دانه
|
popup.warning.seed=دانه
|
||||||
|
|
||||||
|
popup.warning.burnBTC=This transaction is not possible, as the mining fees of {0} would exceed the amount to transfer of {1}. Please wait until the mining fees are low again or until you''ve accumulated more BTC to transfer.
|
||||||
|
|
||||||
popup.info.securityDepositInfo=برای اطمینان از اینکه هر دو معامله گر پروتکل معامله را رعایت میکنند، هر دو معامله گر باید مبلغی را تحت عنوان سپرده اطمینان پرداخت کنند.\n\nاین سپرده در کیفپول معامله شما نگهداری میشود و زمانی که معامله شما با موفقیت انجام شد به خود شما بازگردانده خواهد شد.\n\nلطفا توجه کنید: اگر میخواهید یک پیشنهاد جدید ایجاد کنید، Bisq باید برای در سمت معامله دیگر اجرا باشد تا بتوانند آن را بپذیرد. برای اینکه پیشنهادات شما برخط بمانند، بگذارید Bisq در حال اجرابماند و همچنین مطمئن شوید که این کامپیوتر به اینترنت متصل است. (به عنوان مثال مطمئن شوید که به حالت آماده باش نمیرود.. البته حالت آماده باش برای نمایشگر ایرادی ندارد).
|
popup.info.securityDepositInfo=برای اطمینان از اینکه هر دو معامله گر پروتکل معامله را رعایت میکنند، هر دو معامله گر باید مبلغی را تحت عنوان سپرده اطمینان پرداخت کنند.\n\nاین سپرده در کیفپول معامله شما نگهداری میشود و زمانی که معامله شما با موفقیت انجام شد به خود شما بازگردانده خواهد شد.\n\nلطفا توجه کنید: اگر میخواهید یک پیشنهاد جدید ایجاد کنید، Bisq باید برای در سمت معامله دیگر اجرا باشد تا بتوانند آن را بپذیرد. برای اینکه پیشنهادات شما برخط بمانند، بگذارید Bisq در حال اجرابماند و همچنین مطمئن شوید که این کامپیوتر به اینترنت متصل است. (به عنوان مثال مطمئن شوید که به حالت آماده باش نمیرود.. البته حالت آماده باش برای نمایشگر ایرادی ندارد).
|
||||||
|
|
||||||
popup.info.cashDepositInfo=لطفا مطمئن شوید که شما یک شعبه بانک در منطقه خود دارید تا بتوانید سپرده نقدی را بپردازید. شناسه بانکی (BIC/SWIFT) بانک فروشنده: {0}.
|
popup.info.cashDepositInfo=لطفا مطمئن شوید که شما یک شعبه بانک در منطقه خود دارید تا بتوانید سپرده نقدی را بپردازید. شناسه بانکی (BIC/SWIFT) بانک فروشنده: {0}.
|
||||||
|
|
|
@ -739,6 +739,7 @@ funds.tx.unknown=Raison inconnue: {0}
|
||||||
funds.tx.noFundsFromDispute=Aucun remboursement pour dispute
|
funds.tx.noFundsFromDispute=Aucun remboursement pour dispute
|
||||||
funds.tx.receivedFunds=Fonds reçus
|
funds.tx.receivedFunds=Fonds reçus
|
||||||
funds.tx.withdrawnFromWallet=Retiré depuis le portefeuille
|
funds.tx.withdrawnFromWallet=Retiré depuis le portefeuille
|
||||||
|
funds.tx.withdrawnFromBSQWallet=BTC withdrawn from BSQ wallet
|
||||||
funds.tx.noTxAvailable=Aucune transaction disponible
|
funds.tx.noTxAvailable=Aucune transaction disponible
|
||||||
funds.tx.revert=Défaire
|
funds.tx.revert=Défaire
|
||||||
funds.tx.txSent=Transaction envoyée avec succès à la nouvelle adresse dans le portefeuille local bisq.
|
funds.tx.txSent=Transaction envoyée avec succès à la nouvelle adresse dans le portefeuille local bisq.
|
||||||
|
@ -1603,6 +1604,7 @@ dao.tx.type.enum.PROOF_OF_BURN=Proof of burn
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.tx.type.enum.IRREGULAR=Irregular
|
dao.tx.type.enum.IRREGULAR=Irregular
|
||||||
|
|
||||||
|
dao.tx.withdrawnFromWallet=BTC withdrawn from wallet
|
||||||
dao.tx.issuanceFromCompReq=Compensation request/issuance
|
dao.tx.issuanceFromCompReq=Compensation request/issuance
|
||||||
dao.tx.issuanceFromCompReq.tooltip=Compensation request which led to an issuance of new BSQ.\nIssuance date: {0}
|
dao.tx.issuanceFromCompReq.tooltip=Compensation request which led to an issuance of new BSQ.\nIssuance date: {0}
|
||||||
dao.tx.issuanceFromReimbursement=Reimbursement request/issuance
|
dao.tx.issuanceFromReimbursement=Reimbursement request/issuance
|
||||||
|
@ -1611,10 +1613,15 @@ dao.proposal.create.missingBsqFunds=You don''t have sufficient BSQ funds for cre
|
||||||
|
|
||||||
dao.proposal.create.missingBsqFundsForBond=You don''t have sufficient BSQ funds for this role. You can still publish this proposal, but you''ll need the full BSQ amount required for this role if it gets accepted. \nMissing: {0}
|
dao.proposal.create.missingBsqFundsForBond=You don''t have sufficient BSQ funds for this role. You can still publish this proposal, but you''ll need the full BSQ amount required for this role if it gets accepted. \nMissing: {0}
|
||||||
|
|
||||||
dao.proposal.create.missingMinerFeeFunds=You don''t have sufficient BTC funds for creating the proposal transaction. Any BSQ transaction require also a miner fee in BTC.\nMissing: {0}
|
dao.proposal.create.missingMinerFeeFunds=You don''t have sufficient BTC funds for creating the proposal transaction. All BSQ transactions require a miner fee in BTC.\nMissing: {0}
|
||||||
|
|
||||||
|
dao.proposal.create.missingIssuanceFunds=You don''t have sufficient BTC funds for creating the proposal transaction. All BSQ transactions require a miner fee in BTC, and issuance transactions also require BTC for the requested BSQ amount ({0} Satoshis/BSQ).\nMissing: {1}
|
||||||
|
|
||||||
dao.feeTx.confirm=Confirm {0} transaction
|
dao.feeTx.confirm=Confirm {0} transaction
|
||||||
dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/byte)\nTransaction size: {4} Kb\n\nAre you sure you want to publish the {5} transaction?
|
dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/byte)\nTransaction size: {4} Kb\n\nAre you sure you want to publish the {5} transaction?
|
||||||
|
|
||||||
|
dao.feeTx.issuanceProposal.confirm.details={0} fee: {1}\nBTC needed for BSQ issuance: {2} ({3} Satoshis/BSQ)\nMining fee: {4} ({5} Satoshis/byte)\nTransaction size: {6} Kb\n\nIf your request is approved, you will receive the amount you requested net of the 2 BSQ proposal fee.\n\nAre you sure you want to publish the {7} transaction?
|
||||||
|
|
||||||
dao.news.bisqDAO.title=THE BISQ DAO
|
dao.news.bisqDAO.title=THE BISQ DAO
|
||||||
dao.news.bisqDAO.description=Just as the Bisq exchange is decentralized and censorship-resistant, so is its governance model - and the Bisq DAO and BSQ token are the tools that make it possible.
|
dao.news.bisqDAO.description=Just as the Bisq exchange is decentralized and censorship-resistant, so is its governance model - and the Bisq DAO and BSQ token are the tools that make it possible.
|
||||||
dao.news.bisqDAO.readMoreLink=Learn More About the Bisq DAO
|
dao.news.bisqDAO.readMoreLink=Learn More About the Bisq DAO
|
||||||
|
@ -1946,6 +1953,8 @@ popup.warning.nodeBanned=One of the {0} nodes got banned. Please restart your ap
|
||||||
popup.warning.priceRelay=price relay
|
popup.warning.priceRelay=price relay
|
||||||
popup.warning.seed=seed
|
popup.warning.seed=seed
|
||||||
|
|
||||||
|
popup.warning.burnBTC=This transaction is not possible, as the mining fees of {0} would exceed the amount to transfer of {1}. Please wait until the mining fees are low again or until you''ve accumulated more BTC to transfer.
|
||||||
|
|
||||||
popup.info.securityDepositInfo=To ensure both traders follow the trade protocol, both traders need to pay a security deposit.\n\nThis deposit is kept in your trade wallet until your trade has been successfully completed, and then it's refunded to you.\n\nPlease note: if you're creating a new offer, Bisq needs to be running for another trader to take it. To keep your offers online, keep Bisq running and make sure this computer remains online too (i.e., make sure it doesn't switch to standby mode...monitor standby is fine).
|
popup.info.securityDepositInfo=To ensure both traders follow the trade protocol, both traders need to pay a security deposit.\n\nThis deposit is kept in your trade wallet until your trade has been successfully completed, and then it's refunded to you.\n\nPlease note: if you're creating a new offer, Bisq needs to be running for another trader to take it. To keep your offers online, keep Bisq running and make sure this computer remains online too (i.e., make sure it doesn't switch to standby mode...monitor standby is fine).
|
||||||
|
|
||||||
popup.info.cashDepositInfo=Please be sure that you have a bank branch in your area to be able to make the cash deposit.\nThe bank ID (BIC/SWIFT) of the seller''s bank is: {0}.
|
popup.info.cashDepositInfo=Please be sure that you have a bank branch in your area to be able to make the cash deposit.\nThe bank ID (BIC/SWIFT) of the seller''s bank is: {0}.
|
||||||
|
|
|
@ -739,6 +739,7 @@ funds.tx.unknown=Ismeretlen ok: {0}
|
||||||
funds.tx.noFundsFromDispute=Nincs visszatérítés a vitából
|
funds.tx.noFundsFromDispute=Nincs visszatérítés a vitából
|
||||||
funds.tx.receivedFunds=Pénz részesedések
|
funds.tx.receivedFunds=Pénz részesedések
|
||||||
funds.tx.withdrawnFromWallet=Visszavonva a pénztárcából
|
funds.tx.withdrawnFromWallet=Visszavonva a pénztárcából
|
||||||
|
funds.tx.withdrawnFromBSQWallet=BTC withdrawn from BSQ wallet
|
||||||
funds.tx.noTxAvailable=Nincs hozzáférhető tranzakció
|
funds.tx.noTxAvailable=Nincs hozzáférhető tranzakció
|
||||||
funds.tx.revert=Visszaszállás
|
funds.tx.revert=Visszaszállás
|
||||||
funds.tx.txSent=Tranzakció sikeresen elküldve egy új címre a helyi Bisq pénztárcában.
|
funds.tx.txSent=Tranzakció sikeresen elküldve egy új címre a helyi Bisq pénztárcában.
|
||||||
|
@ -1603,6 +1604,7 @@ dao.tx.type.enum.PROOF_OF_BURN=Proof of burn
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.tx.type.enum.IRREGULAR=Irregular
|
dao.tx.type.enum.IRREGULAR=Irregular
|
||||||
|
|
||||||
|
dao.tx.withdrawnFromWallet=BTC withdrawn from wallet
|
||||||
dao.tx.issuanceFromCompReq=Compensation request/issuance
|
dao.tx.issuanceFromCompReq=Compensation request/issuance
|
||||||
dao.tx.issuanceFromCompReq.tooltip=Compensation request which led to an issuance of new BSQ.\nIssuance date: {0}
|
dao.tx.issuanceFromCompReq.tooltip=Compensation request which led to an issuance of new BSQ.\nIssuance date: {0}
|
||||||
dao.tx.issuanceFromReimbursement=Reimbursement request/issuance
|
dao.tx.issuanceFromReimbursement=Reimbursement request/issuance
|
||||||
|
@ -1611,10 +1613,15 @@ dao.proposal.create.missingBsqFunds=You don''t have sufficient BSQ funds for cre
|
||||||
|
|
||||||
dao.proposal.create.missingBsqFundsForBond=You don''t have sufficient BSQ funds for this role. You can still publish this proposal, but you''ll need the full BSQ amount required for this role if it gets accepted. \nMissing: {0}
|
dao.proposal.create.missingBsqFundsForBond=You don''t have sufficient BSQ funds for this role. You can still publish this proposal, but you''ll need the full BSQ amount required for this role if it gets accepted. \nMissing: {0}
|
||||||
|
|
||||||
dao.proposal.create.missingMinerFeeFunds=You don''t have sufficient BTC funds for creating the proposal transaction. Any BSQ transaction require also a miner fee in BTC.\nMissing: {0}
|
dao.proposal.create.missingMinerFeeFunds=You don''t have sufficient BTC funds for creating the proposal transaction. All BSQ transactions require a miner fee in BTC.\nMissing: {0}
|
||||||
|
|
||||||
|
dao.proposal.create.missingIssuanceFunds=You don''t have sufficient BTC funds for creating the proposal transaction. All BSQ transactions require a miner fee in BTC, and issuance transactions also require BTC for the requested BSQ amount ({0} Satoshis/BSQ).\nMissing: {1}
|
||||||
|
|
||||||
dao.feeTx.confirm=Confirm {0} transaction
|
dao.feeTx.confirm=Confirm {0} transaction
|
||||||
dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/byte)\nTransaction size: {4} Kb\n\nAre you sure you want to publish the {5} transaction?
|
dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/byte)\nTransaction size: {4} Kb\n\nAre you sure you want to publish the {5} transaction?
|
||||||
|
|
||||||
|
dao.feeTx.issuanceProposal.confirm.details={0} fee: {1}\nBTC needed for BSQ issuance: {2} ({3} Satoshis/BSQ)\nMining fee: {4} ({5} Satoshis/byte)\nTransaction size: {6} Kb\n\nIf your request is approved, you will receive the amount you requested net of the 2 BSQ proposal fee.\n\nAre you sure you want to publish the {7} transaction?
|
||||||
|
|
||||||
dao.news.bisqDAO.title=THE BISQ DAO
|
dao.news.bisqDAO.title=THE BISQ DAO
|
||||||
dao.news.bisqDAO.description=Just as the Bisq exchange is decentralized and censorship-resistant, so is its governance model - and the Bisq DAO and BSQ token are the tools that make it possible.
|
dao.news.bisqDAO.description=Just as the Bisq exchange is decentralized and censorship-resistant, so is its governance model - and the Bisq DAO and BSQ token are the tools that make it possible.
|
||||||
dao.news.bisqDAO.readMoreLink=Learn More About the Bisq DAO
|
dao.news.bisqDAO.readMoreLink=Learn More About the Bisq DAO
|
||||||
|
@ -1946,6 +1953,8 @@ popup.warning.nodeBanned=A {0} csomópontok egyike tiltva lett. Kérjük indíts
|
||||||
popup.warning.priceRelay=árjelentés
|
popup.warning.priceRelay=árjelentés
|
||||||
popup.warning.seed=mag
|
popup.warning.seed=mag
|
||||||
|
|
||||||
|
popup.warning.burnBTC=This transaction is not possible, as the mining fees of {0} would exceed the amount to transfer of {1}. Please wait until the mining fees are low again or until you''ve accumulated more BTC to transfer.
|
||||||
|
|
||||||
popup.info.securityDepositInfo=To ensure both traders follow the trade protocol, both traders need to pay a security deposit.\n\nThis deposit is kept in your trade wallet until your trade has been successfully completed, and then it's refunded to you.\n\nPlease note: if you're creating a new offer, Bisq needs to be running for another trader to take it. To keep your offers online, keep Bisq running and make sure this computer remains online too (i.e., make sure it doesn't switch to standby mode...monitor standby is fine).
|
popup.info.securityDepositInfo=To ensure both traders follow the trade protocol, both traders need to pay a security deposit.\n\nThis deposit is kept in your trade wallet until your trade has been successfully completed, and then it's refunded to you.\n\nPlease note: if you're creating a new offer, Bisq needs to be running for another trader to take it. To keep your offers online, keep Bisq running and make sure this computer remains online too (i.e., make sure it doesn't switch to standby mode...monitor standby is fine).
|
||||||
|
|
||||||
popup.info.cashDepositInfo=Please be sure that you have a bank branch in your area to be able to make the cash deposit.\nThe bank ID (BIC/SWIFT) of the seller''s bank is: {0}.
|
popup.info.cashDepositInfo=Please be sure that you have a bank branch in your area to be able to make the cash deposit.\nThe bank ID (BIC/SWIFT) of the seller''s bank is: {0}.
|
||||||
|
|
|
@ -639,7 +639,7 @@ tradeFeedbackWindow.msg.part3=Obrigado por usar Bisq!
|
||||||
|
|
||||||
|
|
||||||
daoTestingFeedbackWindow.title=Obrigado por testar a OAD do Bisq
|
daoTestingFeedbackWindow.title=Obrigado por testar a OAD do Bisq
|
||||||
daoTestingFeedbackWindow.msg.part1=Tem 3 minutos para um breve questionário? Estamos oferecendo 20 BSQ para questionários completos.\nSeu feedback é crucial para garantir um bom lançamento na rede principal.
|
daoTestingFeedbackWindow.msg.part1=Tem 3 minutos para um breve questionário? Estamos oferecendo 20 BSQ para questionários completos.\nSeu feedback é crucial para garantir um bom lançamento na mainnet.
|
||||||
daoTestingFeedbackWindow.surveyLinkLabel=Preencher questionário
|
daoTestingFeedbackWindow.surveyLinkLabel=Preencher questionário
|
||||||
daoTestingFeedbackWindow.msg.part2=Perguntas ou outros problemas? Discuta com os usuários e contribuidores do Bisq no fórum:
|
daoTestingFeedbackWindow.msg.part2=Perguntas ou outros problemas? Discuta com os usuários e contribuidores do Bisq no fórum:
|
||||||
daoTestingFeedbackWindow.forumLinkLabel=Visitar fórum
|
daoTestingFeedbackWindow.forumLinkLabel=Visitar fórum
|
||||||
|
@ -739,6 +739,7 @@ funds.tx.unknown=Razão desconhecida: {0}
|
||||||
funds.tx.noFundsFromDispute=Nenhum reembolso de disputa
|
funds.tx.noFundsFromDispute=Nenhum reembolso de disputa
|
||||||
funds.tx.receivedFunds=Fundos recebidos
|
funds.tx.receivedFunds=Fundos recebidos
|
||||||
funds.tx.withdrawnFromWallet=Levantado da carteira
|
funds.tx.withdrawnFromWallet=Levantado da carteira
|
||||||
|
funds.tx.withdrawnFromBSQWallet=BTC levantado da carteira BSQ
|
||||||
funds.tx.noTxAvailable=Sem transações disponíveis
|
funds.tx.noTxAvailable=Sem transações disponíveis
|
||||||
funds.tx.revert=Reverter
|
funds.tx.revert=Reverter
|
||||||
funds.tx.txSent=Transação enviada com sucesso para um novo endereço em sua carteira Bisq local.
|
funds.tx.txSent=Transação enviada com sucesso para um novo endereço em sua carteira Bisq local.
|
||||||
|
@ -836,11 +837,11 @@ settings.preferences.arbitrationLanguageWarning=Em caso de disputa, saiba que a
|
||||||
settings.preferences.selectCurrencyNetwork=Selecionar rede
|
settings.preferences.selectCurrencyNetwork=Selecionar rede
|
||||||
setting.preferences.daoOptions=Opções da OAD
|
setting.preferences.daoOptions=Opções da OAD
|
||||||
setting.preferences.dao.resync.label=Reconstruir o estado da OAD à partir da tx genesis
|
setting.preferences.dao.resync.label=Reconstruir o estado da OAD à partir da tx genesis
|
||||||
setting.preferences.dao.resync.button=Resincronizar
|
setting.preferences.dao.resync.button=Re-sincronizar
|
||||||
setting.preferences.dao.resync.popup=Após um reinício do programa, o estado de consenso do BSQ será reconstruído a partir da transação genesis.
|
setting.preferences.dao.resync.popup=Após um reinício do programa, o estado de consenso do BSQ será reconstruído a partir da transação genesis.
|
||||||
setting.preferences.dao.isDaoFullNode=Executar Bisq como nó completo OAD
|
setting.preferences.dao.isDaoFullNode=Executar Bisq como nó completo OAD
|
||||||
setting.preferences.dao.rpcUser=Nome de usuário de RPC
|
setting.preferences.dao.rpcUser=Nome de usuário de RPC
|
||||||
setting.preferences.dao.rpcPw=Palavra-passe de RPC
|
setting.preferences.dao.rpcPw=Senha de RPC
|
||||||
setting.preferences.dao.fullNodeInfo=Para executar Bisq como nó completo da OAD, você precisa ter o Bitcoin Core sendo executado localmente e configurado com o RPC e outros requerimentos documentados em ''{0}''.
|
setting.preferences.dao.fullNodeInfo=Para executar Bisq como nó completo da OAD, você precisa ter o Bitcoin Core sendo executado localmente e configurado com o RPC e outros requerimentos documentados em ''{0}''.
|
||||||
setting.preferences.dao.fullNodeInfo.ok=Abrir página de documentos
|
setting.preferences.dao.fullNodeInfo.ok=Abrir página de documentos
|
||||||
setting.preferences.dao.fullNodeInfo.cancel=Não, eu fico com o modo nó lite
|
setting.preferences.dao.fullNodeInfo.cancel=Não, eu fico com o modo nó lite
|
||||||
|
@ -880,10 +881,10 @@ settings.net.directPeer=Par (direto)
|
||||||
settings.net.peer=Par
|
settings.net.peer=Par
|
||||||
settings.net.inbound=entrante
|
settings.net.inbound=entrante
|
||||||
settings.net.outbound=sainte
|
settings.net.outbound=sainte
|
||||||
settings.net.reSyncSPVChainLabel=Resincronizar corrente SPV
|
settings.net.reSyncSPVChainLabel=Re-sincronizar corrente SPV
|
||||||
settings.net.reSyncSPVChainButton=Remover ficheiro SPV e resincronizar
|
settings.net.reSyncSPVChainButton=Remover ficheiro SPV e re-sincronizar
|
||||||
settings.net.reSyncSPVSuccess=O ficheiro da corrente SPV será apagado na próxima inicialização. Você precisa reiniciar seu programa agora.\n\nApós a reinicialização, pode demorar um pouco para ressincronizar com a rede e você apenas verá todas as transações quando a ressincronização for concluída.\n\nPor favor, reinicie novamente após a conclusão da ressincronização, pois às vezes há inconsistências que resultam na exibição de saldos incorretos.
|
settings.net.reSyncSPVSuccess=O ficheiro da corrente SPV será apagado na próxima inicialização. Você precisa reiniciar seu programa agora.\n\nApós a reinicialização, pode demorar um pouco para re-sincronizar com a rede e você apenas verá todas as transações quando a re-sincronização for concluída.\n\nPor favor, reinicie novamente após a conclusão da re-sincronização, pois às vezes há inconsistências que resultam na exibição de saldos incorretos.
|
||||||
settings.net.reSyncSPVAfterRestart=O ficheiro da corrente SPV foi apagado. Por favor, seja paciente. Pode demorar um pouco para ressincronizar com a rede.
|
settings.net.reSyncSPVAfterRestart=O ficheiro da corrente SPV foi apagado. Por favor, seja paciente. Pode demorar um pouco para re-sincronizar com a rede.
|
||||||
settings.net.reSyncSPVAfterRestartCompleted=A resincronização concluiu. Por favor reiniciar o programa.
|
settings.net.reSyncSPVAfterRestartCompleted=A resincronização concluiu. Por favor reiniciar o programa.
|
||||||
settings.net.reSyncSPVFailed=Não foi possível remover o ficherio da corrente SPV\nErro: {0}
|
settings.net.reSyncSPVFailed=Não foi possível remover o ficherio da corrente SPV\nErro: {0}
|
||||||
setting.about.aboutBisq=Sobre Bisq
|
setting.about.aboutBisq=Sobre Bisq
|
||||||
|
@ -914,11 +915,11 @@ setting.about.subsystems.val=Versão da rede: {0}; Versão de mensagem P2P: {1};
|
||||||
account.tab.arbitratorRegistration=Registo de árbitro
|
account.tab.arbitratorRegistration=Registo de árbitro
|
||||||
account.tab.account=Conta
|
account.tab.account=Conta
|
||||||
account.info.headline=Bem vindo à sua conta Bisq
|
account.info.headline=Bem vindo à sua conta Bisq
|
||||||
account.info.msg=Aqui você pode adicionar contas de negociação para moedas nacionais e altcoins, selecionar árbitros e criar um backup da sua carteira e dos dados da sua conta.\n\nUma nova carteira Bitcoin foi criada na primeira vez que você iniciou o Bisq.\n\nNós recomendamos fortemente que você anote as palavras-semente da sua carteira Bitcoin (veja a aba no topo) e considere adicionar uma palavra-passe antes de financiar. Os depósitos e levantamentos de Bitcoin são geridos na secção \"Fundos\".\n\nNota de privacidade e segurança: como o Bisq é um mercado de câmbio descentralizado, todos os seus dados são mantidos no seu computador. Não há servidores, por isso não temos acesso à sua informação pessoal, os seus fundos ou até mesmo seu endereço IP. Dados como números de contas bancárias, endereços de altcoins e de Bitcoin, etc, são compartilhados apenas com o seu par de negociação para completar os negócios iniciados por você (no caso de uma disputa, o árbitro verá os mesmos dados que o seu par de negociação).
|
account.info.msg=Aqui você pode adicionar contas de negociação para moedas nacionais e altcoins, selecionar árbitros e criar um backup da sua carteira e dos dados da sua conta.\n\nUma nova carteira Bitcoin foi criada na primeira vez que você iniciou o Bisq.\n\nNós recomendamos fortemente que você anote as palavras-semente da sua carteira Bitcoin (veja a aba no topo) e considere adicionar uma senha antes de financiar. Os depósitos e levantamentos de Bitcoin são geridos na secção \"Fundos\".\n\nNota de privacidade e segurança: como o Bisq é um mercado de câmbio descentralizado, todos os seus dados são mantidos no seu computador. Não há servidores, por isso não temos acesso à sua informação pessoal, os seus fundos ou até mesmo seu endereço IP. Dados como números de contas bancárias, endereços de altcoins e de Bitcoin, etc, são compartilhados apenas com o seu par de negociação para completar os negócios iniciados por você (no caso de uma disputa, o árbitro verá os mesmos dados que o seu par de negociação).
|
||||||
|
|
||||||
account.menu.paymentAccount=Contas de moedas nacionais
|
account.menu.paymentAccount=Contas de moedas nacionais
|
||||||
account.menu.altCoinsAccountView=Contas de altcoins
|
account.menu.altCoinsAccountView=Contas de altcoins
|
||||||
account.menu.password=Palavra-passe da carteira
|
account.menu.password=Senha da carteira
|
||||||
account.menu.seedWords=Semente da carteira
|
account.menu.seedWords=Semente da carteira
|
||||||
account.menu.backup=Backup
|
account.menu.backup=Backup
|
||||||
account.menu.notifications=Notificações
|
account.menu.notifications=Notificações
|
||||||
|
@ -972,17 +973,17 @@ account.backup.openLogFile=Abrir ficheiro de log
|
||||||
account.backup.success=Backup guardado com sucesso em:\n{0}
|
account.backup.success=Backup guardado com sucesso em:\n{0}
|
||||||
account.backup.directoryNotAccessible=O diretório escolhido não é acessível. {0}
|
account.backup.directoryNotAccessible=O diretório escolhido não é acessível. {0}
|
||||||
|
|
||||||
account.password.removePw.button=Remover palavra-passe
|
account.password.removePw.button=Remover senha
|
||||||
account.password.removePw.headline=Remover proteção com palavra-passe da carteira
|
account.password.removePw.headline=Remover proteção com senha da carteira
|
||||||
account.password.setPw.button=Definir palavra-passe
|
account.password.setPw.button=Definir senha
|
||||||
account.password.setPw.headline=Definir proteção de palavra-passe da carteira
|
account.password.setPw.headline=Definir proteção de senha da carteira
|
||||||
account.password.info=Com a proteção por palavra-passe, você precisará inserir a sua palavra-passe na inicialização do programa, ao levantar o bitcoin da sua carteira e ao restaurar a sua carteira a partir de palavras-semente.
|
account.password.info=Com a proteção por senha, você precisará inserir a sua senha na inicialização do programa, ao levantar o bitcoin da sua carteira e ao restaurar a sua carteira a partir de palavras-semente.
|
||||||
|
|
||||||
account.seed.backup.title=Fazer backup das palavras semente da sua carteira
|
account.seed.backup.title=Fazer backup das palavras semente da sua carteira
|
||||||
account.seed.info=Por favor, anote as palavras-semente da carteira e a data! Você pode recuperar sua carteira a qualquer momento com palavras-semente e a data.\nAs mesmas palavras-semente são usadas para a carteira BTC e BSQ.\n\nVocê deve anotar as palavras-semente numa folha de papel. Não as guarde no seu computador.\n\nPor favor, note que as palavras-semente não são um substituto para um backup.\nVocê precisa criar um backup de todo o diretório do programa a partir do ecrã \"Conta/Backup\" para recuperar o estado e os dados do programa.\nA importação de palavras-semente é recomendada apenas para casos de emergência. O programa não será funcional sem um backup adequado dos arquivos da base de dados e das chaves!
|
account.seed.info=Por favor, anote as palavras-semente da carteira e a data! Você pode recuperar sua carteira a qualquer momento com palavras-semente e a data.\nAs mesmas palavras-semente são usadas para a carteira BTC e BSQ.\n\nVocê deve anotar as palavras-semente numa folha de papel. Não as guarde no seu computador.\n\nPor favor, note que as palavras-semente não são um substituto para um backup.\nVocê precisa criar um backup de todo o diretório do programa a partir do ecrã \"Conta/Backup\" para recuperar o estado e os dados do programa.\nA importação de palavras-semente é recomendada apenas para casos de emergência. O programa não será funcional sem um backup adequado dos arquivos da base de dados e das chaves!
|
||||||
account.seed.warn.noPw.msg=Você não definiu uma palavra-passe da carteira que protegeria a exibição das palavras-semente.\n\nVocê quer exibir as palavras-semente?
|
account.seed.warn.noPw.msg=Você não definiu uma senha da carteira que protegeria a exibição das palavras-semente.\n\nVocê quer exibir as palavras-semente?
|
||||||
account.seed.warn.noPw.yes=Sim, e não me pergunte novamente
|
account.seed.warn.noPw.yes=Sim, e não me pergunte novamente
|
||||||
account.seed.enterPw=Digite a palavra-passe para ver palavras-semente
|
account.seed.enterPw=Digite a senha para ver palavras-semente
|
||||||
account.seed.restore.info=Por favor, faça um backup antes de aplicar a restauração a partir de palavras-semente. Esteja ciente de que a restauração da carteira é apenas para casos de emergência e pode causar problemas com a base de dados interna da carteira.\nNão é uma maneira de aplicar um backup! Por favor, use um backup do diretório de dados do programa para restaurar um estado anterior do programa.\n\nDepois de restaurar o programa será desligado automaticamente. Depois de ter reiniciado o programa, ele será ressincronizado com a rede Bitcoin. Isso pode demorar um pouco e consumir muito do CPU, especialmente se a carteira for mais antiga e tiver muitas transações. Por favor, evite interromper esse processo, caso contrário, você pode precisar excluir o ficheiro da corrente do SPV novamente ou repetir o processo de restauração.
|
account.seed.restore.info=Por favor, faça um backup antes de aplicar a restauração a partir de palavras-semente. Esteja ciente de que a restauração da carteira é apenas para casos de emergência e pode causar problemas com a base de dados interna da carteira.\nNão é uma maneira de aplicar um backup! Por favor, use um backup do diretório de dados do programa para restaurar um estado anterior do programa.\n\nDepois de restaurar o programa será desligado automaticamente. Depois de ter reiniciado o programa, ele será ressincronizado com a rede Bitcoin. Isso pode demorar um pouco e consumir muito do CPU, especialmente se a carteira for mais antiga e tiver muitas transações. Por favor, evite interromper esse processo, caso contrário, você pode precisar excluir o ficheiro da corrente do SPV novamente ou repetir o processo de restauração.
|
||||||
account.seed.restore.ok=Ok, restaurar e desligar Bisq
|
account.seed.restore.ok=Ok, restaurar e desligar Bisq
|
||||||
|
|
||||||
|
@ -1077,7 +1078,7 @@ dao.totalBsqBalance=Saldo total de BSQ
|
||||||
|
|
||||||
dao.tx.published.success=Sua transação foi publicada com sucesso.
|
dao.tx.published.success=Sua transação foi publicada com sucesso.
|
||||||
dao.proposal.menuItem.make=Criar proposta
|
dao.proposal.menuItem.make=Criar proposta
|
||||||
dao.proposal.menuItem.browse=Navegar propostas abertas
|
dao.proposal.menuItem.browse=Propostas abertas
|
||||||
dao.proposal.menuItem.vote=Votar em propostas
|
dao.proposal.menuItem.vote=Votar em propostas
|
||||||
dao.proposal.menuItem.result=Resultado da votação
|
dao.proposal.menuItem.result=Resultado da votação
|
||||||
dao.cycle.headline=Ciclo de votação
|
dao.cycle.headline=Ciclo de votação
|
||||||
|
@ -1488,8 +1489,8 @@ dao.proposal.create.publish=Publicar proposta
|
||||||
dao.proposal.create.publishing=Publicação de proposta em progresso ...
|
dao.proposal.create.publishing=Publicação de proposta em progresso ...
|
||||||
dao.proposal=proposta
|
dao.proposal=proposta
|
||||||
dao.proposal.display.type=Tipo de proposta
|
dao.proposal.display.type=Tipo de proposta
|
||||||
dao.proposal.display.name=Nome/apelido
|
dao.proposal.display.name=Nome/alcunha
|
||||||
dao.proposal.display.link=Link para detallhes
|
dao.proposal.display.link=Link para detalhes
|
||||||
dao.proposal.display.link.prompt=Link para Github issue
|
dao.proposal.display.link.prompt=Link para Github issue
|
||||||
dao.proposal.display.requestedBsq=Quantia requerida em BSQ
|
dao.proposal.display.requestedBsq=Quantia requerida em BSQ
|
||||||
dao.proposal.display.bsqAddress=Endereço BSQ
|
dao.proposal.display.bsqAddress=Endereço BSQ
|
||||||
|
@ -1542,8 +1543,8 @@ dao.wallet.receive.bsqAddress=Endereço da carteira BSQ (endereço não utilizad
|
||||||
dao.wallet.receive.dao.headline=A OAD do Bisq
|
dao.wallet.receive.dao.headline=A OAD do Bisq
|
||||||
dao.wallet.receive.daoInfo=Assim como o mercado de câmbio do Bisq é descentralizado e resistente à censura, o seu modelo de governação também o é - e a OAD do Bisq e o token BSQ são as ferramentas que tornam isso possível.
|
dao.wallet.receive.daoInfo=Assim como o mercado de câmbio do Bisq é descentralizado e resistente à censura, o seu modelo de governação também o é - e a OAD do Bisq e o token BSQ são as ferramentas que tornam isso possível.
|
||||||
dao.wallet.receive.daoInfo.button=Aprender mais sobre a OAD do Bisq
|
dao.wallet.receive.daoInfo.button=Aprender mais sobre a OAD do Bisq
|
||||||
dao.wallet.receive.daoTestnetInfo=A rede principal da OAD do Bisq ainda não foi lançada, mas você pode aprender sobre a OAD do Bisq executando-a na rede de testes.
|
dao.wallet.receive.daoTestnetInfo=A mainnet da OAD do Bisq ainda não foi lançada, mas você pode aprender sobre a OAD do Bisq executando-a na testnet.
|
||||||
dao.wallet.receive.daoTestnetInfo.button=Como executar a OAD do Bisq na nossa rede de testes
|
dao.wallet.receive.daoTestnetInfo.button=Como executar a OAD do Bisq na nossa testnet
|
||||||
dao.wallet.receive.daoContributorInfo=Se você contribuiu para o Bisq, por favor, use o endereço BSQ abaixo e faça um pedido para participar da distribuição genesis de BSQ.
|
dao.wallet.receive.daoContributorInfo=Se você contribuiu para o Bisq, por favor, use o endereço BSQ abaixo e faça um pedido para participar da distribuição genesis de BSQ.
|
||||||
dao.wallet.receive.daoContributorInfo.button=Como ser parte da distribuição genesis de BSQ
|
dao.wallet.receive.daoContributorInfo.button=Como ser parte da distribuição genesis de BSQ
|
||||||
|
|
||||||
|
@ -1603,6 +1604,7 @@ dao.tx.type.enum.PROOF_OF_BURN=Prova de destruição
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.tx.type.enum.IRREGULAR=Irregular
|
dao.tx.type.enum.IRREGULAR=Irregular
|
||||||
|
|
||||||
|
dao.tx.withdrawnFromWallet=BTC levantado da carteira
|
||||||
dao.tx.issuanceFromCompReq=Pedido de compensação/emissão
|
dao.tx.issuanceFromCompReq=Pedido de compensação/emissão
|
||||||
dao.tx.issuanceFromCompReq.tooltip=Pedido de compensação que levou à emissão de novo BSQ.\nData de emissão: {0}
|
dao.tx.issuanceFromCompReq.tooltip=Pedido de compensação que levou à emissão de novo BSQ.\nData de emissão: {0}
|
||||||
dao.tx.issuanceFromReimbursement=Pedido de reembolso/emissão
|
dao.tx.issuanceFromReimbursement=Pedido de reembolso/emissão
|
||||||
|
@ -1611,10 +1613,15 @@ dao.proposal.create.missingBsqFunds=Você não tem fundos suficientes para criar
|
||||||
|
|
||||||
dao.proposal.create.missingBsqFundsForBond=Você não tem fundos suficientes para este cargo. Você ainda pode publicar essa proposta, mas precisará do valor completo de BSQ necessário para esse cargo se ela for aceite.\nEm falta: {0}
|
dao.proposal.create.missingBsqFundsForBond=Você não tem fundos suficientes para este cargo. Você ainda pode publicar essa proposta, mas precisará do valor completo de BSQ necessário para esse cargo se ela for aceite.\nEm falta: {0}
|
||||||
|
|
||||||
dao.proposal.create.missingMinerFeeFunds=Você não tem fundos suficientes de BTC para criar a transação da proposta. Qualquer transação BSQ requer também uma taxa do mineiro em BTC.\nEm falta: {0}
|
dao.proposal.create.missingMinerFeeFunds=Você não tem suficientes fundos de BTC para criar a transação da proposta. Todas as transações de BSQ exigem uma taxa do mineiro em BTC.\nEm falta: {0}
|
||||||
|
|
||||||
|
dao.proposal.create.missingIssuanceFunds=Você não tem suficientes fundos de BTC para criar a transação da proposta. Todas as transações de BSQ exigem uma taxa do mineiro em BTC, e as transações de emissão também exigem BTC pela quantia de BSQ solicitado ({0} satoshis/BSQ).\nEm falta: {1}
|
||||||
|
|
||||||
dao.feeTx.confirm=Confirmar transação {0}
|
dao.feeTx.confirm=Confirmar transação {0}
|
||||||
dao.feeTx.confirm.details={0} taxa: {1}\nTaxa de mineração: {2} ({3} satoshis/byte)\nTamanho da transação: {4} Kb\n\nTem certeza de que deseja publicar a transação {5}?
|
dao.feeTx.confirm.details={0} taxa: {1}\nTaxa de mineração: {2} ({3} satoshis/byte)\nTamanho da transação: {4} Kb\n\nTem certeza de que deseja publicar a transação {5}?
|
||||||
|
|
||||||
|
dao.feeTx.issuanceProposal.confirm.details={0} taxa: {1}\nBTC necessário para a emissão de BSQ: {2} ({3} satoshis/BSQ)\nTaxa de mineração: {4} ({5} satoshis/byte)\nTamanho da transação: {6} Kb\n\nSe o seu pedido for aprovado, você receberá a quantia solicitada menos a taxa de proposta de 2 BSQ.\n\nTem certeza de que deseja publicar a transação de {7}?"
|
||||||
|
|
||||||
dao.news.bisqDAO.title=A OAD DO BISQ
|
dao.news.bisqDAO.title=A OAD DO BISQ
|
||||||
dao.news.bisqDAO.description=Assim como o mercado de câmbio do Bisq é descentralizado e resistente à censura, o seu modelo de governação também o é - e a OAD do Bisq e o token da BSQ são as ferramentas que tornam isso possível.
|
dao.news.bisqDAO.description=Assim como o mercado de câmbio do Bisq é descentralizado e resistente à censura, o seu modelo de governação também o é - e a OAD do Bisq e o token da BSQ são as ferramentas que tornam isso possível.
|
||||||
dao.news.bisqDAO.readMoreLink=Saber Mais Sobre a OAD do Bisq
|
dao.news.bisqDAO.readMoreLink=Saber Mais Sobre a OAD do Bisq
|
||||||
|
@ -1625,9 +1632,9 @@ dao.news.pastContribution.yourAddress=O seu endereço da carteira BSQ
|
||||||
dao.news.pastContribution.requestNow=Solicitar agora
|
dao.news.pastContribution.requestNow=Solicitar agora
|
||||||
|
|
||||||
dao.news.DAOOnTestnet.title=EXECUTE A OAD DO BISQ NA NOSSA REDE DE TESTES
|
dao.news.DAOOnTestnet.title=EXECUTE A OAD DO BISQ NA NOSSA REDE DE TESTES
|
||||||
dao.news.DAOOnTestnet.description=A rede principal da OAD do Bisq ainda não foi lançada, mas você pode aprender sobre a OAD do Bisq executando-a na nossa rede de testes.
|
dao.news.DAOOnTestnet.description=A mainnet da OAD do Bisq ainda não foi lançada, mas você pode aprender sobre a OAD do Bisq executando-a na nossa testnet.
|
||||||
dao.news.DAOOnTestnet.firstSection.title=1. Mudar para Modo Rede de teses da OAD
|
dao.news.DAOOnTestnet.firstSection.title=1. Mudar para Modo Testnet da OAD
|
||||||
dao.news.DAOOnTestnet.firstSection.content=Mude para a Rede de testes da OAD no painel de Definições
|
dao.news.DAOOnTestnet.firstSection.content=Mude para a Testnet da OAD no painel de Definições
|
||||||
dao.news.DAOOnTestnet.secondSection.title=2. Obtenha alguns BSQ
|
dao.news.DAOOnTestnet.secondSection.title=2. Obtenha alguns BSQ
|
||||||
dao.news.DAOOnTestnet.secondSection.content=Solicite BSQ no Slack ou Compre BSQ no Bisq
|
dao.news.DAOOnTestnet.secondSection.content=Solicite BSQ no Slack ou Compre BSQ no Bisq
|
||||||
dao.news.DAOOnTestnet.thirdSection.title=3. Participe num Ciclo de Votação
|
dao.news.DAOOnTestnet.thirdSection.title=3. Participe num Ciclo de Votação
|
||||||
|
@ -1644,7 +1651,7 @@ dao.monitor.table.peers=Pares
|
||||||
dao.monitor.table.conflicts=Conflitos
|
dao.monitor.table.conflicts=Conflitos
|
||||||
dao.monitor.state=Estado
|
dao.monitor.state=Estado
|
||||||
dao.monitor.requestAlHashes=Pedir todos os hashes
|
dao.monitor.requestAlHashes=Pedir todos os hashes
|
||||||
dao.monitor.resync=Resincronizat estado da OAD
|
dao.monitor.resync=Re-sincronizar estado da OAD
|
||||||
dao.monitor.table.header.cycleBlockHeight=Ciclo / altura do bloco
|
dao.monitor.table.header.cycleBlockHeight=Ciclo / altura do bloco
|
||||||
dao.monitor.table.cycleBlockHeight=Ciclo {0} / bloco {1}
|
dao.monitor.table.cycleBlockHeight=Ciclo {0} / bloco {1}
|
||||||
|
|
||||||
|
@ -1753,7 +1760,7 @@ disputeSummaryWindow.evidence=Evidência
|
||||||
disputeSummaryWindow.evidence.tamperProof=Evidência à prova de adulteração
|
disputeSummaryWindow.evidence.tamperProof=Evidência à prova de adulteração
|
||||||
disputeSummaryWindow.evidence.id=Verificação de ID
|
disputeSummaryWindow.evidence.id=Verificação de ID
|
||||||
disputeSummaryWindow.evidence.video=Vídeo/Captura de ecrã
|
disputeSummaryWindow.evidence.video=Vídeo/Captura de ecrã
|
||||||
disputeSummaryWindow.payout=Pagamento de quantia de negócio
|
disputeSummaryWindow.payout=Pagamento da quantia de negócio
|
||||||
disputeSummaryWindow.payout.getsTradeAmount={0} de BTC fica com o pagamento da quantia de negócio
|
disputeSummaryWindow.payout.getsTradeAmount={0} de BTC fica com o pagamento da quantia de negócio
|
||||||
disputeSummaryWindow.payout.getsAll={0} BTC fica com tudo
|
disputeSummaryWindow.payout.getsAll={0} BTC fica com tudo
|
||||||
disputeSummaryWindow.payout.custom=Pagamento personalizado
|
disputeSummaryWindow.payout.custom=Pagamento personalizado
|
||||||
|
@ -1862,7 +1869,7 @@ tradeDetailsWindow.txFee=Taxa de mineração
|
||||||
tradeDetailsWindow.tradingPeersOnion=Endereço onion dos parceiros de negociação
|
tradeDetailsWindow.tradingPeersOnion=Endereço onion dos parceiros de negociação
|
||||||
tradeDetailsWindow.tradeState=Estado de negócio
|
tradeDetailsWindow.tradeState=Estado de negócio
|
||||||
|
|
||||||
walletPasswordWindow.headline=Digite palavra-passe para abrir:
|
walletPasswordWindow.headline=Digite senha para abrir:
|
||||||
|
|
||||||
torNetworkSettingWindow.header=Definições de redes Tor
|
torNetworkSettingWindow.header=Definições de redes Tor
|
||||||
torNetworkSettingWindow.noBridges=Não usar pontes
|
torNetworkSettingWindow.noBridges=Não usar pontes
|
||||||
|
@ -1919,7 +1926,7 @@ error.deleteAddressEntryListFailed=Não foi possível apagar o ficheiro AddressE
|
||||||
|
|
||||||
popup.warning.walletNotInitialized=A carteira ainda não foi inicializada
|
popup.warning.walletNotInitialized=A carteira ainda não foi inicializada
|
||||||
popup.warning.wrongVersion=Você provavelmente tem a versão errada do Bisq para este computador.\nA arquitetura do seu computador é: {0}.\nO binário Bisq que você instalou é: {1}.\nPor favor, desligue e reinstale a versão correta ({2}).
|
popup.warning.wrongVersion=Você provavelmente tem a versão errada do Bisq para este computador.\nA arquitetura do seu computador é: {0}.\nO binário Bisq que você instalou é: {1}.\nPor favor, desligue e reinstale a versão correta ({2}).
|
||||||
popup.warning.incompatibleDB=Detectamos ficheiros de base de dados incompatíveis!\n\nEsses arquivos de base de dados não são compatíveis com nossa base de código atual:\n{0}\n\nFizemos um backup do(s) ficheiro(s) corrompido(s) e aplicamos os valores padrão para uma nova versão da base de dados.\n\nO backup está localizado em:\n{1} /db/backup_of_corrupted_data.\n\nPor favor, verifique se você tem a última versão do Bisq instalada.\nVocê pode baixá-lo em:\nhttps://bisq.network/downloads\n\nPor favor, reinicie o programa.
|
popup.warning.incompatibleDB=Detectamos ficheiros de base de dados incompatíveis!\n\nEsses ficheiros de base de dados não são compatíveis com nossa base de código atual:\n{0}\n\nFizemos um backup do(s) ficheiro(s) corrompido(s) e aplicamos os valores padrão para uma nova versão da base de dados.\n\nO backup está localizado em:\n{1} /db/backup_of_corrupted_data.\n\nPor favor, verifique se você tem a última versão do Bisq instalada.\nVocê pode baixá-lo em:\nhttps://bisq.network/downloads\n\nPor favor, reinicie o programa.
|
||||||
popup.warning.startupFailed.twoInstances=Bisq já está em execução. Você não pode executar duas instâncias do Bisq.
|
popup.warning.startupFailed.twoInstances=Bisq já está em execução. Você não pode executar duas instâncias do Bisq.
|
||||||
popup.warning.cryptoTestFailed=Parece que você usa um binário auto-compilado e não segue as instruções de compilação em https://github.com/bisq-network/exchange/blob/master/doc/build.md#7-enable-unlimited-strength-for-cryptographic-keys.\n\nSe não for esse o caso e você usar o binário oficial do Bisq, por favor, envie um relatório de erros para a página do Github.\nErro = {0}
|
popup.warning.cryptoTestFailed=Parece que você usa um binário auto-compilado e não segue as instruções de compilação em https://github.com/bisq-network/exchange/blob/master/doc/build.md#7-enable-unlimited-strength-for-cryptographic-keys.\n\nSe não for esse o caso e você usar o binário oficial do Bisq, por favor, envie um relatório de erros para a página do Github.\nErro = {0}
|
||||||
popup.warning.tradePeriod.halfReached=Sua negociação com o ID {0} atingiu a metade do valor máx. do período de negociação permitido e ainda não está concluído.\n\nO período de negócio termina em {1}\n\nPor favor, verifique o seu estado de negócio em \"Portefólio/Ofertas abertas\" para mais informações.
|
popup.warning.tradePeriod.halfReached=Sua negociação com o ID {0} atingiu a metade do valor máx. do período de negociação permitido e ainda não está concluído.\n\nO período de negócio termina em {1}\n\nPor favor, verifique o seu estado de negócio em \"Portefólio/Ofertas abertas\" para mais informações.
|
||||||
|
@ -1946,6 +1953,8 @@ popup.warning.nodeBanned=Um dos nós de {0} foi banido. Por favor reinicie seu p
|
||||||
popup.warning.priceRelay=transmissão de preço
|
popup.warning.priceRelay=transmissão de preço
|
||||||
popup.warning.seed=semente
|
popup.warning.seed=semente
|
||||||
|
|
||||||
|
popup.warning.burnBTC=Esta transação não é possível, pois as taxas de mineração de {0} excederia o montante a transferir de {1}. Aguarde até que as taxas de mineração estejam novamente baixas ou até você ter acumulado mais BTC para transferir.
|
||||||
|
|
||||||
popup.info.securityDepositInfo=Para garantir que ambos os negociadores seguem o protocolo de negócio, ambos os negociadores precisam pagar um depósito de segurança.\n\nEsse depósito é mantido na sua carteira de negócio até que o seu negócio seja concluído com sucesso, e então lhe será reembolsado.\n\nPor favor note: se você está criando uma nova oferta, o Bisq precisa estar em execução para que um outro negociador a aceite. Para manter suas ofertas online, mantenha o Bisq em execução e certifique-se de que este computador permaneça online também (ou seja, certifique-se de que ele não alterne para o modo de espera... o modo de espera do monitor não causa problema).
|
popup.info.securityDepositInfo=Para garantir que ambos os negociadores seguem o protocolo de negócio, ambos os negociadores precisam pagar um depósito de segurança.\n\nEsse depósito é mantido na sua carteira de negócio até que o seu negócio seja concluído com sucesso, e então lhe será reembolsado.\n\nPor favor note: se você está criando uma nova oferta, o Bisq precisa estar em execução para que um outro negociador a aceite. Para manter suas ofertas online, mantenha o Bisq em execução e certifique-se de que este computador permaneça online também (ou seja, certifique-se de que ele não alterne para o modo de espera... o modo de espera do monitor não causa problema).
|
||||||
|
|
||||||
popup.info.cashDepositInfo=Por favor, certifique-se de que você tem uma agência bancária na sua área para poder fazer o depósito em dinheiro.\nO ID do banco (BIC/SWIFT) do vendedor é: {0}.
|
popup.info.cashDepositInfo=Por favor, certifique-se de que você tem uma agência bancária na sua área para poder fazer o depósito em dinheiro.\nO ID do banco (BIC/SWIFT) do vendedor é: {0}.
|
||||||
|
@ -1956,7 +1965,7 @@ popup.info.shutDownWithOpenOffers=Bisq está sendo fechado, mas há ofertas aber
|
||||||
popup.privateNotification.headline=Notificação privada importante!
|
popup.privateNotification.headline=Notificação privada importante!
|
||||||
|
|
||||||
popup.securityRecommendation.headline=Recomendação de segurança importante
|
popup.securityRecommendation.headline=Recomendação de segurança importante
|
||||||
popup.securityRecommendation.msg=Gostaríamos de lembrá-lo de considerar a possibilidade de usar a proteção por palavra-passe para sua carteira, caso você ainda não tenha ativado isso.\n\nTambém é altamente recomendável anotar as palavras-semente da carteira. Essas palavras-semente são como uma palavra-passe mestre para recuperar sua carteira Bitcoin.\nNa secção \"Semente da Carteira\", você encontrará mais informações.\n\nAlém disso, você deve fazer o backup da pasta completa de dados do programa na secção \"Backup\".
|
popup.securityRecommendation.msg=Gostaríamos de lembrá-lo de considerar a possibilidade de usar a proteção por senha para sua carteira, caso você ainda não tenha ativado isso.\n\nTambém é altamente recomendável anotar as palavras-semente da carteira. Essas palavras-semente são como uma senha mestre para recuperar sua carteira Bitcoin.\nNa secção \"Semente da Carteira\", você encontrará mais informações.\n\nAlém disso, você deve fazer o backup da pasta completa de dados do programa na secção \"Backup\".
|
||||||
|
|
||||||
popup.bitcoinLocalhostNode.msg=O Bisq detectou um nó do Bitcoin Core em execução localmente (no localhost).\nPor favor, certifique-se de que este nó esteja totalmente sincronizado antes de iniciar o Bisq e que ele não esteja em execução no pruned mode.
|
popup.bitcoinLocalhostNode.msg=O Bisq detectou um nó do Bitcoin Core em execução localmente (no localhost).\nPor favor, certifique-se de que este nó esteja totalmente sincronizado antes de iniciar o Bisq e que ele não esteja em execução no pruned mode.
|
||||||
|
|
||||||
|
@ -2111,17 +2120,17 @@ formatter.asTaker={0} {1} como aceitador
|
||||||
# we use enum values here
|
# we use enum values here
|
||||||
# dynamic values are not recognized by IntelliJ
|
# dynamic values are not recognized by IntelliJ
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
BTC_MAINNET=Rede principal de Bitcoin
|
BTC_MAINNET=Mainnet de Bitcoin
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
BTC_TESTNET=Rede de testes de Bitcoin
|
BTC_TESTNET=Testnet de Bitcoin
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
BTC_REGTEST=Regtest Bitcoin
|
BTC_REGTEST=Regtest Bitcoin
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
BTC_DAO_TESTNET=Bitcoin DAO Testnet (deprecated)
|
BTC_DAO_TESTNET=Testnet da OAD do Bitcoin (discontinuada)
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
BTC_DAO_BETANET=Rede beta da OAD do Bisq (Rede principal do Bitcoin)
|
BTC_DAO_BETANET=Betanet da OAD do Bitcoin (Mainnet do Bitcoin)
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
BTC_DAO_REGTEST=Bitcoin DAO Regtest
|
BTC_DAO_REGTEST=Regtest da OAD do Bitcoin
|
||||||
|
|
||||||
time.year=Ano
|
time.year=Ano
|
||||||
time.month=Mês
|
time.month=Mês
|
||||||
|
@ -2139,17 +2148,17 @@ time.minutes=minutos
|
||||||
time.seconds=segundos
|
time.seconds=segundos
|
||||||
|
|
||||||
|
|
||||||
password.enterPassword=Inserir palavra-passe
|
password.enterPassword=Inserir senha
|
||||||
password.confirmPassword=Confirmar palavra-passe
|
password.confirmPassword=Confirmar senha
|
||||||
password.tooLong=A palavra-passe deve ter menos de 500 caracteres.
|
password.tooLong=A senha deve ter menos de 500 caracteres.
|
||||||
password.deriveKey=Derivar chave a partir da palavra-passe
|
password.deriveKey=Derivar chave a partir da senha
|
||||||
password.walletDecrypted=A carteira foi descriptografada com sucesso e a proteção por palavra-passe removida.
|
password.walletDecrypted=A carteira foi descriptografada com sucesso e a proteção por senha removida.
|
||||||
password.wrongPw=Você digitou a palavra-passe errada.\n\nPor favor, tente digitar sua palavra-passe novamente, verificando com atenção se há erros de ortografia.
|
password.wrongPw=Você digitou a senha errada.\n\nPor favor, tente digitar sua senha novamente, verificando com atenção se há erros de ortografia.
|
||||||
password.walletEncrypted=Carteira encriptada com sucesso e proteção por palavra-passe ativada.
|
password.walletEncrypted=Carteira encriptada com sucesso e proteção por senha ativada.
|
||||||
password.walletEncryptionFailed=A palavra-passe da carteira não pôde ser definida. Você pode ter importado palavras-semente que não correspondem à base de dados da carteira. Por favor, contacte os desenvolvedores no Fórum Bisq.
|
password.walletEncryptionFailed=A senha da carteira não pôde ser definida. Você pode ter importado palavras-semente que não correspondem à base de dados da carteira. Por favor, contacte os desenvolvedores no Fórum Bisq.
|
||||||
password.passwordsDoNotMatch=As 2 palavras-passe inseridas não são iguais.
|
password.passwordsDoNotMatch=As 2 senhas inseridas não são iguais.
|
||||||
password.forgotPassword=Esqueceu a palavra-passe?
|
password.forgotPassword=Esqueceu a senha?
|
||||||
password.backupReminder=Observe que, ao definir uma palavra-passe da carteira, todos os backups criados automaticamente a partir da carteira não criptografada serão apagados.\n\nÉ altamente recomendado fazer um backup do diretório do programa e anotar suas palavras-semente antes de definir uma palavra-passe!
|
password.backupReminder=Observe que, ao definir uma senha da carteira, todos os backups criados automaticamente a partir da carteira não criptografada serão apagados.\n\nÉ altamente recomendado fazer um backup do diretório do programa e anotar suas palavras-semente antes de definir uma senha!
|
||||||
password.backupWasDone=Eu já fiz um backup
|
password.backupWasDone=Eu já fiz um backup
|
||||||
|
|
||||||
seed.seedWords=Palavras-semente da carteira
|
seed.seedWords=Palavras-semente da carteira
|
||||||
|
@ -2161,7 +2170,7 @@ seed.creationDate=Data de criação
|
||||||
seed.warn.walletNotEmpty.msg=Sua carteira do Bitcoin não está vazia.\n\nVocê deve esvaziar esta carteira antes de tentar restaurar uma mais antiga, já que misturar as carteiras pode levar à backups invalidados.\n\nPor favor, finalize seus negócios, feche todas as suas ofertas abertas e vá para a secção Fundos para levantar a sua bitcoin.\nCaso você não consiga acessar a sua bitcoin, você pode usar a ferramenta de emergência para esvaziar a carteira.\nPara abrir essa ferramenta de emergência, pressione \"alt + e\" ou \"option + e\".
|
seed.warn.walletNotEmpty.msg=Sua carteira do Bitcoin não está vazia.\n\nVocê deve esvaziar esta carteira antes de tentar restaurar uma mais antiga, já que misturar as carteiras pode levar à backups invalidados.\n\nPor favor, finalize seus negócios, feche todas as suas ofertas abertas e vá para a secção Fundos para levantar a sua bitcoin.\nCaso você não consiga acessar a sua bitcoin, você pode usar a ferramenta de emergência para esvaziar a carteira.\nPara abrir essa ferramenta de emergência, pressione \"alt + e\" ou \"option + e\".
|
||||||
seed.warn.walletNotEmpty.restore=Eu desejo restaurar de qualquer forma
|
seed.warn.walletNotEmpty.restore=Eu desejo restaurar de qualquer forma
|
||||||
seed.warn.walletNotEmpty.emptyWallet=Eu esvaziarei as carteiras primeiro
|
seed.warn.walletNotEmpty.emptyWallet=Eu esvaziarei as carteiras primeiro
|
||||||
seed.warn.notEncryptedAnymore=Suas carteiras são encriptadas.\n\nApós a restauração, as carteiras não serão mais encriptadas e você deverá definir uma nova palavra-passe.\n\nVocê quer continuar?
|
seed.warn.notEncryptedAnymore=Suas carteiras são encriptadas.\n\nApós a restauração, as carteiras não serão mais encriptadas e você deverá definir uma nova senha.\n\nVocê quer continuar?
|
||||||
seed.restore.success=Carteiras restauradas com sucesso com as novas palavras-semente.\n\nVocê precisa desligar e reiniciar o programa.
|
seed.restore.success=Carteiras restauradas com sucesso com as novas palavras-semente.\n\nVocê precisa desligar e reiniciar o programa.
|
||||||
seed.restore.error=Um erro ocorreu ao restaurar as carteiras com palavras-semente.{0}
|
seed.restore.error=Um erro ocorreu ao restaurar as carteiras com palavras-semente.{0}
|
||||||
|
|
||||||
|
@ -2192,7 +2201,7 @@ payment.country=País
|
||||||
payment.extras=Requerimentos adicionais
|
payment.extras=Requerimentos adicionais
|
||||||
payment.email.mobile=Email ou nº de telemóvel
|
payment.email.mobile=Email ou nº de telemóvel
|
||||||
payment.altcoin.address=Endereço de altcoin
|
payment.altcoin.address=Endereço de altcoin
|
||||||
payment.altcoin.tradeInstantCheckbox=Negociação instantânea (dentro de 1 hora) com esta Altcoin
|
payment.altcoin.tradeInstantCheckbox=Negócio instantâneo (dentro de 1 hora) com esta Altcoin
|
||||||
payment.altcoin.tradeInstant.popup=Para negociação instantânea, é necessário que os dois pares de negociação estejam online para concluir o negócio em menos de 1 hora..\n\nSe você tem ofertas abertas e você não está disponível, por favor desative essas ofertas no ecrã 'Portefólio'.
|
payment.altcoin.tradeInstant.popup=Para negociação instantânea, é necessário que os dois pares de negociação estejam online para concluir o negócio em menos de 1 hora..\n\nSe você tem ofertas abertas e você não está disponível, por favor desative essas ofertas no ecrã 'Portefólio'.
|
||||||
payment.altcoin=Altcoin
|
payment.altcoin=Altcoin
|
||||||
payment.select.altcoin=Selecionar ou procurar altcoin
|
payment.select.altcoin=Selecionar ou procurar altcoin
|
||||||
|
@ -2205,7 +2214,7 @@ payment.moneyBeam.accountId=Email ou nº de telemóvel
|
||||||
payment.venmo.venmoUserName=Nome de utilizador do Venmo
|
payment.venmo.venmoUserName=Nome de utilizador do Venmo
|
||||||
payment.popmoney.accountId=Email ou nº de telemóvel
|
payment.popmoney.accountId=Email ou nº de telemóvel
|
||||||
payment.revolut.email=Email
|
payment.revolut.email=Email
|
||||||
payment.revolut.phoneNr=Nº de telemóvel guardado
|
payment.revolut.phoneNr=Nº de telemóvel registado
|
||||||
payment.promptPay.promptPayId=ID de cidadão/ID de impostos ou nº de telemóvel
|
payment.promptPay.promptPayId=ID de cidadão/ID de impostos ou nº de telemóvel
|
||||||
payment.supportedCurrencies=Moedas suportadas
|
payment.supportedCurrencies=Moedas suportadas
|
||||||
payment.limitations=Limitações
|
payment.limitations=Limitações
|
||||||
|
@ -2412,8 +2421,8 @@ validation.btc.fraction=O input resulta em um valor de bitcoin com uma fração
|
||||||
validation.btc.toLarge=O input maior que {0} não é permitido.
|
validation.btc.toLarge=O input maior que {0} não é permitido.
|
||||||
validation.btc.toSmall=Input menor que {0} não é permitido.
|
validation.btc.toSmall=Input menor que {0} não é permitido.
|
||||||
validation.securityDeposit.toSmall=Input menor que {0} não é permitido.
|
validation.securityDeposit.toSmall=Input menor que {0} não é permitido.
|
||||||
validation.passwordTooShort=A palavra-passe inserida é muito curta. É necessário conter no mínimo 8 caracteres.
|
validation.passwordTooShort=A senha inserida é muito curta. É necessário conter no mínimo 8 caracteres.
|
||||||
validation.passwordTooLong=A palavra-passe inserida é muito longa. Não pode ser maior do que 50 caracteres.
|
validation.passwordTooLong=A senha inserida é muito longa. Não pode ser maior do que 50 caracteres.
|
||||||
validation.sortCodeNumber={0} deve consistir de {1} números.
|
validation.sortCodeNumber={0} deve consistir de {1} números.
|
||||||
validation.sortCodeChars={0} deve consistir de {1} caracteres.
|
validation.sortCodeChars={0} deve consistir de {1} caracteres.
|
||||||
validation.bankIdNumber={0} deve consistir de {1 números.
|
validation.bankIdNumber={0} deve consistir de {1 números.
|
||||||
|
|
|
@ -739,6 +739,7 @@ funds.tx.unknown=Motiv necunoscut: {0}
|
||||||
funds.tx.noFundsFromDispute=Nicio rambursare din dispută
|
funds.tx.noFundsFromDispute=Nicio rambursare din dispută
|
||||||
funds.tx.receivedFunds=Fonduri încasate
|
funds.tx.receivedFunds=Fonduri încasate
|
||||||
funds.tx.withdrawnFromWallet=Retras din portofel
|
funds.tx.withdrawnFromWallet=Retras din portofel
|
||||||
|
funds.tx.withdrawnFromBSQWallet=BTC withdrawn from BSQ wallet
|
||||||
funds.tx.noTxAvailable=Nicio tranzacție disponibilă
|
funds.tx.noTxAvailable=Nicio tranzacție disponibilă
|
||||||
funds.tx.revert=Revenire
|
funds.tx.revert=Revenire
|
||||||
funds.tx.txSent=Tranzacția a fost virată cu succes la o nouă adresă în portofelul Bisq local.
|
funds.tx.txSent=Tranzacția a fost virată cu succes la o nouă adresă în portofelul Bisq local.
|
||||||
|
@ -1603,6 +1604,7 @@ dao.tx.type.enum.PROOF_OF_BURN=Proof of burn
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.tx.type.enum.IRREGULAR=Irregular
|
dao.tx.type.enum.IRREGULAR=Irregular
|
||||||
|
|
||||||
|
dao.tx.withdrawnFromWallet=BTC withdrawn from wallet
|
||||||
dao.tx.issuanceFromCompReq=Compensation request/issuance
|
dao.tx.issuanceFromCompReq=Compensation request/issuance
|
||||||
dao.tx.issuanceFromCompReq.tooltip=Compensation request which led to an issuance of new BSQ.\nIssuance date: {0}
|
dao.tx.issuanceFromCompReq.tooltip=Compensation request which led to an issuance of new BSQ.\nIssuance date: {0}
|
||||||
dao.tx.issuanceFromReimbursement=Reimbursement request/issuance
|
dao.tx.issuanceFromReimbursement=Reimbursement request/issuance
|
||||||
|
@ -1611,10 +1613,15 @@ dao.proposal.create.missingBsqFunds=You don''t have sufficient BSQ funds for cre
|
||||||
|
|
||||||
dao.proposal.create.missingBsqFundsForBond=You don''t have sufficient BSQ funds for this role. You can still publish this proposal, but you''ll need the full BSQ amount required for this role if it gets accepted. \nMissing: {0}
|
dao.proposal.create.missingBsqFundsForBond=You don''t have sufficient BSQ funds for this role. You can still publish this proposal, but you''ll need the full BSQ amount required for this role if it gets accepted. \nMissing: {0}
|
||||||
|
|
||||||
dao.proposal.create.missingMinerFeeFunds=You don''t have sufficient BTC funds for creating the proposal transaction. Any BSQ transaction require also a miner fee in BTC.\nMissing: {0}
|
dao.proposal.create.missingMinerFeeFunds=You don''t have sufficient BTC funds for creating the proposal transaction. All BSQ transactions require a miner fee in BTC.\nMissing: {0}
|
||||||
|
|
||||||
|
dao.proposal.create.missingIssuanceFunds=You don''t have sufficient BTC funds for creating the proposal transaction. All BSQ transactions require a miner fee in BTC, and issuance transactions also require BTC for the requested BSQ amount ({0} Satoshis/BSQ).\nMissing: {1}
|
||||||
|
|
||||||
dao.feeTx.confirm=Confirm {0} transaction
|
dao.feeTx.confirm=Confirm {0} transaction
|
||||||
dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/byte)\nTransaction size: {4} Kb\n\nAre you sure you want to publish the {5} transaction?
|
dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/byte)\nTransaction size: {4} Kb\n\nAre you sure you want to publish the {5} transaction?
|
||||||
|
|
||||||
|
dao.feeTx.issuanceProposal.confirm.details={0} fee: {1}\nBTC needed for BSQ issuance: {2} ({3} Satoshis/BSQ)\nMining fee: {4} ({5} Satoshis/byte)\nTransaction size: {6} Kb\n\nIf your request is approved, you will receive the amount you requested net of the 2 BSQ proposal fee.\n\nAre you sure you want to publish the {7} transaction?
|
||||||
|
|
||||||
dao.news.bisqDAO.title=THE BISQ DAO
|
dao.news.bisqDAO.title=THE BISQ DAO
|
||||||
dao.news.bisqDAO.description=Just as the Bisq exchange is decentralized and censorship-resistant, so is its governance model - and the Bisq DAO and BSQ token are the tools that make it possible.
|
dao.news.bisqDAO.description=Just as the Bisq exchange is decentralized and censorship-resistant, so is its governance model - and the Bisq DAO and BSQ token are the tools that make it possible.
|
||||||
dao.news.bisqDAO.readMoreLink=Learn More About the Bisq DAO
|
dao.news.bisqDAO.readMoreLink=Learn More About the Bisq DAO
|
||||||
|
@ -1946,6 +1953,8 @@ popup.warning.nodeBanned=Unul dintre nodurile {0} a fost interzise. Te rugăm s
|
||||||
popup.warning.priceRelay=preț releu
|
popup.warning.priceRelay=preț releu
|
||||||
popup.warning.seed=nucleu
|
popup.warning.seed=nucleu
|
||||||
|
|
||||||
|
popup.warning.burnBTC=This transaction is not possible, as the mining fees of {0} would exceed the amount to transfer of {1}. Please wait until the mining fees are low again or until you''ve accumulated more BTC to transfer.
|
||||||
|
|
||||||
popup.info.securityDepositInfo=To ensure both traders follow the trade protocol, both traders need to pay a security deposit.\n\nThis deposit is kept in your trade wallet until your trade has been successfully completed, and then it's refunded to you.\n\nPlease note: if you're creating a new offer, Bisq needs to be running for another trader to take it. To keep your offers online, keep Bisq running and make sure this computer remains online too (i.e., make sure it doesn't switch to standby mode...monitor standby is fine).
|
popup.info.securityDepositInfo=To ensure both traders follow the trade protocol, both traders need to pay a security deposit.\n\nThis deposit is kept in your trade wallet until your trade has been successfully completed, and then it's refunded to you.\n\nPlease note: if you're creating a new offer, Bisq needs to be running for another trader to take it. To keep your offers online, keep Bisq running and make sure this computer remains online too (i.e., make sure it doesn't switch to standby mode...monitor standby is fine).
|
||||||
|
|
||||||
popup.info.cashDepositInfo=Please be sure that you have a bank branch in your area to be able to make the cash deposit.\nThe bank ID (BIC/SWIFT) of the seller''s bank is: {0}.
|
popup.info.cashDepositInfo=Please be sure that you have a bank branch in your area to be able to make the cash deposit.\nThe bank ID (BIC/SWIFT) of the seller''s bank is: {0}.
|
||||||
|
|
|
@ -739,6 +739,7 @@ funds.tx.unknown=Неизвестная причина: {0}
|
||||||
funds.tx.noFundsFromDispute=Без возмещения от спора
|
funds.tx.noFundsFromDispute=Без возмещения от спора
|
||||||
funds.tx.receivedFunds=Полученные средства
|
funds.tx.receivedFunds=Полученные средства
|
||||||
funds.tx.withdrawnFromWallet=Выведено из кошелька
|
funds.tx.withdrawnFromWallet=Выведено из кошелька
|
||||||
|
funds.tx.withdrawnFromBSQWallet=BTC withdrawn from BSQ wallet
|
||||||
funds.tx.noTxAvailable=Транзакции недоступны
|
funds.tx.noTxAvailable=Транзакции недоступны
|
||||||
funds.tx.revert=Возвратить
|
funds.tx.revert=Возвратить
|
||||||
funds.tx.txSent=Транзакция успешно отправлена на новый адрес локального кошелька Bisq.
|
funds.tx.txSent=Транзакция успешно отправлена на новый адрес локального кошелька Bisq.
|
||||||
|
@ -1603,6 +1604,7 @@ dao.tx.type.enum.PROOF_OF_BURN=Proof of burn
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.tx.type.enum.IRREGULAR=Irregular
|
dao.tx.type.enum.IRREGULAR=Irregular
|
||||||
|
|
||||||
|
dao.tx.withdrawnFromWallet=BTC withdrawn from wallet
|
||||||
dao.tx.issuanceFromCompReq=Запрос/выдача компенсации
|
dao.tx.issuanceFromCompReq=Запрос/выдача компенсации
|
||||||
dao.tx.issuanceFromCompReq.tooltip=Запрос компенсации, который привел к выпуску новых BSQ.\nДата выпуска: {0}
|
dao.tx.issuanceFromCompReq.tooltip=Запрос компенсации, который привел к выпуску новых BSQ.\nДата выпуска: {0}
|
||||||
dao.tx.issuanceFromReimbursement=Запрос/выдача возмещения
|
dao.tx.issuanceFromReimbursement=Запрос/выдача возмещения
|
||||||
|
@ -1611,10 +1613,15 @@ dao.proposal.create.missingBsqFunds=У Вас недостаточно сред
|
||||||
|
|
||||||
dao.proposal.create.missingBsqFundsForBond=У Вас недостаточно BSQ для этой роли. Вы все же можете опубликовать это предложение, но Вам понадобится полная сумма BSQ, необходимая для этой роли, если оно будет принято.\nНехватает: {0}
|
dao.proposal.create.missingBsqFundsForBond=У Вас недостаточно BSQ для этой роли. Вы все же можете опубликовать это предложение, но Вам понадобится полная сумма BSQ, необходимая для этой роли, если оно будет принято.\nНехватает: {0}
|
||||||
|
|
||||||
dao.proposal.create.missingMinerFeeFunds=У Вас недостаточно средств для создания транзакции предложения. Любая транз. BSQ требует оплаты комиссии майнера в ВТС.\nНехватает: {0}
|
dao.proposal.create.missingMinerFeeFunds=You don''t have sufficient BTC funds for creating the proposal transaction. All BSQ transactions require a miner fee in BTC.\nMissing: {0}
|
||||||
|
|
||||||
|
dao.proposal.create.missingIssuanceFunds=You don''t have sufficient BTC funds for creating the proposal transaction. All BSQ transactions require a miner fee in BTC, and issuance transactions also require BTC for the requested BSQ amount ({0} Satoshis/BSQ).\nMissing: {1}
|
||||||
|
|
||||||
dao.feeTx.confirm=Подтвердить транзакцию {0}
|
dao.feeTx.confirm=Подтвердить транзакцию {0}
|
||||||
dao.feeTx.confirm.details={0} сбор: {1}\nкомиссия майнера: {2} ({3} сатоши/байт)\nРазмер транзакиции: {4} Кб\n\nДействительно хотите опубликовать транзакцию {5}?
|
dao.feeTx.confirm.details={0} сбор: {1}\nкомиссия майнера: {2} ({3} сатоши/байт)\nРазмер транзакиции: {4} Кб\n\nДействительно хотите опубликовать транзакцию {5}?
|
||||||
|
|
||||||
|
dao.feeTx.issuanceProposal.confirm.details={0} fee: {1}\nBTC needed for BSQ issuance: {2} ({3} Satoshis/BSQ)\nMining fee: {4} ({5} Satoshis/byte)\nTransaction size: {6} Kb\n\nIf your request is approved, you will receive the amount you requested net of the 2 BSQ proposal fee.\n\nAre you sure you want to publish the {7} transaction?
|
||||||
|
|
||||||
dao.news.bisqDAO.title=BISQ DAO
|
dao.news.bisqDAO.title=BISQ DAO
|
||||||
dao.news.bisqDAO.description=Подобно тому, как обменник Bisq децентрализован и защищён от цензуры, так и в его способе управления Bisq DAО и токен BSQ позволяют это осуществить.
|
dao.news.bisqDAO.description=Подобно тому, как обменник Bisq децентрализован и защищён от цензуры, так и в его способе управления Bisq DAО и токен BSQ позволяют это осуществить.
|
||||||
dao.news.bisqDAO.readMoreLink=Подробнее о Bisq DAO
|
dao.news.bisqDAO.readMoreLink=Подробнее о Bisq DAO
|
||||||
|
@ -1946,6 +1953,8 @@ popup.warning.nodeBanned=Один из узлов {0} был запрещен/з
|
||||||
popup.warning.priceRelay=ретранслятор курса
|
popup.warning.priceRelay=ретранслятор курса
|
||||||
popup.warning.seed=кодовые слова
|
popup.warning.seed=кодовые слова
|
||||||
|
|
||||||
|
popup.warning.burnBTC=This transaction is not possible, as the mining fees of {0} would exceed the amount to transfer of {1}. Please wait until the mining fees are low again or until you''ve accumulated more BTC to transfer.
|
||||||
|
|
||||||
popup.info.securityDepositInfo=Чтобы гарантировать следование торговому протоколу трейдерами, обоим необходимо заплатить залоговый депозит.\n\nДепозит остаётся в Вашем торговом кошельке до успешного завершения сделки, и затем будет возвращен Вам.\n\nУчтите, что если Вы создаёте новое предложение, Bisq должен быть подключён к сети для принятия предложения другими трейдерами. Чтобы Ваши предложения были доступны в сети, компьютер и Bisq должны быть включены и подключены к сети. (т. е. убедитесь, что компьютер не впал в режим ожидания...монитор в режиме ожидания не проблема).
|
popup.info.securityDepositInfo=Чтобы гарантировать следование торговому протоколу трейдерами, обоим необходимо заплатить залоговый депозит.\n\nДепозит остаётся в Вашем торговом кошельке до успешного завершения сделки, и затем будет возвращен Вам.\n\nУчтите, что если Вы создаёте новое предложение, Bisq должен быть подключён к сети для принятия предложения другими трейдерами. Чтобы Ваши предложения были доступны в сети, компьютер и Bisq должны быть включены и подключены к сети. (т. е. убедитесь, что компьютер не впал в режим ожидания...монитор в режиме ожидания не проблема).
|
||||||
|
|
||||||
popup.info.cashDepositInfo=Просьба убедиться, что в Вашем районе существует отделение банка, где возможно внести депозит наличными.\nИдентификатор (BIC/SWIFT) банка продавца: {0}.
|
popup.info.cashDepositInfo=Просьба убедиться, что в Вашем районе существует отделение банка, где возможно внести депозит наличными.\nИдентификатор (BIC/SWIFT) банка продавца: {0}.
|
||||||
|
|
|
@ -739,6 +739,7 @@ funds.tx.unknown=Nepoznat razlog: {0}
|
||||||
funds.tx.noFundsFromDispute=Nema povraćaja od rasprave
|
funds.tx.noFundsFromDispute=Nema povraćaja od rasprave
|
||||||
funds.tx.receivedFunds=Primljena sredstva
|
funds.tx.receivedFunds=Primljena sredstva
|
||||||
funds.tx.withdrawnFromWallet=Podignuto iz novčanika
|
funds.tx.withdrawnFromWallet=Podignuto iz novčanika
|
||||||
|
funds.tx.withdrawnFromBSQWallet=BTC withdrawn from BSQ wallet
|
||||||
funds.tx.noTxAvailable=Nema dostupnih transakcija
|
funds.tx.noTxAvailable=Nema dostupnih transakcija
|
||||||
funds.tx.revert=Vrati
|
funds.tx.revert=Vrati
|
||||||
funds.tx.txSent=Transakcija uspešno poslata na novu adresu u lokalnom Bisq novčaniku
|
funds.tx.txSent=Transakcija uspešno poslata na novu adresu u lokalnom Bisq novčaniku
|
||||||
|
@ -1603,6 +1604,7 @@ dao.tx.type.enum.PROOF_OF_BURN=Proof of burn
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.tx.type.enum.IRREGULAR=Irregular
|
dao.tx.type.enum.IRREGULAR=Irregular
|
||||||
|
|
||||||
|
dao.tx.withdrawnFromWallet=BTC withdrawn from wallet
|
||||||
dao.tx.issuanceFromCompReq=Compensation request/issuance
|
dao.tx.issuanceFromCompReq=Compensation request/issuance
|
||||||
dao.tx.issuanceFromCompReq.tooltip=Compensation request which led to an issuance of new BSQ.\nIssuance date: {0}
|
dao.tx.issuanceFromCompReq.tooltip=Compensation request which led to an issuance of new BSQ.\nIssuance date: {0}
|
||||||
dao.tx.issuanceFromReimbursement=Reimbursement request/issuance
|
dao.tx.issuanceFromReimbursement=Reimbursement request/issuance
|
||||||
|
@ -1611,10 +1613,15 @@ dao.proposal.create.missingBsqFunds=You don''t have sufficient BSQ funds for cre
|
||||||
|
|
||||||
dao.proposal.create.missingBsqFundsForBond=You don''t have sufficient BSQ funds for this role. You can still publish this proposal, but you''ll need the full BSQ amount required for this role if it gets accepted. \nMissing: {0}
|
dao.proposal.create.missingBsqFundsForBond=You don''t have sufficient BSQ funds for this role. You can still publish this proposal, but you''ll need the full BSQ amount required for this role if it gets accepted. \nMissing: {0}
|
||||||
|
|
||||||
dao.proposal.create.missingMinerFeeFunds=You don''t have sufficient BTC funds for creating the proposal transaction. Any BSQ transaction require also a miner fee in BTC.\nMissing: {0}
|
dao.proposal.create.missingMinerFeeFunds=You don''t have sufficient BTC funds for creating the proposal transaction. All BSQ transactions require a miner fee in BTC.\nMissing: {0}
|
||||||
|
|
||||||
|
dao.proposal.create.missingIssuanceFunds=You don''t have sufficient BTC funds for creating the proposal transaction. All BSQ transactions require a miner fee in BTC, and issuance transactions also require BTC for the requested BSQ amount ({0} Satoshis/BSQ).\nMissing: {1}
|
||||||
|
|
||||||
dao.feeTx.confirm=Confirm {0} transaction
|
dao.feeTx.confirm=Confirm {0} transaction
|
||||||
dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/byte)\nTransaction size: {4} Kb\n\nAre you sure you want to publish the {5} transaction?
|
dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/byte)\nTransaction size: {4} Kb\n\nAre you sure you want to publish the {5} transaction?
|
||||||
|
|
||||||
|
dao.feeTx.issuanceProposal.confirm.details={0} fee: {1}\nBTC needed for BSQ issuance: {2} ({3} Satoshis/BSQ)\nMining fee: {4} ({5} Satoshis/byte)\nTransaction size: {6} Kb\n\nIf your request is approved, you will receive the amount you requested net of the 2 BSQ proposal fee.\n\nAre you sure you want to publish the {7} transaction?
|
||||||
|
|
||||||
dao.news.bisqDAO.title=THE BISQ DAO
|
dao.news.bisqDAO.title=THE BISQ DAO
|
||||||
dao.news.bisqDAO.description=Just as the Bisq exchange is decentralized and censorship-resistant, so is its governance model - and the Bisq DAO and BSQ token are the tools that make it possible.
|
dao.news.bisqDAO.description=Just as the Bisq exchange is decentralized and censorship-resistant, so is its governance model - and the Bisq DAO and BSQ token are the tools that make it possible.
|
||||||
dao.news.bisqDAO.readMoreLink=Learn More About the Bisq DAO
|
dao.news.bisqDAO.readMoreLink=Learn More About the Bisq DAO
|
||||||
|
@ -1946,6 +1953,8 @@ popup.warning.nodeBanned=One of the {0} nodes got banned. Please restart your ap
|
||||||
popup.warning.priceRelay=price relay
|
popup.warning.priceRelay=price relay
|
||||||
popup.warning.seed=seed
|
popup.warning.seed=seed
|
||||||
|
|
||||||
|
popup.warning.burnBTC=This transaction is not possible, as the mining fees of {0} would exceed the amount to transfer of {1}. Please wait until the mining fees are low again or until you''ve accumulated more BTC to transfer.
|
||||||
|
|
||||||
popup.info.securityDepositInfo=To ensure both traders follow the trade protocol, both traders need to pay a security deposit.\n\nThis deposit is kept in your trade wallet until your trade has been successfully completed, and then it's refunded to you.\n\nPlease note: if you're creating a new offer, Bisq needs to be running for another trader to take it. To keep your offers online, keep Bisq running and make sure this computer remains online too (i.e., make sure it doesn't switch to standby mode...monitor standby is fine).
|
popup.info.securityDepositInfo=To ensure both traders follow the trade protocol, both traders need to pay a security deposit.\n\nThis deposit is kept in your trade wallet until your trade has been successfully completed, and then it's refunded to you.\n\nPlease note: if you're creating a new offer, Bisq needs to be running for another trader to take it. To keep your offers online, keep Bisq running and make sure this computer remains online too (i.e., make sure it doesn't switch to standby mode...monitor standby is fine).
|
||||||
|
|
||||||
popup.info.cashDepositInfo=Please be sure that you have a bank branch in your area to be able to make the cash deposit.\nThe bank ID (BIC/SWIFT) of the seller''s bank is: {0}.
|
popup.info.cashDepositInfo=Please be sure that you have a bank branch in your area to be able to make the cash deposit.\nThe bank ID (BIC/SWIFT) of the seller''s bank is: {0}.
|
||||||
|
|
|
@ -739,6 +739,7 @@ funds.tx.unknown=เหตุผลที่ไม่ระบุ: {0}
|
||||||
funds.tx.noFundsFromDispute=ไม่มีการคืนเงินจากการพิพาท
|
funds.tx.noFundsFromDispute=ไม่มีการคืนเงินจากการพิพาท
|
||||||
funds.tx.receivedFunds=เงินที่ได้รับ
|
funds.tx.receivedFunds=เงินที่ได้รับ
|
||||||
funds.tx.withdrawnFromWallet=ถอนออกจาก wallet
|
funds.tx.withdrawnFromWallet=ถอนออกจาก wallet
|
||||||
|
funds.tx.withdrawnFromBSQWallet=BTC withdrawn from BSQ wallet
|
||||||
funds.tx.noTxAvailable=ไม่มีธุรกรรมใด ๆ
|
funds.tx.noTxAvailable=ไม่มีธุรกรรมใด ๆ
|
||||||
funds.tx.revert=กลับสู่สภาพเดิม
|
funds.tx.revert=กลับสู่สภาพเดิม
|
||||||
funds.tx.txSent=ธุรกรรมถูกส่งสำเร็จไปยังที่อยู่ใหม่ใน Bisq wallet ท้องถิ่นแล้ว
|
funds.tx.txSent=ธุรกรรมถูกส่งสำเร็จไปยังที่อยู่ใหม่ใน Bisq wallet ท้องถิ่นแล้ว
|
||||||
|
@ -1603,6 +1604,7 @@ dao.tx.type.enum.PROOF_OF_BURN=การพิสูจน์หลักฐา
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.tx.type.enum.IRREGULAR=Irregular
|
dao.tx.type.enum.IRREGULAR=Irregular
|
||||||
|
|
||||||
|
dao.tx.withdrawnFromWallet=BTC withdrawn from wallet
|
||||||
dao.tx.issuanceFromCompReq=คำขอหรือการออกค่าสินไหมทดแทน
|
dao.tx.issuanceFromCompReq=คำขอหรือการออกค่าสินไหมทดแทน
|
||||||
dao.tx.issuanceFromCompReq.tooltip=คำขอค่าสินไหมทดแทน ซึ่งนำไปสู่การออก BSQ ใหม่\nวันที่ออก: {0}
|
dao.tx.issuanceFromCompReq.tooltip=คำขอค่าสินไหมทดแทน ซึ่งนำไปสู่การออก BSQ ใหม่\nวันที่ออก: {0}
|
||||||
dao.tx.issuanceFromReimbursement=การออกคำสั่ง/การยื่นคำร้องขอการชำระเงินคืน
|
dao.tx.issuanceFromReimbursement=การออกคำสั่ง/การยื่นคำร้องขอการชำระเงินคืน
|
||||||
|
@ -1611,10 +1613,15 @@ dao.proposal.create.missingBsqFunds=You don''t have sufficient BSQ funds for cre
|
||||||
|
|
||||||
dao.proposal.create.missingBsqFundsForBond=You don''t have sufficient BSQ funds for this role. You can still publish this proposal, but you''ll need the full BSQ amount required for this role if it gets accepted. \nMissing: {0}
|
dao.proposal.create.missingBsqFundsForBond=You don''t have sufficient BSQ funds for this role. You can still publish this proposal, but you''ll need the full BSQ amount required for this role if it gets accepted. \nMissing: {0}
|
||||||
|
|
||||||
dao.proposal.create.missingMinerFeeFunds=You don''t have sufficient BTC funds for creating the proposal transaction. Any BSQ transaction require also a miner fee in BTC.\nMissing: {0}
|
dao.proposal.create.missingMinerFeeFunds=You don''t have sufficient BTC funds for creating the proposal transaction. All BSQ transactions require a miner fee in BTC.\nMissing: {0}
|
||||||
|
|
||||||
|
dao.proposal.create.missingIssuanceFunds=You don''t have sufficient BTC funds for creating the proposal transaction. All BSQ transactions require a miner fee in BTC, and issuance transactions also require BTC for the requested BSQ amount ({0} Satoshis/BSQ).\nMissing: {1}
|
||||||
|
|
||||||
dao.feeTx.confirm=ยืนยันการทำรายการ {0}
|
dao.feeTx.confirm=ยืนยันการทำรายการ {0}
|
||||||
dao.feeTx.confirm.details={0} ค่าธรรมเนียม: {1}\nค่าธรรมเนียมการขุด: {2} ({3} Satoshis / byte)\nขนาดของธุรกรรม: {4} Kb\n\nคุณแน่ใจหรือไม่ว่าต้องการเผยแพร่ {5} ธุรกรรม?
|
dao.feeTx.confirm.details={0} ค่าธรรมเนียม: {1}\nค่าธรรมเนียมการขุด: {2} ({3} Satoshis / byte)\nขนาดของธุรกรรม: {4} Kb\n\nคุณแน่ใจหรือไม่ว่าต้องการเผยแพร่ {5} ธุรกรรม?
|
||||||
|
|
||||||
|
dao.feeTx.issuanceProposal.confirm.details={0} fee: {1}\nBTC needed for BSQ issuance: {2} ({3} Satoshis/BSQ)\nMining fee: {4} ({5} Satoshis/byte)\nTransaction size: {6} Kb\n\nIf your request is approved, you will receive the amount you requested net of the 2 BSQ proposal fee.\n\nAre you sure you want to publish the {7} transaction?
|
||||||
|
|
||||||
dao.news.bisqDAO.title=THE BISQ DAO
|
dao.news.bisqDAO.title=THE BISQ DAO
|
||||||
dao.news.bisqDAO.description=Just as the Bisq exchange is decentralized and censorship-resistant, so is its governance model - and the Bisq DAO and BSQ token are the tools that make it possible.
|
dao.news.bisqDAO.description=Just as the Bisq exchange is decentralized and censorship-resistant, so is its governance model - and the Bisq DAO and BSQ token are the tools that make it possible.
|
||||||
dao.news.bisqDAO.readMoreLink=Learn More About the Bisq DAO
|
dao.news.bisqDAO.readMoreLink=Learn More About the Bisq DAO
|
||||||
|
@ -1946,6 +1953,8 @@ popup.warning.nodeBanned=หนึ่งใน {0} โหนดถูกแบ
|
||||||
popup.warning.priceRelay=ราคาผลัดเปลี่ยน
|
popup.warning.priceRelay=ราคาผลัดเปลี่ยน
|
||||||
popup.warning.seed=รหัสลับเพื่อกู้ข้อมูล
|
popup.warning.seed=รหัสลับเพื่อกู้ข้อมูล
|
||||||
|
|
||||||
|
popup.warning.burnBTC=This transaction is not possible, as the mining fees of {0} would exceed the amount to transfer of {1}. Please wait until the mining fees are low again or until you''ve accumulated more BTC to transfer.
|
||||||
|
|
||||||
popup.info.securityDepositInfo=เพื่อให้แน่ใจว่าเทรดเดอร์ทั้งคู่นั้นได้ปฏิบัติตามข้อสนธิสัญญาในการค้า เทรดเดอร์จำเป็นต้องทำการชำระค่าประกัน\n\nค่าประกันนี้คือถูกเก็บไว้ในกระเป๋าสตางค์การเทรดของคุณจนกว่าการเทรดของคุณจะดำเนินการสำเร็จ และคุณจะได้รับมันคืนหลังจากนั้น \n\nโปรดทราบ: หากคุณกำลังสร้างข้อเสนอขึ้นมาใหม่ Bisq จำเป็นที่ต้องดำเนินงานต่อเนื่องไปยังเทรดเดอร์รายอื่น และเพื่อที่สถานะข้อเสนอทางออนไลน์ของคุณจะยังคงอยู่ Bisq จะยังคงดำเนินงานต่อเนื่อง และโปรดมั่นใจว่าเครื่องคอมพิวเตอร์นี้กำลังออนไลน์อยู่ด้วยเช่นกัน (ยกตัวอย่างเช่น ตรวจเช็คว่าสวิทช์ไฟไม่ได้อยู่ในโหมดแสตนบายด์...หน้าจอแสตนบายด์คือปกติดี)
|
popup.info.securityDepositInfo=เพื่อให้แน่ใจว่าเทรดเดอร์ทั้งคู่นั้นได้ปฏิบัติตามข้อสนธิสัญญาในการค้า เทรดเดอร์จำเป็นต้องทำการชำระค่าประกัน\n\nค่าประกันนี้คือถูกเก็บไว้ในกระเป๋าสตางค์การเทรดของคุณจนกว่าการเทรดของคุณจะดำเนินการสำเร็จ และคุณจะได้รับมันคืนหลังจากนั้น \n\nโปรดทราบ: หากคุณกำลังสร้างข้อเสนอขึ้นมาใหม่ Bisq จำเป็นที่ต้องดำเนินงานต่อเนื่องไปยังเทรดเดอร์รายอื่น และเพื่อที่สถานะข้อเสนอทางออนไลน์ของคุณจะยังคงอยู่ Bisq จะยังคงดำเนินงานต่อเนื่อง และโปรดมั่นใจว่าเครื่องคอมพิวเตอร์นี้กำลังออนไลน์อยู่ด้วยเช่นกัน (ยกตัวอย่างเช่น ตรวจเช็คว่าสวิทช์ไฟไม่ได้อยู่ในโหมดแสตนบายด์...หน้าจอแสตนบายด์คือปกติดี)
|
||||||
|
|
||||||
popup.info.cashDepositInfo=โปรดตรวจสอบว่าคุณมีสาขาธนาคารในพื้นที่ของคุณเพื่อสามารถฝากเงินได้\nรหัสธนาคาร (BIC / SWIFT) ของธนาคารผู้ขายคือ: {0}
|
popup.info.cashDepositInfo=โปรดตรวจสอบว่าคุณมีสาขาธนาคารในพื้นที่ของคุณเพื่อสามารถฝากเงินได้\nรหัสธนาคาร (BIC / SWIFT) ของธนาคารผู้ขายคือ: {0}
|
||||||
|
|
|
@ -739,6 +739,7 @@ funds.tx.unknown=Không rõ lý do: {0}
|
||||||
funds.tx.noFundsFromDispute=KHÔNG HOÀN LẠI từ khiếu nại
|
funds.tx.noFundsFromDispute=KHÔNG HOÀN LẠI từ khiếu nại
|
||||||
funds.tx.receivedFunds=Vốn đã nhận
|
funds.tx.receivedFunds=Vốn đã nhận
|
||||||
funds.tx.withdrawnFromWallet=rút từ ví
|
funds.tx.withdrawnFromWallet=rút từ ví
|
||||||
|
funds.tx.withdrawnFromBSQWallet=BTC withdrawn from BSQ wallet
|
||||||
funds.tx.noTxAvailable=Không có giao dịch nào
|
funds.tx.noTxAvailable=Không có giao dịch nào
|
||||||
funds.tx.revert=Khôi phục
|
funds.tx.revert=Khôi phục
|
||||||
funds.tx.txSent=GIao dịch đã gửi thành công tới địa chỉ mới trong ví Bisq nội bộ.
|
funds.tx.txSent=GIao dịch đã gửi thành công tới địa chỉ mới trong ví Bisq nội bộ.
|
||||||
|
@ -1603,6 +1604,7 @@ dao.tx.type.enum.PROOF_OF_BURN=Bằng chứng đốt
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.tx.type.enum.IRREGULAR=Irregular
|
dao.tx.type.enum.IRREGULAR=Irregular
|
||||||
|
|
||||||
|
dao.tx.withdrawnFromWallet=BTC withdrawn from wallet
|
||||||
dao.tx.issuanceFromCompReq=Yêu cầu bồi thường/ban hành
|
dao.tx.issuanceFromCompReq=Yêu cầu bồi thường/ban hành
|
||||||
dao.tx.issuanceFromCompReq.tooltip=Yêu cầu bồi thường dẫn đến ban hành BSQ mới.\nNgày ban hành: {0}
|
dao.tx.issuanceFromCompReq.tooltip=Yêu cầu bồi thường dẫn đến ban hành BSQ mới.\nNgày ban hành: {0}
|
||||||
dao.tx.issuanceFromReimbursement=Yêu cầu/ Phát hành bồi hoàn
|
dao.tx.issuanceFromReimbursement=Yêu cầu/ Phát hành bồi hoàn
|
||||||
|
@ -1611,10 +1613,15 @@ dao.proposal.create.missingBsqFunds=You don''t have sufficient BSQ funds for cre
|
||||||
|
|
||||||
dao.proposal.create.missingBsqFundsForBond=You don''t have sufficient BSQ funds for this role. You can still publish this proposal, but you''ll need the full BSQ amount required for this role if it gets accepted. \nMissing: {0}
|
dao.proposal.create.missingBsqFundsForBond=You don''t have sufficient BSQ funds for this role. You can still publish this proposal, but you''ll need the full BSQ amount required for this role if it gets accepted. \nMissing: {0}
|
||||||
|
|
||||||
dao.proposal.create.missingMinerFeeFunds=You don''t have sufficient BTC funds for creating the proposal transaction. Any BSQ transaction require also a miner fee in BTC.\nMissing: {0}
|
dao.proposal.create.missingMinerFeeFunds=You don''t have sufficient BTC funds for creating the proposal transaction. All BSQ transactions require a miner fee in BTC.\nMissing: {0}
|
||||||
|
|
||||||
|
dao.proposal.create.missingIssuanceFunds=You don''t have sufficient BTC funds for creating the proposal transaction. All BSQ transactions require a miner fee in BTC, and issuance transactions also require BTC for the requested BSQ amount ({0} Satoshis/BSQ).\nMissing: {1}
|
||||||
|
|
||||||
dao.feeTx.confirm=Xác nhận {0} giao dịch
|
dao.feeTx.confirm=Xác nhận {0} giao dịch
|
||||||
dao.feeTx.confirm.details={0} phí: {1}\nPhí đào: {2} ({3} Satoshis/byte)\nKích thước giao dịch: {4} Kb\n\nBạn có chắc là muốn công bố giao dịch {5}?
|
dao.feeTx.confirm.details={0} phí: {1}\nPhí đào: {2} ({3} Satoshis/byte)\nKích thước giao dịch: {4} Kb\n\nBạn có chắc là muốn công bố giao dịch {5}?
|
||||||
|
|
||||||
|
dao.feeTx.issuanceProposal.confirm.details={0} fee: {1}\nBTC needed for BSQ issuance: {2} ({3} Satoshis/BSQ)\nMining fee: {4} ({5} Satoshis/byte)\nTransaction size: {6} Kb\n\nIf your request is approved, you will receive the amount you requested net of the 2 BSQ proposal fee.\n\nAre you sure you want to publish the {7} transaction?
|
||||||
|
|
||||||
dao.news.bisqDAO.title=THE BISQ DAO
|
dao.news.bisqDAO.title=THE BISQ DAO
|
||||||
dao.news.bisqDAO.description=Just as the Bisq exchange is decentralized and censorship-resistant, so is its governance model - and the Bisq DAO and BSQ token are the tools that make it possible.
|
dao.news.bisqDAO.description=Just as the Bisq exchange is decentralized and censorship-resistant, so is its governance model - and the Bisq DAO and BSQ token are the tools that make it possible.
|
||||||
dao.news.bisqDAO.readMoreLink=Learn More About the Bisq DAO
|
dao.news.bisqDAO.readMoreLink=Learn More About the Bisq DAO
|
||||||
|
@ -1946,6 +1953,8 @@ popup.warning.nodeBanned=Một trong {0} Node đã bị chấm. Vui lòng khởi
|
||||||
popup.warning.priceRelay=rơle giá
|
popup.warning.priceRelay=rơle giá
|
||||||
popup.warning.seed=seed
|
popup.warning.seed=seed
|
||||||
|
|
||||||
|
popup.warning.burnBTC=This transaction is not possible, as the mining fees of {0} would exceed the amount to transfer of {1}. Please wait until the mining fees are low again or until you''ve accumulated more BTC to transfer.
|
||||||
|
|
||||||
popup.info.securityDepositInfo=Để đảm bảo cả hai người giao dịch đều tuân thủ giao thức giao dịch, cả hai cần phải trả một khoản tiền cọc. \n\nSố tiền cọc này được giữ ở ví giao dịch cho đến khi giao dịch của bạn được hoàn thành, sau đó nó sẽ được trả lại cho bạn. \nXin lưu ý: Nếu bạn tạo một chào giá mới, ứng dụng Bisq cần phải chạy để người giao dịch khác có thể nhận chào giá đó. Để giữ cho chào giá của bạn online, để Bisq chạy và đảm bảo là máy tính của bạn cũng online (nghĩa là đảm bảo là máy tính của bạn không chuyển qua chế độ standby, nếu màn hình chuyển qua chế độ standby thì không sao).
|
popup.info.securityDepositInfo=Để đảm bảo cả hai người giao dịch đều tuân thủ giao thức giao dịch, cả hai cần phải trả một khoản tiền cọc. \n\nSố tiền cọc này được giữ ở ví giao dịch cho đến khi giao dịch của bạn được hoàn thành, sau đó nó sẽ được trả lại cho bạn. \nXin lưu ý: Nếu bạn tạo một chào giá mới, ứng dụng Bisq cần phải chạy để người giao dịch khác có thể nhận chào giá đó. Để giữ cho chào giá của bạn online, để Bisq chạy và đảm bảo là máy tính của bạn cũng online (nghĩa là đảm bảo là máy tính của bạn không chuyển qua chế độ standby, nếu màn hình chuyển qua chế độ standby thì không sao).
|
||||||
|
|
||||||
popup.info.cashDepositInfo=Chắc chắn rằng khu vực của bạn có chi nhánh ngân hàng có thể gửi tiền mặt.\nID (BIC/SWIFT) ngân hàng của bên bán là: {0}.
|
popup.info.cashDepositInfo=Chắc chắn rằng khu vực của bạn có chi nhánh ngân hàng có thể gửi tiền mặt.\nID (BIC/SWIFT) ngân hàng của bên bán là: {0}.
|
||||||
|
|
|
@ -739,6 +739,7 @@ funds.tx.unknown=不知原因:{0}
|
||||||
funds.tx.noFundsFromDispute=没有退款的纠纷
|
funds.tx.noFundsFromDispute=没有退款的纠纷
|
||||||
funds.tx.receivedFunds=收到的资金:
|
funds.tx.receivedFunds=收到的资金:
|
||||||
funds.tx.withdrawnFromWallet=从钱包提现
|
funds.tx.withdrawnFromWallet=从钱包提现
|
||||||
|
funds.tx.withdrawnFromBSQWallet=BTC withdrawn from BSQ wallet
|
||||||
funds.tx.noTxAvailable=没有可用交易
|
funds.tx.noTxAvailable=没有可用交易
|
||||||
funds.tx.revert=还原
|
funds.tx.revert=还原
|
||||||
funds.tx.txSent=交易成功发送到本地Bisq钱包中的新地址。
|
funds.tx.txSent=交易成功发送到本地Bisq钱包中的新地址。
|
||||||
|
@ -1603,6 +1604,7 @@ dao.tx.type.enum.PROOF_OF_BURN=Proof of burn
|
||||||
# suppress inspection "UnusedProperty"
|
# suppress inspection "UnusedProperty"
|
||||||
dao.tx.type.enum.IRREGULAR=Irregular
|
dao.tx.type.enum.IRREGULAR=Irregular
|
||||||
|
|
||||||
|
dao.tx.withdrawnFromWallet=BTC withdrawn from wallet
|
||||||
dao.tx.issuanceFromCompReq=补偿请求/发行
|
dao.tx.issuanceFromCompReq=补偿请求/发行
|
||||||
dao.tx.issuanceFromCompReq.tooltip=导致新BSQ发行的补偿请求\n发行日期: {0}
|
dao.tx.issuanceFromCompReq.tooltip=导致新BSQ发行的补偿请求\n发行日期: {0}
|
||||||
dao.tx.issuanceFromReimbursement=Reimbursement request/issuance
|
dao.tx.issuanceFromReimbursement=Reimbursement request/issuance
|
||||||
|
@ -1611,10 +1613,15 @@ dao.proposal.create.missingBsqFunds=You don''t have sufficient BSQ funds for cre
|
||||||
|
|
||||||
dao.proposal.create.missingBsqFundsForBond=You don''t have sufficient BSQ funds for this role. You can still publish this proposal, but you''ll need the full BSQ amount required for this role if it gets accepted. \nMissing: {0}
|
dao.proposal.create.missingBsqFundsForBond=You don''t have sufficient BSQ funds for this role. You can still publish this proposal, but you''ll need the full BSQ amount required for this role if it gets accepted. \nMissing: {0}
|
||||||
|
|
||||||
dao.proposal.create.missingMinerFeeFunds=You don''t have sufficient BTC funds for creating the proposal transaction. Any BSQ transaction require also a miner fee in BTC.\nMissing: {0}
|
dao.proposal.create.missingMinerFeeFunds=You don''t have sufficient BTC funds for creating the proposal transaction. All BSQ transactions require a miner fee in BTC.\nMissing: {0}
|
||||||
|
|
||||||
|
dao.proposal.create.missingIssuanceFunds=You don''t have sufficient BTC funds for creating the proposal transaction. All BSQ transactions require a miner fee in BTC, and issuance transactions also require BTC for the requested BSQ amount ({0} Satoshis/BSQ).\nMissing: {1}
|
||||||
|
|
||||||
dao.feeTx.confirm=Confirm {0} transaction
|
dao.feeTx.confirm=Confirm {0} transaction
|
||||||
dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/byte)\nTransaction size: {4} Kb\n\nAre you sure you want to publish the {5} transaction?
|
dao.feeTx.confirm.details={0} fee: {1}\nMining fee: {2} ({3} Satoshis/byte)\nTransaction size: {4} Kb\n\nAre you sure you want to publish the {5} transaction?
|
||||||
|
|
||||||
|
dao.feeTx.issuanceProposal.confirm.details={0} fee: {1}\nBTC needed for BSQ issuance: {2} ({3} Satoshis/BSQ)\nMining fee: {4} ({5} Satoshis/byte)\nTransaction size: {6} Kb\n\nIf your request is approved, you will receive the amount you requested net of the 2 BSQ proposal fee.\n\nAre you sure you want to publish the {7} transaction?
|
||||||
|
|
||||||
dao.news.bisqDAO.title=THE BISQ DAO
|
dao.news.bisqDAO.title=THE BISQ DAO
|
||||||
dao.news.bisqDAO.description=Just as the Bisq exchange is decentralized and censorship-resistant, so is its governance model - and the Bisq DAO and BSQ token are the tools that make it possible.
|
dao.news.bisqDAO.description=Just as the Bisq exchange is decentralized and censorship-resistant, so is its governance model - and the Bisq DAO and BSQ token are the tools that make it possible.
|
||||||
dao.news.bisqDAO.readMoreLink=Learn More About the Bisq DAO
|
dao.news.bisqDAO.readMoreLink=Learn More About the Bisq DAO
|
||||||
|
@ -1946,6 +1953,8 @@ popup.warning.nodeBanned=One of the {0} nodes got banned. Please restart your ap
|
||||||
popup.warning.priceRelay=price relay
|
popup.warning.priceRelay=price relay
|
||||||
popup.warning.seed=种子
|
popup.warning.seed=种子
|
||||||
|
|
||||||
|
popup.warning.burnBTC=This transaction is not possible, as the mining fees of {0} would exceed the amount to transfer of {1}. Please wait until the mining fees are low again or until you''ve accumulated more BTC to transfer.
|
||||||
|
|
||||||
popup.info.securityDepositInfo=To ensure both traders follow the trade protocol, both traders need to pay a security deposit.\n\nThis deposit is kept in your trade wallet until your trade has been successfully completed, and then it's refunded to you.\n\nPlease note: if you're creating a new offer, Bisq needs to be running for another trader to take it. To keep your offers online, keep Bisq running and make sure this computer remains online too (i.e., make sure it doesn't switch to standby mode...monitor standby is fine).
|
popup.info.securityDepositInfo=To ensure both traders follow the trade protocol, both traders need to pay a security deposit.\n\nThis deposit is kept in your trade wallet until your trade has been successfully completed, and then it's refunded to you.\n\nPlease note: if you're creating a new offer, Bisq needs to be running for another trader to take it. To keep your offers online, keep Bisq running and make sure this computer remains online too (i.e., make sure it doesn't switch to standby mode...monitor standby is fine).
|
||||||
|
|
||||||
popup.info.cashDepositInfo=Please be sure that you have a bank branch in your area to be able to make the cash deposit.\nThe bank ID (BIC/SWIFT) of the seller''s bank is: {0}.
|
popup.info.cashDepositInfo=Please be sure that you have a bank branch in your area to be able to make the cash deposit.\nThe bank ID (BIC/SWIFT) of the seller''s bank is: {0}.
|
||||||
|
|
|
@ -43,7 +43,7 @@ public class UserPayloadModelVOTest {
|
||||||
vo.setDisplayedAlert(new Alert("message", true, "version", new byte[]{12, -64, 12}, "string", null));
|
vo.setDisplayedAlert(new Alert("message", true, "version", new byte[]{12, -64, 12}, "string", null));
|
||||||
vo.setDevelopersFilter(new Filter(Lists.newArrayList(), Lists.newArrayList(), Lists.newArrayList(),
|
vo.setDevelopersFilter(new Filter(Lists.newArrayList(), Lists.newArrayList(), Lists.newArrayList(),
|
||||||
Lists.newArrayList(), Lists.newArrayList(), Lists.newArrayList(), Lists.newArrayList(), Lists.newArrayList(),
|
Lists.newArrayList(), Lists.newArrayList(), Lists.newArrayList(), Lists.newArrayList(), Lists.newArrayList(),
|
||||||
false, Lists.newArrayList(), false, "string", new byte[]{10, 0, 0}, null));
|
false, Lists.newArrayList(), false, null, "string", new byte[]{10, 0, 0}, null));
|
||||||
vo.setRegisteredArbitrator(ArbitratorTest.getArbitratorMock());
|
vo.setRegisteredArbitrator(ArbitratorTest.getArbitratorMock());
|
||||||
vo.setRegisteredMediator(MediatorTest.getMediatorMock());
|
vo.setRegisteredMediator(MediatorTest.getMediatorMock());
|
||||||
vo.setAcceptedArbitrators(Lists.newArrayList(ArbitratorTest.getArbitratorMock()));
|
vo.setAcceptedArbitrators(Lists.newArrayList(ArbitratorTest.getArbitratorMock()));
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
# pull base image
|
# pull base image
|
||||||
FROM openjdk:8-jdk
|
FROM openjdk:8-jdk
|
||||||
ENV version 0.9.7-SNAPSHOT
|
ENV version 0.9.8-SNAPSHOT
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y --no-install-recommends openjfx && rm -rf /var/lib/apt/lists/* &&
|
RUN apt-get update && apt-get install -y --no-install-recommends openjfx && rm -rf /var/lib/apt/lists/* &&
|
||||||
apt-get install -y vim fakeroot
|
apt-get install -y vim fakeroot
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
# - Update version below
|
# - Update version below
|
||||||
# - Ensure JAVA_HOME below is pointing to OracleJDK 10 directory
|
# - Ensure JAVA_HOME below is pointing to OracleJDK 10 directory
|
||||||
|
|
||||||
version=0.9.7-SNAPSHOT
|
version=0.9.8-SNAPSHOT
|
||||||
if [ ! -f "$JAVA_HOME/bin/javapackager" ]; then
|
if [ ! -f "$JAVA_HOME/bin/javapackager" ]; then
|
||||||
if [ -d "/usr/lib/jvm/jdk-10.0.2" ]; then
|
if [ -d "/usr/lib/jvm/jdk-10.0.2" ]; then
|
||||||
JAVA_HOME=/usr/lib/jvm/jdk-10.0.2
|
JAVA_HOME=/usr/lib/jvm/jdk-10.0.2
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
# Prior to running this script:
|
# Prior to running this script:
|
||||||
# - Update version below
|
# - Update version below
|
||||||
|
|
||||||
version=0.9.7-SNAPSHOT
|
version=0.9.8-SNAPSHOT
|
||||||
base_dir=$( cd "$(dirname "$0")" ; pwd -P )/../../..
|
base_dir=$( cd "$(dirname "$0")" ; pwd -P )/../../..
|
||||||
package_dir=$base_dir/desktop/package
|
package_dir=$base_dir/desktop/package
|
||||||
release_dir=$base_dir/desktop/release/$version
|
release_dir=$base_dir/desktop/release/$version
|
||||||
|
|
|
@ -5,10 +5,10 @@
|
||||||
<!-- See: https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -->
|
<!-- See: https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -->
|
||||||
|
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>0.9.7</string>
|
<string>0.9.8</string>
|
||||||
|
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>0.9.7</string>
|
<string>0.9.8</string>
|
||||||
|
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
<string>Bisq</string>
|
<string>Bisq</string>
|
||||||
|
|
|
@ -6,7 +6,7 @@ mkdir -p deploy
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
version="0.9.7-SNAPSHOT"
|
version="0.9.8-SNAPSHOT"
|
||||||
|
|
||||||
cd ..
|
cd ..
|
||||||
./gradlew :desktop:build -x test shadowJar
|
./gradlew :desktop:build -x test shadowJar
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
cd ../../
|
cd ../../
|
||||||
|
|
||||||
version="0.9.7-SNAPSHOT"
|
version="0.9.8-SNAPSHOT"
|
||||||
|
|
||||||
target_dir="releases/$version"
|
target_dir="releases/$version"
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
cd $(dirname $0)/../../../
|
cd $(dirname $0)/../../../
|
||||||
|
|
||||||
version=0.9.7
|
version=0.9.8
|
||||||
|
|
||||||
find . -type f \( -name "finalize.sh" \
|
find . -type f \( -name "finalize.sh" \
|
||||||
-o -name "create_app.sh" \
|
-o -name "create_app.sh" \
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
|
|
||||||
cd $(dirname $0)/../../../
|
cd $(dirname $0)/../../../
|
||||||
|
|
||||||
oldVersion=0.9.6
|
oldVersion=0.9.7
|
||||||
newVersion=0.9.7
|
newVersion=0.9.8
|
||||||
|
|
||||||
find . -type f \( -name "finalize.sh" \
|
find . -type f \( -name "finalize.sh" \
|
||||||
-o -name "create_app.sh" \
|
-o -name "create_app.sh" \
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
@echo off
|
@echo off
|
||||||
|
|
||||||
set version=0.9.7-SNAPSHOT
|
set version=0.9.8-SNAPSHOT
|
||||||
if not exist "%JAVA_HOME%\bin\javapackager.exe" (
|
if not exist "%JAVA_HOME%\bin\javapackager.exe" (
|
||||||
if not exist "%ProgramFiles%\Java\jdk-10.0.2" (
|
if not exist "%ProgramFiles%\Java\jdk-10.0.2" (
|
||||||
echo Javapackager not found. Update JAVA_HOME variable to point to OracleJDK.
|
echo Javapackager not found. Update JAVA_HOME variable to point to OracleJDK.
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
@echo off
|
@echo off
|
||||||
|
|
||||||
set version=0.9.7-SNAPSHOT
|
set version=0.9.8-SNAPSHOT
|
||||||
set release_dir=%~dp0..\..\..\releases\%version%
|
set release_dir=%~dp0..\..\..\releases\%version%
|
||||||
set package_dir=%~dp0..
|
set package_dir=%~dp0..
|
||||||
|
|
||||||
|
|
|
@ -119,7 +119,7 @@ public class BondingViewUtils {
|
||||||
duration,
|
duration,
|
||||||
formatter.formatCoinWithCode(miningFee),
|
formatter.formatCoinWithCode(miningFee),
|
||||||
CoinUtil.getFeePerByte(miningFee, txSize),
|
CoinUtil.getFeePerByte(miningFee, txSize),
|
||||||
txSize
|
txSize / 1000d
|
||||||
))
|
))
|
||||||
.actionButtonText(Res.get("shared.yes"))
|
.actionButtonText(Res.get("shared.yes"))
|
||||||
.onAction(() -> publishLockupTx(lockupAmount, lockupTime, lockupReason, hash, resultHandler))
|
.onAction(() -> publishLockupTx(lockupAmount, lockupTime, lockupReason, hash, resultHandler))
|
||||||
|
@ -180,7 +180,7 @@ public class BondingViewUtils {
|
||||||
duration,
|
duration,
|
||||||
formatter.formatCoinWithCode(miningFee),
|
formatter.formatCoinWithCode(miningFee),
|
||||||
CoinUtil.getFeePerByte(miningFee, txSize),
|
CoinUtil.getFeePerByte(miningFee, txSize),
|
||||||
txSize
|
txSize / 1000d
|
||||||
))
|
))
|
||||||
.actionButtonText(Res.get("shared.yes"))
|
.actionButtonText(Res.get("shared.yes"))
|
||||||
.onAction(() -> publishUnlockTx(lockupTxId, resultHandler))
|
.onAction(() -> publishUnlockTx(lockupTxId, resultHandler))
|
||||||
|
|
|
@ -310,8 +310,14 @@ public class MakeProposalView extends ActivatableView<GridPane, Void> implements
|
||||||
new Popup<>().warning(Res.get("dao.proposal.create.missingBsqFunds",
|
new Popup<>().warning(Res.get("dao.proposal.create.missingBsqFunds",
|
||||||
bsqFormatter.formatCoinWithCode(e.missing))).show();
|
bsqFormatter.formatCoinWithCode(e.missing))).show();
|
||||||
} else {
|
} else {
|
||||||
new Popup<>().warning(Res.get("dao.proposal.create.missingMinerFeeFunds",
|
if (type.equals(ProposalType.COMPENSATION_REQUEST) || type.equals(ProposalType.REIMBURSEMENT_REQUEST)) {
|
||||||
btcFormatter.formatCoinWithCode(e.missing))).show();
|
new Popup<>().warning(Res.get("dao.proposal.create.missingIssuanceFunds",
|
||||||
|
100,
|
||||||
|
btcFormatter.formatCoinWithCode(e.missing))).show();
|
||||||
|
} else {
|
||||||
|
new Popup<>().warning(Res.get("dao.proposal.create.missingMinerFeeFunds",
|
||||||
|
btcFormatter.formatCoinWithCode(e.missing))).show();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch (ProposalValidationException e) {
|
} catch (ProposalValidationException e) {
|
||||||
String message;
|
String message;
|
||||||
|
|
|
@ -20,8 +20,12 @@ package bisq.desktop.main.dao.monitor;
|
||||||
import bisq.core.dao.monitoring.model.StateHash;
|
import bisq.core.dao.monitoring.model.StateHash;
|
||||||
import bisq.core.locale.Res;
|
import bisq.core.locale.Res;
|
||||||
|
|
||||||
|
import bisq.network.p2p.NodeAddress;
|
||||||
|
|
||||||
import bisq.common.util.Utilities;
|
import bisq.common.util.Utilities;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
@ -36,10 +40,15 @@ public abstract class StateInConflictListItem<T extends StateHash> {
|
||||||
private final String prevHash;
|
private final String prevHash;
|
||||||
private final T stateHash;
|
private final T stateHash;
|
||||||
|
|
||||||
protected StateInConflictListItem(String peerAddress, T stateHash, int cycleIndex) {
|
protected StateInConflictListItem(String peerAddress, T stateHash, int cycleIndex,
|
||||||
|
Set<NodeAddress> seedNodeAddresses) {
|
||||||
this.stateHash = stateHash;
|
this.stateHash = stateHash;
|
||||||
this.peerAddress = peerAddress;
|
this.peerAddress = seedNodeAddresses.stream().anyMatch(e -> e.getFullAddress().equals(peerAddress)) ?
|
||||||
height = Res.get("dao.monitor.table.cycleBlockHeight", cycleIndex + 1, String.valueOf(stateHash.getHeight()));
|
Res.get("dao.monitor.table.seedPeers", peerAddress) :
|
||||||
|
peerAddress;
|
||||||
|
height = Res.get("dao.monitor.table.cycleBlockHeight",
|
||||||
|
cycleIndex + 1,
|
||||||
|
String.valueOf(stateHash.getHeight()));
|
||||||
hash = Utilities.bytesAsHexString(stateHash.getHash());
|
hash = Utilities.bytesAsHexString(stateHash.getHash());
|
||||||
prevHash = stateHash.getPrevHash().length > 0 ?
|
prevHash = stateHash.getPrevHash().length > 0 ?
|
||||||
Utilities.bytesAsHexString(stateHash.getPrevHash()) : "-";
|
Utilities.bytesAsHexString(stateHash.getPrevHash()) : "-";
|
||||||
|
|
|
@ -23,6 +23,7 @@ import bisq.desktop.components.AutoTooltipButton;
|
||||||
import bisq.desktop.components.AutoTooltipLabel;
|
import bisq.desktop.components.AutoTooltipLabel;
|
||||||
import bisq.desktop.components.AutoTooltipTableColumn;
|
import bisq.desktop.components.AutoTooltipTableColumn;
|
||||||
import bisq.desktop.components.TableGroupHeadline;
|
import bisq.desktop.components.TableGroupHeadline;
|
||||||
|
import bisq.desktop.main.overlays.popups.Popup;
|
||||||
import bisq.desktop.util.FormBuilder;
|
import bisq.desktop.util.FormBuilder;
|
||||||
import bisq.desktop.util.GUIUtil;
|
import bisq.desktop.util.GUIUtil;
|
||||||
import bisq.desktop.util.Layout;
|
import bisq.desktop.util.Layout;
|
||||||
|
@ -36,7 +37,10 @@ import bisq.core.dao.state.DaoStateListener;
|
||||||
import bisq.core.dao.state.DaoStateService;
|
import bisq.core.dao.state.DaoStateService;
|
||||||
import bisq.core.locale.Res;
|
import bisq.core.locale.Res;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import bisq.network.p2p.NodeAddress;
|
||||||
|
import bisq.network.p2p.seed.SeedNodeRepository;
|
||||||
|
|
||||||
|
import bisq.common.storage.FileManager;
|
||||||
|
|
||||||
import de.jensd.fx.fontawesome.AwesomeIcon;
|
import de.jensd.fx.fontawesome.AwesomeIcon;
|
||||||
|
|
||||||
|
@ -64,8 +68,12 @@ import javafx.collections.transformation.SortedList;
|
||||||
|
|
||||||
import javafx.util.Callback;
|
import javafx.util.Callback;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@FxmlView
|
@FxmlView
|
||||||
|
@ -78,6 +86,8 @@ public abstract class StateMonitorView<StH extends StateHash,
|
||||||
protected final DaoFacade daoFacade;
|
protected final DaoFacade daoFacade;
|
||||||
protected final CycleService cycleService;
|
protected final CycleService cycleService;
|
||||||
protected final PeriodService periodService;
|
protected final PeriodService periodService;
|
||||||
|
protected final Set<NodeAddress> seedNodeAddresses;
|
||||||
|
private final File storageDir;
|
||||||
|
|
||||||
protected TextField statusTextField;
|
protected TextField statusTextField;
|
||||||
protected Button resyncButton;
|
protected Button resyncButton;
|
||||||
|
@ -91,22 +101,26 @@ public abstract class StateMonitorView<StH extends StateHash,
|
||||||
|
|
||||||
protected int gridRow = 0;
|
protected int gridRow = 0;
|
||||||
private Subscription selectedItemSubscription;
|
private Subscription selectedItemSubscription;
|
||||||
protected final BooleanProperty isInConflict = new SimpleBooleanProperty();
|
protected final BooleanProperty isInConflictWithNonSeedNode = new SimpleBooleanProperty();
|
||||||
|
protected final BooleanProperty isInConflictWithSeedNode = new SimpleBooleanProperty();
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Constructor, lifecycle
|
// Constructor, lifecycle
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
@Inject
|
protected StateMonitorView(DaoStateService daoStateService,
|
||||||
public StateMonitorView(DaoStateService daoStateService,
|
DaoFacade daoFacade,
|
||||||
DaoFacade daoFacade,
|
CycleService cycleService,
|
||||||
CycleService cycleService,
|
PeriodService periodService,
|
||||||
PeriodService periodService) {
|
SeedNodeRepository seedNodeRepository,
|
||||||
|
File storageDir) {
|
||||||
this.daoStateService = daoStateService;
|
this.daoStateService = daoStateService;
|
||||||
this.daoFacade = daoFacade;
|
this.daoFacade = daoFacade;
|
||||||
this.cycleService = cycleService;
|
this.cycleService = cycleService;
|
||||||
this.periodService = periodService;
|
this.periodService = periodService;
|
||||||
|
this.seedNodeAddresses = new HashSet<>(seedNodeRepository.getSeedNodeAddresses());
|
||||||
|
this.storageDir = storageDir;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -124,8 +138,36 @@ public abstract class StateMonitorView<StH extends StateHash,
|
||||||
|
|
||||||
daoStateService.addDaoStateListener(this);
|
daoStateService.addDaoStateListener(this);
|
||||||
|
|
||||||
resyncButton.visibleProperty().bind(isInConflict);
|
resyncButton.visibleProperty().bind(isInConflictWithSeedNode);
|
||||||
resyncButton.managedProperty().bind(isInConflict);
|
resyncButton.managedProperty().bind(isInConflictWithSeedNode);
|
||||||
|
|
||||||
|
resyncButton.setOnAction(ev -> {
|
||||||
|
try {
|
||||||
|
// We delete all consensus payload data and reset the daoState so it will rebuild from genesis.
|
||||||
|
// Deleting the daoState would cause to read the file from the resources and we would not rebuild from
|
||||||
|
// genesis if a snapshot exist!
|
||||||
|
long currentTime = System.currentTimeMillis();
|
||||||
|
String backupDirName = "out_of_sync_dao_data";
|
||||||
|
String newFileName = "BlindVoteStore_" + currentTime;
|
||||||
|
FileManager.removeAndBackupFile(storageDir, new File(storageDir, "BlindVoteStore"), newFileName, backupDirName);
|
||||||
|
|
||||||
|
newFileName = "ProposalStore_" + currentTime;
|
||||||
|
FileManager.removeAndBackupFile(storageDir, new File(storageDir, "ProposalStore"), newFileName, backupDirName);
|
||||||
|
|
||||||
|
// We also need to remove ballot list as it contains the proposals as well. It will be recreated at resync
|
||||||
|
newFileName = "BallotList_" + currentTime;
|
||||||
|
FileManager.removeAndBackupFile(storageDir, new File(storageDir, "BallotList"), newFileName, backupDirName);
|
||||||
|
|
||||||
|
daoFacade.resyncDao(() -> new Popup<>().attention(Res.get("setting.preferences.dao.resync.popup"))
|
||||||
|
.useShutDownButton()
|
||||||
|
.hideCloseButton()
|
||||||
|
.show());
|
||||||
|
} catch (Throwable t) {
|
||||||
|
t.printStackTrace();
|
||||||
|
log.error(t.toString());
|
||||||
|
new Popup<>().error(t.toString()).show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
if (daoStateService.isParseBlockChainComplete()) {
|
if (daoStateService.isParseBlockChainComplete()) {
|
||||||
onDataUpdate();
|
onDataUpdate();
|
||||||
|
@ -250,6 +292,17 @@ public abstract class StateMonitorView<StH extends StateHash,
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
protected void onDataUpdate() {
|
protected void onDataUpdate() {
|
||||||
|
if (isInConflictWithSeedNode.get()) {
|
||||||
|
statusTextField.setText(Res.get("dao.monitor.isInConflictWithSeedNode"));
|
||||||
|
statusTextField.getStyleClass().add("dao-inConflict");
|
||||||
|
} else if (isInConflictWithNonSeedNode.get()) {
|
||||||
|
statusTextField.setText(Res.get("dao.monitor.isInConflictWithNonSeedNode"));
|
||||||
|
statusTextField.getStyleClass().remove("dao-inConflict");
|
||||||
|
} else {
|
||||||
|
statusTextField.setText(Res.get("dao.monitor.daoStateInSync"));
|
||||||
|
statusTextField.getStyleClass().remove("dao-inConflict");
|
||||||
|
}
|
||||||
|
|
||||||
GUIUtil.setFitToRowsForTableView(tableView, 25, 28, 2, 5);
|
GUIUtil.setFitToRowsForTableView(tableView, 25, 28, 2, 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -455,7 +508,7 @@ public abstract class StateMonitorView<StH extends StateHash,
|
||||||
|
|
||||||
|
|
||||||
column = new AutoTooltipTableColumn<>(getPeersTableHeader());
|
column = new AutoTooltipTableColumn<>(getPeersTableHeader());
|
||||||
column.setMinWidth(80);
|
column.setMinWidth(150);
|
||||||
column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue()));
|
column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue()));
|
||||||
column.setCellFactory(
|
column.setCellFactory(
|
||||||
new Callback<>() {
|
new Callback<>() {
|
||||||
|
@ -479,7 +532,7 @@ public abstract class StateMonitorView<StH extends StateHash,
|
||||||
|
|
||||||
|
|
||||||
column = new AutoTooltipTableColumn<>(getHashTableHeader());
|
column = new AutoTooltipTableColumn<>(getHashTableHeader());
|
||||||
column.setMinWidth(150);
|
column.setMinWidth(120);
|
||||||
column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue()));
|
column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue()));
|
||||||
column.setCellFactory(
|
column.setCellFactory(
|
||||||
new Callback<>() {
|
new Callback<>() {
|
||||||
|
@ -503,7 +556,7 @@ public abstract class StateMonitorView<StH extends StateHash,
|
||||||
|
|
||||||
|
|
||||||
column = new AutoTooltipTableColumn<>(getPrevHashTableHeader());
|
column = new AutoTooltipTableColumn<>(getPrevHashTableHeader());
|
||||||
column.setMinWidth(150);
|
column.setMinWidth(120);
|
||||||
column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue()));
|
column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue()));
|
||||||
column.setCellFactory(
|
column.setCellFactory(
|
||||||
new Callback<>() {
|
new Callback<>() {
|
||||||
|
@ -527,7 +580,7 @@ public abstract class StateMonitorView<StH extends StateHash,
|
||||||
|
|
||||||
|
|
||||||
column = new AutoTooltipTableColumn<>("");
|
column = new AutoTooltipTableColumn<>("");
|
||||||
column.setMinWidth(100);
|
column.setMinWidth(120);
|
||||||
column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue()));
|
column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue()));
|
||||||
column.setCellFactory(
|
column.setCellFactory(
|
||||||
new Callback<>() {
|
new Callback<>() {
|
||||||
|
|
|
@ -21,6 +21,10 @@ import bisq.desktop.main.dao.monitor.StateInConflictListItem;
|
||||||
|
|
||||||
import bisq.core.dao.monitoring.model.BlindVoteStateHash;
|
import bisq.core.dao.monitoring.model.BlindVoteStateHash;
|
||||||
|
|
||||||
|
import bisq.network.p2p.NodeAddress;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.Value;
|
import lombok.Value;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
@ -31,8 +35,9 @@ import lombok.extern.slf4j.Slf4j;
|
||||||
class BlindVoteStateInConflictListItem extends StateInConflictListItem<BlindVoteStateHash> {
|
class BlindVoteStateInConflictListItem extends StateInConflictListItem<BlindVoteStateHash> {
|
||||||
private final String numBlindVotes;
|
private final String numBlindVotes;
|
||||||
|
|
||||||
BlindVoteStateInConflictListItem(String peerAddress, BlindVoteStateHash stateHash, int cycleIndex) {
|
BlindVoteStateInConflictListItem(String peerAddress, BlindVoteStateHash stateHash, int cycleIndex,
|
||||||
super(peerAddress, stateHash, cycleIndex);
|
Set<NodeAddress> seedNodeAddresses) {
|
||||||
|
super(peerAddress, stateHash, cycleIndex, seedNodeAddresses);
|
||||||
|
|
||||||
numBlindVotes = String.valueOf(stateHash.getNumBlindVotes());
|
numBlindVotes = String.valueOf(stateHash.getNumBlindVotes());
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,6 @@ package bisq.desktop.main.dao.monitor.blindvotes;
|
||||||
import bisq.desktop.common.view.FxmlView;
|
import bisq.desktop.common.view.FxmlView;
|
||||||
import bisq.desktop.components.AutoTooltipTableColumn;
|
import bisq.desktop.components.AutoTooltipTableColumn;
|
||||||
import bisq.desktop.main.dao.monitor.StateMonitorView;
|
import bisq.desktop.main.dao.monitor.StateMonitorView;
|
||||||
import bisq.desktop.main.overlays.popups.Popup;
|
|
||||||
import bisq.desktop.util.FormBuilder;
|
import bisq.desktop.util.FormBuilder;
|
||||||
|
|
||||||
import bisq.core.dao.DaoFacade;
|
import bisq.core.dao.DaoFacade;
|
||||||
|
@ -32,7 +31,12 @@ import bisq.core.dao.monitoring.model.BlindVoteStateHash;
|
||||||
import bisq.core.dao.state.DaoStateService;
|
import bisq.core.dao.state.DaoStateService;
|
||||||
import bisq.core.locale.Res;
|
import bisq.core.locale.Res;
|
||||||
|
|
||||||
|
import bisq.network.p2p.seed.SeedNodeRepository;
|
||||||
|
|
||||||
|
import bisq.common.storage.Storage;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Named;
|
||||||
|
|
||||||
import javafx.scene.control.TableCell;
|
import javafx.scene.control.TableCell;
|
||||||
import javafx.scene.control.TableColumn;
|
import javafx.scene.control.TableColumn;
|
||||||
|
@ -41,6 +45,8 @@ import javafx.beans.property.ReadOnlyObjectWrapper;
|
||||||
|
|
||||||
import javafx.util.Callback;
|
import javafx.util.Callback;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
@ -50,6 +56,7 @@ public class BlindVoteStateMonitorView extends StateMonitorView<BlindVoteStateHa
|
||||||
implements BlindVoteStateMonitoringService.Listener {
|
implements BlindVoteStateMonitoringService.Listener {
|
||||||
private final BlindVoteStateMonitoringService blindVoteStateMonitoringService;
|
private final BlindVoteStateMonitoringService blindVoteStateMonitoringService;
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Constructor, lifecycle
|
// Constructor, lifecycle
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -60,8 +67,10 @@ public class BlindVoteStateMonitorView extends StateMonitorView<BlindVoteStateHa
|
||||||
DaoFacade daoFacade,
|
DaoFacade daoFacade,
|
||||||
BlindVoteStateMonitoringService blindVoteStateMonitoringService,
|
BlindVoteStateMonitoringService blindVoteStateMonitoringService,
|
||||||
CycleService cycleService,
|
CycleService cycleService,
|
||||||
PeriodService periodService) {
|
PeriodService periodService,
|
||||||
super(daoStateService, daoFacade, cycleService, periodService);
|
SeedNodeRepository seedNodeRepository,
|
||||||
|
@Named(Storage.STORAGE_DIR) File storageDir) {
|
||||||
|
super(daoStateService, daoFacade, cycleService, periodService, seedNodeRepository, storageDir);
|
||||||
|
|
||||||
this.blindVoteStateMonitoringService = blindVoteStateMonitoringService;
|
this.blindVoteStateMonitoringService = blindVoteStateMonitoringService;
|
||||||
}
|
}
|
||||||
|
@ -80,14 +89,8 @@ public class BlindVoteStateMonitorView extends StateMonitorView<BlindVoteStateHa
|
||||||
@Override
|
@Override
|
||||||
protected void activate() {
|
protected void activate() {
|
||||||
super.activate();
|
super.activate();
|
||||||
blindVoteStateMonitoringService.addListener(this);
|
|
||||||
|
|
||||||
resyncButton.setOnAction(e -> daoFacade.resyncDao(() ->
|
blindVoteStateMonitoringService.addListener(this);
|
||||||
new Popup<>().attention(Res.get("setting.preferences.dao.resync.popup"))
|
|
||||||
.useShutDownButton()
|
|
||||||
.hideCloseButton()
|
|
||||||
.show())
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -123,7 +126,7 @@ public class BlindVoteStateMonitorView extends StateMonitorView<BlindVoteStateHa
|
||||||
protected BlindVoteStateInConflictListItem getStateInConflictListItem(Map.Entry<String, BlindVoteStateHash> mapEntry) {
|
protected BlindVoteStateInConflictListItem getStateInConflictListItem(Map.Entry<String, BlindVoteStateHash> mapEntry) {
|
||||||
BlindVoteStateHash blindVoteStateHash = mapEntry.getValue();
|
BlindVoteStateHash blindVoteStateHash = mapEntry.getValue();
|
||||||
int cycleIndex = periodService.getCycle(blindVoteStateHash.getHeight()).map(cycleService::getCycleIndex).orElse(0);
|
int cycleIndex = periodService.getCycle(blindVoteStateHash.getHeight()).map(cycleService::getCycleIndex).orElse(0);
|
||||||
return new BlindVoteStateInConflictListItem(mapEntry.getKey(), mapEntry.getValue(), cycleIndex);
|
return new BlindVoteStateInConflictListItem(mapEntry.getKey(), mapEntry.getValue(), cycleIndex, seedNodeAddresses);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -173,15 +176,8 @@ public class BlindVoteStateMonitorView extends StateMonitorView<BlindVoteStateHa
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onDataUpdate() {
|
protected void onDataUpdate() {
|
||||||
isInConflict.set(blindVoteStateMonitoringService.isInConflict());
|
isInConflictWithSeedNode.set(blindVoteStateMonitoringService.isInConflictWithSeedNode());
|
||||||
|
isInConflictWithNonSeedNode.set(blindVoteStateMonitoringService.isInConflictWithNonSeedNode());
|
||||||
if (isInConflict.get()) {
|
|
||||||
statusTextField.setText(Res.get("dao.monitor.blindVote.daoStateNotInSync"));
|
|
||||||
statusTextField.getStyleClass().add("dao-inConflict");
|
|
||||||
} else {
|
|
||||||
statusTextField.setText(Res.get("dao.monitor.blindVote.daoStateInSync"));
|
|
||||||
statusTextField.getStyleClass().remove("dao-inConflict");
|
|
||||||
}
|
|
||||||
|
|
||||||
listItems.setAll(blindVoteStateMonitoringService.getBlindVoteStateBlockChain().stream()
|
listItems.setAll(blindVoteStateMonitoringService.getBlindVoteStateBlockChain().stream()
|
||||||
.map(this::getStateBlockListItem)
|
.map(this::getStateBlockListItem)
|
||||||
|
@ -202,7 +198,7 @@ public class BlindVoteStateMonitorView extends StateMonitorView<BlindVoteStateHa
|
||||||
TableColumn<BlindVoteStateBlockListItem, BlindVoteStateBlockListItem> column;
|
TableColumn<BlindVoteStateBlockListItem, BlindVoteStateBlockListItem> column;
|
||||||
|
|
||||||
column = new AutoTooltipTableColumn<>(Res.get("dao.monitor.blindVote.table.numBlindVotes"));
|
column = new AutoTooltipTableColumn<>(Res.get("dao.monitor.blindVote.table.numBlindVotes"));
|
||||||
column.setMinWidth(110);
|
column.setMinWidth(90);
|
||||||
column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue()));
|
column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue()));
|
||||||
column.setCellFactory(
|
column.setCellFactory(
|
||||||
new Callback<>() {
|
new Callback<>() {
|
||||||
|
@ -232,7 +228,7 @@ public class BlindVoteStateMonitorView extends StateMonitorView<BlindVoteStateHa
|
||||||
TableColumn<BlindVoteStateInConflictListItem, BlindVoteStateInConflictListItem> column;
|
TableColumn<BlindVoteStateInConflictListItem, BlindVoteStateInConflictListItem> column;
|
||||||
|
|
||||||
column = new AutoTooltipTableColumn<>(Res.get("dao.monitor.blindVote.table.numBlindVotes"));
|
column = new AutoTooltipTableColumn<>(Res.get("dao.monitor.blindVote.table.numBlindVotes"));
|
||||||
column.setMinWidth(110);
|
column.setMinWidth(90);
|
||||||
column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue()));
|
column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue()));
|
||||||
column.setCellFactory(
|
column.setCellFactory(
|
||||||
new Callback<>() {
|
new Callback<>() {
|
||||||
|
|
|
@ -21,6 +21,10 @@ import bisq.desktop.main.dao.monitor.StateInConflictListItem;
|
||||||
|
|
||||||
import bisq.core.dao.monitoring.model.DaoStateHash;
|
import bisq.core.dao.monitoring.model.DaoStateHash;
|
||||||
|
|
||||||
|
import bisq.network.p2p.NodeAddress;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.Value;
|
import lombok.Value;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
@ -29,7 +33,8 @@ import lombok.extern.slf4j.Slf4j;
|
||||||
@Value
|
@Value
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
class DaoStateInConflictListItem extends StateInConflictListItem<DaoStateHash> {
|
class DaoStateInConflictListItem extends StateInConflictListItem<DaoStateHash> {
|
||||||
DaoStateInConflictListItem(String peerAddress, DaoStateHash stateHash, int cycleIndex) {
|
DaoStateInConflictListItem(String peerAddress, DaoStateHash stateHash, int cycleIndex,
|
||||||
super(peerAddress, stateHash, cycleIndex);
|
Set<NodeAddress> seedNodeAddresses) {
|
||||||
|
super(peerAddress, stateHash, cycleIndex, seedNodeAddresses);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,12 +33,18 @@ import bisq.core.dao.monitoring.model.UtxoMismatch;
|
||||||
import bisq.core.dao.state.DaoStateService;
|
import bisq.core.dao.state.DaoStateService;
|
||||||
import bisq.core.locale.Res;
|
import bisq.core.locale.Res;
|
||||||
|
|
||||||
|
import bisq.network.p2p.seed.SeedNodeRepository;
|
||||||
|
|
||||||
|
import bisq.common.storage.Storage;
|
||||||
import bisq.common.util.Utilities;
|
import bisq.common.util.Utilities;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Named;
|
||||||
|
|
||||||
import javafx.collections.ListChangeListener;
|
import javafx.collections.ListChangeListener;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@ -60,8 +66,10 @@ public class DaoStateMonitorView extends StateMonitorView<DaoStateHash, DaoState
|
||||||
DaoFacade daoFacade,
|
DaoFacade daoFacade,
|
||||||
DaoStateMonitoringService daoStateMonitoringService,
|
DaoStateMonitoringService daoStateMonitoringService,
|
||||||
CycleService cycleService,
|
CycleService cycleService,
|
||||||
PeriodService periodService) {
|
PeriodService periodService,
|
||||||
super(daoStateService, daoFacade, cycleService, periodService);
|
SeedNodeRepository seedNodeRepository,
|
||||||
|
@Named(Storage.STORAGE_DIR) File storageDir) {
|
||||||
|
super(daoStateService, daoFacade, cycleService, periodService, seedNodeRepository, storageDir);
|
||||||
|
|
||||||
this.daoStateMonitoringService = daoStateMonitoringService;
|
this.daoStateMonitoringService = daoStateMonitoringService;
|
||||||
}
|
}
|
||||||
|
@ -87,13 +95,6 @@ public class DaoStateMonitorView extends StateMonitorView<DaoStateHash, DaoState
|
||||||
daoStateMonitoringService.getUtxoMismatches().addListener(utxoMismatchListChangeListener);
|
daoStateMonitoringService.getUtxoMismatches().addListener(utxoMismatchListChangeListener);
|
||||||
|
|
||||||
updateUtxoMismatches();
|
updateUtxoMismatches();
|
||||||
|
|
||||||
resyncButton.setOnAction(e -> daoFacade.resyncDao(() ->
|
|
||||||
new Popup<>().attention(Res.get("setting.preferences.dao.resync.popup"))
|
|
||||||
.useShutDownButton()
|
|
||||||
.hideCloseButton()
|
|
||||||
.show())
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -131,7 +132,7 @@ public class DaoStateMonitorView extends StateMonitorView<DaoStateHash, DaoState
|
||||||
protected DaoStateInConflictListItem getStateInConflictListItem(Map.Entry<String, DaoStateHash> mapEntry) {
|
protected DaoStateInConflictListItem getStateInConflictListItem(Map.Entry<String, DaoStateHash> mapEntry) {
|
||||||
DaoStateHash daoStateHash = mapEntry.getValue();
|
DaoStateHash daoStateHash = mapEntry.getValue();
|
||||||
int cycleIndex = periodService.getCycle(daoStateHash.getHeight()).map(cycleService::getCycleIndex).orElse(0);
|
int cycleIndex = periodService.getCycle(daoStateHash.getHeight()).map(cycleService::getCycleIndex).orElse(0);
|
||||||
return new DaoStateInConflictListItem(mapEntry.getKey(), daoStateHash, cycleIndex);
|
return new DaoStateInConflictListItem(mapEntry.getKey(), daoStateHash, cycleIndex, seedNodeAddresses);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -181,15 +182,8 @@ public class DaoStateMonitorView extends StateMonitorView<DaoStateHash, DaoState
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onDataUpdate() {
|
protected void onDataUpdate() {
|
||||||
isInConflict.set(daoStateMonitoringService.isInConflict());
|
isInConflictWithSeedNode.set(daoStateMonitoringService.isInConflictWithSeedNode());
|
||||||
|
isInConflictWithNonSeedNode.set(daoStateMonitoringService.isInConflictWithNonSeedNode());
|
||||||
if (isInConflict.get()) {
|
|
||||||
statusTextField.setText(Res.get("dao.monitor.daoState.daoStateNotInSync"));
|
|
||||||
statusTextField.getStyleClass().add("dao-inConflict");
|
|
||||||
} else {
|
|
||||||
statusTextField.setText(Res.get("dao.monitor.daoState.daoStateInSync"));
|
|
||||||
statusTextField.getStyleClass().remove("dao-inConflict");
|
|
||||||
}
|
|
||||||
|
|
||||||
listItems.setAll(daoStateMonitoringService.getDaoStateBlockChain().stream()
|
listItems.setAll(daoStateMonitoringService.getDaoStateBlockChain().stream()
|
||||||
.map(this::getStateBlockListItem)
|
.map(this::getStateBlockListItem)
|
||||||
|
|
|
@ -21,6 +21,10 @@ import bisq.desktop.main.dao.monitor.StateInConflictListItem;
|
||||||
|
|
||||||
import bisq.core.dao.monitoring.model.ProposalStateHash;
|
import bisq.core.dao.monitoring.model.ProposalStateHash;
|
||||||
|
|
||||||
|
import bisq.network.p2p.NodeAddress;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.Value;
|
import lombok.Value;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
@ -31,8 +35,9 @@ import lombok.extern.slf4j.Slf4j;
|
||||||
class ProposalStateInConflictListItem extends StateInConflictListItem<ProposalStateHash> {
|
class ProposalStateInConflictListItem extends StateInConflictListItem<ProposalStateHash> {
|
||||||
private final String numProposals;
|
private final String numProposals;
|
||||||
|
|
||||||
ProposalStateInConflictListItem(String peerAddress, ProposalStateHash stateHash, int cycleIndex) {
|
ProposalStateInConflictListItem(String peerAddress, ProposalStateHash stateHash, int cycleIndex,
|
||||||
super(peerAddress, stateHash, cycleIndex);
|
Set<NodeAddress> seedNodeAddresses) {
|
||||||
|
super(peerAddress, stateHash, cycleIndex, seedNodeAddresses);
|
||||||
|
|
||||||
numProposals = String.valueOf(stateHash.getNumProposals());
|
numProposals = String.valueOf(stateHash.getNumProposals());
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,6 @@ package bisq.desktop.main.dao.monitor.proposals;
|
||||||
import bisq.desktop.common.view.FxmlView;
|
import bisq.desktop.common.view.FxmlView;
|
||||||
import bisq.desktop.components.AutoTooltipTableColumn;
|
import bisq.desktop.components.AutoTooltipTableColumn;
|
||||||
import bisq.desktop.main.dao.monitor.StateMonitorView;
|
import bisq.desktop.main.dao.monitor.StateMonitorView;
|
||||||
import bisq.desktop.main.overlays.popups.Popup;
|
|
||||||
import bisq.desktop.util.FormBuilder;
|
import bisq.desktop.util.FormBuilder;
|
||||||
|
|
||||||
import bisq.core.dao.DaoFacade;
|
import bisq.core.dao.DaoFacade;
|
||||||
|
@ -32,7 +31,12 @@ import bisq.core.dao.monitoring.model.ProposalStateHash;
|
||||||
import bisq.core.dao.state.DaoStateService;
|
import bisq.core.dao.state.DaoStateService;
|
||||||
import bisq.core.locale.Res;
|
import bisq.core.locale.Res;
|
||||||
|
|
||||||
|
import bisq.network.p2p.seed.SeedNodeRepository;
|
||||||
|
|
||||||
|
import bisq.common.storage.Storage;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Named;
|
||||||
|
|
||||||
import javafx.scene.control.TableCell;
|
import javafx.scene.control.TableCell;
|
||||||
import javafx.scene.control.TableColumn;
|
import javafx.scene.control.TableColumn;
|
||||||
|
@ -41,6 +45,8 @@ import javafx.beans.property.ReadOnlyObjectWrapper;
|
||||||
|
|
||||||
import javafx.util.Callback;
|
import javafx.util.Callback;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
@ -60,8 +66,10 @@ public class ProposalStateMonitorView extends StateMonitorView<ProposalStateHash
|
||||||
DaoFacade daoFacade,
|
DaoFacade daoFacade,
|
||||||
ProposalStateMonitoringService proposalStateMonitoringService,
|
ProposalStateMonitoringService proposalStateMonitoringService,
|
||||||
CycleService cycleService,
|
CycleService cycleService,
|
||||||
PeriodService periodService) {
|
PeriodService periodService,
|
||||||
super(daoStateService, daoFacade, cycleService, periodService);
|
SeedNodeRepository seedNodeRepository,
|
||||||
|
@Named(Storage.STORAGE_DIR) File storageDir) {
|
||||||
|
super(daoStateService, daoFacade, cycleService, periodService, seedNodeRepository, storageDir);
|
||||||
|
|
||||||
this.proposalStateMonitoringService = proposalStateMonitoringService;
|
this.proposalStateMonitoringService = proposalStateMonitoringService;
|
||||||
}
|
}
|
||||||
|
@ -81,13 +89,6 @@ public class ProposalStateMonitorView extends StateMonitorView<ProposalStateHash
|
||||||
protected void activate() {
|
protected void activate() {
|
||||||
super.activate();
|
super.activate();
|
||||||
proposalStateMonitoringService.addListener(this);
|
proposalStateMonitoringService.addListener(this);
|
||||||
|
|
||||||
resyncButton.setOnAction(e -> daoFacade.resyncDao(() ->
|
|
||||||
new Popup<>().attention(Res.get("setting.preferences.dao.resync.popup"))
|
|
||||||
.useShutDownButton()
|
|
||||||
.hideCloseButton()
|
|
||||||
.show())
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -123,7 +124,7 @@ public class ProposalStateMonitorView extends StateMonitorView<ProposalStateHash
|
||||||
protected ProposalStateInConflictListItem getStateInConflictListItem(Map.Entry<String, ProposalStateHash> mapEntry) {
|
protected ProposalStateInConflictListItem getStateInConflictListItem(Map.Entry<String, ProposalStateHash> mapEntry) {
|
||||||
ProposalStateHash proposalStateHash = mapEntry.getValue();
|
ProposalStateHash proposalStateHash = mapEntry.getValue();
|
||||||
int cycleIndex = periodService.getCycle(proposalStateHash.getHeight()).map(cycleService::getCycleIndex).orElse(0);
|
int cycleIndex = periodService.getCycle(proposalStateHash.getHeight()).map(cycleService::getCycleIndex).orElse(0);
|
||||||
return new ProposalStateInConflictListItem(mapEntry.getKey(), mapEntry.getValue(), cycleIndex);
|
return new ProposalStateInConflictListItem(mapEntry.getKey(), mapEntry.getValue(), cycleIndex, seedNodeAddresses);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -173,15 +174,8 @@ public class ProposalStateMonitorView extends StateMonitorView<ProposalStateHash
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onDataUpdate() {
|
protected void onDataUpdate() {
|
||||||
isInConflict.set(proposalStateMonitoringService.isInConflict());
|
isInConflictWithSeedNode.set(proposalStateMonitoringService.isInConflictWithSeedNode());
|
||||||
|
isInConflictWithNonSeedNode.set(proposalStateMonitoringService.isInConflictWithNonSeedNode());
|
||||||
if (isInConflict.get()) {
|
|
||||||
statusTextField.setText(Res.get("dao.monitor.proposal.daoStateNotInSync"));
|
|
||||||
statusTextField.getStyleClass().add("dao-inConflict");
|
|
||||||
} else {
|
|
||||||
statusTextField.setText(Res.get("dao.monitor.proposal.daoStateInSync"));
|
|
||||||
statusTextField.getStyleClass().remove("dao-inConflict");
|
|
||||||
}
|
|
||||||
|
|
||||||
listItems.setAll(proposalStateMonitoringService.getProposalStateBlockChain().stream()
|
listItems.setAll(proposalStateMonitoringService.getProposalStateBlockChain().stream()
|
||||||
.map(this::getStateBlockListItem)
|
.map(this::getStateBlockListItem)
|
||||||
|
|
|
@ -296,18 +296,25 @@ public class BsqSendView extends ActivatableView<GridPane, Void> implements BsqB
|
||||||
Transaction txWithBtcFee = btcWalletService.completePreparedSendBsqTx(preparedSendTx, true);
|
Transaction txWithBtcFee = btcWalletService.completePreparedSendBsqTx(preparedSendTx, true);
|
||||||
Transaction signedTx = bsqWalletService.signTx(txWithBtcFee);
|
Transaction signedTx = bsqWalletService.signTx(txWithBtcFee);
|
||||||
Coin miningFee = signedTx.getFee();
|
Coin miningFee = signedTx.getFee();
|
||||||
int txSize = signedTx.bitcoinSerialize().length;
|
|
||||||
showPublishTxPopup(receiverAmount,
|
if (miningFee.getValue() >= receiverAmount.getValue())
|
||||||
txWithBtcFee,
|
GUIUtil.showWantToBurnBTCPopup(miningFee, receiverAmount, btcFormatter);
|
||||||
TxType.INVALID,
|
else {
|
||||||
miningFee,
|
int txSize = signedTx.bitcoinSerialize().length;
|
||||||
txSize, receiversBtcAddressInputTextField.getText(),
|
showPublishTxPopup(receiverAmount,
|
||||||
btcFormatter,
|
txWithBtcFee,
|
||||||
btcFormatter,
|
TxType.INVALID,
|
||||||
() -> {
|
miningFee,
|
||||||
receiversBtcAddressInputTextField.setText("");
|
txSize, receiversBtcAddressInputTextField.getText(),
|
||||||
btcAmountInputTextField.setText("");
|
btcFormatter,
|
||||||
});
|
btcFormatter,
|
||||||
|
() -> {
|
||||||
|
receiversBtcAddressInputTextField.setText("");
|
||||||
|
btcAmountInputTextField.setText("");
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
handleError(t);
|
handleError(t);
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,6 +47,7 @@ class BsqTxListItem extends TxConfidenceListItem {
|
||||||
private final BsqFormatter bsqFormatter;
|
private final BsqFormatter bsqFormatter;
|
||||||
private final Date date;
|
private final Date date;
|
||||||
private final boolean isBurnedBsqTx;
|
private final boolean isBurnedBsqTx;
|
||||||
|
private final boolean withdrawalToBTCWallet;
|
||||||
|
|
||||||
private final String address;
|
private final String address;
|
||||||
private final String direction;
|
private final String direction;
|
||||||
|
@ -73,6 +74,11 @@ class BsqTxListItem extends TxConfidenceListItem {
|
||||||
|
|
||||||
Coin valueSentToMe = bsqWalletService.getValueSentToMeForTransaction(transaction);
|
Coin valueSentToMe = bsqWalletService.getValueSentToMeForTransaction(transaction);
|
||||||
Coin valueSentFromMe = bsqWalletService.getValueSentFromMeForTransaction(transaction);
|
Coin valueSentFromMe = bsqWalletService.getValueSentFromMeForTransaction(transaction);
|
||||||
|
Coin valueSentToMyBTCWallet = btcWalletService.getValueSentToMeForTransaction(transaction);
|
||||||
|
Coin valueSentFromMyBTCWallet = btcWalletService.getValueSentFromMeForTransaction(transaction);
|
||||||
|
|
||||||
|
withdrawalToBTCWallet = valueSentToMyBTCWallet.getValue() > valueSentFromMyBTCWallet.getValue();
|
||||||
|
|
||||||
amount = valueSentToMe.subtract(valueSentFromMe);
|
amount = valueSentToMe.subtract(valueSentFromMe);
|
||||||
if (amount.isPositive()) {
|
if (amount.isPositive()) {
|
||||||
if (txId.equals(daoFacade.getGenesisTxId()))
|
if (txId.equals(daoFacade.getGenesisTxId()))
|
||||||
|
@ -124,5 +130,9 @@ class BsqTxListItem extends TxConfidenceListItem {
|
||||||
.flatMap(tx -> daoFacade.getOptionalTxType(tx.getId()))
|
.flatMap(tx -> daoFacade.getOptionalTxType(tx.getId()))
|
||||||
.orElse(confirmations == 0 ? TxType.UNVERIFIED : TxType.UNDEFINED_TX_TYPE);
|
.orElse(confirmations == 0 ? TxType.UNVERIFIED : TxType.UNDEFINED_TX_TYPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isWithdrawalToBTCWallet() {
|
||||||
|
return withdrawalToBTCWallet;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -463,6 +463,10 @@ public class BsqTxView extends ActivatableView<GridPane, Void> implements BsqBal
|
||||||
setGraphic(field);
|
setGraphic(field);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
if (item.isWithdrawalToBTCWallet())
|
||||||
|
labelString = Res.get("dao.tx.withdrawnFromWallet");
|
||||||
|
|
||||||
label = new AutoTooltipLabel(labelString);
|
label = new AutoTooltipLabel(labelString);
|
||||||
setGraphic(label);
|
setGraphic(label);
|
||||||
}
|
}
|
||||||
|
@ -497,9 +501,17 @@ public class BsqTxView extends ActivatableView<GridPane, Void> implements BsqBal
|
||||||
super.updateItem(item, empty);
|
super.updateItem(item, empty);
|
||||||
if (item != null && !empty) {
|
if (item != null && !empty) {
|
||||||
TxType txType = item.getTxType();
|
TxType txType = item.getTxType();
|
||||||
setText(item.getConfirmations() > 0 && isValidType(txType) ?
|
|
||||||
bsqFormatter.formatCoin(item.getAmount()) :
|
String bsqAmount = Res.get("shared.na");
|
||||||
Res.get("shared.na"));
|
|
||||||
|
if (item.getConfirmations() > 0) {
|
||||||
|
if (isValidType(txType))
|
||||||
|
bsqAmount = bsqFormatter.formatCoin(item.getAmount());
|
||||||
|
else if (item.isWithdrawalToBTCWallet())
|
||||||
|
bsqAmount = bsqFormatter.formatBSQSatoshis(0L);
|
||||||
|
}
|
||||||
|
|
||||||
|
setText(bsqAmount);
|
||||||
} else
|
} else
|
||||||
setText("");
|
setText("");
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,6 +93,7 @@ class TransactionsListItem {
|
||||||
|
|
||||||
// TODO check and refactor
|
// TODO check and refactor
|
||||||
boolean txFeeForBsqPayment = false;
|
boolean txFeeForBsqPayment = false;
|
||||||
|
boolean withdrawalFromBSQWallet = false;
|
||||||
if (valueSentToMe.isZero()) {
|
if (valueSentToMe.isZero()) {
|
||||||
amountAsCoin = valueSentFromMe.multiply(-1);
|
amountAsCoin = valueSentFromMe.multiply(-1);
|
||||||
for (TransactionOutput output : transaction.getOutputs()) {
|
for (TransactionOutput output : transaction.getOutputs()) {
|
||||||
|
@ -145,6 +146,14 @@ class TransactionsListItem {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
addressString = WalletService.getAddressStringFromOutput(output);
|
||||||
|
outgoing = (valueSentToMe.getValue() < valueSentFromMe.getValue());
|
||||||
|
if (!outgoing) {
|
||||||
|
direction = Res.get("funds.tx.direction.receivedWith");
|
||||||
|
received = true;
|
||||||
|
withdrawalFromBSQWallet = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -216,6 +225,8 @@ class TransactionsListItem {
|
||||||
} else {
|
} else {
|
||||||
if (amountAsCoin.isZero())
|
if (amountAsCoin.isZero())
|
||||||
details = Res.get("funds.tx.noFundsFromDispute");
|
details = Res.get("funds.tx.noFundsFromDispute");
|
||||||
|
else if (withdrawalFromBSQWallet)
|
||||||
|
details = Res.get("funds.tx.withdrawnFromBSQWallet");
|
||||||
else if (!txFeeForBsqPayment)
|
else if (!txFeeForBsqPayment)
|
||||||
details = received ? Res.get("funds.tx.receivedFunds") : Res.get("funds.tx.withdrawnFromWallet");
|
details = received ? Res.get("funds.tx.receivedFunds") : Res.get("funds.tx.withdrawnFromWallet");
|
||||||
else if (details.isEmpty())
|
else if (details.isEmpty())
|
||||||
|
|
|
@ -141,6 +141,7 @@ public class FilterWindow extends Overlay<FilterWindow> {
|
||||||
InputTextField btcNodesInputTextField = addInputTextField(gridPane, ++rowIndex, Res.get("filterWindow.btcNode"));
|
InputTextField btcNodesInputTextField = addInputTextField(gridPane, ++rowIndex, Res.get("filterWindow.btcNode"));
|
||||||
CheckBox preventPublicBtcNetworkCheckBox = addLabelCheckBox(gridPane, ++rowIndex, Res.get("filterWindow.preventPublicBtcNetwork"));
|
CheckBox preventPublicBtcNetworkCheckBox = addLabelCheckBox(gridPane, ++rowIndex, Res.get("filterWindow.preventPublicBtcNetwork"));
|
||||||
CheckBox disableDaoCheckBox = addLabelCheckBox(gridPane, ++rowIndex, Res.get("filterWindow.disableDao"));
|
CheckBox disableDaoCheckBox = addLabelCheckBox(gridPane, ++rowIndex, Res.get("filterWindow.disableDao"));
|
||||||
|
InputTextField disableDaoBelowVersionInputTextField = addInputTextField(gridPane, ++rowIndex, Res.get("filterWindow.disableDaoBelowVersion"));
|
||||||
|
|
||||||
final Filter filter = filterManager.getDevelopersFilter();
|
final Filter filter = filterManager.getDevelopersFilter();
|
||||||
if (filter != null) {
|
if (filter != null) {
|
||||||
|
@ -182,6 +183,7 @@ public class FilterWindow extends Overlay<FilterWindow> {
|
||||||
preventPublicBtcNetworkCheckBox.setSelected(filter.isPreventPublicBtcNetwork());
|
preventPublicBtcNetworkCheckBox.setSelected(filter.isPreventPublicBtcNetwork());
|
||||||
|
|
||||||
disableDaoCheckBox.setSelected(filter.isDisableDao());
|
disableDaoCheckBox.setSelected(filter.isDisableDao());
|
||||||
|
disableDaoBelowVersionInputTextField.setText(filter.getDisableDaoBelowVersion());
|
||||||
}
|
}
|
||||||
Button sendButton = new AutoTooltipButton(Res.get("filterWindow.add"));
|
Button sendButton = new AutoTooltipButton(Res.get("filterWindow.add"));
|
||||||
sendButton.setOnAction(e -> {
|
sendButton.setOnAction(e -> {
|
||||||
|
@ -267,7 +269,8 @@ public class FilterWindow extends Overlay<FilterWindow> {
|
||||||
priceRelayNodes,
|
priceRelayNodes,
|
||||||
preventPublicBtcNetworkCheckBox.isSelected(),
|
preventPublicBtcNetworkCheckBox.isSelected(),
|
||||||
btcNodes,
|
btcNodes,
|
||||||
disableDaoCheckBox.isSelected()),
|
disableDaoCheckBox.isSelected(),
|
||||||
|
disableDaoBelowVersionInputTextField.getText()),
|
||||||
keyInputTextField.getText()))
|
keyInputTextField.getText()))
|
||||||
hide();
|
hide();
|
||||||
else
|
else
|
||||||
|
|
|
@ -340,7 +340,7 @@ public class FormBuilder {
|
||||||
hyperlinkWithIcon.setOnAction(e -> GUIUtil.openWebPage(url));
|
hyperlinkWithIcon.setOnAction(e -> GUIUtil.openWebPage(url));
|
||||||
GridPane.setRowIndex(hyperlinkWithIcon, rowIndex);
|
GridPane.setRowIndex(hyperlinkWithIcon, rowIndex);
|
||||||
GridPane.setColumnIndex(hyperlinkWithIcon, 0);
|
GridPane.setColumnIndex(hyperlinkWithIcon, 0);
|
||||||
GridPane.setMargin(hyperlinkWithIcon, new Insets(top, 0, 0, -4));
|
GridPane.setMargin(hyperlinkWithIcon, new Insets(top, 0, 0, 0));
|
||||||
GridPane.setHalignment(hyperlinkWithIcon, HPos.LEFT);
|
GridPane.setHalignment(hyperlinkWithIcon, HPos.LEFT);
|
||||||
gridPane.getChildren().add(hyperlinkWithIcon);
|
gridPane.getChildren().add(hyperlinkWithIcon);
|
||||||
return hyperlinkWithIcon;
|
return hyperlinkWithIcon;
|
||||||
|
|
|
@ -751,6 +751,11 @@ public class GUIUtil {
|
||||||
log.warn("showNotReadyForTxBroadcastPopups called but no case matched. This should never happen if isReadyForTxBroadcast was called before.");
|
log.warn("showNotReadyForTxBroadcastPopups called but no case matched. This should never happen if isReadyForTxBroadcast was called before.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void showWantToBurnBTCPopup(Coin miningFee, Coin amount, BSFormatter btcFormatter) {
|
||||||
|
new Popup<>().warning(Res.get("popup.warning.burnBTC", btcFormatter.formatCoinWithCode(miningFee),
|
||||||
|
btcFormatter.formatCoinWithCode(amount))).show();
|
||||||
|
}
|
||||||
|
|
||||||
public static void requestFocus(Node node) {
|
public static void requestFocus(Node node) {
|
||||||
UserThread.execute(node::requestFocus);
|
UserThread.execute(node::requestFocus);
|
||||||
}
|
}
|
||||||
|
|
BIN
p2p/src/main/resources/AccountAgeWitnessStore_BTC_DAO_REGTEST
Normal file
BIN
p2p/src/main/resources/AccountAgeWitnessStore_BTC_DAO_REGTEST
Normal file
Binary file not shown.
Binary file not shown.
BIN
p2p/src/main/resources/BlindVoteStore_BTC_DAO_REGTEST
Normal file
BIN
p2p/src/main/resources/BlindVoteStore_BTC_DAO_REGTEST
Normal file
Binary file not shown.
BIN
p2p/src/main/resources/DaoStateStore_BTC_DAO_REGTEST
Normal file
BIN
p2p/src/main/resources/DaoStateStore_BTC_DAO_REGTEST
Normal file
Binary file not shown.
BIN
p2p/src/main/resources/ProposalStore_BTC_DAO_REGTEST
Normal file
BIN
p2p/src/main/resources/ProposalStore_BTC_DAO_REGTEST
Normal file
Binary file not shown.
BIN
p2p/src/main/resources/TempProposalStore_BTC_DAO_REGTEST
Normal file
BIN
p2p/src/main/resources/TempProposalStore_BTC_DAO_REGTEST
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1 +1 @@
|
||||||
0.9.7-SNAPSHOT
|
0.9.8-SNAPSHOT
|
||||||
|
|
|
@ -34,7 +34,7 @@ import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class SeedNodeMain extends ExecutableForAppWithP2p {
|
public class SeedNodeMain extends ExecutableForAppWithP2p {
|
||||||
private static final String VERSION = "0.9.7";
|
private static final String VERSION = "0.9.8";
|
||||||
private SeedNode seedNode;
|
private SeedNode seedNode;
|
||||||
|
|
||||||
public SeedNodeMain() {
|
public SeedNodeMain() {
|
||||||
|
|
Loading…
Add table
Reference in a new issue