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:
Manfred Karrer 2019-04-10 09:39:15 -05:00
commit 68436f5f85
No known key found for this signature in database
GPG key ID: 401250966A6B2C46
73 changed files with 763 additions and 403 deletions

View file

@ -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'

View file

@ -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);

View file

@ -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);
} }

View file

@ -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());

View file

@ -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

View file

@ -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);
} }

View file

@ -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;

View file

@ -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) {

View file

@ -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() {

View file

@ -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 {

View file

@ -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);
}
} }

View file

@ -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));
}
} }
} }

View file

@ -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

View file

@ -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;
} }

View file

@ -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());

View file

@ -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);
});
}
} }

View file

@ -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()) {

View file

@ -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);
} }

View file

@ -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()) {

View file

@ -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);
} }

View file

@ -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) {

View file

@ -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 \

View file

@ -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}.

View file

@ -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}.

View file

@ -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

View file

@ -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}.

View file

@ -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}.

View file

@ -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}.

View file

@ -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.

View file

@ -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}.

View file

@ -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}.

View file

@ -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}.

View file

@ -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}

View file

@ -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}.

View file

@ -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}.

View file

@ -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()));

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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>

View file

@ -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

View file

@ -2,7 +2,7 @@
cd ../../ cd ../../
version="0.9.7-SNAPSHOT" version="0.9.8-SNAPSHOT"
target_dir="releases/$version" target_dir="releases/$version"

View file

@ -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" \

View file

@ -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" \

View file

@ -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.

View file

@ -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..

View file

@ -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))

View file

@ -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;

View file

@ -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()) : "-";

View file

@ -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<>() {

View file

@ -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());
} }

View file

@ -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<>() {

View file

@ -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);
} }
} }

View file

@ -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)

View file

@ -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());
} }

View file

@ -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)

View file

@ -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);
} }

View file

@ -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;
}
} }

View file

@ -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("");
} }

View file

@ -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())

View file

@ -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

View file

@ -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;

View file

@ -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);
} }

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1 +1 @@
0.9.7-SNAPSHOT 0.9.8-SNAPSHOT

View file

@ -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() {