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 from: '../gradle/witness/gradle-witness.gradle'
version = '0.9.7-SNAPSHOT'
version = '0.9.8-SNAPSHOT'
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
// Therefore all sub versions start again with 1
// 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) {
return getSubVersion(version, 0);

View file

@ -162,16 +162,21 @@ public class FileManager<T extends PersistableEnvelope> {
}
}
public synchronized void removeAndBackupFile(String fileName) throws IOException {
File corruptedBackupDir = new File(Paths.get(dir.getAbsolutePath(), "backup_of_corrupted_data").toString());
public static void removeAndBackupFile(File dbDir, File storageFile, String fileName, String backupFolderName)
throws IOException {
File corruptedBackupDir = new File(Paths.get(dbDir.getAbsolutePath(), backupFolderName).toString());
if (!corruptedBackupDir.exists())
if (!corruptedBackupDir.mkdir())
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);
}
public synchronized void removeAndBackupFile(String fileName) throws IOException {
removeAndBackupFile(dir, storageFile, fileName, "backup_of_corrupted_data");
}
public synchronized void backupFile(String fileName, int numMaxBackupFiles) {
FileUtil.rollingBackup(dir, fileName, numMaxBackupFiles);
}

View file

@ -79,6 +79,13 @@ public class JsonFileManager {
printWriter = new PrintWriter(tempFile);
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);
} catch (Throwable t) {
log.error("storageFile " + jsonFile.toString());

View file

@ -528,6 +528,7 @@ message Filter {
bool prevent_public_btc_network = 12;
repeated string btc_nodes = 13;
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

View file

@ -68,6 +68,8 @@ public class BitcoinModule extends AppModule {
RegTestHost.HOST = regTestHost;
if (Arrays.asList("localhost", "127.0.0.1").contains(regTestHost)) {
bind(RegTestHost.class).toInstance(RegTestHost.LOCALHOST);
} else if ("none".equals(regTestHost)) {
bind(RegTestHost.class).toInstance(RegTestHost.NONE);
} else {
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) {
super("The transaction was not broadcasted in " + delay +
"seconds. txId=" + localTx.getHashAsString());
" seconds. txId=" + localTx.getHashAsString());
this.localTx = localTx;
this.delay = delay;
this.wallet = wallet;

View file

@ -72,7 +72,12 @@ public class TxBroadcaster {
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<>();
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.FilterManager;
import bisq.common.app.Version;
import javax.inject.Inject;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import javax.annotation.Nullable;
@Slf4j
public class DaoKillSwitch implements DaoSetupService {
private static DaoKillSwitch INSTANCE;
private final FilterManager filterManager;
@ -49,8 +55,19 @@ public class DaoKillSwitch implements DaoSetupService {
applyFilter(filterManager.getFilter());
}
private void applyFilter(Filter filter) {
daoDisabled = filter != null && filter.isDisableDao();
private void applyFilter(@Nullable Filter filter) {
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() {

View file

@ -95,8 +95,8 @@ public class BlindVoteConsensus {
return Encryption.encrypt(bytes, secretKey);
}
public static byte[] getHashOfEncryptedProposalList(byte[] encryptedProposalList) {
return Hash.getSha256Ripemd160hash(encryptedProposalList);
public static byte[] getHashOfEncryptedVotes(byte[] encryptedVotes) {
return Hash.getSha256Ripemd160hash(encryptedVotes);
}
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.governance.blindvote.storage.BlindVotePayload;
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.DaoStateService;
import bisq.core.dao.state.model.governance.DaoPhase;
import bisq.network.p2p.P2PService;
import bisq.network.p2p.storage.payload.PersistableNetworkPayload;
@ -48,6 +50,8 @@ import lombok.extern.slf4j.Slf4j;
public class BlindVoteListService implements AppendOnlyDataStoreListener, DaoStateListener, DaoSetupService {
private final DaoStateService daoStateService;
private final P2PService p2PService;
private final PeriodService periodService;
private final BlindVoteStorageService blindVoteStorageService;
private final BlindVoteValidator blindVoteValidator;
@Getter
private final ObservableList<BlindVotePayload> blindVotePayloads = FXCollections.observableArrayList();
@ -60,12 +64,15 @@ public class BlindVoteListService implements AppendOnlyDataStoreListener, DaoSta
@Inject
public BlindVoteListService(DaoStateService daoStateService,
P2PService p2PService,
PeriodService periodService,
BlindVoteStorageService blindVoteStorageService,
AppendOnlyDataStoreService appendOnlyDataStoreService,
BlindVoteValidator blindVoteValidator,
@Named(DaoOptionKeys.DAO_ACTIVATED) boolean daoActivated) {
this.daoStateService = daoStateService;
this.p2PService = p2PService;
this.periodService = periodService;
this.blindVoteStorageService = blindVoteStorageService;
this.blindVoteValidator = blindVoteValidator;
if (daoActivated)
@ -80,7 +87,6 @@ public class BlindVoteListService implements AppendOnlyDataStoreListener, DaoSta
@Override
public void addListeners() {
daoStateService.addDaoStateListener(this);
p2PService.getP2PDataStorage().addAppendOnlyDataStoreListener(this);
}
@Override
@ -93,9 +99,18 @@ public class BlindVoteListService implements AppendOnlyDataStoreListener, DaoSta
// 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
public void onParseBlockChainComplete() {
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() {
p2PService.getP2PDataStorage().getAppendOnlyDataStoreMap().values().forEach(e -> onAppendOnlyDataAdded(e, false));
blindVoteStorageService.getMap().values().forEach(e -> onAppendOnlyDataAdded(e, false));
}
private void onAppendOnlyDataAdded(PersistableNetworkPayload persistableNetworkPayload, boolean fromBroadcastMessage) {
@ -142,18 +157,30 @@ public class BlindVoteListService implements AppendOnlyDataStoreListener, DaoSta
if (!blindVotePayloads.contains(blindVotePayload)) {
BlindVote blindVote = blindVotePayload.getBlindVote();
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 (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 {
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.myProposalListService = myProposalListService;
numConnectedPeersListener = (observable, oldValue, newValue) -> rePublishMyBlindVoteOnceWellConnected();
numConnectedPeersListener = (observable, oldValue, newValue) -> maybeRePublishMyBlindVote();
}
@ -177,7 +177,7 @@ public class MyBlindVoteListService implements PersistedDataHost, DaoStateListen
@Override
public void onParseBlockChainComplete() {
rePublishMyBlindVoteOnceWellConnected();
maybeRePublishMyBlindVote();
}
@ -263,7 +263,7 @@ public class MyBlindVoteListService implements PersistedDataHost, DaoStateListen
private byte[] getOpReturnData(byte[] encryptedVotes) throws IOException {
// 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.
final byte[] hash = BlindVoteConsensus.getHashOfEncryptedProposalList(encryptedVotes);
final byte[] hash = BlindVoteConsensus.getHashOfEncryptedVotes(encryptedVotes);
log.info("Sha256Ripemd160 hash of encryptedVotes: " + Utilities.bytesAsHexString(hash));
return BlindVoteConsensus.getOpReturnData(hash);
}
@ -353,23 +353,31 @@ public class MyBlindVoteListService implements PersistedDataHost, DaoStateListen
return bsqWalletService.signTx(txWithBtcFee);
}
private void rePublishMyBlindVoteOnceWellConnected() {
// We republish at each startup at any block during the cycle. We filter anyway for valid blind votes
// of that cycle so it is 1 blind vote getting rebroadcast at each startup to my neighbors.
// Republishing only will have effect if the payload creation date is < 5 hours as other nodes would not
// accept payloads which are too old or are in future.
// Only payloads received from seed nodes would ignore that date check.
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));
private void maybeRePublishMyBlindVote() {
// We do not republish during vote reveal phase as peer would reject blindVote data to protect against
// late publishing attacks.
// This attack is only relevant during the vote reveal phase as there it could cause damage by disturbing the
// data view of the blind votes of the voter for creating the majority hash.
// To republish after the vote reveal phase still makes sense to reduce risk that some nodes have not received
// it and would need to request the data then in the vote result phase.
if (!periodService.isInPhase(daoStateService.getChainHeight(), DaoPhase.Phase.VOTE_REVEAL)) {
// We republish at each startup at any block during the cycle. We filter anyway for valid blind votes
// of that cycle so it is 1 blind vote getting rebroadcast at each startup to my neighbors.
// Republishing only will have effect if the payload creation date is < 5 hours as other nodes would not
// accept payloads which are too old or are in future.
// Only payloads received from seed nodes would ignore that date check.
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.
UserThread.execute(() -> p2PService.getNumConnectedPeers().removeListener(numConnectedPeersListener));
// We delay removal of listener as we call that inside listener itself.
UserThread.execute(() -> p2PService.getNumConnectedPeers().removeListener(numConnectedPeersListener));
}
}
}

View file

@ -52,7 +52,6 @@ import javax.annotation.concurrent.Immutable;
@EqualsAndHashCode
public final class BlindVotePayload implements PersistableNetworkPayload, PersistableEnvelope,
CapabilityRequiringPayload, ConsensusCritical {
private static final long TOLERANCE = TimeUnit.HOURS.toMillis(5); // +/- 5 hours
private final BlindVote blindVote;
protected final byte[] hash; // 20 byte

View file

@ -31,12 +31,18 @@ import java.io.File;
import java.util.Map;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class BlindVoteStorageService extends MapStoreService<BlindVoteStore, PersistableNetworkPayload> {
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
@ -64,7 +70,7 @@ public class BlindVoteStorageService extends MapStoreService<BlindVoteStore, Per
@Override
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()) {
log.warn("We found a local vote but don't have that vote in the data from the " +
"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 " +
"blind vote does not match. ballot={}, vote from blindVote data={}",
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.BlindVoteConsensus;
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.MyVoteListService;
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.common.UserThread;
import bisq.common.util.Utilities;
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
// next startup but the tx was actually broadcasted.
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
| InsufficientMoneyException e) {
voteRevealExceptions.add(new VoteRevealException("Exception at calling revealVote.",
@ -285,20 +277,4 @@ public class VoteRevealService implements DaoStateListener, DaoSetupService {
Transaction txWithBtcFee = btcWalletService.completePreparedVoteRevealTx(preparedTx, opReturnData);
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.network.Connection;
import bisq.network.p2p.seed.SeedNodeRepository;
import bisq.common.UserThread;
import bisq.common.crypto.Hash;
@ -49,6 +50,7 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Optional;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
@ -81,6 +83,7 @@ public class BlindVoteStateMonitoringService implements DaoSetupService, DaoStat
private final GenesisTxInfo genesisTxInfo;
private final PeriodService periodService;
private final BlindVoteListService blindVoteListService;
private final Set<String> seedNodeAddresses;
@Getter
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 List<Listener> listeners = new CopyOnWriteArrayList<>();
@Getter
private boolean isInConflict;
private boolean isInConflictWithNonSeedNode;
@Getter
private boolean isInConflictWithSeedNode;
private boolean parseBlockChainComplete;
@ -101,12 +106,16 @@ public class BlindVoteStateMonitoringService implements DaoSetupService, DaoStat
BlindVoteStateNetworkService blindVoteStateNetworkService,
GenesisTxInfo genesisTxInfo,
PeriodService periodService,
BlindVoteListService blindVoteListService) {
BlindVoteListService blindVoteListService,
SeedNodeRepository seedNodeRepository) {
this.daoStateService = daoStateService;
this.blindVoteStateNetworkService = blindVoteStateNetworkService;
this.genesisTxInfo = genesisTxInfo;
this.periodService = periodService;
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) {
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();
blindVoteStateBlockChain.stream()
.filter(e -> e.getHeight() == blindVoteStateHash.getHeight()).findAny()
@ -286,7 +296,12 @@ public class BlindVoteStateMonitoringService implements DaoSetupService, DaoStat
daoStateBlock.putInPeersMap(peersNodeAddressAsString, blindVoteStateHash);
if (!daoStateBlock.getMyStateHash().hasEqualHash(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 ")
.append(peersNodeAddressAsString)
.append(" which conflicts with our block hash.\n")
@ -298,11 +313,15 @@ public class BlindVoteStateMonitoringService implements DaoSetupService, DaoStat
changed.set(true);
});
this.isInConflict = isInConflict.get();
this.isInConflictWithNonSeedNode = inConflictWithNonSeedNode.get();
this.isInConflictWithSeedNode = inConflictWithSeedNode.get();
String conflictMsg = sb.toString();
if (this.isInConflict && !conflictMsg.isEmpty()) {
log.warn(conflictMsg);
if (!conflictMsg.isEmpty()) {
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()) {

View file

@ -33,6 +33,7 @@ import bisq.core.dao.state.model.governance.IssuanceType;
import bisq.network.p2p.NodeAddress;
import bisq.network.p2p.network.Connection;
import bisq.network.p2p.seed.SeedNodeRepository;
import bisq.common.UserThread;
import bisq.common.crypto.Hash;
@ -48,6 +49,7 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Optional;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
@ -83,6 +85,8 @@ public class DaoStateMonitoringService implements DaoSetupService, DaoStateListe
private final DaoStateService daoStateService;
private final DaoStateNetworkService daoStateNetworkService;
private final GenesisTxInfo genesisTxInfo;
private final Set<String> seedNodeAddresses;
@Getter
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 boolean parseBlockChainComplete;
@Getter
private boolean isInConflict;
private boolean isInConflictWithNonSeedNode;
@Getter
private boolean isInConflictWithSeedNode;
@Getter
private ObservableList<UtxoMismatch> utxoMismatches = FXCollections.observableArrayList();
@ -103,10 +109,14 @@ public class DaoStateMonitoringService implements DaoSetupService, DaoStateListe
@Inject
public DaoStateMonitoringService(DaoStateService daoStateService,
DaoStateNetworkService daoStateNetworkService,
GenesisTxInfo genesisTxInfo) {
GenesisTxInfo genesisTxInfo,
SeedNodeRepository seedNodeRepository) {
this.daoStateService = daoStateService;
this.daoStateNetworkService = daoStateNetworkService;
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) {
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();
daoStateBlockChain.stream()
.filter(e -> e.getHeight() == daoStateHash.getHeight()).findAny()
@ -293,7 +304,11 @@ public class DaoStateMonitoringService implements DaoSetupService, DaoStateListe
daoStateBlock.putInPeersMap(peersNodeAddressAsString, daoStateHash);
if (!daoStateBlock.getMyStateHash().hasEqualHash(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 ")
.append(peersNodeAddressAsString)
.append(" which conflicts with our block hash.\n")
@ -305,13 +320,18 @@ public class DaoStateMonitoringService implements DaoSetupService, DaoStateListe
changed.set(true);
});
this.isInConflict = isInConflict.get();
this.isInConflictWithNonSeedNode = inConflictWithNonSeedNode.get();
this.isInConflictWithSeedNode = inConflictWithSeedNode.get();
String conflictMsg = sb.toString();
if (this.isInConflict && !conflictMsg.isEmpty()) {
log.warn(conflictMsg);
if (!conflictMsg.isEmpty()) {
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()) {
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.network.Connection;
import bisq.network.p2p.seed.SeedNodeRepository;
import bisq.common.UserThread;
import bisq.common.crypto.Hash;
@ -49,6 +50,7 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Optional;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
@ -81,6 +83,8 @@ public class ProposalStateMonitoringService implements DaoSetupService, DaoState
private final GenesisTxInfo genesisTxInfo;
private final PeriodService periodService;
private final ProposalService proposalService;
private final Set<String> seedNodeAddresses;
@Getter
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 List<Listener> listeners = new CopyOnWriteArrayList<>();
@Getter
private boolean isInConflict;
private boolean isInConflictWithNonSeedNode;
@Getter
private boolean isInConflictWithSeedNode;
private boolean parseBlockChainComplete;
@ -101,12 +107,16 @@ public class ProposalStateMonitoringService implements DaoSetupService, DaoState
ProposalStateNetworkService proposalStateNetworkService,
GenesisTxInfo genesisTxInfo,
PeriodService periodService,
ProposalService proposalService) {
ProposalService proposalService,
SeedNodeRepository seedNodeRepository) {
this.daoStateService = daoStateService;
this.proposalStateNetworkService = proposalStateNetworkService;
this.genesisTxInfo = genesisTxInfo;
this.periodService = periodService;
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) {
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();
proposalStateBlockChain.stream()
.filter(e -> e.getHeight() == proposalStateHash.getHeight()).findAny()
@ -290,7 +301,11 @@ public class ProposalStateMonitoringService implements DaoSetupService, DaoState
daoStateBlock.putInPeersMap(peersNodeAddressAsString, proposalStateHash);
if (!daoStateBlock.getMyStateHash().hasEqualHash(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 ")
.append(peersNodeAddressAsString)
.append(" which conflicts with our block hash.\n")
@ -302,11 +317,15 @@ public class ProposalStateMonitoringService implements DaoSetupService, DaoState
changed.set(true);
});
this.isInConflict = isInConflict.get();
this.isInConflictWithNonSeedNode = inConflictWithNonSeedNode.get();
this.isInConflictWithSeedNode = inConflictWithSeedNode.get();
String conflictMsg = sb.toString();
if (this.isInConflict && !conflictMsg.isEmpty()) {
log.warn(conflictMsg);
if (!conflictMsg.isEmpty()) {
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()) {

View file

@ -28,8 +28,6 @@ import bisq.common.proto.persistable.PersistablePayload;
import io.bisq.generated.protobuffer.PB;
import java.math.BigInteger;
import java.util.Objects;
import java.util.UUID;
@ -104,8 +102,7 @@ public final class Role implements PersistablePayload, NetworkPayload, BondedAss
@Override
public byte[] getHash() {
// We use only the immutable data as input for hash
byte[] bytes = BigInteger.valueOf(hashCode()).toByteArray();
byte[] bytes = toProtoMessage().toByteArray();
return Hash.getSha256Ripemd160hash(bytes);
}

View file

@ -90,6 +90,10 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload {
// added in v0.9.4
private final boolean disableDao;
// added in v0.9.8
@Nullable
private final String disableDaoBelowVersion;
public Filter(List<String> bannedOfferIds,
List<String> bannedNodeAddress,
List<PaymentAccountFilter> bannedPaymentAccounts,
@ -100,7 +104,8 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload {
@Nullable List<String> priceRelayNodes,
boolean preventPublicBtcNetwork,
@Nullable List<String> btcNodes,
boolean disableDao) {
boolean disableDao,
@Nullable String disableDaoBelowVersion) {
this.bannedOfferIds = bannedOfferIds;
this.bannedNodeAddress = bannedNodeAddress;
this.bannedPaymentAccounts = bannedPaymentAccounts;
@ -112,6 +117,7 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload {
this.preventPublicBtcNetwork = preventPublicBtcNetwork;
this.btcNodes = btcNodes;
this.disableDao = disableDao;
this.disableDaoBelowVersion = disableDaoBelowVersion;
}
@ -131,6 +137,7 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload {
boolean preventPublicBtcNetwork,
@Nullable List<String> btcNodes,
boolean disableDao,
@Nullable String disableDaoBelowVersion,
String signatureAsBase64,
byte[] ownerPubKeyBytes,
@Nullable Map<String, String> extraDataMap) {
@ -144,7 +151,8 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload {
priceRelayNodes,
preventPublicBtcNetwork,
btcNodes,
disableDao);
disableDao,
disableDaoBelowVersion);
this.signatureAsBase64 = signatureAsBase64;
this.ownerPubKeyBytes = ownerPubKeyBytes;
this.extraDataMap = ExtraDataMapValidator.getValidatedExtraDataMap(extraDataMap);
@ -174,6 +182,7 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload {
Optional.ofNullable(seedNodes).ifPresent(builder::addAllSeedNodes);
Optional.ofNullable(priceRelayNodes).ifPresent(builder::addAllPriceRelayNodes);
Optional.ofNullable(btcNodes).ifPresent(builder::addAllBtcNodes);
Optional.ofNullable(disableDaoBelowVersion).ifPresent(builder::setDisableDaoBelowVersion);
Optional.ofNullable(extraDataMap).ifPresent(builder::putAllExtraData);
return PB.StoragePayload.newBuilder().setFilter(builder).build();
@ -193,6 +202,7 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload {
proto.getPreventPublicBtcNetwork(),
CollectionUtils.isEmpty(proto.getBtcNodesList()) ? null : new ArrayList<>(proto.getBtcNodesList()),
proto.getDisableDao(),
proto.getDisableDaoBelowVersion().isEmpty() ? null : proto.getDisableDaoBelowVersion(),
proto.getSignatureAsBase64(),
proto.getOwnerPubKeyBytes().toByteArray(),
CollectionUtils.isEmpty(proto.getExtraDataMap()) ? null : proto.getExtraDataMap());
@ -205,7 +215,7 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload {
@Override
public long getTTL() {
return TimeUnit.DAYS.toMillis(90);
return TimeUnit.DAYS.toMillis(180);
}
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.receivedFunds=Received funds
funds.tx.withdrawnFromWallet=Withdrawn from wallet
funds.tx.withdrawnFromBSQWallet=BTC withdrawn from BSQ wallet
funds.tx.noTxAvailable=No transactions available
funds.tx.revert=Revert
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.dao.resync.label=Rebuild DAO state from genesis tx
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.rpcUser=RPC username
setting.preferences.dao.rpcPw=RPC password
@ -1821,6 +1823,7 @@ dao.tx.type.enum.PROOF_OF_BURN=Proof of burn
# suppress inspection "UnusedProperty"
dao.tx.type.enum.IRREGULAR=Irregular
dao.tx.withdrawnFromWallet=BTC withdrawn from wallet
dao.tx.issuanceFromCompReq=Compensation request/issuance
dao.tx.issuanceFromCompReq.tooltip=Compensation request which led to an issuance of new BSQ.\n\
Issuance date: {0}
@ -1837,8 +1840,14 @@ dao.proposal.create.missingBsqFundsForBond=You don''t have sufficient BSQ funds
Missing: {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.\n\
All BSQ transactions require a miner fee in BTC.\n\
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.details={0} fee: {1}\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\
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\
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?
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.table.header.cycleBlockHeight=Cycle / block height
dao.monitor.table.cycleBlockHeight=Cycle {0} / block {1}
dao.monitor.table.seedPeers=Seed node: {0}
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.blockHeight=Block height
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.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.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.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.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.conflictTable.headline=Blind vote state hashes from peers in conflict
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.preventPublicBtcNetwork=Prevent usage of public Bitcoin network
filterWindow.disableDao=Disable DAO
filterWindow.disableDaoBelowVersion=Min. version required for DAO
filterWindow.add=Add 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.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 \

View file

@ -739,6 +739,7 @@ funds.tx.unknown=Unbekannter Grund: {0}
funds.tx.noFundsFromDispute=Keine Rückzahlung vom Konflikt
funds.tx.receivedFunds=Gelder erhalten
funds.tx.withdrawnFromWallet=Von Wallet abgehoben
funds.tx.withdrawnFromBSQWallet=BTC withdrawn from BSQ wallet
funds.tx.noTxAvailable=Keine Transaktionen verfügbar
funds.tx.revert=Umkehren
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"
dao.tx.type.enum.IRREGULAR=Irregulär
dao.tx.withdrawnFromWallet=BTC withdrawn from wallet
dao.tx.issuanceFromCompReq=Entlohnungsanfrage/ausgabe
dao.tx.issuanceFromCompReq.tooltip=Entlohnungsanfrage, die zur Ausgabe neuere BSQ führte.\nAusgabedatum: {0}
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.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.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.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
@ -1946,6 +1953,8 @@ popup.warning.nodeBanned=Einer der {0} Knoten wurde gebannt. Bitte starten Sie d
popup.warning.priceRelay=Preisrelais
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.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.volume={0} (ελάχιστο - μέγιστο)
offerbook.createOfferToBuy=Create new offer to buy {0}
offerbook.createOfferToSell=Create new offer to sell {0}
offerbook.createOfferToBuy.withFiat=Create new offer to buy {0} with {1}
offerbook.createOfferToSell.forFiat=Create new offer to sell {0} for {1}
offerbook.createOfferToBuy.withCrypto=Create new offer to sell {0} (buy {1})
offerbook.createOfferToSell.forCrypto=Create new offer to buy {0} (sell {1})
offerbook.createOfferToBuy=Δημιούργησε νέα προσφορά για αγορά {0}
offerbook.createOfferToSell=Δημιούργησε νέα προσφορά για πώληση {0}
offerbook.createOfferToBuy.withFiat=Δημιούργησε νέα προσφορά για αγορά {0} με {1}
offerbook.createOfferToSell.forFiat=Δημιούργησε νέα προσφορά για πώληση {0} με {1}
offerbook.createOfferToBuy.withCrypto=Δημιούργησε νέα προσφορά για πώληση {0} (αγορά {1})
offerbook.createOfferToSell.forCrypto=Δημιούργησε νέα προσφορά για αγορά {0} (πώληση {1})
offerbook.takeOfferButton.tooltip=Αποδοχή προσφοράς έναντι {0}
offerbook.yesCreateOffer=Ναι, δημιούργησε προσφορά
@ -355,7 +355,7 @@ offerbook.info.sellAboveMarketPrice=Θα λάβεις {0} περισσότερα
offerbook.info.buyBelowMarketPrice=Θα πληρώσεις {0} λιγότερα από την τρέχουσα τιμή (ενημερώνεται κάθε λεπτό).
offerbook.info.buyAtFixedPrice=Θα αγοράσεις σε αυτή την καθορισμένη τιμή.
offerbook.info.sellAtFixedPrice=Θα πουλήσεις σε αυτή την καθορισμένη τιμή.
offerbook.info.noArbitrationInUserLanguage=Σε περίπτωση διαφωνίας, παρακαλούμε να σημειώσετε ότι η διαιτησία για αυτή την προσφορά θα διεκπεραιωθεί στο {0}. Η γλώσσα είναι αυτήν τη στιγμή ρυθμισμένη στο {1}.\n
offerbook.info.noArbitrationInUserLanguage=Σε περίπτωση διαφωνίας, παρακαλούμε να σημειώσετε ότι η διαιτησία για αυτή την προσφορά θα διεκπεραιωθεί στα {0}. Η γλώσσα αυτή τη στιγμή είναι ρυθμισμένη σε {1}.\n
offerbook.info.roundedFiatVolume=Το ποσό στρογγυλοποιήθηκε για να αυξηθεί το απόρρητο της συναλλαγής σου.
####################################################################
@ -739,6 +739,7 @@ funds.tx.unknown=Άγνωστη αιτία: {0}
funds.tx.noFundsFromDispute=Καμί επιστροφή ποσού από τη διένεξη
funds.tx.receivedFunds=Ληφθέντα κεφάλαια
funds.tx.withdrawnFromWallet=Ανειλημμένα από το πορτοφόλι
funds.tx.withdrawnFromBSQWallet=BTC withdrawn from BSQ wallet
funds.tx.noTxAvailable=Δεν υπάρχουν διαθέσιμες συναλλαγές
funds.tx.revert=Revert
funds.tx.txSent=Η συναλλαγή απεστάλη επιτυχώς σε νέα διεύθυνση στο τοπικό πορτοφόλι Bisq.
@ -816,7 +817,7 @@ setting.preferences.txFeeTooLarge=Εισήγαγες υπέρογκη αξία (
setting.preferences.ignorePeers=Αγνόησε συναλλασσόμενους με διεύθυνση onion (για πολλαπλές εισαγωγές βάλε κόμμα ανάμεσα)
setting.preferences.refererId=Referral ID
setting.preferences.refererId.prompt=Optional referral ID
setting.preferences.currenciesInList=Νομίσματα στην λίστα τιμών αγοράς
setting.preferences.currenciesInList=Νομίσματα στη λίστα τιμών αγοράς
setting.preferences.prefCurrency=Προτιμώμενο νόμισμα
setting.preferences.displayFiat=Προβολή εθνικών νομισμάτων
setting.preferences.noFiat=Δεν επέλεξες εθνικό νόμισμα
@ -832,7 +833,7 @@ setting.preferences.sortWithNumOffers=Ταξινόμησε τους καταλό
setting.preferences.resetAllFlags=Επανάφερε όλες τις επισημάνσεις \"Να μην επανεμφανιστεί\"
setting.preferences.reset=Επαναφορά
settings.preferences.languageChange=Για αλλαγή γλώσσας σε όλα τα παράθυρα απαιτείται επανεκκίνηση.
settings.preferences.arbitrationLanguageWarning=Σε περίπτωση διαφωνίας, σημειώστε ότι η διαιτησία διεκπεραιώνεται στο {0}.
settings.preferences.arbitrationLanguageWarning=Σε περίπτωση διαφωνίας, σημειώστε ότι η διαιτησία διεκπεραιώνεται σε {0}.
settings.preferences.selectCurrencyNetwork=Διάλεξε δίκτυο
setting.preferences.daoOptions=Επιλογές DAO
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.settings.title=Ρυθμίσεις
account.notifications.useSound.label=Αναπαραγωγή ήχου ειδοποίησης στο τηλέφωνο
account.notifications.trade.label=Receive trade messages
account.notifications.market.label=Receive offer alerts
account.notifications.price.label=Receive price alerts
account.notifications.trade.label=Λήψη μηνυμάτων συναλλαγών
account.notifications.market.label=Λήψη ειδοποιήσεων προσφορών
account.notifications.price.label=Λήψη ειδοποιήσεων τιμών
account.notifications.priceAlert.title=Τιμές ειδοποίησης
account.notifications.priceAlert.high.label=Ειδοποίηση αν η τιμή BTC είναι μεγαλύτερη από
account.notifications.priceAlert.low.label=Ειδοποίηση αν η τιμή BTC είναι μικρότερη από
account.notifications.priceAlert.setButton=Καθόρισε τιμή ειδοποίησης
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.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.offer.message.title=Η προσφορά σου έγινε αποδεκτή
account.notifications.offer.message.msg=Η προσφορά σου με ταυτότητα {0} έγινε αποδεκτή
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.selectPaymentAccount=Offers matching payment account
account.notifications.marketAlert.offerType.label=Είδος προσφορών για τις οποίες ενδιαφέρομαι
account.notifications.marketAlert.offerType.buy=Προσφορές αγοράς (θέλω να πουλήσω 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.prompt=Percentage distance from market price (e.g. 2.50%, -0.50%, etc)
account.notifications.marketAlert.addButton=Add offer alert
account.notifications.marketAlert.trigger.prompt=Ποσοστιαία διαφορά από τιμή αγοράς (π.χ. 2.50%, -0.50%, κλπ)
account.notifications.marketAlert.addButton=Πρόσθεσε ειδοποίηση προσφοράς
account.notifications.marketAlert.manageAlertsButton=Διαχείριση ειδοποιήσεων προσφορών
account.notifications.marketAlert.manageAlerts.title=Διαχείριση ειδοποιήσεων προσφορών
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.trigger=Τιμή ενεργοποίησης
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.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}.
@ -1059,52 +1060,52 @@ account.notifications.priceAlert.warning.lowerPriceTooHigh=Η χαμηλότερ
dao.tab.factsAndFigures=Facts & Figures
dao.tab.bsqWallet=Πορτοφόλι BSQ
dao.tab.proposals=Governance
dao.tab.proposals=Διακυβέρνηση
dao.tab.bonding=Bonding
dao.tab.proofOfBurn=Asset listing fee/Proof of burn
dao.tab.monitor=Network monitor
dao.tab.news=News
dao.tab.monitor=Παρακολούθηση δικτύου
dao.tab.news=Νέα
dao.paidWithBsq=πληρώθηκε με BSQ
dao.availableBsqBalance=Available for spending (verified + unconfirmed change outputs)
dao.verifiedBsqBalance=Balance of all verified UTXOs
dao.unconfirmedChangeBalance=Balance of all unconfirmed change outputs
dao.unverifiedBsqBalance=Balance of all unverified transactions (awaiting block confirmation)
dao.lockedForVoteBalance=Used for voting
dao.lockedForVoteBalance=Χρησιμοποιημένα για ψηφοφορία
dao.lockedInBonds=Locked in bonds
dao.availableNonBsqBalance=Available non-BSQ balance (BTC)
dao.availableNonBsqBalance=Διαθέσιμο μη BSQ υπόλοιπο (BTC)
dao.totalBsqBalance=Συνολικό υπόλοιπο BSQ
dao.tx.published.success=Η συναλλαγή σου κοινοποιήθηκε επιτυχώς.
dao.proposal.menuItem.make=Κατάθεσε πρόταση
dao.proposal.menuItem.browse=Browse open proposals
dao.proposal.menuItem.browse=Περιήγηση ανοιχτών προτάσεων
dao.proposal.menuItem.vote=Ψήφιση προτάσεων
dao.proposal.menuItem.result=Αποτελέσματα ψηφοφορίας
dao.cycle.headline=Voting cycle
dao.cycle.overview.headline=Voting cycle overview
dao.cycle.currentPhase=Current phase
dao.cycle.currentBlockHeight=Current block height
dao.cycle.proposal=Proposal phase
dao.cycle.proposal.next=Next proposal phase
dao.cycle.blindVote=Blind vote phase
dao.cycle.voteReveal=Vote reveal phase
dao.cycle.headline=Κύκλος ψηφοφορίας
dao.cycle.overview.headline=Επισκόπηση κύκλος ψηφοφορίας
dao.cycle.currentPhase=Τρέχουσα φάση
dao.cycle.currentBlockHeight=Τρέχων ύψος block
dao.cycle.proposal=Φάση προτάσεων
dao.cycle.proposal.next=Επόμενη φάση προτάσεων
dao.cycle.blindVote=Φάση τυφλής ψήφου
dao.cycle.voteReveal=Φάση αποκάλυψης ψήφων
dao.cycle.voteResult=Αποτέλεσμα ψηφοφορίας
dao.cycle.phaseDuration={0} blocks (≈{1}); Block {2} - {3} (≈{4} - ≈{5})
dao.cycle.phaseDurationWithoutBlocks=Block {0} - {1} (≈{2} - ≈{3})
dao.voteReveal.txPublished.headLine=Vote reveal transaction published
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.headLine=Κοινοποίηση συναλλαγής αποκάλυψης ψήφου
dao.voteReveal.txPublished=Η συναλλαγή για την αποκάλυψη της ψήφου σου με ταυτότητα {0} κοινοποιήθηκε επιτυχώς.\n\nΑυτό συμβαίνει αυτομάτως μέσω του λογισμικού, εφόσον έχεις συμμετάσχει στην ψηφοφορία του DAO.
dao.results.cycles.header=Κύκλοι
dao.results.cycles.table.header.cycle=Κύκλος
dao.results.cycles.table.header.numProposals=Προτάσεις
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.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.details=Λεπτομέριες
dao.results.proposals.table.header.myVote=Η ψήφος μου
@ -1118,28 +1119,28 @@ dao.results.exceptions=Vote result exception(s)
dao.param.UNDEFINED=Ακαθόριστο
# suppress inspection "UnusedProperty"
dao.param.DEFAULT_MAKER_FEE_BSQ=BSQ maker fee
dao.param.DEFAULT_MAKER_FEE_BSQ=Προμήθεια δημιουργού προσφοράς BSQ
# suppress inspection "UnusedProperty"
dao.param.DEFAULT_TAKER_FEE_BSQ=BSQ taker fee
dao.param.DEFAULT_TAKER_FEE_BSQ=Προμήθεια αποδέκτη προσφοράς BSQ
# suppress inspection "UnusedProperty"
dao.param.MIN_MAKER_FEE_BSQ=Min. BSQ maker fee
dao.param.MIN_MAKER_FEE_BSQ=Ελάχιστη προμήθεια δημιουργού προσφοράς BSQ
# suppress inspection "UnusedProperty"
dao.param.MIN_TAKER_FEE_BSQ=Min. BSQ taker fee
dao.param.MIN_TAKER_FEE_BSQ=Ελάχιστη προμήθεια αποδέκτη προσφοράς BSQ
# suppress inspection "UnusedProperty"
dao.param.DEFAULT_MAKER_FEE_BTC=BTC maker fee
dao.param.DEFAULT_MAKER_FEE_BTC=Προμήθεια δημιουργού προσφοράς BTC
# 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"
dao.param.MIN_MAKER_FEE_BTC=Min. BTC maker fee
dao.param.MIN_MAKER_FEE_BTC=Ελάχιστη προμήθεια δημιουργού προσφοράς BTC
# 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"
dao.param.PROPOSAL_FEE=Proposal fee in BSQ
dao.param.PROPOSAL_FEE=Αμοιβή πρότασης σε BSQ
# suppress inspection "UnusedProperty"
dao.param.BLIND_VOTE_FEE=Voting fee in BSQ
dao.param.BLIND_VOTE_FEE=Αμοιβή ψήφου σε BSQ
# suppress inspection "UnusedProperty"
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
# suppress inspection "UnusedProperty"
dao.param.MAX_TRADE_LIMIT=Max. trade limit in BTC
dao.param.MAX_TRADE_LIMIT=Μέγιστο όριο συναλλαγής σε BTC
# suppress inspection "UnusedProperty"
dao.param.BONDED_ROLE_FACTOR=Bonded role unit factor in BSQ
# suppress inspection "UnusedProperty"
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.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"
dao.phase.PHASE_UNDEFINED=Ακαθόριστο
# suppress inspection "UnusedProperty"
dao.phase.PHASE_PROPOSAL=Proposal phase
dao.phase.PHASE_PROPOSAL=Φάση προτάσεων
# suppress inspection "UnusedProperty"
dao.phase.PHASE_BREAK1=Break 1
# suppress inspection "UnusedProperty"
dao.phase.PHASE_BLIND_VOTE=Blind vote phase
dao.phase.PHASE_BLIND_VOTE=Φάση τυφλής ψήφου
# suppress inspection "UnusedProperty"
dao.phase.PHASE_BREAK2=Break 2
# suppress inspection "UnusedProperty"
dao.phase.PHASE_VOTE_REVEAL=Vote reveal phase
dao.phase.PHASE_VOTE_REVEAL=Φάση αποκάλυψης ψήφων
# suppress inspection "UnusedProperty"
dao.phase.PHASE_BREAK3=Break 3
# suppress inspection "UnusedProperty"
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.merit=Earned
dao.results.votes.table.header.vote=Ψήφισε
@ -1393,34 +1394,34 @@ dao.proofOfBurn.txs=Συναλλαγές
dao.proofOfBurn.pubKey=Pubkey
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.copySig=Copy signature to clipboard
dao.proofOfBurn.sign=Sign
dao.proofOfBurn.message=Message
dao.proofOfBurn.sig=Signature
dao.proofOfBurn.verify=Verify
dao.proofOfBurn.copySig=Αντιγραφή υπογραφής στο πρόχειρο
dao.proofOfBurn.sign=Υπόγραψε
dao.proofOfBurn.message=Μήνυμα
dao.proofOfBurn.sig=Υπογραφή
dao.proofOfBurn.verify=Επαλήθευση
dao.proofOfBurn.verify.header=Verify message with key from proof of burn transaction
dao.proofOfBurn.verificationResult.ok=Verification succeeded
dao.proofOfBurn.verificationResult.failed=Verification failed
dao.proofOfBurn.verificationResult.ok=Επιτυχία επαλήθευσης
dao.proofOfBurn.verificationResult.failed=Αποτυχία επαλήθευσης
# suppress inspection "UnusedProperty"
dao.phase.UNDEFINED=Ακαθόριστο
# suppress inspection "UnusedProperty"
dao.phase.PROPOSAL=Proposal phase
dao.phase.PROPOSAL=Φάση προτάσεων
# suppress inspection "UnusedProperty"
dao.phase.BREAK1=Break before blind vote phase
# suppress inspection "UnusedProperty"
dao.phase.BLIND_VOTE=Blind vote phase
dao.phase.BLIND_VOTE=Φάση τυφλής ψήφου
# suppress inspection "UnusedProperty"
dao.phase.BREAK2=Break before vote reveal phase
# suppress inspection "UnusedProperty"
dao.phase.VOTE_REVEAL=Vote reveal phase
dao.phase.VOTE_REVEAL=Φάση αποκάλυψης ψήφων
# suppress inspection "UnusedProperty"
dao.phase.BREAK3=Break before result phase
# suppress inspection "UnusedProperty"
dao.phase.RESULT=Vote result phase
# suppress inspection "UnusedProperty"
dao.phase.separatedPhaseBar.PROPOSAL=Proposal phase
dao.phase.separatedPhaseBar.PROPOSAL=Φάση προτάσεων
# suppress inspection "UnusedProperty"
dao.phase.separatedPhaseBar.BLIND_VOTE=Blind vote
# suppress inspection "UnusedProperty"
@ -1454,9 +1455,9 @@ dao.proposal.type.short.REIMBURSEMENT_REQUEST=Αίτημα αποζημίωση
# suppress inspection "UnusedProperty"
dao.proposal.type.short.BONDED_ROLE=Bonded role
# suppress inspection "UnusedProperty"
dao.proposal.type.short.REMOVE_ASSET=Removing an altcoin
dao.proposal.type.short.REMOVE_ASSET=Απόσυρση κρυπτονομίσματος
# suppress inspection "UnusedProperty"
dao.proposal.type.short.CHANGE_PARAM=Changing a parameter
dao.proposal.type.short.CHANGE_PARAM=Αλλαγή παραμέτρου
# suppress inspection "UnusedProperty"
dao.proposal.type.short.GENERIC=Γενική πρόταση
# suppress inspection "UnusedProperty"
@ -1464,14 +1465,14 @@ dao.proposal.type.short.CONFISCATE_BOND=Confiscating a bond
dao.proposal.details=Λεπτομέρειες πρότασης
dao.proposal.selectedProposal=Επιλεγμένη πρόταση
dao.proposal.active.header=Proposals of current cycle
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.doRemove=Yes, remove my proposal
dao.proposal.active.header=Προτάσεις τρέχοντος κύκλου
dao.proposal.active.remove.confirm=Σίγουρα θέλεις να αποσύρεις την πρόταση;\nΘα χάσεις την ήδη πληρωμένη αμοιβή πρότασης.
dao.proposal.active.remove.doRemove=Ναι, απόσυρε την πρότασή μου
dao.proposal.active.remove.failed=Δεν ήταν δυνατή η απόσυρση της πρότασης.
dao.proposal.myVote.title=Ψηφοφορία
dao.proposal.myVote.accept=Αποδοχή πρότασης
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.stake=Vote weight from stake
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.new=Κατάθεση νέας πρότασης
dao.proposal.create.button=Κατάθεσε πρόταση
dao.proposal.create.publish=Publish proposal
dao.proposal.create.publishing=Proposal publishing is in progress ...
dao.proposal.create.publish=Κοινοποίηση πρότασης
dao.proposal.create.publishing=Κοινοποίηση πρότασης σε εξέλιξη...
dao.proposal=πρόταση
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.prompt=Link to GitHub issue
dao.proposal.display.requestedBsq=Requested amount in BSQ
dao.proposal.display.bsqAddress=BSQ address
dao.proposal.display.txId=Proposal transaction ID
dao.proposal.display.proposalFee=Proposal fee
dao.proposal.display.link.prompt=Σύνδεσμος με θέμα στο GitHub
dao.proposal.display.requestedBsq=Αιτούμενο ποσό σε BSQ
dao.proposal.display.bsqAddress=Διεύθυνση BSQ
dao.proposal.display.txId=Ταυτότητα πρότασης
dao.proposal.display.proposalFee=Αμοιβή πρότασης
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.requiredBondForRole.label=Required bond for role
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.myVote=Η ψήφος μου
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.display.myVote.accepted=Accepted
dao.proposal.display.myVote.rejected=Rejected
dao.proposal.display.myVote.ignored=Ignored
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.failed=Rejected
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.paramValue=Parameter value
dao.proposal.display.paramComboBox.label=Επίλεξε παράμετρο προς μετατροπή
dao.proposal.display.paramValue=Τιμή παραμέτρου
dao.proposal.display.confiscateBondComboBox.label=Choose bond
dao.proposal.display.assetComboBox.label=Asset to remove
@ -1534,14 +1535,14 @@ dao.wallet.menuItem.send=Αποστολή
dao.wallet.menuItem.receive=Λήψη
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.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.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.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.
@ -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.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.setAmount=Όρισε ποσό ανάληψης (ελάχιστο ποσό {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.setDestinationAddress=Συμπλήρωσε τη διεύθυνση προορισμού
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.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.tx.type=Τύπος
@ -1603,6 +1604,7 @@ dao.tx.type.enum.PROOF_OF_BURN=Proof of burn
# suppress inspection "UnusedProperty"
dao.tx.type.enum.IRREGULAR=Irregular
dao.tx.withdrawnFromWallet=BTC withdrawn from wallet
dao.tx.issuanceFromCompReq=Αίτημα/έκδοση αποζημίωσης
dao.tx.issuanceFromCompReq.tooltip=Αίτημα αποζημίωσης το οποίο οδήγησε σε έκδοση νέων BSQ.\nΗμερομηνία έκδοσης: {0}
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.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.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.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
@ -1641,7 +1648,7 @@ dao.monitor.proposals=Proposals state
dao.monitor.blindVotes=Blind votes state
dao.monitor.table.peers=Peers
dao.monitor.table.conflicts=Conflicts
dao.monitor.table.conflicts=Διενέξεις
dao.monitor.state=Κατάσταση
dao.monitor.requestAlHashes=Request all hashes
dao.monitor.resync=Resync DAO state
@ -1946,6 +1953,8 @@ popup.warning.nodeBanned=Ένας από τους κόμβους {0} απαγο
popup.warning.priceRelay=αναμετάδοση τιμής
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.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.volume={0} (min - max)
offerbook.createOfferToBuy=Create new offer to buy {0}
offerbook.createOfferToSell=Create new offer to sell {0}
offerbook.createOfferToBuy.withFiat=Create new offer to buy {0} with {1}
offerbook.createOfferToSell.forFiat=Create new offer to sell {0} for {1}
offerbook.createOfferToBuy.withCrypto=Create new offer to sell {0} (buy {1})
offerbook.createOfferToSell.forCrypto=Create new offer to buy {0} (sell {1})
offerbook.createOfferToBuy=Crear nueva oferta para comprar {0}
offerbook.createOfferToSell=Crear nueva oferta para vender {0}
offerbook.createOfferToBuy.withFiat=Crear nueva oferta para comprar {0} con {1}
offerbook.createOfferToSell.forFiat=Crear nueva oferta para vender {0} por {1}
offerbook.createOfferToBuy.withCrypto=Crear nueva oferta para vender {0} (comprar {1})
offerbook.createOfferToSell.forCrypto=Crear nueva oferta para comprar {0} (vender {1})
offerbook.takeOfferButton.tooltip=Tomar oferta {0}
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.receivedFunds=Fondos recibidos
funds.tx.withdrawnFromWallet=Retirar desde el monedero
funds.tx.withdrawnFromBSQWallet=BTC retirados desde el monedero BSQ
funds.tx.noTxAvailable=Sin transacciones disponibles
funds.tx.revert=Revertir
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.tab.factsAndFigures=Facts & Figures
dao.tab.factsAndFigures=Hechos y figuras
dao.tab.bsqWallet=Monedero BSQ
dao.tab.proposals=Gobernancia
dao.tab.bonding=Obligaciones
@ -1199,7 +1200,7 @@ dao.param.MAX_TRADE_LIMIT=Límite máximo de intercambio en BTC
# suppress inspection "UnusedProperty"
dao.param.BONDED_ROLE_FACTOR=Unidad de factor de rol bonificado en BSQ
# 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.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.stake=Peso de voto desde stake
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.votes.header=Set stake for voting and publish your votes
dao.proposal.myVote.button=Publish votes
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.stake.prompt=Cantidad máxima disponible para votaciones: {0}
dao.proposal.votes.header=Establecer cantidad para votaciones y publicar sus votos
dao.proposal.myVote.button=Publicar votos
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.phase.inactive=Por favor espere a la próxima fase 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"
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.tooltip=Solicitud de compensación que lleva a emitir nuevos BSQ.\nFecha de emisión: {0}
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.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.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.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.
@ -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.prev=Hash previo
dao.monitor.daoState.conflictTable.headline=Estado de hashes DAO desde pares en conflicto
dao.monitor.daoState.utxoConflicts=UTXO conflicts
dao.monitor.daoState.utxoConflicts.blockHeight=Block height: {0}
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=conflictos UTXO
dao.monitor.daoState.utxoConflicts.blockHeight=Altura de bloque: {0}
dao.monitor.daoState.utxoConflicts.sumUtxo=Suma de todas las UTXO: {0} BSQ
dao.monitor.daoState.utxoConflicts.sumBsq=Suma de todlas las BSQ: {0} BSQ
dao.monitor.proposal.headline=Estado de propuestas
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.numBlindVotes=Número de votos a ciegas
dao.factsAndFigures.menuItem.supply=BSQ Supply
dao.factsAndFigures.menuItem.transactions=BSQ Transactions
dao.factsAndFigures.menuItem.supply=Oferta BSQ
dao.factsAndFigures.menuItem.transactions=Transacciones BSQ
dao.factsAndFigures.dashboard.marketPrice=Datos de mercad
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.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.compRequestIssueAmount=BSQ emitidos para solicitudes de compensación
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.totalLockedUpAmount=Bloqueados en obligaciones
dao.factsAndFigures.supply.totalUnlockingAmount=Desbloqueando BSQ de bonos
dao.factsAndFigures.supply.totalUnlockedAmount=BSQ desbloqueados 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.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.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.invalidTx=No. of all invalid transactions
dao.factsAndFigures.transactions.irregularTx=No. of all irregular transactions
dao.factsAndFigures.transactions.invalidTx=Número de todas las transacciones inválidas
dao.factsAndFigures.transactions.irregularTx=Número de todas las transacciones irregulares
####################################################################
# 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.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.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"
BTC_REGTEST=Regtest Bitcoin
# suppress inspection "UnusedProperty"
BTC_DAO_TESTNET=Bitcoin DAO Testnet (deprecated)
BTC_DAO_TESTNET=Testnet de Bitcoin DAO (depreciada)
# suppress inspection "UnusedProperty"
BTC_DAO_BETANET=Bitcoin DAO Betanet (Bitcoin Mainnet)
# suppress inspection "UnusedProperty"
BTC_DAO_REGTEST=Bitcoin DAO Regtest
BTC_DAO_REGTEST=Regtest de Bitcoin DAO
time.year=Año
time.month=Mes

View file

@ -739,6 +739,7 @@ funds.tx.unknown=دلیل ناشناخته: {0}
funds.tx.noFundsFromDispute=عدم بازپرداخت از مناقشه
funds.tx.receivedFunds=وجوه دریافت شده
funds.tx.withdrawnFromWallet=برداشت شده از کیف پول
funds.tx.withdrawnFromBSQWallet=BTC withdrawn from BSQ wallet
funds.tx.noTxAvailable=هیچ تراکنشی موجود نیست
funds.tx.revert=عودت
funds.tx.txSent=تراکنش به طور موفقیت آمیز به یک آدرس جدید در کیف پول محلی Bisq ارسال شد.
@ -1603,6 +1604,7 @@ dao.tx.type.enum.PROOF_OF_BURN=اثبات امحا
# suppress inspection "UnusedProperty"
dao.tx.type.enum.IRREGULAR=Irregular
dao.tx.withdrawnFromWallet=BTC withdrawn from wallet
dao.tx.issuanceFromCompReq=درخواست/صدور خسارت
dao.tx.issuanceFromCompReq.tooltip=درخواست خسارت که منجر به صدور BSQ جدید می‌شود.\nتاریخ صدور: {0}
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.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.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.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
@ -1946,6 +1953,8 @@ popup.warning.nodeBanned=یکی از گره های {0} مسدود شده است.
popup.warning.priceRelay=رله قیمت
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.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.receivedFunds=Fonds reçus
funds.tx.withdrawnFromWallet=Retiré depuis le portefeuille
funds.tx.withdrawnFromBSQWallet=BTC withdrawn from BSQ wallet
funds.tx.noTxAvailable=Aucune transaction disponible
funds.tx.revert=Défaire
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"
dao.tx.type.enum.IRREGULAR=Irregular
dao.tx.withdrawnFromWallet=BTC withdrawn from wallet
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.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.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.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.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
@ -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.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.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.receivedFunds=Pénz részesedések
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.revert=Visszaszállás
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"
dao.tx.type.enum.IRREGULAR=Irregular
dao.tx.withdrawnFromWallet=BTC withdrawn from wallet
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.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.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.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.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
@ -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.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.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.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.msg.part2=Perguntas ou outros problemas? Discuta com os usuários e contribuidores do Bisq no 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.receivedFunds=Fundos recebidos
funds.tx.withdrawnFromWallet=Levantado da carteira
funds.tx.withdrawnFromBSQWallet=BTC levantado da carteira BSQ
funds.tx.noTxAvailable=Sem transações disponíveis
funds.tx.revert=Reverter
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
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.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.isDaoFullNode=Executar Bisq como nó completo OAD
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.ok=Abrir página de documentos
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.inbound=entrante
settings.net.outbound=sainte
settings.net.reSyncSPVChainLabel=Resincronizar corrente SPV
settings.net.reSyncSPVChainButton=Remover ficheiro SPV e resincronizar
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.reSyncSPVAfterRestart=O ficheiro da corrente SPV foi apagado. Por favor, seja paciente. Pode demorar um pouco para ressincronizar com a rede.
settings.net.reSyncSPVChainLabel=Re-sincronizar corrente SPV
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 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 re-sincronizar com a rede.
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}
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.account=Conta
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.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.backup=Backup
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.directoryNotAccessible=O diretório escolhido não é acessível. {0}
account.password.removePw.button=Remover palavra-passe
account.password.removePw.headline=Remover proteção com palavra-passe da carteira
account.password.setPw.button=Definir palavra-passe
account.password.setPw.headline=Definir proteção de palavra-passe 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.removePw.button=Remover senha
account.password.removePw.headline=Remover proteção com senha da carteira
account.password.setPw.button=Definir senha
account.password.setPw.headline=Definir proteção de senha da carteira
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.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.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.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.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.result=Resultado da 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=proposta
dao.proposal.display.type=Tipo de proposta
dao.proposal.display.name=Nome/apelido
dao.proposal.display.link=Link para detallhes
dao.proposal.display.name=Nome/alcunha
dao.proposal.display.link=Link para detalhes
dao.proposal.display.link.prompt=Link para Github issue
dao.proposal.display.requestedBsq=Quantia requerida em 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.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.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.button=Como executar a OAD do Bisq na nossa 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 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.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"
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.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
@ -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.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.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.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
@ -1625,9 +1632,9 @@ dao.news.pastContribution.yourAddress=O seu endereço da carteira BSQ
dao.news.pastContribution.requestNow=Solicitar agora
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.firstSection.title=1. Mudar para Modo Rede de teses da OAD
dao.news.DAOOnTestnet.firstSection.content=Mude para a Rede de testes da OAD no painel de Definições
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 Testnet da OAD
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.content=Solicite BSQ no Slack ou Compre BSQ no Bisq
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.state=Estado
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.cycleBlockHeight=Ciclo {0} / bloco {1}
@ -1753,7 +1760,7 @@ disputeSummaryWindow.evidence=Evidência
disputeSummaryWindow.evidence.tamperProof=Evidência à prova de adulteração
disputeSummaryWindow.evidence.id=Verificação de ID
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.getsAll={0} BTC fica com tudo
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.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.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.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.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.
@ -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.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.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.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.
@ -2111,17 +2120,17 @@ formatter.asTaker={0} {1} como aceitador
# we use enum values here
# dynamic values are not recognized by IntelliJ
# suppress inspection "UnusedProperty"
BTC_MAINNET=Rede principal de Bitcoin
BTC_MAINNET=Mainnet de Bitcoin
# suppress inspection "UnusedProperty"
BTC_TESTNET=Rede de testes de Bitcoin
BTC_TESTNET=Testnet de Bitcoin
# suppress inspection "UnusedProperty"
BTC_REGTEST=Regtest Bitcoin
# suppress inspection "UnusedProperty"
BTC_DAO_TESTNET=Bitcoin DAO Testnet (deprecated)
BTC_DAO_TESTNET=Testnet da OAD do Bitcoin (discontinuada)
# 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"
BTC_DAO_REGTEST=Bitcoin DAO Regtest
BTC_DAO_REGTEST=Regtest da OAD do Bitcoin
time.year=Ano
time.month=Mês
@ -2139,17 +2148,17 @@ time.minutes=minutos
time.seconds=segundos
password.enterPassword=Inserir palavra-passe
password.confirmPassword=Confirmar palavra-passe
password.tooLong=A palavra-passe deve ter menos de 500 caracteres.
password.deriveKey=Derivar chave a partir da palavra-passe
password.walletDecrypted=A carteira foi descriptografada com sucesso e a proteção por palavra-passe 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.walletEncrypted=Carteira encriptada com sucesso e proteção por palavra-passe 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.passwordsDoNotMatch=As 2 palavras-passe inseridas não são iguais.
password.forgotPassword=Esqueceu a palavra-passe?
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.enterPassword=Inserir senha
password.confirmPassword=Confirmar senha
password.tooLong=A senha deve ter menos de 500 caracteres.
password.deriveKey=Derivar chave a partir da senha
password.walletDecrypted=A carteira foi descriptografada com sucesso e a proteção por senha removida.
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 senha ativada.
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 senhas inseridas não são iguais.
password.forgotPassword=Esqueceu a senha?
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
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.restore=Eu desejo restaurar de qualquer forma
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.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.email.mobile=Email ou nº de telemóvel
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=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.popmoney.accountId=Email ou nº de telemóvel
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.supportedCurrencies=Moedas suportadas
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.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.passwordTooLong=A palavra-passe inserida é muito longa. Não pode ser maior do que 50 caracteres.
validation.passwordTooShort=A senha inserida é muito curta. É necessário conter no mínimo 8 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.sortCodeChars={0} deve consistir de {1} caracteres.
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.receivedFunds=Fonduri încasate
funds.tx.withdrawnFromWallet=Retras din portofel
funds.tx.withdrawnFromBSQWallet=BTC withdrawn from BSQ wallet
funds.tx.noTxAvailable=Nicio tranzacție disponibilă
funds.tx.revert=Revenire
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"
dao.tx.type.enum.IRREGULAR=Irregular
dao.tx.withdrawnFromWallet=BTC withdrawn from wallet
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.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.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.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.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
@ -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.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.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.receivedFunds=Полученные средства
funds.tx.withdrawnFromWallet=Выведено из кошелька
funds.tx.withdrawnFromBSQWallet=BTC withdrawn from BSQ wallet
funds.tx.noTxAvailable=Транзакции недоступны
funds.tx.revert=Возвратить
funds.tx.txSent=Транзакция успешно отправлена на новый адрес локального кошелька Bisq.
@ -1603,6 +1604,7 @@ dao.tx.type.enum.PROOF_OF_BURN=Proof of burn
# suppress inspection "UnusedProperty"
dao.tx.type.enum.IRREGULAR=Irregular
dao.tx.withdrawnFromWallet=BTC withdrawn from wallet
dao.tx.issuanceFromCompReq=Запрос/выдача компенсации
dao.tx.issuanceFromCompReq.tooltip=Запрос компенсации, который привел к выпуску новых BSQ.\nДата выпуска: {0}
dao.tx.issuanceFromReimbursement=Запрос/выдача возмещения
@ -1611,10 +1613,15 @@ dao.proposal.create.missingBsqFunds=У Вас недостаточно сред
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.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.description=Подобно тому, как обменник Bisq децентрализован и защищён от цензуры, так и в его способе управления Bisq DAО и токен BSQ позволяют это осуществить.
dao.news.bisqDAO.readMoreLink=Подробнее о Bisq DAO
@ -1946,6 +1953,8 @@ popup.warning.nodeBanned=Один из узлов {0} был запрещен/з
popup.warning.priceRelay=ретранслятор курса
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.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.receivedFunds=Primljena sredstva
funds.tx.withdrawnFromWallet=Podignuto iz novčanika
funds.tx.withdrawnFromBSQWallet=BTC withdrawn from BSQ wallet
funds.tx.noTxAvailable=Nema dostupnih transakcija
funds.tx.revert=Vrati
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"
dao.tx.type.enum.IRREGULAR=Irregular
dao.tx.withdrawnFromWallet=BTC withdrawn from wallet
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.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.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.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.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
@ -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.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.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.receivedFunds=เงินที่ได้รับ
funds.tx.withdrawnFromWallet=ถอนออกจาก wallet
funds.tx.withdrawnFromBSQWallet=BTC withdrawn from BSQ wallet
funds.tx.noTxAvailable=ไม่มีธุรกรรมใด ๆ
funds.tx.revert=กลับสู่สภาพเดิม
funds.tx.txSent=ธุรกรรมถูกส่งสำเร็จไปยังที่อยู่ใหม่ใน Bisq wallet ท้องถิ่นแล้ว
@ -1603,6 +1604,7 @@ dao.tx.type.enum.PROOF_OF_BURN=การพิสูจน์หลักฐา
# suppress inspection "UnusedProperty"
dao.tx.type.enum.IRREGULAR=Irregular
dao.tx.withdrawnFromWallet=BTC withdrawn from wallet
dao.tx.issuanceFromCompReq=คำขอหรือการออกค่าสินไหมทดแทน
dao.tx.issuanceFromCompReq.tooltip=คำขอค่าสินไหมทดแทน ซึ่งนำไปสู่การออก BSQ ใหม่\nวันที่ออก: {0}
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.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.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.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
@ -1946,6 +1953,8 @@ popup.warning.nodeBanned=หนึ่งใน {0} โหนดถูกแบ
popup.warning.priceRelay=ราคาผลัดเปลี่ยน
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.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.receivedFunds=Vốn đã nhận
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.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ộ.
@ -1603,6 +1604,7 @@ dao.tx.type.enum.PROOF_OF_BURN=Bằng chứng đốt
# suppress inspection "UnusedProperty"
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.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
@ -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.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.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.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
@ -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.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.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.receivedFunds=收到的资金:
funds.tx.withdrawnFromWallet=从钱包提现
funds.tx.withdrawnFromBSQWallet=BTC withdrawn from BSQ wallet
funds.tx.noTxAvailable=没有可用交易
funds.tx.revert=还原
funds.tx.txSent=交易成功发送到本地Bisq钱包中的新地址。
@ -1603,6 +1604,7 @@ dao.tx.type.enum.PROOF_OF_BURN=Proof of burn
# suppress inspection "UnusedProperty"
dao.tx.type.enum.IRREGULAR=Irregular
dao.tx.withdrawnFromWallet=BTC withdrawn from wallet
dao.tx.issuanceFromCompReq=补偿请求/发行
dao.tx.issuanceFromCompReq.tooltip=导致新BSQ发行的补偿请求\n发行日期: {0}
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.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.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.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
@ -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.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.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.setDevelopersFilter(new Filter(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.setRegisteredMediator(MediatorTest.getMediatorMock());
vo.setAcceptedArbitrators(Lists.newArrayList(ArbitratorTest.getArbitratorMock()));

View file

@ -8,7 +8,7 @@
# pull base image
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/* &&
apt-get install -y vim fakeroot

View file

@ -6,7 +6,7 @@
# - Update version below
# - 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 [ -d "/usr/lib/jvm/jdk-10.0.2" ]; then
JAVA_HOME=/usr/lib/jvm/jdk-10.0.2

View file

@ -4,7 +4,7 @@
# Prior to running this script:
# - Update version below
version=0.9.7-SNAPSHOT
version=0.9.8-SNAPSHOT
base_dir=$( cd "$(dirname "$0")" ; pwd -P )/../../..
package_dir=$base_dir/desktop/package
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 -->
<key>CFBundleVersion</key>
<string>0.9.7</string>
<string>0.9.8</string>
<key>CFBundleShortVersionString</key>
<string>0.9.7</string>
<string>0.9.8</string>
<key>CFBundleExecutable</key>
<string>Bisq</string>

View file

@ -6,7 +6,7 @@ mkdir -p deploy
set -e
version="0.9.7-SNAPSHOT"
version="0.9.8-SNAPSHOT"
cd ..
./gradlew :desktop:build -x test shadowJar

View file

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

View file

@ -2,7 +2,7 @@
cd $(dirname $0)/../../../
version=0.9.7
version=0.9.8
find . -type f \( -name "finalize.sh" \
-o -name "create_app.sh" \

View file

@ -2,8 +2,8 @@
cd $(dirname $0)/../../../
oldVersion=0.9.6
newVersion=0.9.7
oldVersion=0.9.7
newVersion=0.9.8
find . -type f \( -name "finalize.sh" \
-o -name "create_app.sh" \

View file

@ -8,7 +8,7 @@
@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 "%ProgramFiles%\Java\jdk-10.0.2" (
echo Javapackager not found. Update JAVA_HOME variable to point to OracleJDK.

View file

@ -6,7 +6,7 @@
@echo off
set version=0.9.7-SNAPSHOT
set version=0.9.8-SNAPSHOT
set release_dir=%~dp0..\..\..\releases\%version%
set package_dir=%~dp0..

View file

@ -119,7 +119,7 @@ public class BondingViewUtils {
duration,
formatter.formatCoinWithCode(miningFee),
CoinUtil.getFeePerByte(miningFee, txSize),
txSize
txSize / 1000d
))
.actionButtonText(Res.get("shared.yes"))
.onAction(() -> publishLockupTx(lockupAmount, lockupTime, lockupReason, hash, resultHandler))
@ -180,7 +180,7 @@ public class BondingViewUtils {
duration,
formatter.formatCoinWithCode(miningFee),
CoinUtil.getFeePerByte(miningFee, txSize),
txSize
txSize / 1000d
))
.actionButtonText(Res.get("shared.yes"))
.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",
bsqFormatter.formatCoinWithCode(e.missing))).show();
} else {
new Popup<>().warning(Res.get("dao.proposal.create.missingMinerFeeFunds",
btcFormatter.formatCoinWithCode(e.missing))).show();
if (type.equals(ProposalType.COMPENSATION_REQUEST) || type.equals(ProposalType.REIMBURSEMENT_REQUEST)) {
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) {
String message;

View file

@ -20,8 +20,12 @@ package bisq.desktop.main.dao.monitor;
import bisq.core.dao.monitoring.model.StateHash;
import bisq.core.locale.Res;
import bisq.network.p2p.NodeAddress;
import bisq.common.util.Utilities;
import java.util.Set;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
@ -36,10 +40,15 @@ public abstract class StateInConflictListItem<T extends StateHash> {
private final String prevHash;
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.peerAddress = peerAddress;
height = Res.get("dao.monitor.table.cycleBlockHeight", cycleIndex + 1, String.valueOf(stateHash.getHeight()));
this.peerAddress = seedNodeAddresses.stream().anyMatch(e -> e.getFullAddress().equals(peerAddress)) ?
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());
prevHash = stateHash.getPrevHash().length > 0 ?
Utilities.bytesAsHexString(stateHash.getPrevHash()) : "-";

View file

@ -23,6 +23,7 @@ import bisq.desktop.components.AutoTooltipButton;
import bisq.desktop.components.AutoTooltipLabel;
import bisq.desktop.components.AutoTooltipTableColumn;
import bisq.desktop.components.TableGroupHeadline;
import bisq.desktop.main.overlays.popups.Popup;
import bisq.desktop.util.FormBuilder;
import bisq.desktop.util.GUIUtil;
import bisq.desktop.util.Layout;
@ -36,7 +37,10 @@ import bisq.core.dao.state.DaoStateListener;
import bisq.core.dao.state.DaoStateService;
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;
@ -64,8 +68,12 @@ import javafx.collections.transformation.SortedList;
import javafx.util.Callback;
import java.io.File;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
@FxmlView
@ -78,6 +86,8 @@ public abstract class StateMonitorView<StH extends StateHash,
protected final DaoFacade daoFacade;
protected final CycleService cycleService;
protected final PeriodService periodService;
protected final Set<NodeAddress> seedNodeAddresses;
private final File storageDir;
protected TextField statusTextField;
protected Button resyncButton;
@ -91,22 +101,26 @@ public abstract class StateMonitorView<StH extends StateHash,
protected int gridRow = 0;
private Subscription selectedItemSubscription;
protected final BooleanProperty isInConflict = new SimpleBooleanProperty();
protected final BooleanProperty isInConflictWithNonSeedNode = new SimpleBooleanProperty();
protected final BooleanProperty isInConflictWithSeedNode = new SimpleBooleanProperty();
///////////////////////////////////////////////////////////////////////////////////////////
// Constructor, lifecycle
///////////////////////////////////////////////////////////////////////////////////////////
@Inject
public StateMonitorView(DaoStateService daoStateService,
DaoFacade daoFacade,
CycleService cycleService,
PeriodService periodService) {
protected StateMonitorView(DaoStateService daoStateService,
DaoFacade daoFacade,
CycleService cycleService,
PeriodService periodService,
SeedNodeRepository seedNodeRepository,
File storageDir) {
this.daoStateService = daoStateService;
this.daoFacade = daoFacade;
this.cycleService = cycleService;
this.periodService = periodService;
this.seedNodeAddresses = new HashSet<>(seedNodeRepository.getSeedNodeAddresses());
this.storageDir = storageDir;
}
@Override
@ -124,8 +138,36 @@ public abstract class StateMonitorView<StH extends StateHash,
daoStateService.addDaoStateListener(this);
resyncButton.visibleProperty().bind(isInConflict);
resyncButton.managedProperty().bind(isInConflict);
resyncButton.visibleProperty().bind(isInConflictWithSeedNode);
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()) {
onDataUpdate();
@ -250,6 +292,17 @@ public abstract class StateMonitorView<StH extends StateHash,
///////////////////////////////////////////////////////////////////////////////////////////
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);
}
@ -455,7 +508,7 @@ public abstract class StateMonitorView<StH extends StateHash,
column = new AutoTooltipTableColumn<>(getPeersTableHeader());
column.setMinWidth(80);
column.setMinWidth(150);
column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue()));
column.setCellFactory(
new Callback<>() {
@ -479,7 +532,7 @@ public abstract class StateMonitorView<StH extends StateHash,
column = new AutoTooltipTableColumn<>(getHashTableHeader());
column.setMinWidth(150);
column.setMinWidth(120);
column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue()));
column.setCellFactory(
new Callback<>() {
@ -503,7 +556,7 @@ public abstract class StateMonitorView<StH extends StateHash,
column = new AutoTooltipTableColumn<>(getPrevHashTableHeader());
column.setMinWidth(150);
column.setMinWidth(120);
column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue()));
column.setCellFactory(
new Callback<>() {
@ -527,7 +580,7 @@ public abstract class StateMonitorView<StH extends StateHash,
column = new AutoTooltipTableColumn<>("");
column.setMinWidth(100);
column.setMinWidth(120);
column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue()));
column.setCellFactory(
new Callback<>() {

View file

@ -21,6 +21,10 @@ import bisq.desktop.main.dao.monitor.StateInConflictListItem;
import bisq.core.dao.monitoring.model.BlindVoteStateHash;
import bisq.network.p2p.NodeAddress;
import java.util.Set;
import lombok.EqualsAndHashCode;
import lombok.Value;
import lombok.extern.slf4j.Slf4j;
@ -31,8 +35,9 @@ import lombok.extern.slf4j.Slf4j;
class BlindVoteStateInConflictListItem extends StateInConflictListItem<BlindVoteStateHash> {
private final String numBlindVotes;
BlindVoteStateInConflictListItem(String peerAddress, BlindVoteStateHash stateHash, int cycleIndex) {
super(peerAddress, stateHash, cycleIndex);
BlindVoteStateInConflictListItem(String peerAddress, BlindVoteStateHash stateHash, int cycleIndex,
Set<NodeAddress> seedNodeAddresses) {
super(peerAddress, stateHash, cycleIndex, seedNodeAddresses);
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.components.AutoTooltipTableColumn;
import bisq.desktop.main.dao.monitor.StateMonitorView;
import bisq.desktop.main.overlays.popups.Popup;
import bisq.desktop.util.FormBuilder;
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.locale.Res;
import bisq.network.p2p.seed.SeedNodeRepository;
import bisq.common.storage.Storage;
import javax.inject.Inject;
import javax.inject.Named;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
@ -41,6 +45,8 @@ import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.util.Callback;
import java.io.File;
import java.util.Comparator;
import java.util.Map;
import java.util.stream.Collectors;
@ -50,6 +56,7 @@ public class BlindVoteStateMonitorView extends StateMonitorView<BlindVoteStateHa
implements BlindVoteStateMonitoringService.Listener {
private final BlindVoteStateMonitoringService blindVoteStateMonitoringService;
///////////////////////////////////////////////////////////////////////////////////////////
// Constructor, lifecycle
///////////////////////////////////////////////////////////////////////////////////////////
@ -60,8 +67,10 @@ public class BlindVoteStateMonitorView extends StateMonitorView<BlindVoteStateHa
DaoFacade daoFacade,
BlindVoteStateMonitoringService blindVoteStateMonitoringService,
CycleService cycleService,
PeriodService periodService) {
super(daoStateService, daoFacade, cycleService, periodService);
PeriodService periodService,
SeedNodeRepository seedNodeRepository,
@Named(Storage.STORAGE_DIR) File storageDir) {
super(daoStateService, daoFacade, cycleService, periodService, seedNodeRepository, storageDir);
this.blindVoteStateMonitoringService = blindVoteStateMonitoringService;
}
@ -80,14 +89,8 @@ public class BlindVoteStateMonitorView extends StateMonitorView<BlindVoteStateHa
@Override
protected void activate() {
super.activate();
blindVoteStateMonitoringService.addListener(this);
resyncButton.setOnAction(e -> daoFacade.resyncDao(() ->
new Popup<>().attention(Res.get("setting.preferences.dao.resync.popup"))
.useShutDownButton()
.hideCloseButton()
.show())
);
blindVoteStateMonitoringService.addListener(this);
}
@Override
@ -123,7 +126,7 @@ public class BlindVoteStateMonitorView extends StateMonitorView<BlindVoteStateHa
protected BlindVoteStateInConflictListItem getStateInConflictListItem(Map.Entry<String, BlindVoteStateHash> mapEntry) {
BlindVoteStateHash blindVoteStateHash = mapEntry.getValue();
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
@ -173,15 +176,8 @@ public class BlindVoteStateMonitorView extends StateMonitorView<BlindVoteStateHa
@Override
protected void onDataUpdate() {
isInConflict.set(blindVoteStateMonitoringService.isInConflict());
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");
}
isInConflictWithSeedNode.set(blindVoteStateMonitoringService.isInConflictWithSeedNode());
isInConflictWithNonSeedNode.set(blindVoteStateMonitoringService.isInConflictWithNonSeedNode());
listItems.setAll(blindVoteStateMonitoringService.getBlindVoteStateBlockChain().stream()
.map(this::getStateBlockListItem)
@ -202,7 +198,7 @@ public class BlindVoteStateMonitorView extends StateMonitorView<BlindVoteStateHa
TableColumn<BlindVoteStateBlockListItem, BlindVoteStateBlockListItem> column;
column = new AutoTooltipTableColumn<>(Res.get("dao.monitor.blindVote.table.numBlindVotes"));
column.setMinWidth(110);
column.setMinWidth(90);
column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue()));
column.setCellFactory(
new Callback<>() {
@ -232,7 +228,7 @@ public class BlindVoteStateMonitorView extends StateMonitorView<BlindVoteStateHa
TableColumn<BlindVoteStateInConflictListItem, BlindVoteStateInConflictListItem> column;
column = new AutoTooltipTableColumn<>(Res.get("dao.monitor.blindVote.table.numBlindVotes"));
column.setMinWidth(110);
column.setMinWidth(90);
column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue()));
column.setCellFactory(
new Callback<>() {

View file

@ -21,6 +21,10 @@ import bisq.desktop.main.dao.monitor.StateInConflictListItem;
import bisq.core.dao.monitoring.model.DaoStateHash;
import bisq.network.p2p.NodeAddress;
import java.util.Set;
import lombok.EqualsAndHashCode;
import lombok.Value;
import lombok.extern.slf4j.Slf4j;
@ -29,7 +33,8 @@ import lombok.extern.slf4j.Slf4j;
@Value
@EqualsAndHashCode(callSuper = true)
class DaoStateInConflictListItem extends StateInConflictListItem<DaoStateHash> {
DaoStateInConflictListItem(String peerAddress, DaoStateHash stateHash, int cycleIndex) {
super(peerAddress, stateHash, cycleIndex);
DaoStateInConflictListItem(String peerAddress, DaoStateHash stateHash, int 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.locale.Res;
import bisq.network.p2p.seed.SeedNodeRepository;
import bisq.common.storage.Storage;
import bisq.common.util.Utilities;
import javax.inject.Inject;
import javax.inject.Named;
import javafx.collections.ListChangeListener;
import java.io.File;
import java.util.Map;
import java.util.stream.Collectors;
@ -60,8 +66,10 @@ public class DaoStateMonitorView extends StateMonitorView<DaoStateHash, DaoState
DaoFacade daoFacade,
DaoStateMonitoringService daoStateMonitoringService,
CycleService cycleService,
PeriodService periodService) {
super(daoStateService, daoFacade, cycleService, periodService);
PeriodService periodService,
SeedNodeRepository seedNodeRepository,
@Named(Storage.STORAGE_DIR) File storageDir) {
super(daoStateService, daoFacade, cycleService, periodService, seedNodeRepository, storageDir);
this.daoStateMonitoringService = daoStateMonitoringService;
}
@ -87,13 +95,6 @@ public class DaoStateMonitorView extends StateMonitorView<DaoStateHash, DaoState
daoStateMonitoringService.getUtxoMismatches().addListener(utxoMismatchListChangeListener);
updateUtxoMismatches();
resyncButton.setOnAction(e -> daoFacade.resyncDao(() ->
new Popup<>().attention(Res.get("setting.preferences.dao.resync.popup"))
.useShutDownButton()
.hideCloseButton()
.show())
);
}
@Override
@ -131,7 +132,7 @@ public class DaoStateMonitorView extends StateMonitorView<DaoStateHash, DaoState
protected DaoStateInConflictListItem getStateInConflictListItem(Map.Entry<String, DaoStateHash> mapEntry) {
DaoStateHash daoStateHash = mapEntry.getValue();
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
@ -181,15 +182,8 @@ public class DaoStateMonitorView extends StateMonitorView<DaoStateHash, DaoState
@Override
protected void onDataUpdate() {
isInConflict.set(daoStateMonitoringService.isInConflict());
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");
}
isInConflictWithSeedNode.set(daoStateMonitoringService.isInConflictWithSeedNode());
isInConflictWithNonSeedNode.set(daoStateMonitoringService.isInConflictWithNonSeedNode());
listItems.setAll(daoStateMonitoringService.getDaoStateBlockChain().stream()
.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.network.p2p.NodeAddress;
import java.util.Set;
import lombok.EqualsAndHashCode;
import lombok.Value;
import lombok.extern.slf4j.Slf4j;
@ -31,8 +35,9 @@ import lombok.extern.slf4j.Slf4j;
class ProposalStateInConflictListItem extends StateInConflictListItem<ProposalStateHash> {
private final String numProposals;
ProposalStateInConflictListItem(String peerAddress, ProposalStateHash stateHash, int cycleIndex) {
super(peerAddress, stateHash, cycleIndex);
ProposalStateInConflictListItem(String peerAddress, ProposalStateHash stateHash, int cycleIndex,
Set<NodeAddress> seedNodeAddresses) {
super(peerAddress, stateHash, cycleIndex, seedNodeAddresses);
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.components.AutoTooltipTableColumn;
import bisq.desktop.main.dao.monitor.StateMonitorView;
import bisq.desktop.main.overlays.popups.Popup;
import bisq.desktop.util.FormBuilder;
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.locale.Res;
import bisq.network.p2p.seed.SeedNodeRepository;
import bisq.common.storage.Storage;
import javax.inject.Inject;
import javax.inject.Named;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
@ -41,6 +45,8 @@ import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.util.Callback;
import java.io.File;
import java.util.Comparator;
import java.util.Map;
import java.util.stream.Collectors;
@ -60,8 +66,10 @@ public class ProposalStateMonitorView extends StateMonitorView<ProposalStateHash
DaoFacade daoFacade,
ProposalStateMonitoringService proposalStateMonitoringService,
CycleService cycleService,
PeriodService periodService) {
super(daoStateService, daoFacade, cycleService, periodService);
PeriodService periodService,
SeedNodeRepository seedNodeRepository,
@Named(Storage.STORAGE_DIR) File storageDir) {
super(daoStateService, daoFacade, cycleService, periodService, seedNodeRepository, storageDir);
this.proposalStateMonitoringService = proposalStateMonitoringService;
}
@ -81,13 +89,6 @@ public class ProposalStateMonitorView extends StateMonitorView<ProposalStateHash
protected void activate() {
super.activate();
proposalStateMonitoringService.addListener(this);
resyncButton.setOnAction(e -> daoFacade.resyncDao(() ->
new Popup<>().attention(Res.get("setting.preferences.dao.resync.popup"))
.useShutDownButton()
.hideCloseButton()
.show())
);
}
@Override
@ -123,7 +124,7 @@ public class ProposalStateMonitorView extends StateMonitorView<ProposalStateHash
protected ProposalStateInConflictListItem getStateInConflictListItem(Map.Entry<String, ProposalStateHash> mapEntry) {
ProposalStateHash proposalStateHash = mapEntry.getValue();
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
@ -173,15 +174,8 @@ public class ProposalStateMonitorView extends StateMonitorView<ProposalStateHash
@Override
protected void onDataUpdate() {
isInConflict.set(proposalStateMonitoringService.isInConflict());
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");
}
isInConflictWithSeedNode.set(proposalStateMonitoringService.isInConflictWithSeedNode());
isInConflictWithNonSeedNode.set(proposalStateMonitoringService.isInConflictWithNonSeedNode());
listItems.setAll(proposalStateMonitoringService.getProposalStateBlockChain().stream()
.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 signedTx = bsqWalletService.signTx(txWithBtcFee);
Coin miningFee = signedTx.getFee();
int txSize = signedTx.bitcoinSerialize().length;
showPublishTxPopup(receiverAmount,
txWithBtcFee,
TxType.INVALID,
miningFee,
txSize, receiversBtcAddressInputTextField.getText(),
btcFormatter,
btcFormatter,
() -> {
receiversBtcAddressInputTextField.setText("");
btcAmountInputTextField.setText("");
});
if (miningFee.getValue() >= receiverAmount.getValue())
GUIUtil.showWantToBurnBTCPopup(miningFee, receiverAmount, btcFormatter);
else {
int txSize = signedTx.bitcoinSerialize().length;
showPublishTxPopup(receiverAmount,
txWithBtcFee,
TxType.INVALID,
miningFee,
txSize, receiversBtcAddressInputTextField.getText(),
btcFormatter,
btcFormatter,
() -> {
receiversBtcAddressInputTextField.setText("");
btcAmountInputTextField.setText("");
});
}
} catch (Throwable t) {
handleError(t);
}

View file

@ -47,6 +47,7 @@ class BsqTxListItem extends TxConfidenceListItem {
private final BsqFormatter bsqFormatter;
private final Date date;
private final boolean isBurnedBsqTx;
private final boolean withdrawalToBTCWallet;
private final String address;
private final String direction;
@ -73,6 +74,11 @@ class BsqTxListItem extends TxConfidenceListItem {
Coin valueSentToMe = bsqWalletService.getValueSentToMeForTransaction(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);
if (amount.isPositive()) {
if (txId.equals(daoFacade.getGenesisTxId()))
@ -124,5 +130,9 @@ class BsqTxListItem extends TxConfidenceListItem {
.flatMap(tx -> daoFacade.getOptionalTxType(tx.getId()))
.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);
}
} else {
if (item.isWithdrawalToBTCWallet())
labelString = Res.get("dao.tx.withdrawnFromWallet");
label = new AutoTooltipLabel(labelString);
setGraphic(label);
}
@ -497,9 +501,17 @@ public class BsqTxView extends ActivatableView<GridPane, Void> implements BsqBal
super.updateItem(item, empty);
if (item != null && !empty) {
TxType txType = item.getTxType();
setText(item.getConfirmations() > 0 && isValidType(txType) ?
bsqFormatter.formatCoin(item.getAmount()) :
Res.get("shared.na"));
String bsqAmount = 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
setText("");
}

View file

@ -93,6 +93,7 @@ class TransactionsListItem {
// TODO check and refactor
boolean txFeeForBsqPayment = false;
boolean withdrawalFromBSQWallet = false;
if (valueSentToMe.isZero()) {
amountAsCoin = valueSentFromMe.multiply(-1);
for (TransactionOutput output : transaction.getOutputs()) {
@ -145,6 +146,14 @@ class TransactionsListItem {
}
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 {
if (amountAsCoin.isZero())
details = Res.get("funds.tx.noFundsFromDispute");
else if (withdrawalFromBSQWallet)
details = Res.get("funds.tx.withdrawnFromBSQWallet");
else if (!txFeeForBsqPayment)
details = received ? Res.get("funds.tx.receivedFunds") : Res.get("funds.tx.withdrawnFromWallet");
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"));
CheckBox preventPublicBtcNetworkCheckBox = addLabelCheckBox(gridPane, ++rowIndex, Res.get("filterWindow.preventPublicBtcNetwork"));
CheckBox disableDaoCheckBox = addLabelCheckBox(gridPane, ++rowIndex, Res.get("filterWindow.disableDao"));
InputTextField disableDaoBelowVersionInputTextField = addInputTextField(gridPane, ++rowIndex, Res.get("filterWindow.disableDaoBelowVersion"));
final Filter filter = filterManager.getDevelopersFilter();
if (filter != null) {
@ -182,6 +183,7 @@ public class FilterWindow extends Overlay<FilterWindow> {
preventPublicBtcNetworkCheckBox.setSelected(filter.isPreventPublicBtcNetwork());
disableDaoCheckBox.setSelected(filter.isDisableDao());
disableDaoBelowVersionInputTextField.setText(filter.getDisableDaoBelowVersion());
}
Button sendButton = new AutoTooltipButton(Res.get("filterWindow.add"));
sendButton.setOnAction(e -> {
@ -267,7 +269,8 @@ public class FilterWindow extends Overlay<FilterWindow> {
priceRelayNodes,
preventPublicBtcNetworkCheckBox.isSelected(),
btcNodes,
disableDaoCheckBox.isSelected()),
disableDaoCheckBox.isSelected(),
disableDaoBelowVersionInputTextField.getText()),
keyInputTextField.getText()))
hide();
else

View file

@ -340,7 +340,7 @@ public class FormBuilder {
hyperlinkWithIcon.setOnAction(e -> GUIUtil.openWebPage(url));
GridPane.setRowIndex(hyperlinkWithIcon, rowIndex);
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.getChildren().add(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.");
}
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) {
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
public class SeedNodeMain extends ExecutableForAppWithP2p {
private static final String VERSION = "0.9.7";
private static final String VERSION = "0.9.8";
private SeedNode seedNode;
public SeedNodeMain() {